【问题标题】:global variable in a .so library.so 库中的全局变量
【发布时间】:2014-02-27 14:32:37
【问题描述】:

说库x.so 有一个全局变量y,它正在由库中的一个函数(比如fun1)进行操作。

当进程 p1 被加载到 RAM 中,其代码正在使用库 x.so 中的函数 fun1,库 x.so 将由 ld.so 和函数加载到 RAM(如果尚未存在)符号在程序开始执行之前被解析。

现在这个全局变量是在哪里创建的。正在处理中p1 吗?

当另一个进程p2 也使用fun1(正在对y 进行操作)时会发生什么?

【问题讨论】:

    标签: c++ c linux shared-libraries


    【解决方案1】:

    进程将获得 y 的私有副本,当您调用 exec 时,它将被新副本替换。它将驻留在库的数据段中。

    【讨论】:

    • 所以当 ld.so 看到当前程序正在使用库中的函数时,它会在库的数据段中创建一个新的变量副本到当前进程自己的数据段中?此外,如果有一个 exec() 调用整个 ld.so 符号解析从新代码开始?
    • 加载库时会立即创建库的数据段。它以与可执行文件的全局变量类似的方式创建(作为私有复制写入文件支持的 VM 映射)。与函数符号不同 - 数据符号被立即解析。当exec 被调用时,您的整个过程虚拟机将被替换为新的虚拟机,并且所有库都从头开始重新映射。
    • @SergeyL,如果您进行exec() 样式调用,从概念上讲,进程的整个内存区域都会被复制,因此子进程会得到一个新副本。实际上,为了提高效率,操作系统只允许他们访问共享的只读副本,并且仅在写入时复制(写时复制)。不涉及重新映射。
    • @vonbrand 不,这是fork 的行为,exec 将过程映像替换为新的(通常不同的)映像。
    • @SergeyL,你是完全正确的。很抱歉造成混乱。
    【解决方案2】:

    每个进程在启动时在到达main 入口点之前加载库时创建自己的变量y 实例。

    【讨论】:

      猜你喜欢
      • 2014-11-14
      • 2014-08-10
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      相关资源
      最近更新 更多