При отображении стека вызовов, который содержит динамические библиотечные функции, я хочу знать фактическое расположение функций в стеке вызовов в библиотеках, а не адреса относительно сопоставленного адреса.
Я знаю, чтоЯ могу вручную вычислить это для каждого вызова, выполнив info shared
, а затем вычесть смещение для того места, где была отображена библиотека.Но есть ли автоматизированный способ сделать это?
Мне кажется, что это общая проблема, поэтому я просто чувствую, что должен быть кто-то, кто уже имел эту проблему и имеет готовое решение :),Я не нашел ни одного скрипта, который бы делал это, поэтому я публикую это.
Чтобы проиллюстрировать проблему в случае, если она не достаточно ясна выше:
Я установилточка останова в write()
и затем отображение стека вызовов с использованием bt
.
Breakpoint 2, 0x00007ffff7eb1790 in write () from /usr/lib/libc.so.6
(gdb) bt
#0 0x00007ffff7eb1790 in write () from /usr/lib/libc.so.6
#1 0x00007ffff7e4185d in _IO_new_file_write () from /usr/lib/libc.so.6
#2 0x00007ffff7e40bbf in new_do_write () from /usr/lib/libc.so.6
#3 0x00007ffff7e429d9 in __GI__IO_do_write () from /usr/lib/libc.so.6
#4 0x00007ffff7e42db3 in __GI__IO_file_overflow () from /usr/lib/libc.so.6
#5 0x00007ffff7e37be2 in puts () from /usr/lib/libc.so.6
#6 0x0000555555555050 in main ()
(gdb) info maps
Undefined info command: "maps". Try "help info".
(gdb) info shared
From To Syms Read Shared Object Library
0x00007ffff7fd5000 0x00007ffff7ff3784 Yes (*) /lib64/ld-linux-x86-64.so.2
0x00007ffff7de7450 0x00007ffff7f3083f Yes (*) /usr/lib/libc.so.6
(*): Shared library is missing debugging information.
(gdb)
Здесь я хочу преобразовать, например, #0 0x00007ffff7eb1790 in write () from /usr/lib/libc.so.6
в 0xca340
автоматически или фактически 0x22450 + 0xca340
, так как начинается раздел .text
в 0x22450
в этой библиотеке.