2011-04-06 18 views
10
[[email protected] memcached-1.4.5]# objdump -R memcached-debug |grep freeaddrinfo 
0000000000629e10 R_X86_64_JUMP_SLOT freeaddrinfo 

...¿Cómo saber en qué biblioteca se define una función específica?

(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 

así que sé freeaddrinfo es una función de enlace dinámico, pero cómo saber qué .so se define en?

+0

¿En serio necesita revisar sus preguntas y aceptar algunas respuestas. – karlphillip

Respuesta

8

Ver esto answer. El info symbol freeadrinfo es una forma de averiguarlo.

En Linux y Solaris también puede usar ldd y LD_DEBUG=symbols. Por ejemplo, si usted quiere averiguar dónde localtime en /bin/date proviene de:

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] 
+0

¿Puedes elaborar más detalles sobre cómo funciona este comando? – compiler

+0

Eso es increíble. ¡Muchas gracias por esto! –

0

Dentro del directorio bibliotecas sea posible ejecutar el siguiente comando para buscar un símbolo específico en todas las bibliotecas:

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

Una versión mejorada sería una lista de todas las bibliotecas que están vinculadas al ejecutable (a través de ldd) y vaya después de cada biblioteca enumerada buscando si el símbolo está definido allí. Dependiendo de su * nix puede que tenga que retocar el corte análisis:

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; 
+0

Respuesta mejorada. – karlphillip

+1

Su primera versión puede reducirse mucho si usa 'nm -A'. Y $ (ls -1 * .so) es completamente falso - *. También hubiera funcionado igual de bien. –

1

Por cierto versión de bajo GDB, "símbolo de información" no podía trabajar como desee.

Así que por favor utilice a continuación el método:

  1. Run 'p symbol_name' para obtener la dirección símbolo

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

  2. Compruebe/proc/PID/mapas para averiguar el módulo donde está la dirección del símbolo.

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

    0x84bcc4 está en [007ce000, 0085f000]

Cuestiones relacionadas