ABI兼容头/库交叉检查

时间:2012-01-09 20:45:07

标签: c++ c linux binary-compatibility

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

How to test binary compatibility automatically?

Static analysis tool to detect ABI breaks in C++

现在,这并不是我想要做的 - 因为这些跟踪版本之间的ABI更改。

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

因此,它适用的情况是,上游库是否运送了libfoo.so和libfood.so。食物是一种略有不同的ABI,(比如说是双倍而不是漂浮),但不是到目前为止它不会编译。

  • 是否有可能提出一个测试(可能不是防弹),说明已编译的可执行文件已链接到正确的lib?
  • 是否有工具可以执行此操作?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

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