假设我与这个函数共享库,其中“i”是一些全局变量。
int foo() {
return i++;
}
当我从多个进程调用此函数时,每个进程中“i”的值独立于其他进程。
这种行为是意料之中的。
我只是想知道链接器通常如何实现这种行为?据我了解,代码在进程之间共享,因此该变量必须在使用该库的每个程序的所有地址空间中具有相同的虚拟地址。这种情况对我来说似乎很难实现,所以我想我在这里遗漏了一些东西,而且做得不同。
我可以获得有关此主题的更详细信息吗?
运行时的动态链接过程(与静态链接过程非常相似)为每个进程分配单独的数据(和 bss)段,并将它们映射到进程地址空间。只有文本段在进程之间共享。这样,每个进程都会获得自己的静态数据副本。
代码在进程之间共享,因此变量必须在使用该库的每个程序的所有地址空间中具有相同的虚拟地址
代码不会按照您的想法共享。是的,动态共享对象仅加载一次,但内存引用或堆栈或堆中的代码so
不共享。仅共享包含代码的部分。
每个进程都有自己唯一的地址空间,因此当一个进程访问变量时,它可以具有与另一个进程不同的值。如果进程应该共享相同的内存,他们将不得不专门设置它。共享库是不够的。