英语法语西班牙语

Ad


OnWorks 网站图标

abicompat - 云端在线

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

这是 abicompat 命令,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器

程序:

您的姓名


abicompat - 检查 ABI 兼容性

abicompat 检查链接到给定共享库的应用程序是否仍然存在
ABI 与该库的后续版本兼容。 如果新版本的
库引入了 ABI 不兼容,然后 abicompat 提示用户究竟是什么
这种不兼容是。

召唤


abicompat [选项] [ ]

配置


· - 帮帮我

显示有关命令的简短帮助并退出。

· - 版 | -v

显示程序版本并退出。

· --列表未定义符号 | -u

显示应用程序的未定义符号列表并退出。

· --显示基本名称 | -b

在工具发出的结果报告中,此选项使应用程序和
库只能通过它们的基本名称来引用; 不是一个完整的绝对名称。 这个
可用于想要比较应用程序名称的脚本和
库独立于它们的目录名称。

· --app-调试信息目录

设置应用程序调试信息所在目录的路径
应该被布置。 这对于需要调试的应用程序二进制文件很有用
info 位于一组单独的文件中。

· --lib-调试信息-dir1

设置第一个版本调试信息所在目录的路径
应该布置共享库的。 这对共享库很有用
调试信息位于单独的一组文件中的二进制文件。

· --lib-调试信息-dir2

设置第二版调试信息所在目录的路径
应该布置共享库的。 这对共享库很有用
调试信息位于单独的一组文件中的二进制文件。

· --不显示位置
不显示有关位置的信息 第二 共用的, 图书馆 各自
类型已更改。

· --弱模式

这触发了弱模式 阿比康. 在这种模式下,只有一个版本
库是必需的。 也就是说,abicompat 是这样调用的:

abicompat --weak-mode

请注意 --弱模式 如果只有一个版本,甚至可以省略选项
库与应用程序一起提供; 在这种情况下, 阿比康 自动
切换到弱模式运行:

abicompat

在这种弱模式下,库导出的函数和变量的类型和
由应用程序使用(例如,这些函数和变量的符号
在应用程序中未定义,由库定义和导出)是
与应用程序预期的这些类型的版本相比。 如果这些
两个版本的类型不同, 阿比康 告诉用户有什么不同
是。

换句话说,在这种模式下, 阿比康 检查函数的类型和
库导出的变量与应用程序的含义相同
预期,就 ABI 而言。

请注意,在此模式下, 阿比康 不检测导出的函数或变量
(符号)应用程序预期但已从库中删除的符号。
这就是为什么它被称为 模式。

返回 价值观


的退出代码 阿比康 如果二进制文件的 ABI 为 0,则命令为 XNUMX
比较是相等的,如果它们不同或工具遇到错误,则为非零。

在后一种情况下,退出代码是一个 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 更改
来决定它们是否兼容。

其余位暂时不使用。

用法 示例


· 在新的共享库版本中检测可能的 ABI 不兼容:

$猫-n test0.h
1 结构体
2{
3 国际米0;
4
5 富()
6:m0()
7、XNUMX、XNUMX、XNUMX {}
8};
9
10 富*
11 第一个函数();
12
13无效
14 second_func(foo&);
15
16无效
17 第三函数();
$

$ cat -n 测试应用程序.cc
1 // 编译:
2 // g++ -g -Wall -o test-app -L. -ltest-0 测试应用程序.cc
3
4 #include "test0.h"
5
6整数
7 主要()
8{
9 foo* f =first_func();
10 秒_func(*f);
11 返回 0;
12}
$

$猫-n test0.cc
1 // 编译它:
2 // g++ -g -Wall -shared -o libtest-0.so test0.cc
3
4 #include "test0.h"
5
6 富*
7 first_func() 函数
8{
9 foo* f = 新的 foo();
10 返回 f;
11}
12
13无效
14 second_func(foo&)
15{
16}
17
18无效
19 第三函数()
20{
21}
$

$猫-n test1.h
1 结构体
2{
3 国际米0;
4 个字符 m1; /* <-- 这里添加了一个新成员! */
5
6 富()
7:m0(),
8米1()
9、XNUMX、XNUMX、XNUMX {}
10};
11
12 富*
13 第一个函数();
14
15无效
16 second_func(foo&);
17
18无效
19 第三函数();
$

$猫-n test1.cc
1 // 编译它:
2 // g++ -g -Wall -shared -o libtest-1.so test1.cc
3
4 #include "test1.h"
5
6 富*
7 first_func() 函数
8{
9 foo* f = 新的 foo();
10 返回 f;
11}
12
13无效
14 second_func(foo&)
15{
16}
17
18 /* 注释掉third_func()的定义
19无效
20 第三函数()
21{
22}
23*/
$

· 编译第一个和第二个版本的库: libtest-0.so
libtest-1.so:

$ g++ -g -Wall -shared -o libtest-0.so test0.cc
$ g++ -g -Wall -shared -o libtest-1.so test1.cc

· 编译应用程序并将其链接到库的第一个版本,
创建 测试应用 二进制:

$ g++ -g -Wall -o 测试应用程序 -L。 -ltest-0.so test-app.cc

· 现在,使用 阿比康 以查看 libtest-1.so 是否与应用程序 ABI 兼容
到 libtest-0.so 的 ABI:

$ abicompat 测试应用程序 libtest-0.so libtest-1.so
由于与下面的“libtest-1.so”不同,ELF 文件“test-app”可能与“libtest-0.so”的 ABI 不兼容:
功能更改摘要:0 已删除,2 已更改,0 已添加功能
变量更改摘要:0 已删除、0 已更改、0 已添加变量

2 个具有一些间接子类型更改的函数:

[C]'function foo* first_func()' 有一些间接的子类型变化:
返回类型更改:
in 指向类型“struct foo”:
大小从 32 位更改为 64 位
1 个数据成员插入:
'char foo::m1',偏移量为 32(以位为单位)
[C]'function void second_func(foo&)' 有一些间接的子类型变化:
'foo&' 类型的参数 0 具有子类型更改:
如前所述,引用类型“struct foo”已更改

$

· 现在使用abicompat的弱模式,即只提供应用程序和
库的新版本:

$ abicompat --弱模式测试应用程序 libtest-1.so
库中定义的函数
'libtest-1.so'
具有与应用程序不同的子类型
'测试应用'
期望:

函数 foo* first_func():
返回类型更改:
in 指向类型“struct foo”:
大小从 32 位更改为 64 位
1 个数据成员插入:
'char foo::m1',偏移量为 32(以位为单位)

$

使用 onworks.net 服务在线使用 abicompat


免费服务器和工作站

下载 Windows 和 Linux 应用程序

Linux 命令

Ad