3

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

如何自动测试二进制兼容性?

用于检测 C++ 中 ABI 中断的静态分析工具

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

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

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

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

2 回答 2

1

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

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

如果库是纯 C++,则符号会被破坏,因此它们的编码包含它们的签名。

最佳实践是在您的库中包含一些返回库版本的函数。看看glib 版本信息函数就是一个很好的例子。

于 2012-01-10T06:31:51.733 回答
1

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

于 2013-07-13T19:13:01.837 回答