https://stackoverflow.com/questions/20380204/how-to-load-multiple-symbol-files-in-gdb
python
# Note: Replace "readelf" with path to binary if it is not in your PATH.
READELF_BINARY = 'readelf'
class AddSymbolFileAuto (gdb.Command):
"""Load symbols from FILE, assuming FILE has been dynamically loaded (auto-address).
Usage: add-symbol-file-auto FILE [-readnow | -readnever]
The necessary starting address of the file's text is resolved by 'readelf'."""
def __init__(self):
super(AddSymbolFileAuto, self).__init__("add-symbol-file-auto", gdb.COMMAND_FILES)
def invoke(self, solibpath, from_tty):
from os import path
self.dont_repeat()
if path.exists(solibpath) == False:
print ("{0}: No such file or directory." .format(solibpath))
return
offset = self.get_text_offset(solibpath)
gdb_cmd = "add-symbol-file %s %s" % (solibpath, offset)
print (f"{gdb_cmd = }")
gdb.execute(gdb_cmd, from_tty)
def get_text_offset(self, solibpath):
import subprocess
elfres = subprocess.check_output([READELF_BINARY, "-WS", solibpath]).decode()
for line in elfres.splitlines():
if "] .text " in line:
return "0x" + line.split()[4]
raise Exception("Offset to .text not found :( ")
#return "" # TODO: Raise error when offset is not found?
def complete(self, text, word):
return gdb.COMPLETE_FILENAME
AddSymbolFileAuto()
endExample with ubuntu's libc, what you need:
- libc-2.27.so <- the stripped library used normally by the system
- libc-2.27.so.debug <- the separate elf containing only debug informations
- eu-unstrip libc-2.27.so libc-2.27.so.debug says gibberish
Solution: gdb binary.elf -ex "add-symbol-file-auto libc-2.27.so.debug"