未明确引用`COMP_zlib@libcrypto.so.10'(和其他人)

时间:2016-09-27 10:24:54

标签: openssl redhat

我正在开发Red Hat Enterprise Linux Server 7.0版(Maipo)。服务器提供OpenSSL 1.0.1。尝试链接到OpenSSL时,我收到了很多加密错误。

这是我的链接命令命令行(在命令行中的顺序):

g++ -g -O2 -Wl,-rpath -o output file1.o  libprivate_lib1.so -Lprivate_path -llib1 -ldl \
-lpthread -llib2 -lexpat -lgtest -lgtest_main -lboost_regex -lboost_filesystem -llzma \
-lcrypto private_lib2.so private_lib3.so -llib3

以下是一些错误:

/lib64/libssl.so.10: undefined reference to `COMP_zlib@libcrypto.so.10'
/lib64/libssh2.so.1: undefined reference to `EVP_get_cipherbyname@libcrypto.so.10'
/lib64/libssl.so.10: undefined reference to `X509_STORE_free@libcrypto.so.10'
/lib64/libssl.so.10: undefined reference to `BIO_clear_flags@libcrypto.so.10'
/lib64/libssl.so.10: undefined reference to `d2i_KRB5_AUTHENT@libcrypto.so.10'
/lib64/libssl.so.10: undefined reference to `MD5_Transform@libcrypto.so.10'
/lib64/libssl.so.10: undefined reference to `X509_VERIFY_PARAM_set_depth@libcrypto.so.10'
/lib64/libssh2.so.1: undefined reference to `DSA_do_verify@libcrypto.so.10'
/lib64/libssl.so.10: undefined reference to `SHA384_Init@libcrypto.so.10'
/lib64/libssl.so.10: undefined reference to `PEM_ASN1_read_bio@libcrypto.so.10'
/lib64/libssl.so.10: undefined reference to `FIPS_mode@libcrypto.so.10'
/lib64/libssl.so.10: undefined reference to `OBJ_find_sigid_algs@libcrypto.so.10'
/lib64/libssh2.so.1: undefined reference to `BN_bn2bin@libcrypto.so.10'
/lib64/libssl.so.10: undefined reference to `EVP_rc2_40_cbc@libcrypto.so.10'
/lib64/libssl.so.10: undefined reference to `sk_num@libcrypto.so.10'
...

当我跑步时:

ll /usr/lib64/libcrypto.so

我正在

/usr/lib64/libcrypto.so -> libcrypto.so.1.0.1e

并在运行时:

objdump -tT /usr/lib64/libcrypto.so.1.0.1e | grep COMP_zlib

我得到了

000000000013e500 g    DF .text  0000000000000002  libcrypto.so.10 COMP_zlib_cleanup
000000000013e460 g    DF .text  000000000000009e  libcrypto.so.10 COMP_zlib

所以这意味着我在这个库里有它。 最奇怪的是,它能够在redhat 6.5 / 4中链接,但在7以上的redhat中失败。 有什么建议 ?

1 个答案:

答案 0 :(得分:0)

COMP_zlibEVP_get_cipherbyname等函数是OPenSSL SSL库的一部分,而不是Crypto库的一部分。您有-lcrypto但似乎缺少-lssl

g++ -g -O2 -Wl,-rpath -o output file1.o  libprivate_lib1.so -Lprivate_path -llib1 -ldl \
-lpthread -llib2 -lexpat -lgtest -lgtest_main -lboost_regex -lboost_filesystem -llzma \
-lcrypto private_lib2.so private_lib3.so -llib3

您应该更改为-lssl -lcrypto

g++ -g -O2 -Wl,-rpath -o output file1.o  libprivate_lib1.so -Lprivate_path -llib1 -ldl \
-lpthread -llib2 -lexpat -lgtest -lgtest_main -lboost_regex -lboost_filesystem -llzma \
-lssl -lcrypto private_lib2.so private_lib3.so -llib3

如果 private_lib2.so private_lib3.so依赖于OpenSSL,那么-lssl -lcrypto需要在它们之后移动。也就是说,使用private_lib2.so private_lib3.so -lssl -lcrypto

同样libssh必须继续-lssl -lcrypto。我不知道它的链接在哪里,但图书馆可能会以不同的名字出现。最后,您可能会发现使用库列表<other libs> ... -lssl -lcrypto -llzma -pthread更容易。

它也可能是OpenSSL的新版本或不同版本,但配置不同。例如,看起来Red Hat会删除压缩(./configure no-comp ...),但标题会引入COMP_zlib之类的符号。

我猜您的下一步是:(1)显示典型的编译命令,(2)提供g++ -v,以便我们可以看到标题搜索路径。

最后要记住的是,您使用的是g++,因此默认情况下与extern "C++"建立关联。它可能是其中一个旧的OpenSSL标头缺乏惯例:

#ifdef __cplusplus
extern "C" {
#endif

...

#ifdef __cplusplus
}
#endif

我无法访问Red Hat服务器,所以我不确定。我使用CentOS和Fedora测试另一个库,但我知道有时存在差异。