Undefined Reference bei Library-Funktionen [solved]
-
Hallo zusammen,
ich will DTLS nutzen, was nur die neuste OpenSSL-Version (0.9.8) unterstützt.
Leider gibt es diese nicht als package für Gentoo, also hab ich die alte Version erstmal von meinem System gelöscht und die neuste Version von openssl.net heruntergeladen.
Dann:./config make make test make install
So weit so gut.
Jetzt will ich aber ein Programm [1] kompilieren, aber ich kriege immer folgende Fehler:# gcc -lssl withdtls.c -I/usr/local/ssl/include/ -L /usr/local/ssl/lib/ /tmp/ccbgPMmj.o(.text+0x1b): In function `main': : undefined reference to `ERR_load_BIO_strings' /tmp/ccbgPMmj.o(.text+0x20): In function `main': : undefined reference to `SSL_load_error_strings' /tmp/ccbgPMmj.o(.text+0x25): In function `main': : undefined reference to `OPENSSL_add_all_algorithms_noconf' /tmp/ccbgPMmj.o(.text+0x2a): In function `main': : undefined reference to `DTLSv1_client_method' /tmp/ccbgPMmj.o(.text+0x32): In function `main': : undefined reference to `SSL_CTX_new' /tmp/ccbgPMmj.o(.text+0x50): In function `main': : undefined reference to `SSL_CTX_load_verify_locations' /tmp/ccbgPMmj.o(.text+0x76): In function `main': : undefined reference to `ERR_print_errors_fp' /tmp/ccbgPMmj.o(.text+0x81): In function `main': : undefined reference to `SSL_CTX_free' /tmp/ccbgPMmj.o(.text+0x9b): In function `main': : undefined reference to `BIO_new_ssl_connect' /tmp/ccbgPMmj.o(.text+0xc0): In function `main': : undefined reference to `BIO_ctrl' /tmp/ccbgPMmj.o(.text+0xe3): In function `main': : undefined reference to `SSL_ctrl' /tmp/ccbgPMmj.o(.text+0x106): In function `main': : undefined reference to `BIO_ctrl' /tmp/ccbgPMmj.o(.text+0x129): In function `main': : undefined reference to `BIO_ctrl' /tmp/ccbgPMmj.o(.text+0x14f): In function `main': : undefined reference to `ERR_print_errors_fp' /tmp/ccbgPMmj.o(.text+0x15a): In function `main': : undefined reference to `BIO_free_all' /tmp/ccbgPMmj.o(.text+0x165): In function `main': : undefined reference to `SSL_CTX_free' /tmp/ccbgPMmj.o(.text+0x17f): In function `main': : undefined reference to `SSL_get_verify_result' /tmp/ccbgPMmj.o(.text+0x18e): In function `main': : undefined reference to `SSL_get_verify_result' /tmp/ccbgPMmj.o(.text+0x1b2): In function `main': : undefined reference to `BIO_free_all' /tmp/ccbgPMmj.o(.text+0x1bd): In function `main': : undefined reference to `SSL_CTX_free' /tmp/ccbgPMmj.o(.text+0x1ed): In function `main': : undefined reference to `BIO_write' /tmp/ccbgPMmj.o(.text+0x20a): In function `main': : undefined reference to `BIO_read' /tmp/ccbgPMmj.o(.text+0x244): In function `main': : undefined reference to `BIO_free_all' /tmp/ccbgPMmj.o(.text+0x24f): In function `main': : undefined reference to `SSL_CTX_free' collect2: ld returned 1 exit status
In dem Verzeichnis /usr/local/ssl/lib/ existieren folgende Dateien:
# ls -l /usr/local/ssl/lib/ insgesamt 2482 drwxr-xr-x 2 root root 48 30. Aug 22:08 engines -rw-r--r-- 1 root root 2186542 30. Aug 23:39 libcrypto.a -rw-r--r-- 1 root root 349276 30. Aug 23:39 libssl.a drwxr-xr-x 2 root root 144 30. Aug 22:08 pkgconfig
Achja, hier ist noch das Programm [1]:
#include "openssl/ssl.h" #include "openssl/bio.h" #include "openssl/err.h" #include "stdio.h" #include "string.h" int main() { BIO * bio; SSL * ssl; SSL_CTX * ctx; int p; char * request = "GET / HTTP/1.1\x0D\x0AHost: www.verisign.com\x0D\x0A\x43onnection: Close\x0D\x0A\x0D\x0A"; char r[1024]; /* Set up the library */ ERR_load_BIO_strings(); SSL_load_error_strings(); OpenSSL_add_all_algorithms(); /* Set up the SSL context */ ctx = SSL_CTX_new(DTLSv1_client_method()); /* Load the trust store */ if(! SSL_CTX_load_verify_locations(ctx, "TrustStore.pem", NULL)) { fprintf(stderr, "Error loading trust store\n"); ERR_print_errors_fp(stderr); SSL_CTX_free(ctx); return 0; } /* Setup the connection */ bio = BIO_new_ssl_connect(ctx); /* Set the SSL_MODE_AUTO_RETRY flag */ BIO_get_ssl(bio, & ssl); SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY); /* Create and setup the connection */ BIO_set_conn_hostname(bio, "localhost:1111"); if(BIO_do_connect(bio) <= 0) { fprintf(stderr, "Error attempting to connect\n"); ERR_print_errors_fp(stderr); BIO_free_all(bio); SSL_CTX_free(ctx); return 0; } /* Check the certificate */ if(SSL_get_verify_result(ssl) != X509_V_OK) { fprintf(stderr, "Certificate verification error: %i\n", SSL_get_verify_result(ssl)); BIO_free_all(bio); SSL_CTX_free(ctx); return 0; } /* Send the request */ BIO_write(bio, request, strlen(request)); /* Read in the response */ for(;;) { p = BIO_read(bio, r, 1023); if(p <= 0) break; r[p] = 0; printf("%s", r); } /* Close the connection and free the context */ BIO_free_all(bio); SSL_CTX_free(ctx); return 0; }
Hat jemand ne Idee, woran das liegen könnte?
-
Versuch erst die .o Datei anzugeben und dann die Library.
-
würde folgendes versuchen
gcc withdtls.c -I/usr/local/ssl/include/ -L/usr/local/ssl/lib/ -lssl -lcrypto
vielleicht sind die fehlenden funktionen in libcrypto.a
Ponto schrieb:
Versuch erst die .o Datei anzugeben und dann die Library.
bei seinen compileraufruf ( compilieren und linken in einem ) hängt der compiler die .o automatisch hinten an. Muss trotzdem funktionieren.
Kurt
-
Leider hat das auch nicht funktioniert.
Ich krieg immer noch die selben Fehler.
-
Mir fehlt nichts ein. Vielleicht hast du die SSL-lib ohne die Unterstützung eines Features? Oder eine veraltete Version? Wie wäre es, wenn du die letzte stable Version neu installierst?
-
Ich würde jetzt mal nachschauen, ob die Symbole in den libs definiert sind.
nm libssl.a | grep SSL_CTX_new
-
# nm libssl.a | grep SSL_CTX_new 00000a70 T SSL_CTX_new
Scheint also definiert zu sein
-
Dann versuch mal als nächstes:
gcc withdtls.c /usr/local/ssl/lib/libssl.a
-
Keine Ahnung ob das hilft aber vielleicht will gcc dynamisch linken deine libraries sind aber statische libs.
Versuche malgcc withdtls.c -static -I/usr/local/ssl/include/ -L/usr/local/ssl/lib/ -lssl -lcrypto
eventuell auch mit dem kompletten pfad zu den libs.
Kurt
-
Ahh, habs hingekriegt.
So läufts:
gcc withdtls.c /usr/local/ssl/lib/libssl.a /usr/local/ssl/lib/libcrypto.a -ldl
Danke für eure Hilfe!