2017-10-16 13 views
2

私はopensslライブラリによって提供されるハッシュアルゴリズムを使用しようとしています。 私はopensslとlibssl-devをインストールしました。バージョンは1.1.0fです。 私はopenssl.orgサイトのサンプルコードを実行しよう:OpenSSL未定義の参照 'EVP_MD_CTX_new'と '... fre'のリンク

#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回インストールして再インストールしました。さらに、他のすべてのコマンドは問題ありません。これらの2つだけ。リンクするときに他のライブラリを使用する必要がありますか?

ありがとうございました。

+0

'gcc digest_example.c -lssl -lcrypto'を使用してください。***ではなく、' gcc digest_example.c -lcrypto -lssl'です。 LDはシングルパスリンカーです。 'libssl'は' libcrypto'に依存するので、 'libcrypto'は' libssl'の後ろにある必要があります。別の方法は '--start-group --end-group'リンカオプションを使うことです。また、['ld(1)'](https://linux.die.net/man/1/ld)のマニュアルページも参照してください。 – jww

+0

-lssl ans -lcryptoの順番では動作しませんでした。私は何の違いもなくそれらを切り替えました。リンカーとヘッダーはOpenSSLのさまざまなライブラリを使用していたようです。 –

+0

OpenSSL 1.1.0ヘッダーとライブラリがマシン上にある場合の状態。注:私が知っているすべてのディストリビューションは、OpenSSL 1.0.2を提供しています。 OpenSSL 1.1.0ではありません。 – jww

答えて

1

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

EVP_MD_CTX_new()(1.1.0)は、1.0.xでEVP_MD_CTX_create()に置き換えられました。

EVP_MD_CTX_free()(1.1.0)は、1.0.xでEVP_MD_CTX_destroy()に置き換えられました。

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

+0

ありがとうございました。 しかし興味深いことに、EVP_MD_CTX_create()またはEVP_MD_CTX_destroy()を使用すると、リンカは_newおよび_freeの出力を持ちます。 明日、私はリンカの仕様を試してみます。 –

+0

@ K.Mathこれも説明できます:openssl 1.1.0のヘッダファイルを使用する場合、互換性マクロがあります。 '#EVP_MD_CTX_create()EVP_MD_CTX_new()を定義します。だからあなたは1.1.0のヘッダファイルを使うようですが、1.0.xのライブラリにリンクしています。 – Ctx

+0

ありがとうございます。 -L を追加した後、それは機能しました。 –

0

The version is 1.1.0f. I try to run the example code of the openssl.org site ...

I installed and reinstalled OpenSSL 2 times from the website by compiling it ...

私はOpenSSL 1.1.0が/usr/local/sslにインストールされていると思います。ヘッダーは/usr/local/ssl/includeにあり、libsは/usr/local/ssl/libにあります。 、あなたは、実行時に適切なライブラリにリンクするように、(コンパイル時ではない)RPATHを追加するあなたの必要性をアップk'd ** Linuxのパスをfされているので、実際には

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

:あなたはを使用してコンパイルとリンクする必要があります。 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と呼ばれていたはずです。