我学会了"100".它提到了使用soname来管理以下版本.

gcc -shared -fPIC -Wl,-soname,libfoo.so.1  -o libfoo.so.1.0.0 foo.c
ln -s libfoo.so.1.0.0  libfoo.so.1
ln -s libfoo.so.1 libfoo.so

我得到的信息是,如果没有设置soname.它将等同于libfoo.所以1.0.0,参见here中的答案.

我发现它也可以在没有soname的情况下工作,比如

 gcc -shared -fPIC -o libfoo.so.1.0.0 foo.c
 ln -s libfoo.so.1.0.0  libfoo.so.1
 ln -s libfoo.so.1 libfoo.so

所以我认为唯一有用的一点是,当您使用readelf -d libfoo.so命令判断共享库时,soname选项可以告诉您共享库的版本.

What else can it do?

推荐答案

soname用于指示库支持的二进制api兼容性.

链接器在编译时使用SONAME从库文件中确定实际的目标库版本.gcc-lNAME将寻找libNAME.因此,链接或文件然后捕获其SONAME,这肯定会更加具体(libnuke.so链接到libnuke.so.0.1.4,其中包含SONAME libnuke.so.0).

在运行时,它将与此链接,然后将其设置为ELF dynamic section NEEDED,那么具有此名称的库(或指向它的链接)应该存在.

备注:SONAME仅在链接/构建时强制执行,而不是在运行时强制执行.

库的"SONAME"可以通过"objdump-p file | grep SONAME"看到.

[EDIT]警告以下是一般性的 comments ,而不是部署在linux中的 comments .最后见.

假设你有一个libnuke图书馆.所以1.2命名并开发一个新的libnuke库:

  • 如果您的新库是以前的修复程序,没有api更改,那么您应该只保留相同的soname,增加文件名的版本.ie文件将是libnuke.所以1.2.1但索纳姆仍将是libnuke.所以1.2.
  • 如果你有一个新的库,它只添加了新的函数,但没有 destruct 功能,并且仍然与previous兼容,那么你希望使用与previous相同的soname加上一个新的后缀,比如.1.ie文件和soname将成为libnuke.所以1.2.1. 任何与libnuke有关的程序.1.2仍适用于该版本.与libnuke有关的新项目.1.2.1只适用于那个版本(直到像libnuke.1.2.1.1一样出现新的颠覆).
  • 如果您的新库与任何libnuke不兼容:libnuke.所以2.
  • 如果你的新库与旧版本兼容:libnuke.所以1.3[即仍然与libnuke兼容.所以1]

[编辑]完成:linux case .

在linux现实生活中,SONAME作为一种特定形式:

即兴.所以0

然后真正的文件名包括次要版本和颠覆,比如libnuke.所以0.1.5

我认为不提供soname是一种糟糕的做法,因为重命名文件会改变其行为.

Linux相关问答推荐

grep条件仅抓取某些文本

IntelliJ(PyCharm)不再识别Linux中的AltGr快捷键

pci_user_write_config_word在哪里实现?

awk 使用动态列号

如何比较 2 个文件并将第二个文件的所有行打印到输出文件 awk

将特定列转换为行

Linux 系统调用文档

Windows WSL 以上 Linux 中的 AF_UNIX 套接字无法绑定到 /mnt 文件:错误 95,不支持操作

如何在初始化脚本中以特定用户身份运行命令?

为什么 Linux (x86) 的页面大小是 4 KB,这是如何计算的?

Eclipse 的 C# 插件

打印当前一周的星期一的日期(在 bash 中)

在 VIM 中搜索和替换导致尾随字符

qstat 和长作业(job)名称

可以通过 SSH 连接的所有用户的列表

仅使用 proc 获取本地网络接口地址?

`cd //` 中的双斜杠 // 在 Linux 中是什么意思?

如何停止 Linux 上的不间断进程?

在linux中根据内容拆分文件

Linux 上的 NuGet:获取响应流时出错