如何使用libtool检测共享库中的缺失符号

时间:2015-12-08 17:55:54

标签: gnu libtool

如上所述,我希望能够检查由libtool创建的共享库是否缺少任何符号,

我写了一个作为共享库构建的库,' A'。它依赖于另一个图书馆' B'

另一个图书馆' B'不遵循严格的semver,因此有时会在次要版本或补丁版本中引入新功能。

虽然我尝试在我的库的代码中放置适当的#if B_LIB_VERSION >= 42,如果它不可用,则不会尝试调用库B中的函数,显然我有时会得到不正确的版本。这会在程序运行时导致错误。

是否有可能使用libtool或任何其他工具要求它生成一个列表,其中列出了共享库中未找到的所有符号,或者它将加载的任何库?

1 个答案:

答案 0 :(得分:0)

  

如上所述,我希望能够检查由libtool创建的共享库是否缺少任何符号,

共享库很难做到,因为它们旨在允许后期符号解析。如果您不使用dlopen类型功能,则可以从静态版本的A和B构建静态可执行文件,并查找缺少的符号。

  

另一个图书馆' B'不遵循严格的semver,因此有时会在次要版本或补丁版本中引入新功能。

我认真考虑寻找替代图书馆,而不是继续处理他们的dependency issues

  

是否有可能使用libtool或任何其他工具要求它生成一个列表,其中列出了共享库中未找到的所有符号,或者它将加载的任何库?

不,不是真的。 nm将为您提供共享库中未定义(和引用)的符号列表。 objdump也可能有用。在Linux上,ldd可能会做你想要的一些事情。但通常会有no way of knowing exactly what a shared library loads,即使不考虑dlopen

如果您必须坚持行为不端的库,那么

libltdl也可能有用。至少你可以在运行时弄清楚libB.42是否有符号xyz。它并不像条件代码处理方式那么容易。