2012-08-28 8 views
5

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

risposta

0

Non c'è modo che io sappia fare questo. Tuttavia, se la struttura di "foo" è sotto il tuo controllo, è possibile spostare tutta la logica in "foo" in una nuova libreria condivisa che esporta i simboli appropriati e quindi collegare entrambi i plugin e la linea principale con quella libreria.

Problemi correlati