链接符号链接而不是soname

时间:2010-12-30 10:33:57

标签: linux elf dynamic-linking

我有一个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,我认为我应该安全地链接到更通用的库版本名称。

2 个答案:

答案 0 :(得分:1)

不要担心libpython2.6的SO版本会增加。它永远不会增加;不会有任何进一步的错误修复版本到2.6,即使有,SO版本也不会增加。

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

答案 1 :(得分:1)

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

  

每个共享库都有一个特殊的   名称为soname''. The soname has the prefix lib'',名称为。{   库,短语.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 with lib'')。一个   完全合格的soname包含为   为它所在的目录添加前缀;在...上   工作系统完全合格   soname只是一个象征性的链接   共享库的“真实姓名”。

     

每个共享库也都有一个真实的   name'',即文件名   包含实际的库代码。   真实姓名增加了soname a   期间,次要数字,另一个   期间和发行号码。该   最后一期和发行号是   可选的。次要号码和释放   号码支持配置控制   通过让你知道究竟是什么   图书馆的版本是   安装。请注意这些数字   可能与数字不一样   用于描述图书馆   文档,虽然确实如此   事情变得更容易。

     

另外,还有这个名字   编译器在请求时使用   库,(我称之为``链接器   名字''),这只是soname   没有任何版本号。