source: mainline/kernel/tools/genmap.py@ a31aad1

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since a31aad1 was 432f68a, checked in by Martin Decky <martin@…>, 14 years ago

improve compatibility with Python 3.2 (thx Vojtech Horky)

  • Property mode set to 100755
File size: 3.6 KB
Line 
1#!/usr/bin/env python
2#
3# Copyright (c) 2006 Ondrej Palkovsky
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9#
10# - Redistributions of source code must retain the above copyright
11# notice, this list of conditions and the following disclaimer.
12# - Redistributions in binary form must reproduce the above copyright
13# notice, this list of conditions and the following disclaimer in the
14# documentation and/or other materials provided with the distribution.
15# - The name of the author may not be used to endorse or promote products
16# derived from this software without specific prior written permission.
17#
18# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28#
29
30"""
31Create binary symbol map out of linker map file
32"""
33
34import sys
35import struct
36import re
37
38MAXSTRING = 63
39symtabfmt = "<Q%ds" % (MAXSTRING + 1)
40
41funcline = re.compile(r'([0-9a-f]+)\s+[lg]\s+.\s+\.text\s+([0-9a-f]+)\s+(.*)$')
42bssline = re.compile(r'([0-9a-f]+)\s+[lg]\s+[a-zA-Z]\s+\.bss\s+([0-9a-f]+)\s+(.*)$')
43dataline = re.compile(r'([0-9a-f]+)\s+[lg]\s+[a-zA-Z]\s+\.data\s+([0-9a-f]+)\s+(.*)$')
44fileexp = re.compile(r'([^\s]+):\s+file format')
45startfile = re.compile(r'\.(text|bss|data)\s+(0x[0-9a-f]+)\s+0x[0-9a-f]+\s+(.*)$')
46
47def read_obdump(inp):
48 "Parse input"
49
50 funcs = {}
51 data = {}
52 bss = {}
53 fname = ''
54
55 for line in inp:
56 line = line.strip()
57 res = funcline.match(line)
58 if (res):
59 funcs.setdefault(fname, []).append((int(res.group(1), 16), res.group(3)))
60 continue
61
62 res = bssline.match(line)
63 if (res):
64 start = int(res.group(1), 16)
65 end = int(res.group(2), 16)
66 if (end):
67 bss.setdefault(fname, []).append((start, res.group(3)))
68
69 res = dataline.match(line)
70 if (res):
71 start = int(res.group(1), 16)
72 end = int(res.group(2), 16)
73 if (end):
74 data.setdefault(fname, []).append((start, res.group(3)))
75
76 res = fileexp.match(line)
77 if (res):
78 fname = res.group(1)
79 continue
80
81 return {'text' : funcs, 'bss' : bss, 'data' : data}
82
83def generate(kmapf, obmapf, out):
84 "Generate output file"
85
86 obdump = read_obdump(obmapf)
87
88 def key_sorter(x):
89 return x[0]
90
91 for line in kmapf:
92 line = line.strip()
93 res = startfile.match(line)
94
95 if ((res) and (res.group(3) in obdump[res.group(1)])):
96 offset = int(res.group(2), 16)
97 fname = res.group(3)
98 symbols = obdump[res.group(1)][fname]
99 symbols.sort(key = key_sorter)
100 for addr, symbol in symbols:
101 value = fname + ':' + symbol
102 value_bytes = value.encode('ascii')
103 data = struct.pack(symtabfmt, addr + offset, value_bytes[:MAXSTRING])
104 out.write(data)
105
106 out.write(struct.pack(symtabfmt, 0, b''))
107
108def main():
109 if (len(sys.argv) != 4):
110 print("Usage: %s <kernel.map> <nm dump> <output.bin>" % sys.argv[0])
111 return 1
112
113 kmapf = open(sys.argv[1], 'r')
114 obmapf = open(sys.argv[2], 'r')
115 out = open(sys.argv[3], 'wb')
116
117 generate(kmapf, obmapf, out)
118
119 kmapf.close()
120 obmapf.close()
121 out.close()
122
123if __name__ == '__main__':
124 sys.exit(main())
Note: See TracBrowser for help on using the repository browser.