共享库中的全局变量是如何链接的
How are global variables in shared libraries linked?
假设我与这个函数共享库,其中" I "是某个全局变量。
int foo() {
return i++;
}
当我从多个进程中调用这个函数时,每个进程中的"I"的值是独立于其他进程的。
这个行为是很正常的。
我只是想知道通常这种行为是如何实现的链接器?根据我的理解,代码在进程之间共享,因此变量必须在使用该库的每个程序的所有地址空间中具有相同的虚拟地址。这个条件对我来说似乎很难实现,所以我想我在这里错过了一些东西,它的处理方式不同。
我能得到关于这个主题的更详细的信息吗?
运行时的动态链接进程(与静态链接进程非常相似)为每个进程分配单独的数据(和bss)段,并将它们映射到进程地址空间中。进程之间只共享文本段。这样,每个进程都有自己的静态数据副本。
代码在进程之间共享,因此变量必须具有在每个程序的所有地址空间中使用相同的虚拟地址这个库
代码并不像你想象的那样共享。是的,动态共享对象只加载一次,但是so
中代码使用的内存引用或堆栈或堆不是共享的。只有包含代码的部分是共享的。
每个进程都有自己唯一的地址空间,所以当一个进程访问变量时,它可以有不同的值。如果进程应该共享相同的内存,他们必须专门设置这个。一个共享库是不够的。
相关文章:
- Eclipse CDT clang 工具链 - 无法从链接器选项中删除 stdlibc++,但可以添加 libc++,E
- 为什么我们需要在链接列表链接之前填写数据?
- 如果我们不创建一个新节点并使用指针插入数据并建立链接(在链表中)怎么办?
- CMake 生成的程序无法在 Windows 上链接:尝试链接到不存在的文件
- 当其他链接库链接 stdc++ 为动态时,如何将 libstdc++ 链接设置为静态?
- 挂接静态链接的 ELF 二进制文件
- 如何将此动态链接库链接到程序
- 静态链接再次链接boost.test和cmake在Windows上的mingw
- 从最基本的Qt应用程序重新链接对象 - 链接器错误
- cmake从子目录中添加了破坏链接/库链接优先级的标志和库
- 链接器链接正确的文件,但找不到符号
- 围绕可以通过C链接器链接的C++库创建一个C包装器
- 为什么在c++中声明静态成员会导致链接器链接atexit
- CMake(Android工具链)-运行链接命令时出错:没有这样的文件或目录
- 如何正确链接 DevIL 链接器库
- c++ 11 foreach循环中指向链接的链接
- 创建和链接双链表
- Boost库构建-运行时链接和链接选项之间的差异
- 如何将code::块设置为在目标链接器选项之前链接项目链接器选项
- 查找由链接列表链接的数据的各个地址.C++