source: mainline/kernel/tools/genmap.py@ 0e9463df

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 0e9463df was 11675207, checked in by jermar <jermar@…>, 17 years ago

Move everything to kernel/.

  • Property mode set to 100755
File size: 2.5 KB
RevLine 
[ab08b42]1#!/usr/bin/env python
2
3import sys
4import struct
5import re
6
[b6d20a7]7MAXSTRING=63
8symtabfmt = "<Q%ds" % (MAXSTRING+1)
[ab08b42]9
10
[3156582]11funcline = re.compile(r'([0-9a-f]+)\s+[lg]\s+.\s+\.text\s+([0-9a-f]+)\s+(.*)$')
[ff4c4f5]12bssline = re.compile(r'([0-9a-f]+)\s+[lg]\s+[a-zA-Z]\s+\.bss\s+([0-9a-f]+)\s+(.*)$')
13dataline = re.compile(r'([0-9a-f]+)\s+[lg]\s+[a-zA-Z]\s+\.data\s+([0-9a-f]+)\s+(.*)$')
[ae9624e]14fileexp = re.compile(r'([^\s]+):\s+file format')
15def read_obdump(inp):
[ff4c4f5]16 funcs = {}
17 data = {}
18 bss ={}
[ae9624e]19 fname = ''
20 for line in inp:
[ab08b42]21 line = line.strip()
[ff4c4f5]22 res = funcline.match(line)
[b6d20a7]23 if res:
[ff4c4f5]24 funcs.setdefault(fname,[]).append((int(res.group(1),16),
25 res.group(3)))
26 continue
27 res = bssline.match(line)
28 if res:
29 start = int(res.group(1),16)
30 end = int(res.group(2),16)
31 if end:
32 bss.setdefault(fname,[]).append((start,res.group(3)))
33 res = dataline.match(line)
34 if res:
35 start = int(res.group(1),16)
36 end = int(res.group(2),16)
37 if end:
38 data.setdefault(fname,[]).append((start,res.group(3)))
[ae9624e]39 res = fileexp.match(line)
[ab08b42]40 if res:
[ae9624e]41 fname = res.group(1)
[ab08b42]42 continue
[ae9624e]43
[ff4c4f5]44 return {
45 'text' : funcs,
46 'bss' : bss,
47 'data' : data
48 }
49
50startfile = re.compile(r'\.(text|bss|data)\s+(0x[0-9a-f]+)\s+0x[0-9a-f]+\s+(.*)$')
[ae9624e]51def generate(kmapf, obmapf, out):
[ff4c4f5]52 obdump = read_obdump(obmapf)
[ae9624e]53
54 def sorter(x,y):
55 return cmp(x[0],y[0])
56
57 for line in kmapf:
58 line = line.strip()
59 res = startfile.match(line)
[ff4c4f5]60
61 if res and obdump[res.group(1)].has_key(res.group(3)):
62 offset = int(res.group(2),16)
63 fname = res.group(3)
64 symbols = obdump[res.group(1)][fname]
[ae9624e]65 symbols.sort(sorter)
[ff4c4f5]66 for addr,symbol in symbols:
[ae9624e]67 value = fname + ':' + symbol
68 data = struct.pack(symtabfmt,addr+offset,value[:MAXSTRING])
69 out.write(data)
70
[ab08b42]71 out.write(struct.pack(symtabfmt,0,''))
72
73def main():
[ae9624e]74 if len(sys.argv) != 4:
75 print "Usage: %s <kernel.map> <nm dump> <output.bin>" % sys.argv[0]
[ab08b42]76 sys.exit(1)
77
[ae9624e]78 kmapf = open(sys.argv[1],'r')
79 obmapf = open(sys.argv[2],'r')
80 out = open(sys.argv[3],'w')
81 generate(kmapf,obmapf,out)
82 kmapf.close()
83 obmapf.close()
[ab08b42]84 out.close()
85
86if __name__ == '__main__':
87 main()
Note: See TracBrowser for help on using the repository browser.