2010-02-16 7 views
30

Acabo de crear una biblioteca compartida en Ubuntu, y cuando intento utilizar la función, la aplicación que carga la biblioteca informa que no se ha encontrado el símbolo "xxx".Cómo enumerar las funciones exportadas en una biblioteca compartida en Ubuntu

Quiero verificar (es decir, enumerar) las funciones que mi biblioteca exporta para que pueda investigar más este problema.

detalles pertinentes:

OS: Ubuntu 9.10 compilador: gcc 4.4.1 enlazador: GNU ld 2,20

Respuesta

26

Pruebe la utilidad nm.

GNU nm lista los símbolos de objeto archivos objFile .... Si no hay archivos de objetos se enumeran como argumentos, nm asume el archivo a.out. [reference]

+15

** nm -C --defined-only -g libXXX.so ** para C++ –

+0

Gracias por eso. Parece que mi símbolo se exporta, pero no está definido (tiene una 'U' al lado del nombre de la función). ¿Cómo se puede exportar una función y aún no estar definida? (IIRC, una opción del vinculador previene este tipo de absentismo). Más importante aún, ¿qué puedo hacer para solucionarlo? –

+0

Al "Solucionarlo", quiero decir, ¿cómo puedo garantizar que mis funciones se exporten Y DEFINEN en la biblioteca compartida? –

2

¿Su biblioteca compartida está en la ruta de carga de la biblioteca o en la ruta de búsqueda de la aplicación en tiempo de ejecución? Parece que el vinculador dinámico no puede encontrar su biblioteca. Intente ejecutar ldd en su aplicación para ver si la biblioteca se puede encontrar en tiempo de ejecución, p.:

$ ldd /usr/bin/less 
    linux-gate.so.1 => (0x0072a000) 
    libncurses.so.5 => /lib/libncurses.so.5 (0x00c68000) 
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x007c7000) 
    libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x00286000) 
    /lib/ld-linux.so.2 (0x002a1000) 

Véase la página ld.so(8) hombre para obtener detalles adicionales sobre las rutas de búsqueda de la biblioteca.

19
nm -D -C -g <library> 

funciona bien también.

+1

Para las funciones _exported_ agregue la opción '--defined-only'; de lo contrario, también obtendrá las importaciones. Además, para obtener solo _funciones_ y no p. algo así como '_edata', deberías buscar los símbolos con' T' o 't' en la segunda columna. Entonces, algo como esto: 'nm -DCg --defined-only $ MY_LIB | grep '^ [0-9a-f] \ + [Tt]' ' – Ruslan

Cuestiones relacionadas