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