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.
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.
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
.