繁体   English   中英

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

[英]How are global variables in shared libraries linked?

假设我有这个函数的共享库,其中“i”是一些全局变量。

int foo() {
return i++;
}

当我从多个进程调用此函数时,每个进程中“i”的值与其他进程无关。

这种行为是非常期待的。

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

我可以获得有关此主题的更详细信息吗?

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

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

代码不会以您的想法分享。 是动态共享对象被加载一次,但存储器的引用或堆栈或在代码中的堆so使用不共享。 仅共享包含代码的部分。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM