【问题标题】:does dynamic library shared global variable in linux在linux中动态库共享全局变量
【发布时间】:2012-09-17 01:44:38
【问题描述】:

众所周知,linux调用ldconfig加载所有*.so库,然后链接使用共享库的应用程序。但是,我很困惑全局变量在这种情况下是如何工作的。由于所有这些应用程序中只有一份共享库,它们是否共享共享库中的全局变量?如果是,那么它们如何同步?

谢谢,

【问题讨论】:

    标签: linux shared-libraries dynamic-linking dynamic-loading


    【解决方案1】:

    不,它不共享 - 库的代码/文本部分是共享的 - 数据部分对于使用库的每个进程都是唯一的

    【讨论】:

    • 谢谢!顺便说一句,你有关于动态加载器的任何网络链接,即它是如何工作的。
    • ld.so动态链接器是免费软件(所以你可以研究它的源代码并改进它),并使用mmap系统调用将一些.so段投影到虚拟地址空间过程。你可以strace你的程序来感受一下涉及的系统调用。
    • 顺便说一句,ld.so,而不是ldconfig,正在做动态链接。 ldconfig 只是在配置动态链接器。
    【解决方案2】:

    正如我所评论的:

    • Levine 关于linkers and loaders 的书是一个有用的参考。

    • Linux 动态链接器ld.so 是免费软件,是GNU libc 的一部分,您可以学习和改进其源代码

    • 动态链接器是ld.so 而不是ldconfig(它只是更新了ld.so 使用的缓存信息)。

    • ld.so 链接器正在使用mmap(2) 系统调用将一些.so 段投影到进程的虚拟地址空间中; “文本”段(用于代码和只读常量)使用 MAP_SHAREDPROT_READ。 “数据”段(用于 C 或 C++ 中的全局或静态变量)使用 MAP_PRIVATEPROT_WRITE

    • 通过strace-ing 程序来了解所涉及的系统调用,您会学到很多东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多