【问题标题】:Link against symlink instead of soname链接到符号链接而不是 soname
【发布时间】:2011-06-01 12:05:50
【问题描述】:

我有一个 linux 应用程序,它在链接器行上链接: libpython2.6.so

这最终会解析为 libpython.2.6.so.1.0

/usr/lib/libpython2.6.so -> libpython2.6.so.1
/usr/lib/libpython2.6.so.1 -> libpython2.6.so.1.0

其中嵌入了 SONAME,所以我坚持使用它链接到完整版本的名称。

 g++ foo.cc /usr/lib/libpython2.6.so
 ldd ./a.out | grep python
        libpython2.6.so.1.0 => /usr/lib/libpython2.6.so.1.0 (0x00007fd36f7ab000)

这意味着如果有 libpython2.6.so.1.1,我的应用程序最终会崩溃。无论如何强制我的应用程序使用通用名称 libpython2.6,而不是 libpython2.6.so.1.0?

我使用如此小的一组 python API,我认为我应该安全地链接到更通用的库版本名称。

【问题讨论】:

  • 您使用的 C 模块有哪些?
  • 除了解释器之外,我的扩展是唯一用 C 编写的部分。我唯一的调用是初始化我的函数,为我的函数获取字符串列表参数,并返回字符串值。
  • @Juan 你有想过这个吗?
  • @copumpkin,我好久没看这个了。这个问题看起来很相关,但没有答案,stackoverflow.com/questions/18467163/…

标签: linux elf dynamic-linking


【解决方案1】:

不用担心 libpython2.6 的 SO 版本增加。它永远不会增加; 2.6 版不会再发布任何错误修复版本,即使有,也不会增加 SO 版本。

您应该担心 libpython2.6 在系统的未来版本中消失(将被 libpython2.7 取代)。目前还没有任何好的解决方案;使用PEP 384,您将能够与 libpython3.so 链接。

【讨论】:

  • 谢谢。这是很好的信息。 Python 2.6 是 Mac OS X 10.6 和 Ubuntu 10.04 目前都有的。
【解决方案2】:

看看``3.1.1. http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html 中的 Shared Library Names '' ,这可以帮助您理解共享库的命名方法。

每个共享库都有一个特殊的 名字叫soname''. The soname has the prefixlib'',名字叫soname''. The soname has the prefixlib'' 图书馆,短语.so'', followed by a period and a version number that is incremented whenever the interface changes (as a special exception, the lowest-level C libraries don't start withlib'')。一种 完全合格的 soname 包括 为其所在目录添加前缀;在一个 工作系统完全合格 soname 只是一个符号链接 共享库的“真实姓名”。

每个共享库也有一个``真正的 name'',即文件名 包含实际的库代码。 真名添加到 soname a 句号,次要号码,另一个 期和发行号。这 上一期和发行号是 可选的。次要编号和版本 号码支持配置控制 通过让您确切地知道什么 库的版本是 安装。请注意,这些数字 可能与数字不同 用于描述图书馆 文档,尽管这确实使 事情变得更容易了。

此外,还有一个名字 编译器在请求时使用 库,(我将其称为“链接器” name''), 就是 soname 没有任何版本号。

【讨论】:

  • 那个问题。我需要链接器忽略 soname,只使用实际的文件名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多