【问题标题】:ABI compatibility header/library cross checkABI 兼容性标头/库交叉检查
【发布时间】:2012-01-09 20:45:06
【问题描述】:

我一直在寻找 ABI 交叉检查工具。现在我遇到了其他问题中建议的一些工具,例如这些问题:

How to test binary compatibility automatically?

Static analysis tool to detect ABI breaks in C++

现在,这并不是我想要做的——因为这些跟踪 ABI 版本之间的变化。

我想知道给定项目源文件 + 库头文件和库 .so 文件,以及编译器版本(用于编译库和项目),是否可以交叉检查输出的 ABI 是否与编译后的库匹配?

因此,它适用的情况是上游库提供了 libfoo.so 和 libfood.so。食物的 ABI 略有不同(比如双精度数而不是浮点数),但到目前为止它不会编译。

  • 是否可以提出一个测试(可能不是防弹的),表明已编译的可执行文件已链接到正确的库?
  • 是否有工具可以做到这一点?

【问题讨论】:

    标签: c++ c linux binary-compatibility


    【解决方案1】:

    如果你假设你只有libfoo.so 用 C 编码(没有它的头文件,你也应该有),没有办法知道例如内部函数的签名,因为共享对象的符号表不包含任何类型信息(例如,除了传统智慧之外,没有什么可以阻止库包含 malloc 函数,该函数将两个整数相加并返回它们的总和,而不是做通常的堆分配)。

    所以libfoo.so 可以被滥用。但是,在某些共享库中通常存在与符号关联的版本(如果您 dlopen-ed 库,则可以通过 dlvsym 以编程方式查询)。有一些方法可以生成版本。

    如果库是纯 C++,则符号为 mangled,因此它们的编码包含它们的签名。

    最佳做法是在您的库中包含一些返回库版本的函数。看看glib version information 函数就是一个很好的例子。

    【讨论】:

      【解决方案2】:

      ABI compliance checker 似乎还支持检查应用程序是否暴露于两个库之间的任何更改。

      【讨论】:

        猜你喜欢
        • 2021-11-26
        • 1970-01-01
        • 2012-09-19
        • 2013-01-20
        • 1970-01-01
        • 2012-03-03
        • 2018-01-07
        相关资源
        最近更新 更多