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