应用程序如何在运行时解析为不同版本的共享库?

时间:2010-10-01 13:46:30

标签: linux shared-libraries

我对共享库如何在linux上运行起了作用。我试图了解应用程序如何在Linux上运行时解析同一共享库的不同修订版。

据我了解,共享库有三个“名称”,例如

  1. libmy.so.1.2(实名,即实际的obj文件)
  2. libmy.so.1(SONAME,嵌入在实际的obj文件中)
  3. libmy.so(链接器名称,链接时提供给链接器并嵌入可执行文件中)
  4. 通过LDCONFIG安装库时,它将创建以下符号链接

    • (2)=> (1)
    • (3)=> (2)

    现在假设我使用以下实名编译同一个库的另一个版本, libmy.so.2.0。指南中的SONAME是libmy.so.2.0

    在应用程序链接时,我将使用“-l”标志提供什么链接器名称。遵循我阅读的指南(http://www.dwheeler.com/program-library/Program-Library-HOWTO/x36.htm l),它不一定是libmy.so,如果是这样,obj文件的两个版本将如何区分?

3 个答案:

答案 0 :(得分:41)

共享对象的版本控制如下:

创建共享对象时,会为其指定实名和soname。这些用于安装共享对象(它创建对象和链接到它)。

所以你最终可以了解情况:

pax> ls -al xyz*
-rw-r--r--  1 pax paxgroup    12345 Nov 18  2009 xyz.so.1.5
lrwxrwxrwx  1 pax paxgroup        0 Nov 18  2009 xyz.so.1 -> xyz.so.1.5
lrwxrwxrwx  1 pax paxgroup        0 Nov 18  2009 xyz.so -> xyz.so.1

xyz.so.1.5拥有SONAME的{​​{1}}。

当链接器在xyz.so.1中链接时,它会跟随链接一直到xyz.so并使用其xyz.so.1.5 SONAME来存储在可执行文件中。然后,当您运行可执行文件时,它会尝试加载xyz.so.1,这将指向特定的xyz.so.1(不一定是版本1.5)。

因此,您可以安装xyz.so.1.N并更新xyz.so.1.6链接以指向它,而已链接的可执行文件将使用该链接。

这种多层方法的一个优点是,您可以拥有多个可能不兼容的同名库(xyz.so.1xyz.so.1.*),但是,在每个主要版本中,您可以自由升级它们<因为它们应该是兼容的。

链接新的可执行文件时:

  • xyz.so.2.*链接的人将获得最新主要版本的最新版本。
  • xyz.so关联的其他人将获得特定主要版本的最新版本。
  • 还有一些与xyz.so.1相关联的人会获得特定主要版本的特定次要版本。

在我们检查你的评论时,请记住最后一段:

  

现在假设我使用以下实名xyz.so.1.2编译同一个库的另一个版本。指南中的SONAME为libmy.so.2.0

不,我不相信。 libmy.so.2.0更有可能是soname,因此您可以对libmy.so.2流进行细微更新并获取最新行为。

答案 1 :(得分:2)

在应用程序链接时,如果指定-lmy,链接器将搜索名为libmy.so的文件。它会找到这个文件,并用它链接你的可执行文件。如果此文件是符号链接,那么您的应用程序将与符号链接的目标链接。

应用程序链接时间是 的位置,用于指定要与应用程序一起使用的动态库版本。

答案 2 :(得分:-1)

  1. 库的名称具有不同的版本。
  2. 名称为“ lib”的软件包只有lib,并且名称具有不同的版本。
  3. 系统只能使用最新的库进行编译, 除非您定义其他人。
  4. 应用程序仅使用所需的那些库。 检查ldd和readelf。
  5. 应用包含链接.so和.pc文件,请检查rpm系统。 https://fedoraproject.org/wiki/Packaging:Guidelines?rd=Packaging#Devel_Packages