我一直在寻找ABI交叉检查工具。现在我遇到了其他问题中建议的一些工具,例如这些问题:
How to test binary compatibility automatically?
Static analysis tool to detect ABI breaks in C++
现在,这并不是我想要做的 - 因为这些跟踪版本之间的ABI更改。
我想知道给定项目源文件+库头文件和库.so文件,以及编译器版本(用于编译库和项目),是否可以交叉检查输出ABI与编译的库匹配?
因此,它适用的情况是,上游库是否运送了libfoo.so和libfood.so。食物是一种略有不同的ABI,(比如说是双倍而不是漂浮),但不是到目前为止它不会编译。
答案 0 :(得分:1)
如果您假设您只有libfoo.so
在C中编码(没有您的头文件,您也应该拥有),则无法知道,例如内部函数的签名,因为共享对象的符号表不包含任何类型信息(例如,除了传统智慧之外什么都不会阻止库包含malloc
函数,该函数会添加两个整数并返回它们的总和,而不是做通常的堆分配。)
因此libfoo.so
可能被滥用。但是,在某些共享库中通常存在与符号关联的版本(如果dlopen
- 编辑库,则可以通过dlvsym以编程方式查询。有一些方法可以生成版本。
如果库是纯C ++,那么符号为mangled,因此它们的编码包含它们的签名。
最佳做法是在库中包含一些返回库版本的函数。查看glib version information函数是一个很好的例子。
答案 1 :(得分:1)
似乎ABI compliance checker还支持检查应用程序是否暴露于两个库之间的任何更改。