【问题标题】:How linux does load libraries in applicationlinux如何在应用程序中加载库
【发布时间】:2013-05-23 13:11:28
【问题描述】:


我很感兴趣 linux 在如图所示的情况下是如何工作的。

您可以看到库“A”与应用程序静态链接。但是这个应用程序依赖于动态库 B,而它又依赖于库 A。
那么,什么库 A 会使用动态库 B?在我的应用程序中静态链接库 A,否则它将再次加载其他库 A。
如果这些库有不同的版本,这一点很重要。
你也可以给我推荐一些关于我的文章,因为对我来说链接器就像黑盒子。

【问题讨论】:

    标签: linux linker linux-kernel static-linking dynamic-linking


    【解决方案1】:

    动态链接库 B libB.so - 应该动态链接,当 libB.so 构建时,到 libA.so 将看不到静态链接的 libA.a(更糟糕的是,它可能具有该库的重复全局变量,所以这可能会给你带来噩梦)。

    实际上,libA.a 不存在于您的主程序的 ELF 可执行文件中。只有来自libA.a 的部分对象文件a*.o 被静态链接到您的可执行文件(实际需要的那些文件)中。

    参见 Levine Linkers and Loaders 书籍、dynamic linkingELF 上的维基页面,以及 Drepper 的论文 How To Write Shared Libraries。另请参阅ld.so(8)ldconfig(8)ldd(1)dlopen(3)mmap(2)proc(5) 手册页。使用strace,并尝试一次cat /proc/self/maps ...

    简而言之避免静态和动态链接同一个库(即使是相似或不同的版本)。

    经验法则:始终动态链接,除非您知道自己在做什么以及为什么...

    【讨论】:

      猜你喜欢
      • 2018-10-04
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 2014-05-16
      • 2011-02-09
      • 1970-01-01
      • 2018-02-05
      相关资源
      最近更新 更多