Ho un programma foo
che può caricare i plugin tramite dlopen()
. Sto scrivendo uno di questi plugin foobar
che si interfaccia alla funzionalità fornita da una libreria di terze parti libfoo
.Come rilevare in modo intelligente i simboli non definiti quando si collega un plugin su GNU/Linux?
Su Linux, sto costruendo foobar
come questo:
gcc -fpic -c -o foobar.o foobar.c
gcc -fpic -shared -o foobar.so foobar.o -lbar
Fin qui tutto bene.
Il problema è che questo non rileva i simboli non definiti, ad esempio a causa di errori nel codice o mancate corrispondenze tra i file di intestazione e la libreria. Il collegamento ha esito positivo e in seguito viene visualizzato un errore solo quando si carica il plug-in o quando si richiama qualcosa nel plug-in (in base ai flag dlopen()
).
Per rilevare simboli non definiti in una libreria condivisa, si utilizza normalmente -Wl,-z,defs
o -Wl,--no-allow-shlib-undefined
. Ma questo fallirà perché riporterà anche i simboli che dovrebbero essere trovati nel programma foo
in fase di esecuzione. Vorrei rilevare i simboli non definiti ad eccezione di quelli forniti dal programma di hosting.
Su Mac OS X, ad esempio, questo viene fatto dall'opzione -bundle_loader
. Il comando di collegamento equivalente sarebbe
gcc -bundle -o foobar.so foobar.o -lbar -bundle_loader=foo
e che rileva i simboli non definiti nel modo in cui desidero.
Come si fa su GNU/Linux o GNU ld in generale? (Ho esaminato tutte le opzioni elencate nella pagina man ld
, ma nessuna sembrava promettente.)