author | Hajime Tazaki <tazaki@nict.go.jp> |
Wed, 13 Feb 2013 22:37:34 +0900 | |
changeset 651 | 9d7e2cd9633b |
parent 644 | 83a4a66061b8 |
permissions | -rwxr-xr-x |
105
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
1 |
#!/usr/bin/env python |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
2 |
|
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
3 |
import sys |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
4 |
import re |
118
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
5 |
import getopt |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
6 |
import os |
105
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
7 |
|
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
8 |
|
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
9 |
class Data: |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
10 |
def __init__(self, data): |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
11 |
self.data = data |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
12 |
|
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
13 |
class DebugData: |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
14 |
class Item: |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
15 |
def __init__(self): |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
16 |
self.type = '' |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
17 |
self.ref = 0 |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
18 |
self.level = 0 |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
19 |
self.attributes = {} |
118
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
20 |
def __init__(self, debug_filename): |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
21 |
file = os.popen ('readelf -wi ' + debug_filename, 'r') |
105
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
22 |
self.__lines = file.readlines () |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
23 |
self.__current = 0 |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
24 |
self.__re1 = re.compile ('<([^>]+)><([^>]+)>:[^A]*Abbrev Number:.*\d+.*\((\w+)\)') |
213
871993da61e9
handle hex type ref
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
118
diff
changeset
|
25 |
self.__re2 = re.compile ('<[^>]+>[^D]*(DW_AT_\w+)([^:]*:)+ <?0?x?([^ \t><\)]+)[ >\t\)]*$') |
105
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
26 |
return |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
27 |
def rewind (self): |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
28 |
self.__current = 0 |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
29 |
return |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
30 |
def read_line (self): |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
31 |
if self.__current == len (self.__lines): |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
32 |
return '' |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
33 |
line = self.__lines[self.__current] |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
34 |
self.__current = self.__current + 1 |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
35 |
return line |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
36 |
def write_back_line (self): |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
37 |
self.__current = self.__current - 1 |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
38 |
return |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
39 |
def write_back_one (self, item): |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
40 |
self.__current = self.__current - 1 - len (item.attributes.keys ()) |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
41 |
return |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
42 |
def read_one (self): |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
43 |
item = DebugData.Item () |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
44 |
while 1: |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
45 |
line = self.read_line () |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
46 |
if line == '': |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
47 |
if item.type == '': |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
48 |
return None |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
49 |
else: |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
50 |
return item |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
51 |
result = self.__re1.search (line) |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
52 |
if result is None: |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
53 |
continue |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
54 |
item.level = result.group (1) |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
55 |
item.ref = result.group (2) |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
56 |
item.type = result.group (3) |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
57 |
while 1: |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
58 |
line = self.read_line () |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
59 |
result = self.__re1.search (line) |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
60 |
if result is not None: |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
61 |
self.write_back_line () |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
62 |
return item |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
63 |
result = self.__re2.search (line) |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
64 |
if result is None: |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
65 |
self.write_back_line () |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
66 |
return item |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
67 |
item.attributes[result.group (1)] = result.group (3) |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
68 |
return item |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
69 |
def find_struct (self, struct_type_name): |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
70 |
return self.find_by_name ('DW_TAG_structure_type', struct_type_name) |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
71 |
def find_by_name (self, type, name): |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
72 |
item = self.read_one () |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
73 |
while item is not None: |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
74 |
if item.type == type and \ |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
75 |
item.attributes.has_key ('DW_AT_name') and \ |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
76 |
item.attributes['DW_AT_name'] == name: |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
77 |
return item |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
78 |
item = self.read_one () |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
79 |
return item |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
80 |
def find_by_ref (self, ref): |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
81 |
item = self.read_one () |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
82 |
while item is not None: |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
83 |
if item.ref == ref: |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
84 |
return item |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
85 |
item = self.read_one () |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
86 |
return item |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
87 |
def find_member (self, member_name, parent): |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
88 |
sub_item = self.read_one () |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
89 |
while sub_item is not None: |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
90 |
if sub_item.level == parent.level: |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
91 |
self.write_back_one () |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
92 |
return None |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
93 |
if sub_item.type == 'DW_TAG_member' and \ |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
94 |
sub_item.attributes.has_key ('DW_AT_name') and \ |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
95 |
sub_item.attributes['DW_AT_name'] == member_name: |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
96 |
return Data (sub_item.attributes['DW_AT_data_member_location']) |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
97 |
sub_item = self.read_one () |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
98 |
return None |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
99 |
# public methods below |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
100 |
def get_struct_member_offset (self, struct_type_name, member_name): |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
101 |
self.rewind () |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
102 |
item = self.find_struct (struct_type_name) |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
103 |
if item is None: |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
104 |
return None |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
105 |
return self.find_member (member_name, item) |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
106 |
def get_struct_size (self, struct_type_name): |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
107 |
self.rewind () |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
108 |
item = self.find_struct (struct_type_name) |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
109 |
if item is None: |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
110 |
return None |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
111 |
if not item.attributes.has_key ('DW_AT_byte_size'): |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
112 |
return None |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
113 |
return Data (item.attributes['DW_AT_byte_size']) |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
114 |
def get_typedef_member_offset (self, typename, member): |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
115 |
self.rewind () |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
116 |
item = self.find_by_name ('DW_TAG_typedef', typename) |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
117 |
if item is None: |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
118 |
return None |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
119 |
if not item.attributes.has_key ('DW_AT_type'): |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
120 |
return None |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
121 |
ref = item.attributes['DW_AT_type'] |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
122 |
self.rewind () |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
123 |
item = self.find_by_ref (ref) |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
124 |
if item is None: |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
125 |
return None |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
126 |
return self.find_member (member, item) |
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
127 |
|
557 | 128 |
class CouldNotFindFile: |
234
b39c94a69cb4
make it smarter
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
213
diff
changeset
|
129 |
pass |
b39c94a69cb4
make it smarter
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
213
diff
changeset
|
130 |
|
b39c94a69cb4
make it smarter
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
213
diff
changeset
|
131 |
def search_debug_file(): |
601
8d31ed03b61d
update from ns-3-simu
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
585
diff
changeset
|
132 |
files_to_try = ['/usr/lib64/debug/lib64/ld-2.11.2.so.debug', |
8d31ed03b61d
update from ns-3-simu
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
585
diff
changeset
|
133 |
'/usr/lib/debug/lib64/ld-linux-x86-64.so.2.debug', |
557 | 134 |
'/usr/lib/debug/ld-linux-x86-64.so.2', |
560 | 135 |
'/usr/lib/debug/lib/ld-linux.so.2.debug', |
585
dc0c43ebd9b7
ubuntu 0910 is missing a symbolic link. fuck them.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
560
diff
changeset
|
136 |
'/usr/lib/debug/ld-linux.so.2', |
635
b9648be833b3
more ld.so versions supoort
Hajime Tazaki <tazaki@nict.go.jp>
parents:
634
diff
changeset
|
137 |
# ubuntu 1104/1110 |
b9648be833b3
more ld.so versions supoort
Hajime Tazaki <tazaki@nict.go.jp>
parents:
634
diff
changeset
|
138 |
'/usr/lib/debug/lib/i386-linux-gnu/ld-2.13.so', |
625
dd14566ee3c0
add ubuntu 1110 debug file path
Mathieu Lacage <mathieu.lacage@cutebugs.net>
parents:
601
diff
changeset
|
139 |
'/usr/lib/debug/lib/x86_64-linux-gnu/ld-2.13.so', |
585
dc0c43ebd9b7
ubuntu 0910 is missing a symbolic link. fuck them.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
560
diff
changeset
|
140 |
# for ubuntu 0910. braindead |
631
5e32178a6bb6
add yet another path for most recent ubuntu
Mathieu Lacage <mathieu.lacage@cutebugs.net>
parents:
625
diff
changeset
|
141 |
'/usr/lib/debug/lib/ld-2.10.1.so', |
634 | 142 |
# for ubuntu 1004. |
143 |
'/usr/lib/debug/lib/ld-2.11.1.so', |
|
635
b9648be833b3
more ld.so versions supoort
Hajime Tazaki <tazaki@nict.go.jp>
parents:
634
diff
changeset
|
144 |
# for ubuntu 1010. |
b9648be833b3
more ld.so versions supoort
Hajime Tazaki <tazaki@nict.go.jp>
parents:
634
diff
changeset
|
145 |
'/usr/lib/debug/lib/ld-2.12.1.so', |
631
5e32178a6bb6
add yet another path for most recent ubuntu
Mathieu Lacage <mathieu.lacage@cutebugs.net>
parents:
625
diff
changeset
|
146 |
# ubuntu 1204 |
641 | 147 |
'/usr/lib/debug/lib/x86_64-linux-gnu/ld-2.15.so', |
148 |
'/usr/lib/debug/lib/i386-linux-gnu/ld-2.15.so', |
|
601
8d31ed03b61d
update from ns-3-simu
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
585
diff
changeset
|
149 |
] |
234
b39c94a69cb4
make it smarter
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
213
diff
changeset
|
150 |
for file in files_to_try: |
b39c94a69cb4
make it smarter
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
213
diff
changeset
|
151 |
if os.path.isfile (file): |
b39c94a69cb4
make it smarter
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
213
diff
changeset
|
152 |
return file |
585
dc0c43ebd9b7
ubuntu 0910 is missing a symbolic link. fuck them.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
560
diff
changeset
|
153 |
|
234
b39c94a69cb4
make it smarter
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
213
diff
changeset
|
154 |
raise CouldNotFindFile () |
639
d10cea06dc85
support ld.so.conf.d directry listing
Hajime Tazaki <tazaki@nict.go.jp>
parents:
638
diff
changeset
|
155 |
|
d10cea06dc85
support ld.so.conf.d directry listing
Hajime Tazaki <tazaki@nict.go.jp>
parents:
638
diff
changeset
|
156 |
def list_lib_path(): |
644
83a4a66061b8
be coherent in how : is treated between i386 & x86-64 codebases
Mathieu Lacage <mathieu.lacage@alcmeon.com>
parents:
641
diff
changeset
|
157 |
paths = [] |
639
d10cea06dc85
support ld.so.conf.d directry listing
Hajime Tazaki <tazaki@nict.go.jp>
parents:
638
diff
changeset
|
158 |
re_lib = re.compile ('(?<=^#)') |
d10cea06dc85
support ld.so.conf.d directry listing
Hajime Tazaki <tazaki@nict.go.jp>
parents:
638
diff
changeset
|
159 |
for filename in os.listdir("/etc/ld.so.conf.d/"): |
d10cea06dc85
support ld.so.conf.d directry listing
Hajime Tazaki <tazaki@nict.go.jp>
parents:
638
diff
changeset
|
160 |
for line in open ("/etc/ld.so.conf.d/" + filename, 'r'): |
d10cea06dc85
support ld.so.conf.d directry listing
Hajime Tazaki <tazaki@nict.go.jp>
parents:
638
diff
changeset
|
161 |
if re_lib.search (line) is not None: |
d10cea06dc85
support ld.so.conf.d directry listing
Hajime Tazaki <tazaki@nict.go.jp>
parents:
638
diff
changeset
|
162 |
continue |
644
83a4a66061b8
be coherent in how : is treated between i386 & x86-64 codebases
Mathieu Lacage <mathieu.lacage@alcmeon.com>
parents:
641
diff
changeset
|
163 |
paths.append(line.rstrip ()) |
83a4a66061b8
be coherent in how : is treated between i386 & x86-64 codebases
Mathieu Lacage <mathieu.lacage@alcmeon.com>
parents:
641
diff
changeset
|
164 |
return ':'.join(paths) |
118
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
165 |
|
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
166 |
def usage(): |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
167 |
print '' |
105
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
168 |
|
118
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
169 |
def main(argv): |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
170 |
config_filename = '' |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
171 |
debug_filename = '' |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
172 |
try: |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
173 |
opts, args = getopt.getopt(argv, 'hc:d:', |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
174 |
['help', 'config=', 'debug=']) |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
175 |
except getopt.GetoptError: |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
176 |
usage() |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
177 |
sys.exit(2) |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
178 |
for opt, arg in opts: |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
179 |
if opt in ('-h', '--help'): |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
180 |
usage() |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
181 |
sys.exit() |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
182 |
elif opt in ('-c', '--config'): |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
183 |
config_filename = arg |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
184 |
elif opt in ('-d', '--debug'): |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
185 |
debug_filename = arg |
105
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
186 |
|
234
b39c94a69cb4
make it smarter
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
213
diff
changeset
|
187 |
if config_filename != '': |
b39c94a69cb4
make it smarter
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
213
diff
changeset
|
188 |
config = open (config_filename, 'w') |
b39c94a69cb4
make it smarter
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
213
diff
changeset
|
189 |
else: |
b39c94a69cb4
make it smarter
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
213
diff
changeset
|
190 |
config = sys.stdout |
b39c94a69cb4
make it smarter
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
213
diff
changeset
|
191 |
if debug_filename == '': |
b39c94a69cb4
make it smarter
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
213
diff
changeset
|
192 |
debug_filename = search_debug_file () |
118
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
193 |
debug = DebugData (debug_filename) |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
194 |
data = debug.get_struct_size ('rtld_global') |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
195 |
if data is None: |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
196 |
sys.exit (1) |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
197 |
config.write ('#define CONFIG_RTLD_GLOBAL_SIZE ' + str(data.data) + '\n') |
105
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
198 |
|
118
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
199 |
data = debug.get_struct_size ('rtld_global_ro') |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
200 |
if data is None: |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
201 |
sys.exit (1) |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
202 |
config.write ('#define CONFIG_RTLD_GLOBAL_RO_SIZE ' + str(data.data) + '\n') |
105
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
203 |
|
638
cf4e616c56d5
fix uninitialized dl_pagesize on fedora16 (glibc-2.14), initalize in vdl
Hajime Tazaki <tazaki@nict.go.jp>
parents:
635
diff
changeset
|
204 |
data = debug.get_struct_member_offset ('rtld_global_ro', '_dl_pagesize') |
cf4e616c56d5
fix uninitialized dl_pagesize on fedora16 (glibc-2.14), initalize in vdl
Hajime Tazaki <tazaki@nict.go.jp>
parents:
635
diff
changeset
|
205 |
if data is None: |
cf4e616c56d5
fix uninitialized dl_pagesize on fedora16 (glibc-2.14), initalize in vdl
Hajime Tazaki <tazaki@nict.go.jp>
parents:
635
diff
changeset
|
206 |
sys.exit (1) |
cf4e616c56d5
fix uninitialized dl_pagesize on fedora16 (glibc-2.14), initalize in vdl
Hajime Tazaki <tazaki@nict.go.jp>
parents:
635
diff
changeset
|
207 |
config.write ('#define CONFIG_RTLD_DL_PAGESIZE_OFFSET ' + str(data.data) + '\n') |
cf4e616c56d5
fix uninitialized dl_pagesize on fedora16 (glibc-2.14), initalize in vdl
Hajime Tazaki <tazaki@nict.go.jp>
parents:
635
diff
changeset
|
208 |
|
118
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
209 |
data = debug.get_struct_member_offset ('rtld_global', '_dl_error_catch_tsd') |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
210 |
if data is None: |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
211 |
sys.exit (1) |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
212 |
config.write ('#define CONFIG_DL_ERROR_CATCH_TSD_OFFSET ' + str(data.data) + '\n') |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
213 |
|
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
214 |
data = debug.get_struct_size ('pthread') |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
215 |
if data is None: |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
216 |
sys.exit (1) |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
217 |
config.write ('#define CONFIG_TCB_SIZE ' + str(data.data) + '\n') |
105
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
218 |
|
118
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
219 |
data = debug.get_typedef_member_offset ('tcbhead_t', 'tcb') |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
220 |
if data is None: |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
221 |
sys.exit (1) |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
222 |
config.write ('#define CONFIG_TCB_TCB_OFFSET ' + str(data.data) + '\n') |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
223 |
|
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
224 |
data = debug.get_typedef_member_offset ('tcbhead_t', 'dtv') |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
225 |
if data is None: |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
226 |
sys.exit (1) |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
227 |
config.write ('#define CONFIG_TCB_DTV_OFFSET ' + str(data.data) + '\n') |
105
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
228 |
|
118
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
229 |
data = debug.get_typedef_member_offset ('tcbhead_t', 'self') |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
230 |
if data is None: |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
231 |
sys.exit (1) |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
232 |
config.write ('#define CONFIG_TCB_SELF_OFFSET ' + str(data.data) + '\n') |
105
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
233 |
|
118
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
234 |
data = debug.get_typedef_member_offset ('tcbhead_t', 'sysinfo') |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
235 |
if data is None: |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
236 |
sys.exit (1) |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
237 |
config.write ('#define CONFIG_TCB_SYSINFO_OFFSET ' + str(data.data) + '\n') |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
238 |
|
285
c19eca98c59e
extra stack_guard if needed
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
234
diff
changeset
|
239 |
data = debug.get_typedef_member_offset ('tcbhead_t', 'stack_guard') |
c19eca98c59e
extra stack_guard if needed
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
234
diff
changeset
|
240 |
if data is None: |
c19eca98c59e
extra stack_guard if needed
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
234
diff
changeset
|
241 |
sys.exit (1) |
c19eca98c59e
extra stack_guard if needed
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
234
diff
changeset
|
242 |
config.write ('#define CONFIG_TCB_STACK_GUARD ' + str(data.data) + '\n') |
c19eca98c59e
extra stack_guard if needed
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
234
diff
changeset
|
243 |
|
639
d10cea06dc85
support ld.so.conf.d directry listing
Hajime Tazaki <tazaki@nict.go.jp>
parents:
638
diff
changeset
|
244 |
config.write ('#define CONFIG_SYSTEM_LDSO_LIBRARY_PATH \"' + list_lib_path () + '\"\n') |
d10cea06dc85
support ld.so.conf.d directry listing
Hajime Tazaki <tazaki@nict.go.jp>
parents:
638
diff
changeset
|
245 |
|
118
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
246 |
if __name__ == "__main__": |
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
247 |
main(sys.argv[1:]) |
105
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
248 |
|
e644364bbcaf
extract system configuration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
249 |
|
118
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
250 |
|
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
251 |
|
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
252 |
|
5bd863647d9b
cleanup a bit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
105
diff
changeset
|
253 |