当前位置: 首页 > 面试题库 >

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

樊熠彤
2023-03-14
问题内容

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

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

  1. libmy.so.1.2(实名,即实际的obj文件)
  2. libmy.so.1(SONAME,嵌入在实际的obj文件中)
  3. libmy.so(链接器名称,在链接时提供给链接器,并嵌入在可执行文件中)

通过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文件的区别?


问题答案:

共享库的版本控制如下:

创建共享库时,请给它一个真实名称和一个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拥有的SONAMExyz.so.1

当连接环节xyz.so,它遵循的链接一路xyz.so.1.5和使用其SONAMExyz.so.1存储的可执行文件。然后,当您 运行
该可执行文件时,它会尝试加载xyz.so.1指向某个特定文件xyz.so.1.N(不一定是1.5版)的文件。

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

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

链接新的可html" target="_blank">执行文件时:

  • 与之链接的人xyz.so将获得最新主要版本的最新次要版本。
  • 与之链接的其他人xyz.so.1将获得特定主要版本的最新次要版本。
  • 还有其他链接xyz.so.1.2将获得特定主要版本的特定次要版本。

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

现在让我们说我用以下实名编译同一库的另一个版本libmy.so.2.0。根据指南,SONAME为libmy.so.2.0

不,我不相信。该soname会更可能是libmy.so.2这样,你可以做轻微的更新到2.x流并获得最新的行为。



 类似资料:
  • 问题内容: 谁能告诉我如何对共享库进行运行时调试? 我需要在运行时调试共享库中的一个函数,但另一个程序会调用它。如何使用共享库执行类似dbx的操作? 我在AIX上使用dbx。我想做的是gdb比dbx好吗? 问题答案: 您只需要使用可执行文件调用gdb(无论是您的文件还是第三方文件都没有关系)。这是一个示例,其中我调试 ls 命令并在(共享) c库中 设置断点。此示例使用了gdb 6.8,它支持延迟

  • null 警告:与依赖项“com.android.support:support-annotations”冲突。应用程序(22.0.0)和测试应用程序(21.0.3)的解析版本不同。 Gradle本身更宽容,但Android工作室,就没那么宽容了。 我没有用21.0.3声明的依赖项...是不是其中一个依赖库使用21.0.3而谷歌忘了用批处理的其余部分更新它? null null null

  • 我正在使用FB。允许用户使用此代码共享我的页面的ui: 当从 Android 移动应用程序中的嵌入式浏览器共享页面时,用户可以选择要用于打开共享对话框的应用程序。如果选择了脸书应用,则不会有回调响应。在普通的桌面浏览器中,一切都按预期工作。这种行为是预期的吗?

  • 我有一个Spring Boot应用程序依赖于谷歌PubSub。我想用谷歌云PubSub模拟器运行它。如何解析,以便应用程序启动并使用来自本地模拟器而不是外部项目的消息? 目前,如果我将GOOGLE_APPLICATION_CREDENTIALS设置为dev.json,则不会调用PubSub,如果我不设置变量,则测试崩溃。我怎样才能克服它?我不会拼图。 注意:我正在编写一个完整的Spring boo

  • 我尝试在web上搜索,但我找不到任何相关的教程或如何将JNI共享库集成到Spring Boot项目中。我想将GDAL库与一个小型的Spring Boot REST应用程序集成在一起。 有可能将JNI与嵌入式Tomcat一起使用吗? 有人能提供链接或解释如何将编译的jar和实际的库文件包含到Spring Boot项目中吗?Maven将是一个更好的构建选项,但gradle也可以工作。

  • 问题内容: 假设我在Linux中有一个使用共享库(文件)的应用程序。我的问题是这些库中的代码是否将在与主应用程序相同的堆中分配内存,还是使用自己的堆? 因此,例如,文件中的某些函数调用,它将使用与应用程序相同的堆管理器,还是使用另一个应用程序?同样,那些共享内存中的全局数据又如何呢?它在哪里?对于应用程序,我知道它位于bss和数据段中,但是不知道这些共享对象文件在哪里。 问题答案: 我的问题是这些