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

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.