2013-03-10 11 views
6

Sto costruendo una libreria condivisa (chiameremo "pippo") che fa uso di un'altra libreria (la chiameremo "barra"). "bar" utilizza alcune funzioni di OpenSSL.Errori che si riferiscono a una serie di simboli OpenSSL irrisolti che esistono chiaramente?

Ecco dove si presenta il problema.

"bar" è stato compilato come libreria statica e sembrerebbe che fosse OpenSSL. Così, quando ho linkare la libreria ("foo"), includo il:

  • file oggetto per "foo"
  • libreria statica libbar.a
  • OpenSSL librerie statiche libcrypto.a e libssl.a

Il il comando di compilazione ha un aspetto simile al seguente:

g++ -Wl,-soname,libfoo.so -shared file1.o file2.o libbar.a \ 
    libcrypto.a libssl.a -o libfoo.so 

Tuttavia, Ho un sacco di errori:

ld: ./obj/libbar.a(file1.c.o): in function initialize_openssl: 
    ssl.c:117: error: undefined reference to 'SSL_library_init' 

eseguendo il comando seguente:

nm libssl.a | grep SSL_library_init 

produce il seguente output:

00000000 T SSL_library_init 

Così, ovviamente, non c'è niente di sbagliato con le librerie OpenSSL. Cosa potrebbe aver causato qualcosa di simile? Ecco i tre comandi utilizzati per costruire OpenSSL:

export cross=arm-linux-androideabi- 
./Configure android --prefix=~/openssl-arm 
make CC="${cross}gcc" AR="${cross}ar r" RANLIB="${cross}ranlib" 

Il processo di compilazione completato senza errori, quindi sono assolutamente sconcertato.

Perché ricevo errori di linker che si riferiscono a una serie di simboli OpenSSL che esistono chiaramente?

risposta

3

Il problema è stato causato dall'ordine delle librerie nel comando di collegamento. L'ordine di libcrypto.a e libssl.a ha risolto tutti i simboli.

GCC utilizza LD per impostazione predefinita ed è un linker a passaggio singolo. Quando hai due librerie, come libssl e libcrypto collegate in un ordine particolare, significa che libssl dipende dai simboli da libcrypto. Pertanto, libssl deve precedere libcrypto (oppure libcrypto deve seguire libssl). Non dovrebbe essere una sorpresa libssl si basa su libcrypto dal libcrypto fornisce la crittografia utilizzata da libssl.

+1

Sto indovinando perché il compilatore/linker apprende i simboli in un ordine lineare e se si verifica una condizione di fuori servizio, allora barfs. Potrebbe anche essere inversamente lineare (anticipando la barra a seconda di foo e le tue costruzioni di dipendenza costruite all'indietro). – RobotHumans