linux - 链接两个不同版本的库

标签 linux linker elf

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 是在链接时记录的。

我的结果来自 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]

关于linux - 链接两个不同版本的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54688999/

相关文章:

c - 如何在终止线程之前将线程数据复制到数组?

python - 正确安装支持 FTS5 的 sqlite3

language-agnostic - 为什么静态和动态可链接库不同?

C 原型(prototype)函数 - 目标文件

c - 从elf获取动态符号表信息

linux - 输出有问题,不读跳转

html - 为什么 Firefox 在我的 div 上放一个水平滚动条?

xcode - 找不到 FacebookSDK 错误 GADCustomEventBanner.h

c++ - 如何在链接存档文件时将库版本信息添加到 elf 文件,并且所有存档文件都有其版本信息?

c++ - 如何在可执行共享库 (.so) 中触发全局变量的 c'tors?