【发布时间】:2021-06-11 16:35:08
【问题描述】:
我维护一个使用 libtool 的共享库,(主要)在 Linux 上运行并输出以下文件。
lrwxrwxrwx 1 root root 18 jun 10 16:12 libxxx.so -> libxxx.so.0.0.1
lrwxrwxrwx 1 root root 18 jun 10 16:12 libxxx.so.0 -> libxxx.so.0.0.1
-rwxr-xr-x 1 root root 760K jun 10 16:12 libxxx.so.0.0.1
libtool version-info 当前为 0:1:0
我想向库的 API/ABI 添加功能,而不是删除或修改任何现有的 API/ABI,以便:
- 我生成了一个库,该库仍可供针对旧版本库构建的二进制文件使用。因此,新库充当了替代品,无需重新构建旧的二进制文件。
- 当找不到包含新 API 的库时,针对新库构建并使用新 API/ABI 的二进制文件在加载阶段失败。
如何使用 libtool 实现这一点?
我尝试按照here的建议将版本信息设置为 1:0:1
使用旧版本的程序可以使用新版本作为替代,但使用新版本的程序可以使用旧版本中不存在的 API。换句话说,如果在运行时链接到旧版本,链接到新版本的程序可能会失败并出现“未解析的符号”:将修订设置为 0,增加当前和年龄。
这会产生以下文件:
rwxrwxrwx 1 root root 18 jun 10 16:24 libxxx.so -> libxxx.so.0.1.0
lrwxrwxrwx 1 root root 18 jun 10 16:24 libxxx.so.0 -> libxxx.so.0.1.0
-rwxr-xr-x 1 root root 760K jun 10 16:24 libxxx.so.0.1.0
但是,针对新库构建的二进制文件将在运行时加载,然后在运行时失败并出现 undefined symbol 错误,如果它们在运行时输入包含旧库中不存在的新符号之一的代码路径。
我可以将SONAME 增加到libxxx.so.1,但是我破坏了针对旧版本构建的二进制文件,而新版本仍然兼容。
【问题讨论】:
-
"如果在运行时遇到旧库,针对新库编译的二进制文件将在运行时失败并出现未定义符号错误。" -- 这不是正是你要求的吗?
-
不,他们遇到符号时崩溃,我希望他们在加载时失败。
-
它们不会崩溃,它们会失败(在加载阶段)。我认为您需要确切地说明您想要发生的事情。
-
现在@EmployedRussian 更清楚了吗?
-
哦,我想我明白了。您在运行时遇到故障(调用新符号时),而您希望在加载时发生故障?
标签: linux shared-libraries libtool