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
내 사건은우분투 16.04.7 LTS(Xenial Xerus), 빌드할 때 오류가 발생합니다.PHP-7.4소스 및openssl 1.1.1m.
그래서 다운로드해서 빌드했습니다.에게데(나의 경우EGD-0.9), 이 참조 자료를 기반으로 함(다운로드 링크 포함)OpenSSL-RAND_egd, 그리고 PHP 소스 코드를 다시 빌드했는데 제 경우에는 제대로 작동했습니다.