我一直在四处寻找 ABI 交叉检查工具。现在我已经遇到了其他问题中建议的一些工具,例如在这些问题中:
How to test binary compatibility automatically?
Static analysis tool to detect ABI breaks in C++
现在,这并不是我想要做的——因为这些跟踪版本之间的 ABI 变化。
我想知道给定项目源文件+库头文件和库.so文件,以及编译器版本(用于编译库和项目),是否可以交叉检查输出ABI 的匹配编译库?
因此,它适用的情况是,如果上游库提供了 libfoo.so 和 libfood.so。其中 food 是一个略有不同的 ABI,(比如 double 而不是 float ),但还没有到无法编译的程度。
- 是否有可能想出一个测试(可能不是防弹的)来表明编译后的可执行文件已链接到正确的库?
- 有没有工具可以做到这一点?
最佳答案
如果你假设你只有 libfoo.so
用 C 编码(没有它的头文件,你也应该有),没有办法知道,例如内部函数的签名,因为共享对象的符号表不包含任何类型信息(例如,除了传统智慧之外,没有什么可以阻止库包含一个 malloc
函数,该函数将两个整数相加并返回它们求和,而不是进行通常的堆分配)。
因此 libfoo.so
可能会被滥用。然而,在某些共享库中通常有与符号关联的版本(如果您 dlopen
-ed 一个库,您可以通过 dlvsym 以编程方式查询)。有一些方法可以生成版本。
如果库是纯 C++,那么符号是 mangled所以他们的编码包含他们的签名。
最佳做法是在您的库中包含一些返回库版本的函数。看glib version information一个很好的例子。
关于c++ - ABI 兼容性 header /库交叉检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8794964/