我一直在寻找一个ABI交叉检查工具。 现在我遇到了其他问题中提出的一些工具,比如这些问题:
如何自动testing二进制兼容性?
用于检测C ++中ABI中断的静态分析工具
现在,这不是我想要做的 – 因为这些跟踪ABI版本之间的变化。
我想知道,给定项目源文件+库头文件和库.so文件,以及编译器版本(用于编译库和项目),是否有可能交叉检查ABI的输出匹配编译的库?
所以,它适用的情况是,如果一个上游库运送libfoo.so和libfood.so。 在哪里食物是一个稍微不同的ABI,(说双打而不是浮动),但不是编译到目前为止。
如果你认为只有libfoo.so
用C语言编写(没有它的头文件,你也应该有),没有办法知道例如里面的函数的签名,因为共享对象的符号表“不包含任何输入信息(例如,除了传统智慧之外,没有任何东西可以阻止库包含malloc
函数,该函数会添加两个整数并返回它们的总和,而不是执行通常的堆分配)。
所以libfoo.so
可以被滥用。 但是,在某些共享库中,通常有与符号相关的版本(如果您使用库,则可以通过dlvsym以编程方式进行查询)。 有一些方法来生成版本。
如果库是纯粹的C ++,那么符号会被破坏,所以它们的编码包含它们的签名。
最好的做法是在库中有一些函数返回库的版本。 看glib版本信息函数就是一个很好的例子。
看来, ABI合规检查器也支持检查应用程序是否暴露于两个库之间的任何更改。