33 lines
980 B
Python
33 lines
980 B
Python
# Make assembly file from ELF symbols map
|
|
# Then link it to kernel so it's aware of symbol names
|
|
# then we can use that for the stack trace.
|
|
|
|
print("Extracting symbols from map file to assembly...")
|
|
|
|
with open("symbols.map", "r") as f:
|
|
lines = f.readlines()
|
|
|
|
symbols = []
|
|
for line in lines:
|
|
parts = line.split()
|
|
# output is formed like "address name"
|
|
symbols.append((parts[0], parts[1]))
|
|
|
|
with open("symbols.S", "w") as f:
|
|
f.write("section .rodata\n")
|
|
f.write("global symbol_table\n")
|
|
f.write("global symbol_count\n")
|
|
f.write("symbol_table:\n")
|
|
|
|
for i, (addr, name) in enumerate(symbols):
|
|
f.write(f" dq 0x{addr}\n")
|
|
f.write(f" dq sym_name_{i}\n")
|
|
|
|
f.write("\nsymbol_count: dq " + str(len(symbols)) + "\n\n")
|
|
|
|
for i, (addr, name) in enumerate(symbols):
|
|
# escaping quotes
|
|
safe_name = name.replace('"', '\\"')
|
|
f.write(f'sym_name_{i}: db "{safe_name}", 0\n')
|
|
|
|
print("Done!") |