破坏DSO /共享库与C ++接口的二进制向后兼容性并不是很难。也就是说,是否存在静态分析工具,如果给出两组不同的头文件,可以帮助检测此类ABI中断:DSO的早期状态和当前状态(也可能是DSO)?欢迎提供免费和商业产品建议。
如果还可以警告不良行为,例如DSO接口中的内联函数和默认函数参数,它会很棒。
答案 0 :(得分:20)
abi-compliance-checker - 用于检查共享C / C ++库(DSO)的后向二进制/源级兼容性的工具:
用于检查C / C ++库的后向二进制和源级兼容性的工具。该工具检查新旧版本的头文件和共享库,并分析可能破坏二进制和/或源兼容性的API和ABI(ABI = API +编译器ABI)中的更改:调用堆栈中的更改,v表更改,删除的符号,重命名字段等。
icheck - C接口ABI / API检查器:
用于静态检查C接口以进行API和ABI更改的工具。应检测可能导致ABI更改的类型声明的所有更改以及大多数API更改。 icheck旨在与库一起使用,作为防止ABI漂移的方法。
shlib-compat - 带符号版本控制的共享库的ABI兼容性检查器:
shlib-compat使用矮化调试符号来重新创建和比较导出的定义 符号,包括函数参数和结构类型。
您也可能对linux upstream tracker和linux abi tracker服务感兴趣。它们都由abi-compliance-checker工具提供支持。
答案 1 :(得分:14)
我认为您熟悉本教程:Binary Compatibility Issues with C++,如果不是读取它!
我听说过这个工具: http://ispras.linuxbase.org/index.php/ABI_compliance_checker,但从未测试或使用过,所以没有意见。
这也可能让您感兴趣:Creating Library with backward compatible ABI that uses Boost
答案 2 :(得分:1)
我记得在工作中他们使用GCC XML来测试二进制兼容性。基本上它所做的是生成编译器对象树的xml表示。理论上说,如果xml是等价的,那么它们就保持了二进制兼容性。
答案 3 :(得分:0)
唯一安全的方法是使用C接口导出库。 C ++库只与您用来编译它的编译器兼容。
答案 4 :(得分:0)
我们的C++ Smart Differencer工具会比较两个源文件,并报告语言结构(标识符,表达式,语句等)方面的差异以及合理的编辑操作(插入,删除,移动,复制,替换标识符, ...)。
它没有直接回答ABI问题,但它提供的信息可能非常有用。另一个答案中讨论的一个例子是从 struct {a,b} 到 struct {b,a} 的返回类型更改。 SmartDifferencer会报告已移动 a 。 (注意:常规diff工具会报告包含结构定义的那一行被更改,因此您可以获得相同的信息,但SmartDifference也会忽略空白/布局和注释中的更改,从而产生较少的概念噪声)。
这些工具都不会报告的是typedef定义的更改,它位于另一个头文件中。但后来可能会比较所涉及的所有头文件。如果您不想手动执行此操作,则使用的任何工具必须包含完整的C ++解析器,名称解析器,并且必须比较等效的声明。另一张海报提出了相当多的答案:比较GCCXML输出的等价性。我不确定这在实践中有多容易;它不能只是“文件按顺序是相同的XML吗?”。
答案 5 :(得分:-1)
ABI - 应用程序二进制接口归结为编译器将源代码转换为机器可识别指令的方式。在最终的程序中,相同的源代码行可以转换为不同的字节流。
运行在源代码上的静态分析器将无法预测编译器将如何翻译它。该决定是在编译器编码或设置中做出的。所以在这种情况下,我不相信静态分析仪会对你有所帮助。