我们知道,linux调用ldconfig
来加载所有*.so
库,然后链接使用共享库的应用程序。但是,我很困惑全局变量在这种情况下是如何工作的。由于所有这些应用程序中只有一个共享库副本,它们是否共享共享库中的全局变量?如果是,那么他们如何同步?
谢谢,
答案 0 :(得分:5)
不共享 - 共享库的代码/文本部分 - 数据部分对于使用库的每个进程都是唯一的
答案 1 :(得分:1)
正如我评论的那样:
Levine关于linkers and loaders的书是一本有用的参考书。
Linux动态链接器ld.so
是免费软件,是GNU libc的一部分,您可以研究和改进其源代码
动态链接器为ld.so
而不是ldconfig
(刚刚更新了ld.so
使用的缓存信息)。
ld.so
链接器正在使用mmap(2)系统调用将一些.so
段投影到进程的虚拟地址空间中; “text”段(代码和只读常量)使用MAP_SHARED
和PROT_READ
。 “数据”段(对于C或C ++中的全局变量或静态变量)使用MAP_PRIVATE
与PROT_WRITE
您可以通过strace
了解您的程序,以了解所涉及的系统调用。