The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/tools/symbolify.py

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: 7313d19dd4a3549ca8c0a8a4aa3b6960


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.