【问题标题】:How to detect missing symbols in shared library with libtool如何使用 libtool 检测共享库中缺失的符号
【发布时间】:2015-12-08 17:55:54
【问题描述】:

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

我编写了一个构建为共享库“A”的库。它又依赖于另一个库“B”。

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

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

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

【问题讨论】:

    标签: gnu libtool


    【解决方案1】:

    如上所述,我希望能够检查由 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。不像条件码的做事方式那么简单。

    【讨论】:

      猜你喜欢
      • 2021-03-21
      • 1970-01-01
      • 2013-05-21
      • 2010-12-31
      • 2011-02-28
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多