loader allocate/deallocate 如何从动态模块获取静态数据

How does a loader allocate/deallocate static data from a dynamic module

向那里的链接器专家提问。我一直在 Matlab 中处理 mex 文件,遇到了很多无法解释的崩溃,所以我想更深入地研究一下。

你能给我解释一下当加载(卸载)动态模块时,静态数据是如何在进程的虚拟内存中分配(解除分配)的吗?space

我假设这发生在 _init()_fini() 函数中。但是,BSS 段是否会在堆 space 中分配一块内存以及其他动态内存分配?

动态模块中的全局数据呢?符号名称是否可能与主要可执行文件冲突?

感谢您阐明这些问题。如果我必须选择一个平台,我想听听 ELF 专家的意见,因为我的大部分开发都是在 Linux.

上进行的

Can you explain to me how static data is allocated (deallocated) in a process' virtual memory space when a dynamic module is being loaded (unloaded)?

这部分很简单:每个 ELF 文件都有 PT_LOAD 段,您可以在 readelf -Wl foo.so 的输出中看到这些段。加载共享对象时,这些段中的每一个都被 mmap 编入地址 space,并用作该共享对象中任何静态数据的 "allocation"。

卸载 foo.so 时,数据(和代码)通过 munmap 系统调用处理。

I assume this takes place in the _init() and _fini() functions

这个假设是不正确的。 _init_fini 是关于 动态 初始化(例如 class 类型的全局变量 C++ 具有非平凡的 constructor/destructor).在调用 _init 时,所有全局变量的内存已经通过 mmap.

"reserved"

However does the BSS segment

.bss 部分包含在与其他已初始化 (writable) 数据相同的 PT_LOAD 段中。这就是为什么在ElfXX_Phdr中有单独的p_fileszp_memsz的原因:p_filesz"covers"初始化的数据,和(更大)p_memsz的原因初始化数据和 .bss 数据的 mmap 到 "allocate" space。

What about global data in a dynamic module?

怎么样?我在上面介绍了初始化数据。

Would there be possibility of symbol name clashes with the primary executable?

当然可以。您可以在 a.out 中定义 int foo = 42;,在 foo.so 中定义 int foo = 24;。通常的规则是 如果 fooa.out 的动态符号 table 中可见,那么无论如何都会使用 foo从哪里引用它。

a.out 不导出 foo 时会出现并发症(如果它不是 link 与 -rdymamic 导出不是 link 反对 foo.so),或者当 foo.so 是 link 与 -Bsymbolic