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是一种糟糕的做法,因为重命名文件会改变其行为.