2016-09-27 9 views
0

Ich arbeite an Red Hat Enterprise Linux Server Version 7.0 (Maipo). Der Server stellt OpenSSL 1.0.1 bereit. Beim Versuch, eine Verbindung zu OpenSSL herzustellen, erhalte ich viele Krypto-Fehler.Undefinierter Verweis auf `[email protected] '(und andere)

Hier ist meine Link-Befehl Befehlszeile (Reihenfolge wie in der Befehlszeile):

g++ -g -O2 -Wl,-rpath -o output file1.o libprivate_lib1.so -Lprivate_path -llib1 -ldl \ 
-lpthread -llib2 -lexpat -lgtest -lgtest_main -lboost_regex -lboost_filesystem -llzma \ 
-lcrypto private_lib2.so private_lib3.so -llib3 

Hier sind einige der Fehler sind:

/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssh2.so.1: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssh2.so.1: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssh2.so.1: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
... 

wenn ich laufe:

ll /usr/lib64/libcrypto.so 

Ich bekomme

/usr/lib64/libcrypto.so -> libcrypto.so.1.0.1e 

und beim Laufen:

objdump -tT /usr/lib64/libcrypto.so.1.0.1e | grep COMP_zlib 

ich

000000000013e500 g DF .text 0000000000000002 libcrypto.so.10 COMP_zlib_cleanup 
000000000013e460 g DF .text 000000000000009e libcrypto.so.10 COMP_zlib 

so bedeutet es, dass ich es in dieser Bibliothek haben. Das Merkwürdigste ist, dass es in redhat 6.5/4 verknüpfen kann, aber mit redhat über 7. keine Vorschläge?

+0

Die Frage ist unklar und es gibt viele mögliche Ursachen. Wir wissen nicht einmal, * was * Sie versuchen zu verknüpfen oder welche Versionen von welchen Tools Sie verwenden und wie Sie sie verwenden (z. B. CLI-Argumente) und so weiter. – ray

+0

Vielleicht haben Sie vergessen auf libcrypto zu verlinken? Fügen Sie das Verknüpfungs-Flag "-lcrypto" ** nach den Flags für die Verknüpfung mit libssl hinzu. Oder Sie versuchen, eine inkompatible Bibliothek zu verknüpfen, die Sie auf einem Computer kompiliert haben, der nicht mit Red Hat 7.0 kompatibel ist. Auf jeden Fall ist es eine gute Idee, Ihr Problem im Detail zu beschreiben, z. Zeigen Sie uns den tatsächlichen Befehl, den Sie ausgeführt haben, der diese Ausgabe erzeugt hat. – nos

+0

Ich verbinde mit crypto lib (hinzugefügt die Befehlszeile). Ich denke, es ist mit redhat 7. verwandt, weil es in der Lage ist, Redhat 6.5/4 zu kompilieren. – yehudahs

Antwort

0

Funktionen wie COMP_zlib und EVP_get_cipherbyname sind Teil der OPenSSL SSL-Bibliothek und nicht der Crypto-Bibliothek. Sie haben -lcrypto, aber sie erscheinen -lssl zu fehlen:

g++ -g -O2 -Wl,-rpath -o output file1.o libprivate_lib1.so -Lprivate_path -llib1 -ldl \ 
-lpthread -llib2 -lexpat -lgtest -lgtest_main -lboost_regex -lboost_filesystem -llzma \ 
-lssl -lcrypto private_lib2.so private_lib3.so -llib3 

Wennprivate_lib2.so private_lib3.so hängen von OpenSSL, dann -lssl -lcrypto Bedarf nach ihnen bewegt werden:

g++ -g -O2 -Wl,-rpath -o output file1.o libprivate_lib1.so -Lprivate_path -llib1 -ldl \ 
-lpthread -llib2 -lexpat -lgtest -lgtest_main -lboost_regex -lboost_filesystem -llzma \ 
-lcrypto private_lib2.so private_lib3.so -llib3 

Sie zu -lssl -lcrypto ändern sollte. Verwenden Sie private_lib2.so private_lib3.so -lssl -lcrypto.

Auch libssh muss fortfahren -lssl -lcrypto. Ich sehe nicht, wo es verlinkt ist, aber die Bibliothek könnte einen anderen Namen haben. Am Ende könnte es einfacher sein, die Bibliotheksliste zu verwenden.

Es könnte auch eine neuere oder andere Version von OpenSSL vorhanden sein, aber es ist anders konfiguriert. Zum Beispiel sieht es so aus, als ob Red Hat die Komprimierung entfernt (./configure no-comp ...), aber Header bringen Symbole wie COMP_zlib.

Ich denke, Ihr nächster Schritt ist: (1) zeigen Sie einen typischen Kompilierbefehl, und (2) geben Sie g++ -v, damit wir die Header-Suchpfade sehen können.

Eine letzte Sache zu beachten ist, dass Sie g++ verwenden, so dass die Verbindung standardmäßig extern "C++" ist. Es könnte ein jene alten OpenSSL-Header wird nicht über die üblichen:

#ifdef __cplusplus 
extern "C" { 
#endif 

... 

#ifdef __cplusplus 
} 
#endif 

Ich habe keinen Zugriff auf einen Red Hat-Server, so dass ich weiß nicht genau. Ich teste eine andere Bibliothek mit CentOS und Fedora, aber ich weiß, dass es gelegentlich Unterschiede gibt.

Verwandte Themen