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

nisah:

我对共享库在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文件的区别?

paxdiablo:

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

创建共享库时,您要给它一个真实名称和一个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并使用它的SONAMEof xyz.so.1存储在可执行文件中。然后,当您运行该可执行文件时,它会尝试加载xyz.so.1指向某个特定文件xyz.so.1.N(不一定是1.5版)的文件。

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

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

链接新的可执行文件时:

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

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在运行时为独立应用程序提供可用的 jar?

如何在运行时为 React 应用程序提供安装特定配置?

如何在运行时调试共享库?

如何在运行时将图像从Android设备的库映射到Unity应用程序中的Textures?

如何在运行时确定是否为内部或外部测试仪分发了应用程序?

如何在单击时在运行时为整个应用程序设置自定义主题?

如何在应用程序仍在运行时刷新它(活动)?

如何在运行时获取Java应用程序的真实路径?

如何在运行时更新SpringBoot应用程序的配置而不重载整个ApplicationContext

如何在运行时设置非托管应用程序的首选CLR(<supportedRuntime>)?

如何在运行时使用应用程序主机和端口

如何在运行时更改应用程序环境?

如何在运行时中检测到应用程序使用了Swift

如何在运行时更改应用程序输出类型

如何在运行时获取Kony应用程序的名称

如何在运行时在Android应用程序中隐藏(或删除)操作栏

如何在运行时在 webpack 应用程序中要求任意本地脚本?

如何在运行时更改android应用程序的名称和图标?

如何在运行时使用Visual Studio调试Pygame应用程序

动态链接程序如何在应用程序运行时解析引用?

blazor wasm应用程序在运行时的程序集构建版本

如何从Gradle构建中获取版本属性以包含在运行时Swing应用程序中

在应用程序运行时如何在通知栏中显示“解析推送通知”?

Linux程序在运行时找不到共享库

如何在运行时检查 rails 应用程序是否在 sidekiq 工作器的上下文中运行?

如何在运行时检查我的Rails应用程序是否在开发环境或生产环境中运行

如何在运行时不同的枚举类上使用Jackson流API将文本解析为Enum?

如何知道我的程序在运行时实际使用哪个共享库?

如何在运行时向嵌入式应用程序添加多种语言选择?