xref: /xnu-8792.81.2/tools/symbolify.py (revision 19c3b8c28c31cb8130e034cfb5df6bf9ba342d90)
1*19c3b8c2SApple OSS Distributions#!/usr/bin/env python
2*19c3b8c2SApple OSS Distributionsfrom subprocess import Popen, PIPE, call
3*19c3b8c2SApple OSS Distributionsimport re
4*19c3b8c2SApple OSS Distributionsimport sys
5*19c3b8c2SApple OSS Distributionsimport os
6*19c3b8c2SApple OSS Distributions
7*19c3b8c2SApple OSS DistributionsSLIDE = 0
8*19c3b8c2SApple OSS Distributions
9*19c3b8c2SApple OSS DistributionsNM_FORMAT = "([0-9a-f]+) ([UuAaTtDdBbCcSsIi]) (.*)"
10*19c3b8c2SApple OSS Distributions
11*19c3b8c2SApple OSS Distributionsnm_re = re.compile(NM_FORMAT)
12*19c3b8c2SApple OSS Distributions
13*19c3b8c2SApple OSS Distributionsdef parse_nm_output(str):
14*19c3b8c2SApple OSS Distributions    "returns (start, type, name)"
15*19c3b8c2SApple OSS Distributions    m = nm_re.match(str)
16*19c3b8c2SApple OSS Distributions    if m:
17*19c3b8c2SApple OSS Distributions        start = int(m.group(1), 16)
18*19c3b8c2SApple OSS Distributions        return (start, m.group(2), m.group(3))
19*19c3b8c2SApple OSS Distributions    else:
20*19c3b8c2SApple OSS Distributions        return None
21*19c3b8c2SApple OSS Distributions
22*19c3b8c2SApple OSS Distributionsdef nm(file):
23*19c3b8c2SApple OSS Distributions    cmd = "nm %s" % file
24*19c3b8c2SApple OSS Distributions    p = Popen(cmd, shell=True, stdout=PIPE)
25*19c3b8c2SApple OSS Distributions    return p.stdout
26*19c3b8c2SApple OSS Distributions
27*19c3b8c2SApple OSS Distributionsclass SymbolLookup:
28*19c3b8c2SApple OSS Distributions    def __init__(self, file, min_width=16):
29*19c3b8c2SApple OSS Distributions        self.min_width = min_width
30*19c3b8c2SApple OSS Distributions        self.symbols = [parse_nm_output(l) for l in nm(file)]
31*19c3b8c2SApple OSS Distributions        self.symbols.sort(key=lambda x: x[0])
32*19c3b8c2SApple OSS Distributions
33*19c3b8c2SApple OSS Distributions    def padded(self, str):
34*19c3b8c2SApple OSS Distributions        return ("%%%ds" % self.min_width) % str
35*19c3b8c2SApple OSS Distributions
36*19c3b8c2SApple OSS Distributions    def __call__(self, saddr):
37*19c3b8c2SApple OSS Distributions        addr = int(saddr.group(0), 16)
38*19c3b8c2SApple OSS Distributions        last = (0, ' ', '<start of file>')
39*19c3b8c2SApple OSS Distributions        if( addr > SLIDE ):
40*19c3b8c2SApple OSS Distributions            addr -= SLIDE
41*19c3b8c2SApple OSS Distributions        # stupid linear search... feel free to improve
42*19c3b8c2SApple OSS Distributions        for s in self.symbols:
43*19c3b8c2SApple OSS Distributions            if s[0] == addr:
44*19c3b8c2SApple OSS Distributions                return self.padded(s[2])
45*19c3b8c2SApple OSS Distributions            elif s[0] > addr:
46*19c3b8c2SApple OSS Distributions                if last[2] == "_last_kernel_symbol":
47*19c3b8c2SApple OSS Distributions                    return saddr.group(0)
48*19c3b8c2SApple OSS Distributions                return self.padded("<%s>+%x" % (last[2], addr - last[0]))
49*19c3b8c2SApple OSS Distributions            else:
50*19c3b8c2SApple OSS Distributions                last = s
51*19c3b8c2SApple OSS Distributions        if last[2] == "_last_kernel_symbol":
52*19c3b8c2SApple OSS Distributions            return saddr.group(0)
53*19c3b8c2SApple OSS Distributions        return self.padded("<%s>+%x" % (last[2], addr - last[0]))
54*19c3b8c2SApple OSS Distributions
55*19c3b8c2SApple OSS Distributionsdef symbolify(objfile, input, *args, **kargs):
56*19c3b8c2SApple OSS Distributions    replacer = SymbolLookup(objfile, *args, **kargs)
57*19c3b8c2SApple OSS Distributions    for l in input:
58*19c3b8c2SApple OSS Distributions        print re.sub("(0x)?[0-9a-f]{6,16}", replacer, l),
59*19c3b8c2SApple OSS Distributions
60*19c3b8c2SApple OSS Distributions
61*19c3b8c2SApple OSS Distributionsdef usage():
62*19c3b8c2SApple OSS Distributions
63*19c3b8c2SApple OSS Distributions    print "usage: %s [filename] [slide]" % sys.argv[0]
64*19c3b8c2SApple OSS Distributions    print "\tor speficy a filename in your SYMBOLIFY_KERNEL environment variable"
65*19c3b8c2SApple OSS Distributions
66*19c3b8c2SApple OSS Distributions    # die now
67*19c3b8c2SApple OSS Distributions    sys.exit(1)
68*19c3b8c2SApple OSS Distributions
69*19c3b8c2SApple OSS DistributionsKERNEL_FILE = None
70*19c3b8c2SApple OSS Distributions
71*19c3b8c2SApple OSS Distributionsif( len(sys.argv) > 3 ):
72*19c3b8c2SApple OSS Distributions    usage()
73*19c3b8c2SApple OSS Distributions
74*19c3b8c2SApple OSS Distributionsif( len(sys.argv) == 3 ):
75*19c3b8c2SApple OSS Distributions    SLIDE = int(sys.argv[2], 16)
76*19c3b8c2SApple OSS Distributions
77*19c3b8c2SApple OSS Distributionsif( len(sys.argv) >= 2 ):
78*19c3b8c2SApple OSS Distributions    KERNEL_FILE = sys.argv[1]
79*19c3b8c2SApple OSS Distributions
80*19c3b8c2SApple OSS Distributionsif( KERNEL_FILE is None ):
81*19c3b8c2SApple OSS Distributions    KERNEL_FILE = os.environ.get("SYMBOLIFY_KERNEL")
82*19c3b8c2SApple OSS Distributions
83*19c3b8c2SApple OSS Distributionsif( KERNEL_FILE is None ):
84*19c3b8c2SApple OSS Distributions    usage()
85*19c3b8c2SApple OSS Distributions
86*19c3b8c2SApple OSS Distributionsprint "using kernel file '%s', slide 0x%x" % (KERNEL_FILE, SLIDE)
87*19c3b8c2SApple OSS Distributions
88*19c3b8c2SApple OSS Distributionssymbolify(KERNEL_FILE, sys.stdin, min_width=40)
89*19c3b8c2SApple OSS Distributions
90