共享库中的全局变量是如何链接的

How are global variables in shared libraries linked?

本文关键字:链接 何链接 全局变量 共享      更新时间:2023-10-16

假设我与这个函数共享库,其中" I "是某个全局变量。

int foo() {
return i++;
}

当我从多个进程中调用这个函数时,每个进程中的"I"的值是独立于其他进程的。

这个行为是很正常的。

我只是想知道通常这种行为是如何实现的链接器?根据我的理解,代码在进程之间共享,因此变量必须在使用该库的每个程序的所有地址空间中具有相同的虚拟地址。这个条件对我来说似乎很难实现,所以我想我在这里错过了一些东西,它的处理方式不同。

我能得到关于这个主题的更详细的信息吗?

运行时的动态链接进程(与静态链接进程非常相似)为每个进程分配单独的数据(和bss)段,并将它们映射到进程地址空间中。进程之间只共享文本段。这样,每个进程都有自己的静态数据副本。

代码在进程之间共享,因此变量必须具有在每个程序的所有地址空间中使用相同的虚拟地址这个库

代码并不像你想象的那样共享。是的,动态共享对象只加载一次,但是so中代码使用的内存引用或堆栈或堆不是共享的。只有包含代码的部分是共享的。

每个进程都有自己唯一的地址空间,所以当一个进程访问变量时,它可以有不同的值。如果进程应该共享相同的内存,他们必须专门设置这个。一个共享库是不够的。