'RAND_egd'への未定義参照を解決する方法

'RAND_egd'への未定義参照を解決する方法

Debian 8 Jessie、OpenSSL バージョン 1.1.0、cURL バージョン: 7.50.2

Linux Debianシステムでカールを構築しようとしています。makeコマンドを使用してビルドを試みるまで、すべてのステップがスムーズに進みます。次のエラーは接続フェーズに失敗します。

  CC       ../lib/curl-nonblock.o
  CC       ../lib/curl-warnless.o
  CCLD     curl
../lib/.libs/libcurl.so: undefined reference to 'RAND_egd'
collect2: error: ld returned 1 exit status
Makefile:771: recipe for target 'curl' failed
make[2]: *** [curl] Error 1

RAND_egd関数はOpenSSLライブラリの一部であるため、libcurl.soファイルでlddを実行してOpenSSLライブラリが見つかったことを確認し、以下のlddの出力に基づいていました。

linux-vdso.so.1 (0x00007ffceb5a1000)
libnghttp2.so.14 => /usr/lib/x86_64-linux-gnu/libnghttp2.so.14 (0x00007ff9ffc05000)
libidn.so.11 => /usr/lib/x86_64-linux-gnu/libidn.so.11 (0x00007ff9ff9d1000)
libssh2.so.1 => /usr/lib/x86_64-linux-gnu/libssh2.so.1 (0x00007ff9ff7a8000)
libssl.so.1.1 => /usr/local/lib/libssl.so.1.1 (0x00007ff9ff53a000)
libcrypto.so.1.1 => /usr/local/lib/libcrypto.so.1.1 (0x00007ff9ff0af000)
liblber-2.4.so.2 => /usr/lib/x86_64-linux-gnu/liblber-2.4.so.2 (0x00007ff9feea0000)
libldap_r-2.4.so.2 => /usr/lib/x86_64-linux-gnu/libldap_r-2.4.so.2 (0x00007ff9fec4e000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007ff9fea33000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff9fe688000)
libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x00007ff9fe3a6000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff9fe1a2000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff9fdf85000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007ff9fdd6e000)
libsasl2.so.2 => /usr/lib/x86_64-linux-gnu/libsasl2.so.2 (0x00007ff9fdb52000)
libgnutls-deb0.so.28 => /usr/lib/x86_64-linux-gnu/libgnutls-deb0.so.28 (0x00007ff9fd833000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffa0009e000)
libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007ff9fd621000)
libp11-kit.so.0 => /usr/lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007ff9fd3db000)
libtasn1.so.6 => /usr/lib/x86_64-linux-gnu/libtasn1.so.6 (0x00007ff9fd1c7000)
libnettle.so.4 => /usr/lib/x86_64-linux-gnu/libnettle.so.4 (0x00007ff9fcf95000)
libhogweed.so.2 => /usr/lib/x86_64-linux-gnu/libhogweed.so.2 (0x00007ff9fcd66000)
libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007ff9fcae3000)
libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007ff9fc8db000)

だから、ライブラリがそこにあります。また、OpenSSLのインクルードディレクトリにあるrand.hファイルを調べましたが、もちろん関数宣言がそこにあるので、ライブラリで定義する必要があります。このエラーの原因を見つけて解決するにはどうすればよいですか?

答え1

'RAND_egd'への未定義参照を解決する方法

今電話する必要があると思いますRAND_add_egd。また見てください簡略化された rand_egd APIopenssl-devメーリングリストにあります。

コンパイル中のコードはOpenSSL 1.1.0から保護する必要があります。たぶん、次のようなものがあります。

#if OPENSSL_VERSION_NUMBER >= 0x10100000L

    int rc = RAND_egd(<path>);
    ...

#else

    int rc = RAND_add_egd(<path>);
    ...

#endif

Danielは通常OpenSSLに従うのに非常に堪能です。特定のディストリビューションのダウングレードバージョンを受けているようです。

~によるとcURL 問題 763、cURLは少なくとも2016年4月に初めてopenssl-1.1.0-devのサポートを追加しました。完全な変更ログは次の場所にあります。cURL 変更ログ


関連して、cURL 7.50.2から移動する必要があるかもしれません。持っている既知の脆弱性12個。 7.51.0は2016年11月2日にリリースされたようです。

答え2

私の出来事はUbuntu 16.04.7 LTS(Xenial Xerus)、ビルドするとエラーが発生します。PHP-7.4ソースとopenssl 1.1.1m

だからダウンロードしてビルドしました。ええと(私の場合EGD-0.9)、この参考資料に基づく(ダウンロードリンクを含む)OpenSSL-RAND_egd、そしてPHPのソースコードを再構築しましたが、私の場合はうまくいきました。

関連情報