2012-08-17 30 views
6

He estado hoy para explorar la API openSSL para RSA. Ese es el código simple:Openssl para RSA: referencia indefinida a RSA_new

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

y estoy compilando con

gcc -I/usr/local/ssl/incluir -o, etc, etc

pero gcc error de retorno de undefining referencia a RSA_new y RSA_free. Revisé el encabezado rsa.h y no hay ninguna referencia a esta función. ¿Qué pasa? he seguir la guía de referencia en el sitio web openssl ...

EDIT: salida de gcc:

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): En la función dlfcn_globallookup': dso_dlfcn.c:(.text+0x1d): undefined reference to dlopen ' dso_dlfcn.c :(. text + 0x33): referencia no definida a dlsym' dso_dlfcn.c:(.text+0x3d): undefined reference to dlclose ' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): En la función dlfcn_bind_func': dso_dlfcn.c:(.text+0x3b1): undefined reference to dlsym' dso_dlfcn.c :(. text + 0x490): referencia indefinida a dlerror' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function dlf cn_bind_var ':. dso_dlfcn.c :(texto + 0x511): referencia indefinida a dlsym' dso_dlfcn.c:(.text+0x5f0): undefined reference to dlerror' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): En función dlfcn_load': dso_dlfcn.c:(.text+0x667): undefined reference to dlopen' dso_dlfcn.c: (.text + 0x6de): referencia indefinida a dlclose' dso_dlfcn.c:(.text+0x715): undefined reference to dlerror. ' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): En función dlfcn_pathbyaddr': dso_dlfcn.c:(.text+0x7b1): undefined reference to dladdr' dso_dlfcn.c :(texto + 0x819): indefinido referencia a dlerror' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function dlfcn_unload ': dso_dlfcn.c :(texto + 0x87a):. undefined reference to `dlclose' collect2: ld devuelto 1 código de salida

+0

Es necesario enlazar con la biblioteca de 'ssl'. No estoy seguro de cuál es su nombre, pero intente agregar '-lssl' al final de su comando de compilación. – hmjd

Respuesta

4

El propblem es que se vincula con libssl y está utilizando RSA de cifrado que es parte de libcrypto, otro error: no hay una función llamada: RSA_new_:

[email protected]:/usr/include/openssl$ grep RSA_new * 
rsa.h:RSA * RSA_new(void); 
rsa.h:RSA * RSA_new_method(ENGINE *engine); 

Así corregir su código:

rsa = RSA_new(); 

y compilar así:

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

EDIT: para el último error (funciones dl):

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

perfecto. Acabo de agregar las opciones -L al final para la ruta de los archivos de la biblioteca. Gracias a todos. – giozh

1

tienes que enlace contra la biblioteca libSSL. Algo como

gcc -I /usr/local/ssl/include -o myprog myprog.c -lssl 

hará el truco.

(tal vez no es realmente -lssl pero -lopenssl, -lssl-rsa o lo que sea, se puede averiguar esto escribiendo

pkg-config --libs PACKAGENAME 

donde PACKAGENAME es el nombre del paquete que contiene libssl, algo así como libssl, openssl, libssl -dev, openssl-devel, etc.)

+0

¡Intenté hacer eso, pero todavía no funciona! el directorio/usr/local/ssl/lib/pkgconfig contiene tres archivos: libcrypto.pc, libssl.pc, openssl.pc. Estoy compilando, pero algo salió mal. Edito el mensaje principal con la salida de compilación – giozh

+0

"... para hacer eso" - ¿para hacer qué? –

+0

para hacer pkg-config! – giozh

2

Necesita agregar -lssl o algo así. La 'referencia no definida' es generada por el enlazador, que está buscando la implementación real de RSA_new y RSA_free. Esas funciones están ubicadas en algún lugar de la biblioteca de openssl, y con -lssl le permite al vinculador saber dónde están.

EDITAR: si hubiera algún problema con el archivo de encabezado vería un error como 'declaración implícita del identificador RSA_new'. Pero necesita habilitar ciertas banderas para tener ese tipo de errores (pensé -Wmissing-prototypes).

2

es necesario enlazar con la biblioteca, así:

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

La opción -L dice GCC dónde buscar el archivo de biblioteca, y -l (pequeño L) le indica al enlazador que debe enlazar con la biblioteca.

Reemplace la carpeta de la biblioteca y el nombre de la biblioteca con lo que obtuvo.

0

Si utiliza CMakeLists.txt, debe agregar este simple comando:

link_libraries(ssl crypto)