2012-08-17 2 views
6

Ich habe heute begonnen, OpenSSL API für RSA zu erkunden. Das ist der einfache Code:Openssl für RSA: undefinierter Verweis auf 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; 
} 

und ich bin Kompilieren mit

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

aber gcc Rückkehr Fehler Definition von RSA_new und RSA_free. Ich habe den Header rsa.h überprüft, und es gibt keinen Hinweis auf diese beiden Funktionen. was ist los? Ich habe im Referenzhandbuch auf OpenSSL Website folgen ...

EDIT: gcc Ausgabe:

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 Funktion dlfcn_globallookup': dso_dlfcn.c:(.text+0x1d): undefined reference to dlopen‘ dso_dlfcn.c :(text + 0x33): undefined reference to dlsym' dso_dlfcn.c:(.text+0x3d): undefined reference to dlclose ' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In Funktion dlfcn_bind_func': dso_dlfcn.c:(.text+0x3b1): undefined reference to dlsym'. dso_dlfcn.c :(text + 0x490): undefined Bezug auf dlerror' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function DLF cn_bind_var ':. dso_dlfcn.c :(text + 0x511): undefiniert Bezug auf dlsym' dso_dlfcn.c:(.text+0x5f0): undefined reference to dlerror' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In Funktion dlfcn_load': dso_dlfcn.c:(.text+0x667): undefined reference to dlopen‘ dso_dlfcn.c: (.text 0x6de +): undefined Bezug auf dlclose' dso_dlfcn.c:(.text+0x715): undefined reference to dlerror. ' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In Funktion dlfcn_pathbyaddr': dso_dlfcn.c:(.text+0x7b1): undefined reference to dladdr' dso_dlfcn.c :(text + 0x819): undefined Verweis auf dlerror' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function dlfcn_unload ': dso_dlfcn.c :(text + 0x87a.): undefined reference to `dlclose' collect2: ld returned 1 exit status

+0

Sie müssen sich mit der Bibliothek verknüpfen für 'ssl'. Ich bin mir nicht sicher, wie der Name lautet, aber versuchen Sie, '-lssl' am Ende des Compilerbefehls hinzuzufügen. – hmjd

Antwort

4

Die propblem ist, dass Sie mit libssl verknüpfen und Sie RSA-Krypto verwenden, den Teil libcrypto ist, ein weiterer Fehler: Es gibt keine Funktion aufgerufen: RSA_new_:

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

So Ihren Code korrigieren:

rsa = RSA_new(); 

Und wie das kompilieren:

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

EDIT: für den letzten Fehler (dl-Funktionen):

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

perfekt. Ich habe nur die -L Optionen am Ende für den Pfad der Bibliotheksdateien hinzugefügt. Dank an alle. – giozh

1

Sie müssen Link gegen die libSSL-Bibliothek. Etwas wie

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

wird den Trick tun.

(Vielleicht ist es nicht eigentlich -lssl aber -lopenssl, -lssl-rsa oder was auch immer, Sie dies, indem Sie herausfinden können,

pkg-config --libs PACKAGENAME 

wo PAKET der Name des Pakets ist die libssl enthält, so etwas wie libssl, OpenSSL, libssl -dev, openssl-devel usw.)

+0

Ich habe versucht, das zu tun, aber es funktioniert immer noch nicht! Das Verzeichnis/usr/local/ssl/lib/pkgconfig enthält drei Dateien: libcrypto.pc, libssl.pc, openssl.pc. Ich kompiliere, aber etwas ist schief gelaufen. Ich bearbeite die Hauptnachricht mit der Kompilierungsausgabe – giozh

+0

"... um das zu tun" - um was zu tun? –

+0

pkg-config zu tun! – giozh

2

Sie müssen -lssl oder etwas ähnliches hinzufügen. 'Undefinierte Referenz' wird vom Linker erzeugt, der nach der tatsächlichen Implementierung von RSA_new und RSA_free sucht. Diese Funktionen befinden sich irgendwo in der openssl-Bibliothek, und mit -lssl lassen Sie den Linker wissen, wo sie sich befinden.

EDIT: Wenn etwas mit der Header-Datei falsch wäre, würden Sie einen Fehler wie 'implizite Deklaration des Bezeichners RSA_new' sehen. Aber Sie müssen bestimmte Flags aktivieren, um diese Art von Fehlern zu haben (ich dachte -Wmissing-prototypes).

2

Sie müssen auch mit der Bibliothek verknüpfen:

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

Die -L Option teilt GCC wo für Bibliotheksdatei suchen, und -l (kleine L) teilen den Linker mit, dass es mit der Bibliothek verknüpfen sollte.

Ersetzen Sie den Bibliotheksordner und den Bibliotheksnamen mit dem, was Sie erhalten haben.

0

Wenn Sie CMakeLists.txt verwenden, müssen Sie diesen einfachen Befehl hinzufügen:

link_libraries(ssl crypto)