这是命令 abidiff 可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
abidiff - 比较 ELF 文件的 ABI
abidiff 比较了两个共享库的应用程序二进制接口 (ABI) ELF
格式。 它会发出一个有意义的报告,描述两个 ABI 之间的差异。
一份全面的 ABI 变更报告,包括有关功能和变量的变更
子类型,两个输入共享库必须附有它们的调试信息
in 矮 格式。 否则,只有 ELF 报告添加或删除的符号。
召唤
abidiff [选项]
配置
· - 帮帮我 | -h
显示有关命令的简短帮助并退出。
· - 版 | -v
显示程序版本并退出。
· --调试信息目录1 | --d1 <双路径1>
对于调试信息为 第一共享库 被分成一个
单独的文件,告诉 阿比迪夫 在哪里可以找到那个单独的调试信息文件。
需要注意的是 双径 必须指向调试信息所在的根目录
呈树状排列。 在基于 Red Hat 的系统下,该目录是
平时 /usr/lib/调试.
另请注意,对于由安装的拆分调试信息,此选项不是必需的
你系统的包管理器,因为那时 阿比迪夫 知道在哪里可以找到它。
· --调试信息目录2 | --d2 <双路径2>
喜欢 --调试信息目录1,这个选项告诉 阿比迪夫 在哪里可以找到拆分调试
的信息 第二共享库 文件中。
· --统计
而不是显示之间的详细 ABI 差异 第一共享库 和
第二共享库,只显示有关这些差异的一些汇总统计信息。
· --符号表
只显示符号表 第一共享库 和 第二共享库.
· --删除-fns
在由此产生的关于之间差异的报告中 第一共享库 和
第二共享库, 只显示被删除的全局定义函数
止 第一共享库.
· --更改-fns
在由此产生的关于之间差异的报告中 第一共享库 和
第二共享库, 只显示全局函数子类型的变化
定义于 第一共享库.
· --add-fns
在由此产生的关于之间差异的报告中 第一共享库 和
第二共享库, 只显示添加到的全局定义函数
第二共享库.
· --删除的变量
在由此产生的关于之间差异的报告中 第一共享库 和
第二共享库, 只显示被删除的全局定义的变量
止 第一共享库.
· --更改变量
在由此产生的关于之间差异的报告中 第一共享库 和
第二共享库, 只显示全局子类型的变化
中定义的变量 第一共享库
· --add-vars
在由此产生的关于之间差异的报告中 第一共享库 和
第二共享库, 只显示添加(定义)到的全局变量
第二共享库.
· --无链接名称
在生成的报告中,不显示添加、删除或
更改了函数或变量。
· --不显示位置
不显示有关位置的信息 第二 共用的, 图书馆 各自
类型已更改。
· --没有未引用的符号
在生成的报告中,不显示有关功能和
没有被任何调试信息引用的变量符号。 请注意,对于
这些符号没有被任何调试信息引用,更改信息
显示的是添加或删除的符号。
· --抑制 | --支持 <抑制路径>
使用位于以下位置的抑制规范文件 抑制路径。 注意这个
选项可以在命令行中出现多次; 所有的压制
然后考虑规范文件。
· - 降低 <正则表达式>
当阅读 第一共享库 和 第二共享库 ELF 输入文件,删除
名称与正则表达式匹配的全局定义的函数和变量
正则表达式. 因此,不会发出涉及这些函数或变量的更改
在差异报告中。
· --drop-fn <正则表达式>
当阅读 第一共享库 和 第二共享库 ELF 输入文件,删除
名称与正则表达式匹配的全局定义函数 正则表达式。 作为一个
结果,在 diff 报告中不会发出涉及这些函数的任何更改。
· --drop-var <正则表达式>
当阅读 第一共享库 和 第二共享库 ELF 输入文件,删除
匹配正则表达式的全局定义变量 正则表达式.
· - 保持 <正则表达式>
当阅读 第一共享库 和 第二共享库 ELF 输入文件,保留
名称与正则表达式匹配的全局定义的函数和变量
正则表达式. 所有其他函数和变量都放在地板上,因此不会
出现在生成的差异报告中。
· --保持-fn <正则表达式>
当阅读 第一共享库 和 第二共享库 ELF 输入文件,保留
名称与正则表达式匹配的全局定义函数 正则表达式。 所有
其他功能放在地板上,因此不会出现在结果中
差异报告。
· --保持变量 <正则表达式>
当阅读 第一共享库 和 第二共享库 ELF 输入文件,保留
全局定义的名称与正则表达式匹配 正则表达式。 所有其他
变量被丢弃在地板上,因此不会出现在结果差异中
报告。
· - 无害
在差异报告中,仅显示无害的更改。 默认情况下,无害的
更改从 diff 报告中过滤掉,将混乱保持在最低限度,并有一个
更大的变化以发现真正的 ABI 问题。
· --无害
在差异报告中,不要显示有害的变化。 默认情况下,只有有害的
更改显示在差异报告中。
· - 多余的
在差异报告中,确实显示冗余更改。 一个多余的变化是一个变化
已显示在报告的其他地方。
· --无冗余
在差异报告中,做 不是 显示冗余更改。 一个多余的变化是一个变化
已显示在报告的其他地方。 此选项由
默认。
· --无架构
比较 ABI 时不要考虑架构。
· --转储差异树
在 diff 报告之后,发出 diff 节点树的文本表示
比较引擎来表示更改的函数和变量。 那
为了调试目的,表示被发送到错误输出。 注意
此差异树仅与具有某些子类型的函数和变量相关
变化。 添加或删除的函数和变量没有任何差异节点树
与他们有关。
· --统计
发出有关各种内部事物的统计数据。
· --详细
发出关于内部杂项进展的详细日志。
返回 价值观
的退出代码 阿比迪夫 如果要比较的二进制文件的 ABI,则命令为 0
是相等的,如果它们不同或工具遇到错误,则不为零。
在后一种情况下,退出代码是一个 8 位宽的位域,其中每个位都有一个
具体含义。
值为 1 的第一位,名为 ABIDIFF_ERROR 错误 表示有错误。
值为 2 的第二位,名为 ABIDIFF_USAGE_ERROR 表示方式有误
用户调用了该工具。 例如,如果用户调用该工具,则可能会设置它
使用未知的命令行开关、错误的数字或参数等。如果该位是
设置,那么 ABIDIFF_ERROR 错误 位也必须设置。
第三位,值为 4,名为 ABIDIFF_ABI_CHANGE 意味着二进制文件的 ABI 是
比较是不同的。
值为 8 的第四位,名为 ABIDIFF_ABI_INCOMPATIBLE_CHANGE 表示 ABI
比较的二进制文件以不兼容的方式不同。 如果设置了该位,则
ABIDIFF_ABI_CHANGE 位也必须设置。 如果 ABIDIFF_ABI_CHANGE 被设置并且
ABIDIFF_INCOMPATIBLE_CHANGE is 不是 设置,那么这意味着被比较的 ABI 可能
或者可能不兼容。 在这种情况下,人类需要审查 ABI 更改
来决定它们是否兼容。
其余位暂时不使用。
用法 示例
1. 检测函数子类型的变化:
$ cat -n 测试-v0.cc
1 // 编译它:
2 // g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
3
4 结构体 S0
5{
6 国际米0;
7};
8
9无效
10 foo(S0* /*参数名称*/)
11{
12 // 用 parameter_name 做一些事情。
13}
$
$ cat -n 测试-v1.cc
1 // 编译它:
2 // g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
3
4 结构 type_base
5{
6个int插入;
7};
8
9 struct S0 : 公共 type_base
10{
11 国际米0;
12};
13
14无效
15 foo(S0* /*参数名称*/)
16{
17 // 用 parameter_name 做一些事情。
18}
$
$ g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
$ g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
$
$ ../build/tools/abidiff libtest-v0.so libtest-v1.so
功能更改摘要:0 已删除,1 已更改,0 已添加功能
变量更改摘要:0 已删除、0 已更改、0 已添加变量
1 个具有一些间接子类型更改的函数:
[C]'function void foo(S0*)' 有一些间接的子类型变化:
'S0*' 类型的参数 0 具有子类型更改:
in 指向类型“struct S0”:
大小从 32 位更改为 64 位
1 基类插入:
结构体类型_基础
1 数据成员更改:
'int S0::m0' 偏移量从 0 更改为 32
$
2. 检测函数子类型的另一个变化:
$ cat -n 测试-v0.cc
1 // 编译它:
2 // g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
3
4 结构体 S0
5{
6 国际米0;
7};
8
9无效
10 foo(S0& /*参数名称*/)
11{
12 // 用 parameter_name 做一些事情。
13}
$
$ cat -n 测试-v1.cc
1 // 编译它:
2 // g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
3
4 结构体 S0
5{
6 个字符插入成员;
7 国际米0;
8};
9
10无效
11 foo(S0& /*参数名称*/)
12{
13 // 用 parameter_name 做一些事情。
14}
$
$ g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
$ g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
$
$ ../build/tools/abidiff libtest-v0.so libtest-v1.so
功能更改摘要:0 已删除,1 已更改,0 已添加功能
变量更改摘要:0 已删除、0 已更改、0 已添加变量
1 个具有一些间接子类型更改的函数:
[C]'function void foo(S0&)' 有一些间接的子类型变化:
'S0&' 类型的参数 0 具有子类型更改:
在引用类型“struct S0”中:
大小从 32 位更改为 64 位
1 个数据成员插入:
'char S0::inserted_member',偏移量为 0(以位为单位)
1 数据成员更改:
'int S0::m0' 偏移量从 0 更改为 32
$
3. 检测函数被删除或添加到库中:
$ cat -n 测试-v0.cc
1 // 编译它:
2 // g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
3
4 结构体 S0
5{
6 国际米0;
7};
8
9无效
10 foo(S0& /*参数名称*/)
11{
12 // 用 parameter_name 做一些事情。
13}
$
$ cat -n 测试-v1.cc
1 // 编译它:
2 // g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
3
4 结构体 S0
5{
6 个字符插入成员;
7 国际米0;
8};
9
10无效
11 bar(S0& /*参数名称*/)
12{
13 // 用 parameter_name 做一些事情。
14}
$
$ g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
$ g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
$
$ ../build/tools/abidiff libtest-v0.so libtest-v1.so
功能更改摘要:1 已删除,0 已更改,1 已添加功能
变量更改摘要:0 已删除、0 已更改、0 已添加变量
1 删除的功能:
'函数无效 foo(S0&)' {_Z3fooR2S0}
1 新增功能:
'function void bar(S0&)' {_Z3barR2S0}
$
使用 onworks.net 服务在线使用 abidiff