Tengo un programa, myprogram
, que está vinculado con una biblioteca de conveniencia estática, llámelo libconvenience.a
, que contiene una función, func()
. La función func()
no se llama en ningún lugar en myprogram
; debe poder invocarse desde una biblioteca de complementos, plugin.so
.Símbolos de la biblioteca de conveniencia no se exportan en el ejecutable
El símbolo func()
no se está exportando dinámicamente en myprogram
. Si ejecuto
nm myprogram | grep func
No obtengo nada. Sin embargo, no está ausente de libconvenience.a
:
nm libconvenience/libconvenience.a | grep func
00000000 T func
estoy usando automake, pero si lo hago el último paso vinculación con la mano en la línea de comandos en su lugar, no funciona bien:
gcc -Wl,--export-dynamic -o myprogram *.o libconvenience/libconvenience.a `pkg-config --libs somelibraries`
sin embargo, si puedo enlazar el programa como este, pasando por alto el uso de una biblioteca de conveniencia y la vinculación de los archivos de objetos que han entrado en libconvenience.a
directamente, func()
muestra en myprogram
's símbolos como debería:
gcc -Wl,--export-dynamic -o myprogram *.o libconvenience/*.o `pkg-config --libs somelibraries`
Si añado una llamada ficticia a func()
en algún lugar de myprogram
, entonces func()
muestra también en myprogram
' s símbolos. ¡Pero pensé que se suponía que --export-dynamic
debía exportar todos los símbolos independientemente de si se usaban en el programa o no!
estoy usando automake 1.11.1 y 4.5.1 gcc en Fedora 14. También estoy usando Libtool 2.2.10 para construir plugin.so
(pero no la biblioteca de conveniencia.)
que no se olvide de poner -Wl,--export-dynamic
en myprogram_LDFLAGS
, ni se me olvidó poner la fuente que contiene func()
en libconvenience_a_SOURCES
(algunas google sugiere que estos son causas comunes de este problema.)
Puede alguien ayudarme a entender lo que está pasando aquí?
Es cierto, pero necesito explícitamente func _NO_ a estar en el complemento, porque func es parte de una API que necesitan varios complementos para llamar. Los complementos fueron escritos en otra parte y estoy tratando de evitar modificaciones locales a ellos. – ptomato