我很感兴趣 linux 在如图所示的情况下是如何工作的。
您可以看到库“A”与应用程序静态链接。但是这个应用程序依赖于动态库B,而它又依赖于库A。
那么,什么库A会使用动态库B呢?在我的应用程序中静态链接库 A,否则它将再次加载其他库 A。
如果这些库具有不同的版本,这一点很重要。
你也可以向我推荐一些关于我的文章,因为对我来说链接器就像黑匣子。
我很感兴趣 linux 在如图所示的情况下是如何工作的。
您可以看到库“A”与应用程序静态链接。但是这个应用程序依赖于动态库B,而它又依赖于库A。
那么,什么库A会使用动态库B呢?在我的应用程序中静态链接库 A,否则它将再次加载其他库 A。
如果这些库具有不同的版本,这一点很重要。
你也可以向我推荐一些关于我的文章,因为对我来说链接器就像黑匣子。
动态链接库 B libB.so
- 应该在libB.so
构建时动态链接到libA.so
不会看到静态链接libA.a
的库(更糟糕的是,它可能具有该库的重复全局变量,因此可能会给您带来噩梦)。
实际上,libA.a
在您的主程序的 ELF 可执行文件中不存在。只有一些但不是所有的目标文件a*.o
在libA.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
...
简而言之,避免静态和动态链接相同的库(即使是相似或不同的版本)。
经验法则:始终动态链接,除非您知道自己在做什么以及为什么...