【问题标题】:How to know if one shared library depends on another shared library or not?如何知道一个共享库是否依赖于另一个共享库?
【发布时间】:2017-04-06 00:09:43
【问题描述】:

我写了一个名为“libmyssl.so”的共享库,我在代码中使用了一些openssl函数,make文件如下所示:

g++ -v -shared -lz -lssl -lcrypto -Wl,-soname,libmyssl.so.1,-o libmyssl.so.1.0 myssl.o

之后,我使用 ldd 命令查看它是否依赖于 libssl.so

ldd libmyssl.so.1.0

结果如下:

linux-vdso.so.1 =>  (0x00007fff743fe000) 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f0bc963b000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0bc9276000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f0bc8f6f000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f0bc9ea0000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f0bc8d59000)

它似乎不依赖于 libssl.so,对吗?

但是,我使用 readelf -s 命令查看符号如下:

readelf -s libmyssl.so.1.0

结果如下:

......
259: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND SSL_new
260: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND SSL_get_shutdown
261: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND close@GLIBC_2.2.5 (4)
262: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND d2i_X509
263: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND X509_get_pubkey
264: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND SSL_set_info_callback
265: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND gmtime_r@GLIBC_2.2.5 (4)
......

X509_get_putkey 似乎没有重新定位。所以它应该依赖于libssl.so。可能我理解的不是很好。

希望有人能详细解释一下,非常感谢!

【问题讨论】:

  • 更好的检查方法是使用objdump 并以objdump -p libmyssl.so.1.0 | grep NEEDED 查找所需的库
  • 我尝试你的命令并得到相同的结果 - 列表中只有 libstdc++.so.6 和 libc.so.6,libssl.so 不出现。

标签: c++ linux gcc linker shared-libraries


【解决方案1】:

某些发行版会要求您在引用它们的目标文件之后列出链接库(以模仿静态库的工作方式)。所以尝试像这样构建:

g++ -v -shared -Wl,-soname,libmyssl.so.1,-o libmyssl.so.1.0 myssl.o -lz -lssl -lcrypto

【讨论】:

  • 非常感谢!你说的对。我将 -lz -lssl -lcrypto 移动到命令行末尾,之后,我发现“ldd libmyssl.so.1.0”的结果包含“libssl.so”。我尝试从命令行中删除“-lssl”,它仍然可以成功构建“myssl.so.1.0”。所以我想知道在构建共享库时是否可以删除所有依赖库?
  • 默认情况下 ld 不需要解析共享库中缺少的符号,因此如果您删除 -lssl,它不会发出错误。但是在运行时你会得到一个错误(加载器不会知道它需要加载 libssl,你会得到 SSL_new 的未定义符号)。我建议与-Wl,--no-undefined 链接以在构建时捕获此类错误。
  • 明白。谢谢你的解释。
猜你喜欢
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
  • 2017-10-26
  • 2011-10-01
相关资源
最近更新 更多