链接两个不同版本的库

Linking against two different version of library

openssl 怎么可能链接到与 curl 相关的其他版本的 libcrypto?在ELF格式文件中定义在哪里?

ldd openssl 给我

libcrypto.so.1.1 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007f5d78c49000)

ldd curl 给我

libcrypto.so.1.0.2 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.2 (0x00007fd38571c000)

readelf --dynamic /usr/bin/curl

Dynamic section at offset 0x2fab0 contains 27 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libcurl.so.4]
 0x0000000000000001 (NEEDED)             Shared library: [libz.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

没有列出libcrypto.so.1.1。为什么?

我猜您正在寻找动态部分中的 NEEDED 条目。共享库的 SONAME 在 link 时间记录。

我的结果来自 Fedora 29 x86_64,因此在该平台上,两个包都是针对同一个共享库构建的。您的输出表明 openssl 来自 OpenSSL 1.1.x 包,但 curl 是针对 OpenSSL 1.0.2.

构建的
$ readelf --dynamic /usr/bin/openssl | fgrep NEEDED
 0x0000000000000001 (NEEDED)             Shared library: [libssl.so.1.1]
 0x0000000000000001 (NEEDED)             Shared library: [libcrypto.so.1.1]
 0x0000000000000001 (NEEDED)             Shared library: [libz.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
$ readelf --dynamic /usr/bin/curl | fgrep NEEDED
 0x0000000000000001 (NEEDED)             Shared library: [libcurl.so.4]
 0x0000000000000001 (NEEDED)             Shared library: [libmetalink.so.3]
 0x0000000000000001 (NEEDED)             Shared library: [libssl.so.1.1]
 0x0000000000000001 (NEEDED)             Shared library: [libcrypto.so.1.1]
 0x0000000000000001 (NEEDED)             Shared library: [libz.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]