2013-08-12 11 views
7

Ho scritto app semplici con Openssl in C e C++. Li compilo in questo modo:Applicazione di collegamento statico con Openssl C/C++ [x86_x64]

gcc openssltest.c -o openssltest -lcrypto 
g++ openssltest.cpp -o openssltest -lcrypto 

E tutto ok ma solo, quando è installato Openssl.

Vorrei compilarlo in modo che possa essere eseguito su sistema operativo in cui non esiste un installend Openssl (sistema operativo simile a Linux). Ho provato questo:

gcc -c openssltest.c -lcrypto -static 
gcc openssltest.o -o openssltest -lcrypto -static 

e lo stesso per il C++:

g++ -c openssltest.cpp -lcrypto -static 
g++ openssltest.o -o openssltest -lcrypto -static 

ma hanno questi errori:

/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup': 
(.text+0x19): undefined reference to `dlopen' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup': 
(.text+0x2c): undefined reference to `dlsym' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup': 
(.text+0x37): undefined reference to `dlclose' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_func': 
(.text+0x354): undefined reference to `dlsym' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_func': 
(.text+0x3fb): undefined reference to `dlerror' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_var': 
(.text+0x474): undefined reference to `dlsym' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_var': 
(.text+0x52e): undefined reference to `dlerror' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_load': 
(.text+0x5a2): undefined reference to `dlopen' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_load': 
(.text+0x60b): undefined reference to `dlclose' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_load': 
(.text+0x638): undefined reference to `dlerror' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_pathbyaddr': 
(.text+0x6cd): undefined reference to `dladdr' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_pathbyaddr': 
(.text+0x731): undefined reference to `dlerror' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_unload': 
(.text+0x78a): undefined reference to `dlclose' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_free': 
(.text+0x4d): undefined reference to `inflateEnd' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_free': 
(.text+0x6b): undefined reference to `deflateEnd' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_ctrl': 
(.text+0x284): undefined reference to `deflate' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_ctrl': 
(.text+0x342): undefined reference to `zError' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `zlib_stateful_expand_block': 
(.text+0x411): undefined reference to `inflate' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `zlib_stateful_compress_block': 
(.text+0x4ca): undefined reference to `deflate' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `zlib_stateful_finish': 
(.text+0x51f): undefined reference to `inflateEnd' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `zlib_stateful_finish': 
(.text+0x528): undefined reference to `deflateEnd' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `zlib_stateful_init': 
(.text+0x5d7): undefined reference to `inflateInit_' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `zlib_stateful_init': 
(.text+0x659): undefined reference to `deflateInit_' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_read': 
(.text+0x893): undefined reference to `inflate' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_read': 
(.text+0x90d): undefined reference to `zError' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_read': 
(.text+0x97c): undefined reference to `inflateInit_' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_write': 
(.text+0xa6f): undefined reference to `deflate' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_write': 
(.text+0xaec): undefined reference to `zError' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_write': 
(.text+0xb7e): undefined reference to `deflateInit_' 
collect2: error: ld returned 1 exit status 

Come posso fare questo? Ricordo che un po 'di tempo fa l'ho fatto ma ora, ehm, ho dimenticato come si fa. Im su Ubuntu 13.04 x64 - può essere un problema?

+0

provare aggiungere '' -ldl -lz – billz

+0

@billz: 'gcc -o -static openssltest openssltest.c -ldl -lz -lcrypto' dà gli stessi errori che ho postato – yak

+1

-ldl -lz dovrebbe essere dopo -lcrypto – billz

risposta

0

Un hotfix: prova a collegare anche in libdl staticamente.

Se questo non funziona, IMHO il tuo libcrypto.a è male compilato.

-2

Ho avuto lo stesso problema di te. Ecco il comando che ha risolto per me:

gcc yourfile.c -o yourfile -static -lcrypto -lz -ldl 

genera questo avvertimento:

/usr/lib/gcc/i686-linux-gnu/4.7/../../../i386-linux-gnu/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup': (.text+0x1b): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking 

ma l'eseguibile funziona ancora.

+0

Finché avrai la libgcc/libc libs prontamente disponibile sul tuo dispositivo di destinazione, sicuro che funzionerà, ma se non sei condannato. Quindi in effetti significa che il binario non è completamente statico, anche questa non è una soluzione. – drahnr

+0

Si dice "certo che funzionerà" e si concluderà con "questa non è una soluzione". Nel mio libro, se qualcosa funziona, è una soluzione. – schulwitz

+0

Perché precludi qualcosa che non è ovvio. Non tutti i sistemi (specialmente quelli incorporati) non includono necessariamente libgcc. Si noti che "sure it will work" fa parte di un'istruzione "if". – drahnr

1

È necessario essere consapevoli del fatto che le librerie devono essere disponibili come file * .a collegati in modo statico. Se non lo sono, la compilazione fallirà o finirai con un eseguibile collegato dinamicamente.

Se questo diventa troppo pita (tutte le librerie dipendenze devono essere compilati staticamente a, e le loro dipendenze troppo e così via) usare qualcosa come buildroot

2

Ho avuto un problema simile si cerca di compilare staticamente un semplice DES programma che usa la lib di openssl. Ho usato "-lcrypto -lz -ldl -static-libgcc" e ha funzionato per me. Nessun avviso o errore.

+0

funziona, grazie! puoi aggiornare la tua risposta, per dire che l'ordine è pertinente. – Zskdan