Changeset ae9624e in mainline for tools/genmap.py


Ignore:
Timestamp:
2005-09-04T23:38:03Z (20 years ago)
Author:
Ondrej Palkovsky <ondrap@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
6153749
Parents:
824553ed
Message:

Symbol table now contains static functions too.
NOTE: gcc heavily inlines, be aware of optimizations.

Removed excesive item from boot page tables.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tools/genmap.py

    r824553ed rae9624e  
    55import re
    66
    7 symline = re.compile(r'(0x[a-f0-9]+)\s+([^\s]+)$')
    8 fileline = re.compile(r'[^\s]+\s+0x[a-f0-9]+\s+0x[a-f0-9]+\s+([^\s]+\.o)$')
    9 
    107MAXSTRING=63
    118symtabfmt = "<Q%ds" % (MAXSTRING+1)
    129
    13 def read_symbols(inp):
    14     while 1:
    15         line = inp.readline()
    16         if not line:
    17             return
    18         if 'memory map' in line:
    19             break       
    2010
    21     symtable = {}
    22     filename = ''
    23     while 1:
    24         line = inp.readline()
    25         if not line.strip():
     11objline = re.compile(r'([0-9a-f]+)\s+[lg]\s+F\s+\.text\s+[0-9a-f]+\s+(.*)$')
     12fileexp = re.compile(r'([^\s]+):\s+file format')
     13def read_obdump(inp):
     14    result = {}
     15    fname = ''
     16    for line in inp:
     17        line = line.strip()
     18        res = objline.match(line)
     19        if res:
     20            result.setdefault(fname,[]).append((int(res.group(1),16),
     21                                                 res.group(2)))
     22        res = fileexp.match(line)
     23        if res:
     24            fname = res.group(1)
    2625            continue
    27         if line[0] not in (' ','.'):
    28             break
     26   
     27    return result
     28
     29startfile = re.compile(r'\.text\s+(0x[0-9a-f]+)\s+0x[0-9a-f]+\s+(.*)$')
     30def generate(kmapf, obmapf, out):
     31    obdump = read_obdump(obmapf)
     32
     33    def sorter(x,y):
     34        return cmp(x[0],y[0])
     35
     36    for line in kmapf:
    2937        line = line.strip()
    30         # Search for file name
    31         res = fileline.match(line)
    32         if res:
    33             filename = res.group(1)
    34         # Search for symbols
    35         res = symline.match(line)
    36         if res:
    37             symtable[int(res.group(1),16)] = filename + ':' + res.group(2)
    38     return symtable
    39    
    40 def generate(inp, out):
    41     symtab = read_symbols(inp)
    42     if not symtab:
    43         print "Bad kernel.map format, empty."
    44         sys.exit(1)
    45     addrs = symtab.keys()
    46     addrs.sort()
    47     for addr in addrs:
    48         # Do not write address 0, it indicates end of data
    49         if addr == 0:
    50             continue
    51         data = struct.pack(symtabfmt,addr,symtab[addr][:MAXSTRING])
    52         out.write(data)
     38        res = startfile.match(line)
     39        if res and obdump.has_key(res.group(2)):
     40            offset = int(res.group(1),16)
     41            fname = res.group(2)
     42            symbols = obdump[fname]
     43            symbols.sort(sorter)
     44            for addr,symbol in symbols:
     45                value = fname + ':' + symbol
     46                data = struct.pack(symtabfmt,addr+offset,value[:MAXSTRING])
     47                out.write(data)
     48               
    5349    out.write(struct.pack(symtabfmt,0,''))
    5450
    5551def main():
    56     if len(sys.argv) != 3:
    57         print "Usage: %s <kernel.map> <output.bin>" % sys.argv[0]
     52    if len(sys.argv) != 4:
     53        print "Usage: %s <kernel.map> <nm dump> <output.bin>" % sys.argv[0]
    5854        sys.exit(1)
    5955
    60     inp = open(sys.argv[1],'r')
    61     out = open(sys.argv[2],'w')
    62     generate(inp,out)
    63     inp.close()
     56    kmapf = open(sys.argv[1],'r')
     57    obmapf = open(sys.argv[2],'r')
     58    out = open(sys.argv[3],'w')
     59    generate(kmapf,obmapf,out)
     60    kmapf.close()
     61    obmapf.close()
    6462    out.close()
    6563
Note: See TracChangeset for help on using the changeset viewer.