¿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
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
@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. –