c - 为什么我们在 Linux 中需要 .so.1 文件?

标签 c linux dynamic-linking

在 Linux 中,对于共享库,我通常会看到一个库的 .so、.so.1 和 .so.1.0 文件。例如库test应该由libtest.so libtest.so.1 libtest.so.1.0文件呈现。 据我了解,.so.1.0 包含真实数据; .so 链接到 .so.1.0 并用于链接。 但我不明白 .so.1 文件的用途。 有人可以澄清 .so.1 文件的用途吗? 谢谢。

最佳答案

假设我们正在谈论 libtest .如果环顾四周,您会看到 libtest.so ,这是指向 libtest.so.1 的链接,它又链接到 libtest.so.1.5 .

使用 libtest 的可执行文件将链接到 libtest.so这是 libtest.so.1在这种情况下(这被写入可执行文件,请参阅 ldd(1) )。如果您的分布发生变化 libtest为了修复错误,新版本可能会提供 libtest.so.1.6 (在更新 libtest.so.1 链接到它之后,运行的程序仍将使用 libtest.so.1.5 直到它们退出)。只要不对 ABI 进行更改,一切正常。未更改的 1 版本号表明没有 API 更改这一事实。

假设忙碌 libtest beavers 提出了一个全新的、 Shiny 的、从头开始重写的库,并更改了 ABI。随着 ABI 的更改,他们将主版本号更改为 2。您安装了那个,现在您有了链 libtest.so --> libtest.so.2 --> libtest.so.2.1 .请注意,您现在已经安装了版本 1 和 2。使用 libtest.so.1 之前的程序仍然可以正常工作, 但如果你编译一个新程序,编译器(链接器,真的)会选择 libtest.so从而将可执行文件指向新的 libtest.so.2.1 (除非特别要求使用旧版本,即)。

请注意,so 版本号不需要与源代码版本号有任何关系;主编号是 ABI 版本,次编号是可选的,可用于跟踪修订。所以在这里 (Fedora 20) 我使用 systemd-libs-208-15.fc20.x86_64 , 它提供了 libsystemd-daemon.so.0.0.10 .

关于c - 为什么我们在 Linux 中需要 .so.1 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22257445/

相关文章:

linux - `execve()` 是否设置寄存器来调用动态链接器或要执行的可执行文件?

linux - 如何使 apache 在执行 cgi 时跳过特定的 stdout 行或停止共享库打印到 stdout

c - 读入字符串的 fscanf 问题

regex - 使用 awk 或 sed 在文件中的特定行索引处插入一个字符

php - 如何保护网站数据库配置文件?

ruby - 使用超时 fork 子进程并捕获输出

依赖项上的 C++ 动态链接会导致冲突吗?

c - 多重定义和文件管理

c - 关于哈希函数

c - 在汇编中写一个 fopen 函数