extract-system-config.py
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
add a testcase to reproduce threaded dlclose crash (Bug 1513)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 556
diff changeset
   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
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 556
diff changeset
   134
                    '/usr/lib/debug/ld-linux-x86-64.so.2',
560
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 559
diff changeset
   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
96ed6c23edb2 support ubuntu 1004
Hajime Tazaki <tazaki@nict.go.jp>
parents: 631
diff changeset
   142
                    # for ubuntu 1004.
96ed6c23edb2 support ubuntu 1004
Hajime Tazaki <tazaki@nict.go.jp>
parents: 631
diff changeset
   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
5537ab8d78d6 missing comma
Hajime Tazaki <tazaki@nict.go.jp>
parents: 640
diff changeset
   147
                    '/usr/lib/debug/lib/x86_64-linux-gnu/ld-2.15.so',
5537ab8d78d6 missing comma
Hajime Tazaki <tazaki@nict.go.jp>
parents: 640
diff changeset
   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