Search code examples
cunixopenssl

Openssl for RSA: undefined reference to RSA_new


I've starto today to explore openSSL api for RSA. That's the simple code:

#include<stdio.h>
#include<openssl/rsa.h>
#include<openssl/engine.h>
int main() {
    RSA *rsa;
    rsa = RSA_new_();
    RSA_free(rsa);
    return 0;
}

and i'm compiling with

gcc -I /usr/local/ssl/include -o etc etc

but gcc return error of undefining reference to RSA_new and RSA_free. I've check the rsa.h header, and there's no reference to this two function. what's wrong? I've follow the reference guide on openssl website...

EDIT: gcc output:

gcc -I /usr/local/ssl/include/ -o rsa rsa.c -L/usr/local/ssl/lib -lcrypto /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function dlfcn_globallookup': dso_dlfcn.c:(.text+0x1d): undefined reference todlopen' dso_dlfcn.c:(.text+0x33): undefined reference to dlsym' dso_dlfcn.c:(.text+0x3d): undefined reference todlclose' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function dlfcn_bind_func': dso_dlfcn.c:(.text+0x3b1): undefined reference todlsym' dso_dlfcn.c:(.text+0x490): undefined reference to dlerror' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In functiondlfcn_bind_var': dso_dlfcn.c:(.text+0x511): undefined reference to dlsym' dso_dlfcn.c:(.text+0x5f0): undefined reference todlerror' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function dlfcn_load': dso_dlfcn.c:(.text+0x667): undefined reference todlopen' dso_dlfcn.c:(.text+0x6de): undefined reference to dlclose' dso_dlfcn.c:(.text+0x715): undefined reference todlerror' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function dlfcn_pathbyaddr': dso_dlfcn.c:(.text+0x7b1): undefined reference todladdr' dso_dlfcn.c:(.text+0x819): undefined reference to dlerror' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In functiondlfcn_unload': dso_dlfcn.c:(.text+0x87a): undefined reference to `dlclose' collect2: ld returned 1 exit status


Solution

  • The propblem is that you are linking with libssl and you are using RSA crypto which is part of libcrypto, another error : there is no function called : RSA_new_:

    toc@UnixServer:/usr/include/openssl$ grep RSA_new *
    rsa.h:RSA * RSA_new(void);
    rsa.h:RSA * RSA_new_method(ENGINE *engine);
    

    So correct your code:

    rsa = RSA_new();
    

    And compile like that:

    gcc -I/usr/include/openssl/ -Wall my_rsa.c -o my_rsa  -lcrypto
    

    EDIT : for the last error(dl functions):

    gcc -I/usr/include/openssl/ -Wall my_rsa.c -o my_rsa  -lcrypto -ldl