【发布时间】:2012-09-17 01:44:38
【问题描述】:
众所周知,linux调用ldconfig加载所有*.so库,然后链接使用共享库的应用程序。但是,我很困惑全局变量在这种情况下是如何工作的。由于所有这些应用程序中只有一份共享库,它们是否共享共享库中的全局变量?如果是,那么它们如何同步?
谢谢,
【问题讨论】:
标签: linux shared-libraries dynamic-linking dynamic-loading
众所周知,linux调用ldconfig加载所有*.so库,然后链接使用共享库的应用程序。但是,我很困惑全局变量在这种情况下是如何工作的。由于所有这些应用程序中只有一份共享库,它们是否共享共享库中的全局变量?如果是,那么它们如何同步?
谢谢,
【问题讨论】:
标签: linux shared-libraries dynamic-linking dynamic-loading
不,它不共享 - 库的代码/文本部分是共享的 - 数据部分对于使用库的每个进程都是唯一的
【讨论】:
ld.so动态链接器是免费软件(所以你可以研究它的源代码并改进它),并使用mmap系统调用将一些.so段投影到虚拟地址空间过程。你可以strace你的程序来感受一下涉及的系统调用。
ld.so,而不是ldconfig,正在做动态链接。 ldconfig 只是在配置动态链接器。
正如我所评论的:
Levine 关于linkers and loaders 的书是一个有用的参考。
Linux 动态链接器ld.so 是免费软件,是GNU libc 的一部分,您可以学习和改进其源代码
动态链接器是ld.so 而不是ldconfig(它只是更新了ld.so 使用的缓存信息)。
ld.so 链接器正在使用mmap(2) 系统调用将一些.so 段投影到进程的虚拟地址空间中; “文本”段(用于代码和只读常量)使用 MAP_SHARED 和 PROT_READ。 “数据”段(用于 C 或 C++ 中的全局或静态变量)使用 MAP_PRIVATE 和 PROT_WRITE
通过strace-ing 程序来了解所涉及的系统调用,您会学到很多东西。
【讨论】: