2011-08-31 1 views
10

Sto provando a creare una libreria di oggetti condivisa che verrà aperta da un programma usando dlopen(). Questa libreria utilizzerà la funzionalità fornita da una libreria separata che è statica.Come forzare i simboli da una libreria statica da includere in una build di libreria condivisa?

Ho incluso il flag appropriato sulla linea di collegamento per inserire la libreria statica quando si collega quello dinamico (ad esempio ho -lfoo per libfoo.a) e il linker non si lamenta. Tuttavia, quando il programma principale chiama dlopen() sulla libreria dinamica, la chiamata fallisce con un messaggio "simbolo non definito" che fa riferimento a un simbolo dalla libreria statica.

L'esecuzione di nm indica che il simbolo in questione non è definito nella libreria dinamica e il programma principale non lo contiene, quindi come posso forzare il linker a inserire questo simbolo? Il simbolo stesso si trova nella sezione dati non inizializzata (tipo di simbolo "B" nell'output nm).

risposta

14

L'opzione di collegamento --whole-archive deve essere eseguita. Lo useresti come ad es.

gcc -o libmyshared.so foo.o -lanothersharedlib -Wl,--whole-archive -lmystaticlib 

quello che stai vivendo è che per impostazione predefinita, il linker cercherà simboli in un archivio statico che il binario si produce bisogni, e se ha bisogno di uno, che sarà includere l'intero .o che la il simbolo risiede dentro. Se la tua libreria condivisa non ha bisogno di nessuno dei simboli, questi non saranno inclusi nella tua lib condivisa.

Ricordare che il codice che diventa una libreria condivisa deve essere compilato con opzioni speciali, come -fpic, poiché si include una libreria statica nella libreria condivisa, la libreria statica deve essere compilata con le stesse opzioni.

8

Recentemente stavo cercando la soluzione per lo stesso. Ho trovato usando

--undefined=symbol 

o

-u symbol 

risolve il problema.

+0

La risposta '--whole-archive' trasformerà tutti i simboli nell'archivio in simboli esportati nella libreria condivisa. Se hai solo bisogno di un simbolo, questa risposta crea molto meno rigonfiamento nel tuo .so. – MuertoExcobito

4

Un altro hack è prendere l'indirizzo della funzione da qualche parte durante l'inizializzazione della libreria. Questo assicurerà che tu effettivamente usi il simbolo.

+3

Per il downvoter: ho detto "hack" – user877329