Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
众所周知,linux调用ldconfig加载所有*.so库,然后链接使用共享库的应用程序。但是,我很困惑全局变量在这种情况下是如何工作的。由于所有这些应用程序中只有一个共享库副本,它们是否共享共享库中的全局变量?如果是,那么它们如何同步?
ldconfig
*.so
谢谢,
不,它不是共享的 - 库的代码/文本部分是共享的 - 数据部分对于使用库的每个进程都是唯一的
正如我评论的那样:
Levine 的关于链接器和加载器的书是一本有用的参考书。
Linux 动态链接器ld.so是免费软件,是GNU libc的一部分,您可以学习和改进其源代码
ld.so
动态链接器ld.so不是ldconfig(它只是更新了使用的缓存信息ld.so)。
ld.so链接器正在使用mmap(2)系统调用将一些段.so投影到进程的虚拟地址空间中;“文本”段(用于代码和只读常量)使用MAP_SHAREDwith PROT_READ。“数据”段(用于 C 或 C++ 中的全局或静态变量)MAP_PRIVATE与PROT_WRITE
.so
MAP_SHARED
PROT_READ
MAP_PRIVATE
PROT_WRITE
strace通过对程序进行操作以了解所涉及的系统调用,您将学到很多东西。
strace