Как узнать, в какой библиотеке определена определенная функция? - PullRequest
10 голосов
/ 06 апреля 2011
[root@xxx memcached-1.4.5]# objdump -R memcached-debug |grep freeaddrinfo
0000000000629e10 R_X86_64_JUMP_SLOT  freeaddrinfo

...

(gdb) disas freeaddrinfo
Dump of assembler code for function freeaddrinfo:
0x00000037aa4baf10 <freeaddrinfo+0>:    push   %rbp
0x00000037aa4baf11 <freeaddrinfo+1>:    push   %rbx
0x00000037aa4baf12 <freeaddrinfo+2>:    mov    %rdi,%rbx

Итак, я знаю, freeaddrinfo - это динамически связанная функция, но как узнать, в каком .so она определена?

Ответы [ 3 ]

8 голосов
/ 06 апреля 2011

См. ответ .info symbol freeadrinfo - это один из способов выяснить.

В Linux и Solaris вы также можете использовать ldd и LD_DEBUG=symbols.Например, если вы хотите выяснить, откуда исходит localtime в /bin/date:

LD_DEBUG=bindings ldd -r /bin/date 2>&1 |  grep localtime
     26322: binding file /bin/date [0] to /lib/libc.so.6 [0]: normal symbol `localtime' [GLIBC_2.2.5]
2 голосов
/ 06 декабря 2016

Для некоторых младших версий GDB "символ информации" может работать не так, как вы хотите.

Поэтому, пожалуйста, используйте ниже метод:

  1. Запустите 'p symbol_name', чтобы получить адрес символа

    (gdb) p test_fun $1 = {<text variable, no debug info>} 0x84bcc4 <test_fun>

  2. Проверьте / proc / PID / maps, чтобы определить модуль, в котором находится символьный адрес.

    # more /proc/23275/maps 007ce000-0085f000 r-xp 00000000 fd:00 3524598 /usr/lib/libtest.so

    0x84bcc4 находится в [007ce000, 0085f000]

0 голосов
/ 06 апреля 2011

Внутри каталога библиотек вы можете выполнить следующую команду для поиска определенного символа во всех библиотеках:

for file in $(ls -1 *.so); do echo "-------> $file"; nm $file; done | c++filt | grep SYMBOL*

Расширенная версия будет содержать список всех библиотек, которые связаны с исполняемым файлом (через ldd ) и переходите к поиску каждой из перечисленных библиотек, если там определен символ.В зависимости от вашего * nix вам, возможно, придется настроить синтаксический анализ cut :

APP=firefox; for symbol in $(nm -D $APP | grep "U " | cut -b12-); do for library in $(ldd $APP | cut -d ' ' -f3- | cut -d' ' -f1); do for lib_symbol in $(nm -D $library | grep "T " | cut -b12-); do if [ $symbol == $lib_symbol ]; then echo "Found symbol: $symbol at [$library]"; fi ; done; done; done;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...