web-dev-qa-db-fra.com

OpenSSL Linking référence non définie 'EVP_MD_CTX_new' et '... fre'

J'essaie d'utiliser les algorithmes de hachage fournis par la bibliothèque openssl. J'ai installé openssl et libssl-dev. La version est 1.1.0f. J'essaie de lancer l'exemple de code du site openssl.org:

#include <stdio.h>

#include <openssl/evp.h>

int main(int argc, char *argv[]){
EVP_MD_CTX *mdctx;
const EVP_MD *md;
char mess1[] = "Test Message\n";
char mess2[] = "Hello World\n";
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_len, i;

if(!argv[1]) {
    printf("Usage: mdtest digestname\n");
    exit(1);
 }

md = EVP_get_digestbyname(argv[1]);

if(!md) {
    printf("Unknown message digest %s\n", argv[1]);
    exit(1);
}

mdctx = EVP_MD_CTX_new();
EVP_DigestInit_ex(mdctx, md, NULL);
EVP_DigestUpdate(mdctx, mess1, strlen(mess1));
EVP_DigestUpdate(mdctx, mess2, strlen(mess2));
EVP_DigestFinal_ex(mdctx, md_value, &md_len);
EVP_MD_CTX_free(mdctx);

printf("Digest is: ");
for (i = 0; i < md_len; i++)
    printf("%02x", md_value[i]);
printf("\n");

exit(0);
}

J'essaye de compiler ceci avec:

 gcc digest_example.c -lcrypto -lssl

Et le compilateur donne l'erreur:

digest_example.c:(.text+0xbc): undefined reference to `EVP_MD_CTX_new'
digest_example.c:(.text+0x138): undefined reference to `EVP_MD_CTX_free'
collect2: error: ld returned 1 exit status

Et honnêtement, je suis désemparé. J'ai installé et réinstallé OpenSSL 2 fois à partir du site Web en le compilant. De plus, toutes les autres commandes ne posent aucun problème. Juste ces deux. Dois-je utiliser d'autres bibliothèques pour créer des liens?

Merci de votre aide.

4
K. Math

Vous semblez utiliser une ancienne version de openssl (<1.1.0). Vous avez peut-être téléchargé et installé la version la plus récente, mais votre éditeur de liens semble rechercher et utiliser une version plus ancienne de votre bibliothèque OpenSSL.

EVP_MD_CTX_new() dans 1.1.0 a remplacé EVP_MD_CTX_create() dans 1.0.x.

EVP_MD_CTX_free() dans 1.1.0 a remplacé EVP_MD_CTX_destroy() dans 1.0.x.

Vous pouvez essayer d'utiliser les anciennes versions de ces fonctions ou vous assurer que votre éditeur de liens utilise réellement la version> = 1.1.0 de la bibliothèque openssl.

7
Ctx

La version est 1.1.0f. J'essaie de lancer l'exemple de code du site openssl.org ...

J'ai installé et réinstallé OpenSSL 2 fois à partir du site Web en le compilant ...

Je pense qu'OpenSSL 1.1.0 est installé dans /usr/local/ssl. Les en-têtes sont situés à /usr/local/ssl/include et les bibliothèques à /usr/local/ssl/lib. Vous devez compiler et lier avec:

gcc -I /usr/local/ssl digest_example.c -Wl,-L,/usr/local/lib -lssl -lcrypto

En fait, comme les chemins Linux sont f ** k'd up, vous devez ajouter un RPATH afin de vous connecter aux bibliothèques appropriées au moment de l'exécution (pas à la compilation). Donc vous avez vraiment besoin de ce qui suit car Linux ne peut toujours pas le faire correctement après 30 ans ou plus:

gcc -I /usr/local/ssl digest_example.c -Wl,-rpath,/usr/local/lib -Wl,-L,/usr/local/lib -lssl -lcrypto

Vous devez toujours obtenir le bon ordre des bibliothèques car LD est un éditeur de liens en un seul passage.

Votre commande est liée à la version du système OpenSSL, à savoir 1.0.2.

 gcc digest_example.c -lcrypto -lssl

L'ordre des bibliothèques était faux, cependant. Les bibliothèques auraient dû être appelées en tant que -lssl -lcrypto.

0
jww