abi-compliance-checker是一个perl程序,可以检查linux上的库的ABI(https://lvc.github.io/abi-compliance-checker/)
该工具有一个-extended
选项,以下是手册中有关它的说明:
如果您的库A应该被其他库B使用并且您想要控制B的ABI,那么您应该启用此选项。该工具将检查所有数据类型的变化,即使它们未被库A中的任何函数使用。这些数据类型不是A库ABI的一部分,但可能是B库的ABI的一部分。 简短的计划是: app C(破碎) - > lib B(破坏的ABI) - > lib A(稳定的ABI)
即使尝试使用和不使用选项检查ABI,我仍然不太了解含义选项以及它如何改变我得到的结果。
以下是我没有选项的结果摘录:
Test Results
Total Header Files 177
Total Libraries 1
Total Symbols / Types 96 / 57
Compatibility 100%
Added Symbols 1
demangle.h, libtoolbox.so.16.0.0.27
namespace mdw
demangle ( std::__cxx11::string const& iMangledString )
Problems with Symbols, Low Severity 1
BufferMgr.h
namespace toolbox
[+] kDefaultMaxBufferSize [data] 1
以下是激活选项的结果:
Test Results
Total Header Files 177
Total Symbols / Types 158 / 375
Compatibility 99.8%
Added Symbols 2
demangle.h
namespace mdw
demangle ( std::__cxx11::string const& iMangledString )
StaticInit.h
namespace toolbox
_SymbolDefinedInStaticInitOnly_StaticInit ( )
Removed Symbols 1
StaticInit.h
namespace toolbox
_SymbolDefinedInStaticInitOnly ( )
Problems with Symbols, Low Severity 1
BufferMgr.h
namespace toolbox
[+] kDefaultMaxBufferSize [data] 1
是否有人能够解释这个选项的含义,以及从ABI的角度来看输出的差异是什么意思?
答案 0 :(得分:1)
默认情况下,该工具通过分析的二进制文件的导出符号检查所使用的数据类型(作为参数,返回值或参数字段或返回值等)。默认情况下不检查未使用的数据类型。在-extended
模式下,该工具将检查所有数据类型,包括未使用的数据。
在您的示例中,我看到在扩展模式下已检查符号的数量不同,但根据选项的说明,它应该相同。检测添加/删除_SymbolDefinedInStaticInitOnly*
看起来像是工具中的回归错误。
目前,-extended
选项隐式启用-headers-only选项,可以分析标题中的所有内联符号。我认为在这种情况下我们不应该启用-headers-only选项。
看起来-extended
选项暂时无法正常工作。我们需要解决它。