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