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