c++ - ABI 兼容性 header /库交叉检查

标签 c++ c linux binary-compatibility

我一直在四处寻找 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/

相关文章:

java - OpenCV 库中的错误 - 2.4.9

c++ - 在 Rcpp Makevars 中找到系统范围的库

linux - 如何在现有静态库的开头添加新的目标文件

Linux:使用精确的子字符串重命名文件

c++ - %12.10lg 在 C++ 字符串格式中意味着什么

c++ - 从链接中排除目标文件

c - 如何从 C 中的二进制文件中读取两种不同的数据类型?

linux - 安装 debian 后 windows 7 无法启动

c - 为什么不同的 C 编译器可以为 C 程序提供不同的输出?

c - 在 C 中使用指针扫描字符串