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_filesz
和p_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;
。通常的规则是 如果 foo
在 a.out
的动态符号 table 中可见,那么无论如何都会使用 foo
从哪里引用它。
当 a.out
不导出 foo
时会出现并发症(如果它不是 link 与 -rdymamic
和 导出不是 link 反对 foo.so
),或者当 foo.so
是 link 与 -Bsymbolic
。
向那里的链接器专家提问。我一直在 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
.
However does the BSS segment
.bss
部分包含在与其他已初始化 (writable) 数据相同的 PT_LOAD
段中。这就是为什么在ElfXX_Phdr
中有单独的p_filesz
和p_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;
。通常的规则是 如果 foo
在 a.out
的动态符号 table 中可见,那么无论如何都会使用 foo
从哪里引用它。
当 a.out
不导出 foo
时会出现并发症(如果它不是 link 与 -rdymamic
和 导出不是 link 反对 foo.so
),或者当 foo.so
是 link 与 -Bsymbolic
。