ABI兼容性头/库交叉检查

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

如何自动testing二进制兼容性

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

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

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

所以,它适用的情况是,如果一个上游库运送libfoo.so和libfood.so。 在哪里食物是一个稍微不同的ABI,(说双打而不是浮动),但不是编译到目前为止。

  • 是否有可能拿出一个testing(可能不是bulletproof)说,编译的可执行文件链接到正确的库?
  • 有没有工具可以做到这一点?

Solutions Collecting From Web of "ABI兼容性头/库交叉检查"

如果你认为只有libfoo.so用C语言编写(没有它的头文件,你也应该有),没有办法知道例如里面的函数的签名,因为共享对象的符号表“不包含任何输入信息(例如,除了传统智慧之外,没有任何东西可以阻止库包含malloc函数,该函数会添加两个整数并返回它们的总和,而不是执行通常的堆分配)。

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

如果库是纯粹的C ++,那么符号会被破坏,所以它们的编码包含它们的签名。

最好的做法是在库中有一些函数返回库的版本。 看glib版本信息函数就是一个很好的例子。

看来, ABI合规检查器也支持检查应用程序是否暴露于两个库之间的任何更改。