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 mal

    gcc 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!


Anmelden zum Antworten