17.2. soname Mechanism
动态加载的库(共享对象)使用名为 soname 的机制来管理库的多个兼容版本。
先决条件
问题简介
动态加载的库(共享对象)作为一个独立的可执行文件存在。这样便可在不更新依赖于它的应用程序的情况下更新库。但是,这个概念会出现以下问题:
- 识别库的实际版本
- 同一库的多个版本需要存在
- 每个多个版本的 ABI 兼容性的信号
soname Mechanism
为了解决这个问题,Linux 使用一种称为 soname 的机制。
库 foo
版本 X.Y 与其它版本兼容,与版本号中的 X 值相同。保持兼容性的小更改会增加数字 Y。破坏兼容性的主要变化会增加 X。
实际库 foo
版本 X.Y 作为文件 libfoo.so.x 存在。y
.在库文件中,记录了一个 soname,值为 libfoo.so.x
以表示兼容性。
构建应用程序时,链接器通过搜索文件 libfoo.so
来查找库。必须存在具有此名称的符号链接,指向实际库文件。然后,链接器从库文件中读取 soname,并将其记录到应用程序可执行文件中。最后,linker 创建应用程序,以便使用 soname 而不是名称或文件名来声明对库的依赖项。
当运行时的动态链路器在运行前链接应用程序时,它会从应用程序的可执行文件中读取 soname。该 soname 是 libfoo.so.x
。必须存在具有此名称的符号链接,指向实际库文件。无论版本的 Y 组件是什么,都允许载入库,因为 soname 不会改变。
版本号的 Y 组件不仅限于一个数字。另外,一些库在其名称中对版本进行编码。
从文件中读取 soname
显示库文件 somelibrary
的 soname:
$ objdump -p somelibrary | grep SONAME
使用您要检查的库的实际文件名替换 somelibrary。