首页 文章

ABI兼容头/库交叉检查

提问于
浏览
3

我一直在寻找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 回答

  • 1

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

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

    如果库是纯C,则符号为mangled,因此它们的编码包含其签名 .

    最佳实践是在库中包含一些返回库版本的函数 . 看看glib version information函数就是一个很好的例子 .

  • 1

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

相关问题