4,63 → 4,61 |
import struct |
import re |
|
symline = re.compile(r'(0x[a-f0-9]+)\s+([^\s]+)$') |
fileline = re.compile(r'[^\s]+\s+0x[a-f0-9]+\s+0x[a-f0-9]+\s+([^\s]+\.o)$') |
|
MAXSTRING=63 |
symtabfmt = "<Q%ds" % (MAXSTRING+1) |
|
def read_symbols(inp): |
while 1: |
line = inp.readline() |
if not line: |
return |
if 'memory map' in line: |
break |
|
symtable = {} |
filename = '' |
while 1: |
line = inp.readline() |
if not line.strip(): |
continue |
if line[0] not in (' ','.'): |
break |
objline = re.compile(r'([0-9a-f]+)\s+[lg]\s+F\s+\.text\s+[0-9a-f]+\s+(.*)$') |
fileexp = re.compile(r'([^\s]+):\s+file format') |
def read_obdump(inp): |
result = {} |
fname = '' |
for line in inp: |
line = line.strip() |
# Search for file name |
res = fileline.match(line) |
res = objline.match(line) |
if res: |
filename = res.group(1) |
# Search for symbols |
res = symline.match(line) |
result.setdefault(fname,[]).append((int(res.group(1),16), |
res.group(2))) |
res = fileexp.match(line) |
if res: |
symtable[int(res.group(1),16)] = filename + ':' + res.group(2) |
return symtable |
fname = res.group(1) |
continue |
|
def generate(inp, out): |
symtab = read_symbols(inp) |
if not symtab: |
print "Bad kernel.map format, empty." |
sys.exit(1) |
addrs = symtab.keys() |
addrs.sort() |
for addr in addrs: |
# Do not write address 0, it indicates end of data |
if addr == 0: |
continue |
data = struct.pack(symtabfmt,addr,symtab[addr][:MAXSTRING]) |
out.write(data) |
return result |
|
startfile = re.compile(r'\.text\s+(0x[0-9a-f]+)\s+0x[0-9a-f]+\s+(.*)$') |
def generate(kmapf, obmapf, out): |
obdump = read_obdump(obmapf) |
|
def sorter(x,y): |
return cmp(x[0],y[0]) |
|
for line in kmapf: |
line = line.strip() |
res = startfile.match(line) |
if res and obdump.has_key(res.group(2)): |
offset = int(res.group(1),16) |
fname = res.group(2) |
symbols = obdump[fname] |
symbols.sort(sorter) |
for addr,symbol in symbols: |
value = fname + ':' + symbol |
data = struct.pack(symtabfmt,addr+offset,value[:MAXSTRING]) |
out.write(data) |
|
out.write(struct.pack(symtabfmt,0,'')) |
|
def main(): |
if len(sys.argv) != 3: |
print "Usage: %s <kernel.map> <output.bin>" % sys.argv[0] |
if len(sys.argv) != 4: |
print "Usage: %s <kernel.map> <nm dump> <output.bin>" % sys.argv[0] |
sys.exit(1) |
|
inp = open(sys.argv[1],'r') |
out = open(sys.argv[2],'w') |
generate(inp,out) |
inp.close() |
kmapf = open(sys.argv[1],'r') |
obmapf = open(sys.argv[2],'r') |
out = open(sys.argv[3],'w') |
generate(kmapf,obmapf,out) |
kmapf.close() |
obmapf.close() |
out.close() |
|
if __name__ == '__main__': |