Debian 8 Jessie,OpenSSL 版本 1.1.0,cURL 版本:7.50.2
我正在尝试在 Linux Debian 系统上构建curl。所有阶段都进展顺利,直到尝试使用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的include目录中的rand.h文件,当然函数声明在那里,所以它应该在库中定义。如何找到此错误的原因并解决?
答案1
如何解决对“RAND_egd”的未定义引用
我相信你现在应该打电话RAND_add_egd
。另请参阅简化 rand_egd API在 openssl-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 源代码,它在我的情况下工作。