Changes in kernel/tools/genmap.py [28f4adb:11675207] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/tools/genmap.py
r28f4adb r11675207 1 1 #!/usr/bin/env python 2 #3 # Copyright (c) 2006 Ondrej Palkovsky4 # All rights reserved.5 #6 # Redistribution and use in source and binary forms, with or without7 # modification, are permitted provided that the following conditions8 # are met:9 #10 # - Redistributions of source code must retain the above copyright11 # notice, this list of conditions and the following disclaimer.12 # - Redistributions in binary form must reproduce the above copyright13 # notice, this list of conditions and the following disclaimer in the14 # documentation and/or other materials provided with the distribution.15 # - The name of the author may not be used to endorse or promote products16 # derived from this software without specific prior written permission.17 #18 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR19 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES20 # 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, BUT23 # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF27 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.28 #29 30 """31 Create binary symbol map out of linker map file32 """33 2 34 3 import sys … … 36 5 import re 37 6 38 MAXSTRING = 63 39 symtabfmt = "<Q%ds" % (MAXSTRING + 1) 7 MAXSTRING=63 8 symtabfmt = "<Q%ds" % (MAXSTRING+1) 9 40 10 41 11 funcline = re.compile(r'([0-9a-f]+)\s+[lg]\s+.\s+\.text\s+([0-9a-f]+)\s+(.*)$') … … 43 13 dataline = re.compile(r'([0-9a-f]+)\s+[lg]\s+[a-zA-Z]\s+\.data\s+([0-9a-f]+)\s+(.*)$') 44 14 fileexp = re.compile(r'([^\s]+):\s+file format') 15 def read_obdump(inp): 16 funcs = {} 17 data = {} 18 bss ={} 19 fname = '' 20 for line in inp: 21 line = line.strip() 22 res = funcline.match(line) 23 if res: 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))) 39 res = fileexp.match(line) 40 if res: 41 fname = res.group(1) 42 continue 43 44 return { 45 'text' : funcs, 46 'bss' : bss, 47 'data' : data 48 } 49 45 50 startfile = re.compile(r'\.(text|bss|data)\s+(0x[0-9a-f]+)\s+0x[0-9a-f]+\s+(.*)$') 51 def generate(kmapf, obmapf, out): 52 obdump = read_obdump(obmapf) 46 53 47 def 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} 54 def sorter(x,y): 55 return cmp(x[0],y[0]) 82 56 83 def 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 data = struct.pack(symtabfmt, addr + offset, value[:MAXSTRING]) 103 out.write(data) 104 105 out.write(struct.pack(symtabfmt, 0, '')) 57 for line in kmapf: 58 line = line.strip() 59 res = startfile.match(line) 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] 65 symbols.sort(sorter) 66 for addr,symbol in symbols: 67 value = fname + ':' + symbol 68 data = struct.pack(symtabfmt,addr+offset,value[:MAXSTRING]) 69 out.write(data) 70 71 out.write(struct.pack(symtabfmt,0,'')) 106 72 107 73 def main(): 108 if (len(sys.argv) != 4): 109 print("Usage: %s <kernel.map> <nm dump> <output.bin>" % sys.argv[0]) 110 return 1 111 112 kmapf = open(sys.argv[1], 'r') 113 obmapf = open(sys.argv[2], 'r') 114 out = open(sys.argv[3], 'wb') 115 116 generate(kmapf, obmapf, out) 117 118 kmapf.close() 119 obmapf.close() 120 out.close() 74 if len(sys.argv) != 4: 75 print "Usage: %s <kernel.map> <nm dump> <output.bin>" % sys.argv[0] 76 sys.exit(1) 77 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() 84 out.close() 121 85 122 86 if __name__ == '__main__': 123 sys.exit(main())87 main()
Note:
See TracChangeset
for help on using the changeset viewer.