0


我很感兴趣 linux 在如图所示的情况下是如何工作的。 在此处输入图像描述

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

4

1 回答 1

1

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

实际上,libA.a在您的主程序的 ELF 可执行文件中不存在。只有一些但不是所有的目标文件a*.olibA.a您的可执行文件中静态链接(那些实际需要的文件)。

请参阅Levine Linkers and Loaders书籍、关于动态链接ELF的 wikipage 以及 Drepper 的论文How To Write Shared Libraries。另请参见ld.so(8)ldconfig(8)ldd(1)dlopen(3)mmap(2)proc(5)手册页。使用strace,并尝试一次cat /proc/self/maps...

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

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

于 2013-05-23T13:30:52.717 回答