Errori che si riferiscono a una serie di simboli OpenSSL irrisolti che esistono chiaramente?

Sto costruendo una libreria condivisa (la chiameremo “pippo”) che fa uso di un’altra libreria (la chiameremo “bar”). “bar” utilizza alcune funzioni di OpenSSL.

Ecco dove il problema emerge.

“bar” è stato compilato come libreria statica e sembrerebbe che fosse OpenSSL. Quindi quando collego la libreria (“pippo”), includo il:

  • file object per “foo”
  • libreria statica libbar.a
  • Librerie statiche OpenSSL libcrypto.a e libssl.a

Il comando build 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, ottengo un sacco di errori:

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

    Eseguendo il seguente comando:

     nm libssl.a | grep SSL_library_init 

    Produce il seguente risultato:

     00000000 T SSL_library_init 

    Quindi ovviamente non c’è niente di sbagliato con le librerie OpenSSL. Cosa potrebbe aver causato qualcosa di simile? Ecco i tre comandi usati per creare OpenSSL:

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

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

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

    Il problema è stato causato dall’ordine delle librerie nel comando di collegamento. libcrypto.a l’ordine di libcrypto.a e libssl.a risolti tutti i simboli.

    GCC utilizza LD per impostazione predefinita e un linker a passaggio singolo. Quando hai due librerie, come libssl e libcrypto collegate in un ordine particolare, vuol dire che libssl dipende dai simboli di libcrypto . Pertanto, libssl deve precedere libcrypto (o libcrypto deve seguire libssl ). Non dovrebbe sorprendere che libssl si libssl su libcrypto poiché libcrypto fornisce la crittografia usata da libssl .