web-dev-qa-db-ja.com

OpenSSLリンクの未定義の参照「EVP_MD_CTX_new」および「... fre」

Opensslライブラリによって提供されるハッシュアルゴリズムを使用しようとしています。 opensslとlibssl-devがインストールされています。バージョンは1.1.0fです。 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);
}

これをコンパイルしてみます:

 gcc digest_example.c -lcrypto -lssl

そしてコンパイラはエラーを出します:

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

そして正直なところ、私は無知です。 OpenSSLをコンパイルして、Webサイトから2回インストールして再インストールしました。さらに、他のすべてのコマンドは問題ありません。これら二つだけ。リンクするときに他のライブラリを使用する必要がありますか?

ご協力いただきありがとうございます。

6
K. Math

Opensslの古いバージョン(<1.1.0)を使用しているようです。新しいバージョンをダウンロードしてインストールした可能性がありますが、リンカーがopensslライブラリの古いバージョンを見つけて使用しているようです。

1.1.0のEVP_MD_CTX_new()は、1.0.xのEVP_MD_CTX_create()を置き換えました。

1.1.0のEVP_MD_CTX_free()は、1.0.xのEVP_MD_CTX_destroy()を置き換えました。

これらの関数の古いバージョンを使用するか、リンカが> = 1.1.0バージョンのopensslライブラリを実際に使用していることを確認してください。

9
Ctx

バージョンは1.1.0fです。 openssl.orgサイトのサンプルコードを実行しようとしています...

OpenSSLをコンパイルしてWebサイトから2回インストールして再インストールしました...

OpenSSL 1.1.0は/usr/local/sslにインストールされると思います。ヘッダーは/usr/local/ssl/includeにあり、ライブラリは/usr/local/ssl/libにあります。以下をコンパイルしてリンクする必要があります。

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

実際、Linuxパスはf ** kされているため、RPATHを追加して、実行時に(コンパイル時ではなく)適切なライブラリにリンクする必要があります。 Linuxは30年ほど経ってもまだ手に入れられないので、次のものが本当に必要です。

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

LDはシングルパスリンカーなので、ライブラリの順序を正しくする必要があります。

コマンドは、システムのバージョンのOpenSSL(1.0.2)にリンクされています。

 gcc digest_example.c -lcrypto -lssl

ただし、ライブラリの順序は間違っていました。ライブラリは-lssl -lcryptoとして呼び出されているはずです。

0
jww