英语法语西班牙语

Ad


OnWorks 网站图标

abidiff - 云端在线

通过 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器在 OnWorks 免费托管服务提供商中运行 abidiff

这是命令 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


免费服务器和工作站

下载 Windows 和 Linux 应用程序

Linux 命令

Ad