2010-05-03 13 views
5

¿Existe una utilidad de linux integrada que pueda usar para probar una biblioteca compartida recién compilada para referencias externas indefinidas? Gcc parece ser lo suficientemente inteligente como para buscar símbolos indefinidos en mi propio binario, pero si el símbolo es una referencia a otra biblioteca, gcc no comprueba en el tiempo del enlace. En cambio, solo recibo el mensaje cuando intento vincular mi nueva biblioteca desde otro programa.Prueba de referencias externas indefinidas en Linux

Parece un poco tonto obtener mensajes de referencia indefinidos en una biblioteca cuando estoy compilando un proyecto diferente, así que quiero saber si puedo verificar todas las referencias internas y externas cuando construyo la biblioteca no cuando enlace lo.

Ejemplo de error:

make -C UnitTests debug 
make[1]: Entering directory `~/projects/Foo/UnitTests` 
g++ [ tons of objects ] -L../libbar/bin -lbar -o UnitTests 
libbar.so: undefined reference to `DoSomethingFromAnotherLibrary` 
collect2: ld returned 1 exit status 
make[1]: *** [~/projects/Foo/UnitTests] Error 1 

Respuesta

2

Por lo general, las referencias no definidas se permite cuando la vinculación de objetos compartidos, pero se puede hacer que el enlazador genera un error si hay símbolos no definidos en los archivos objeto que se está vinculando a crear la biblioteca compartida suministrando -z defs al enlazador (o equivalentemente -Wl,-z,defs en el comando gcc que llama al enlazador).

+0

jaja, brillante. ¡Ahora puedo decir quién llama a la función indefinida al compilar la biblioteca! Mucho mejor que un mensaje genérico cuando se vincula a la biblioteca. ¡Aclamaciones! Tengo curiosidad por saber por qué permite los elementos externos no resueltos en bibliotecas compartidas ahora ... – Charles

+1

@Charles: es posible (si no es usual) tener símbolos de objetos compartidos resueltos por símbolos en los archivos de objetos en el ejecutable, así '-z defs' podría no siempre se lo que quieras. También es posible que la versión de la biblioteca usada en el tiempo del enlace final no sea la versión utilizada en el enlace final o tiempo de carga, por lo que el enlace final podría funcionar incluso si '-z defs' hubiera generado un error en el proceso de compilación. En la mayoría de las situaciones donde he creado objetos compartidos, '-z defs' funciona y es útil. –

Cuestiones relacionadas