2012-08-28 23 views
5

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.)

Respuesta

0

No hay forma de que yo sepa hacer esto. Sin embargo, si la estructura de 'foo' está bajo su control, podría mover toda la lógica en 'foo' a una nueva biblioteca compartida que exporte los símbolos apropiados, y luego vincular tanto sus plugins como la línea principal con esa biblioteca.

Cuestiones relacionadas