6 votes

Comment détecter intelligemment les symboles non définis lors de la liaison d'un plugin sous GNU/Linux ?

J'ai un programme foo qui peut charger des plugins via dlopen() . Je suis en train d'écrire un tel plugin foobar qui s'interface avec une fonctionnalité fournie par une bibliothèque tierce. libfoo .

Sous Linux, je construis foobar comme ça :

gcc -fpic -c -o foobar.o foobar.c
gcc -fpic -shared -o foobar.so foobar.o -lbar

Jusqu'à présent, tout va bien.

Le problème est que cela ne permet pas de détecter les symboles non définis, par exemple en raison de bogues dans le code ou de disparités entre les fichiers d'en-tête et la bibliothèque. Le lien réussit, et vous n'obtenez une erreur que plus tard, lorsque vous chargez le plugin ou lorsque vous invoquez quelque chose dans le plugin (en fonction de l'option dlopen() drapeaux).

Pour détecter les symboles non définis dans une bibliothèque partagée, on utilise normalement -Wl,-z,defs ou peut-être -Wl,--no-allow-shlib-undefined . Mais cela échouera car cela signalera également les symboles qui sont censés se trouver dans le fichier foo au moment de l'exécution du programme. Je voudrais détecter les symboles non définis, sauf ceux fournis par le programme d'hébergement.

Sous Mac OS X, par exemple, cette opération est effectuée par la fonction -bundle_loader option. La commande de liaison équivalente serait

gcc -bundle -o foobar.so foobar.o -lbar -bundle_loader=foo

et qui détecte les symboles indéfinis de la manière que je veux.

Comment fait-on cela sous GNU/Linux ou avec GNU ld en général ? (J'ai regardé toutes les options listées sur la page d'accueil de GNU ld). ld page de manuel, mais aucune ne semblait prometteuse).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X