mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-25 14:04:36 +00:00
92 lines
2.5 KiB
Plaintext
92 lines
2.5 KiB
Plaintext
# Usage: add-symbol-file-all <filename> [<offset>]
|
|
# remove-symbol-file-all <filename> [<offset>]
|
|
#
|
|
# Credit: https://stackoverflow.com/a/33087762/9352057
|
|
# CC BY-SA 4.0
|
|
|
|
python
|
|
import subprocess
|
|
import re
|
|
|
|
def relocatesections(filename, addr):
|
|
p = subprocess.Popen(["readelf", "-S", filename], stdout = subprocess.PIPE)
|
|
|
|
sections = []
|
|
textaddr = '0'
|
|
for line in p.stdout.readlines():
|
|
line = line.decode("utf-8").strip()
|
|
if not line.startswith('[') or line.startswith('[Nr]'):
|
|
continue
|
|
|
|
line = re.sub(r' +', ' ', line)
|
|
line = re.sub(r'\[ *(\d+)\]', '\g<1>', line)
|
|
fieldsvalue = line.split(' ')
|
|
fieldsname = ['number', 'name', 'type', 'addr', 'offset', 'size', 'entsize', 'flags', 'link', 'info', 'addralign']
|
|
sec = dict(zip(fieldsname, fieldsvalue))
|
|
|
|
if sec['number'] == '0':
|
|
continue
|
|
|
|
sections.append(sec)
|
|
|
|
if sec['name'] == '.text':
|
|
textaddr = sec['addr']
|
|
|
|
return (textaddr, sections)
|
|
|
|
|
|
class AddSymbolFileAll(gdb.Command):
|
|
"""The right version for add-symbol-file"""
|
|
|
|
def __init__(self):
|
|
super(AddSymbolFileAll, self).__init__("add-symbol-file-all", gdb.COMMAND_USER)
|
|
self.dont_repeat()
|
|
|
|
def invoke(self, arg, from_tty):
|
|
argv = gdb.string_to_argv(arg)
|
|
filename = argv[0]
|
|
|
|
if len(argv) > 1:
|
|
offset = int(str(gdb.parse_and_eval(argv[1])), 0)
|
|
else:
|
|
offset = 0
|
|
|
|
(textaddr, sections) = relocatesections(filename, offset)
|
|
|
|
cmd = "add-symbol-file %s 0x%08x" % (filename, int(textaddr, 16) + offset)
|
|
|
|
for s in sections:
|
|
addr = int(s['addr'], 16)
|
|
if s['name'] == '.text' or addr == 0:
|
|
continue
|
|
|
|
cmd += " -s %s 0x%08x" % (s['name'], addr + offset)
|
|
|
|
gdb.execute(cmd)
|
|
|
|
class RemoveSymbolFileAll(gdb.Command):
|
|
"""The right version for remove-symbol-file"""
|
|
|
|
def __init__(self):
|
|
super(RemoveSymbolFileAll, self).__init__("remove-symbol-file-all", gdb.COMMAND_USER)
|
|
self.dont_repeat()
|
|
|
|
def invoke(self, arg, from_tty):
|
|
argv = gdb.string_to_argv(arg)
|
|
filename = argv[0]
|
|
|
|
if len(argv) > 1:
|
|
offset = int(str(gdb.parse_and_eval(argv[1])), 0)
|
|
else:
|
|
offset = 0
|
|
|
|
(textaddr, _) = relocatesections(filename, offset)
|
|
|
|
cmd = "remove-symbol-file -a 0x%08x" % (int(textaddr, 16) + offset)
|
|
gdb.execute(cmd)
|
|
|
|
|
|
AddSymbolFileAll()
|
|
RemoveSymbolFileAll()
|
|
end
|