2012-01-09 82 views
3

我一直在寻找ABI交叉检查工具。现在我遇到的其他问题,如对这些问题的一些工具提示:ABI兼容性头/库交叉检查

How to test binary compatibility automatically?

Static analysis tool to detect ABI breaks in C++

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

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

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

  • 是否有可能拿出一个测试(可能不是bulletproof),说明编译的可执行文件已经链接到正确的lib?
  • 是否有工具可以做到这一点?

回答

1

如果你认为你只有C编码的libfoo.so(没有它的头文件,你应该也有),没有办法知道例如因为共享对象的符号表不包含任何输入信息(例如,除了传统智慧以外,没有其他任何东西可以阻止库函数包含增加两个整数并返回其总和的函数,而不是像往常一样堆分配)。

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

如果库是纯C++,那么符号是mangled,因此它们的编码包含它们的签名。

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