Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Openssl for RSA: undefined reference to RSA_new

Tags:

c

unix

openssl

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

like image 664
giozh Avatar asked Aug 17 '12 15:08

giozh


2 Answers

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
like image 146
TOC Avatar answered Oct 18 '22 01:10

TOC


You need to link with the library as well:

gcc -I/usr/local/ssl/include -o etc etc.c -L/usr/local/lib -lssl

The -L option tells GCC where to look for library file, and -l (small L) tells the linker that it should link with the library.

Replace the library folder and library name with what you got.

like image 32
Some programmer dude Avatar answered Oct 18 '22 01:10

Some programmer dude