Tengo un programa foo
que puede cargar complementos a través de dlopen()
. Estoy escribiendo uno de esos complementos foobar
que interactúa con la funcionalidad proporcionada por una biblioteca de terceros libfoo
.¿Cómo detectar inteligentemente símbolos indefinidos cuando se vincula un complemento en GNU/Linux?
En Linux, estoy construyendo foobar
así:
gcc -fpic -c -o foobar.o foobar.c
gcc -fpic -shared -o foobar.so foobar.o -lbar
Hasta aquí todo bien.
El problema es que esto no detecta símbolos indefinidos, por ejemplo, debido a errores en el código o desajustes entre los archivos de encabezado y la biblioteca. El enlace tiene éxito, y solo se obtiene un error más adelante cuando carga el complemento o cuando invoca algo en el complemento (dependiendo de los indicadores dlopen()
).
Para detectar símbolos indefinidos en una biblioteca compartida, uno normalmente usaría -Wl,-z,defs
o quizás -Wl,--no-allow-shlib-undefined
. Pero esto fallará porque también informará los símbolos que se supone que se encuentran en el programa foo
en tiempo de ejecución. Me gustaría detectar símbolos indefinidos, excepto los proporcionados por el programa de alojamiento.
En Mac OS X, por ejemplo, esto se hace mediante la opción -bundle_loader
. El comando de enlace equivalente sería
gcc -bundle -o foobar.so foobar.o -lbar -bundle_loader=foo
y detecta símbolos indefinidos de la manera que yo quiero.
¿Cómo se hace esto en GNU/Linux o con GNU ld en general? (He examinado todas las opciones enumeradas en la página del manual ld
, pero ninguna parecía prometedora.)