gpt4 book ai didi

c++ - 加载程序如何从动态模块分配/释放静态数据

转载 作者:行者123 更新时间:2023-11-30 03:43:08 31 4
gpt4 key购买 nike

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

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

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

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

感谢您阐明这些问题。如果我必须选择一个平台,我希望听取 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 的输出中看到这些段.加载共享对象时,这些段中的每一个都被映射到地址空间,并充当该共享对象中任何静态数据的“分配”。

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

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

这个假设是不正确的。 _init_fini 是关于动态 初始化的(例如 C++ 中类类型的全局变量,具有非平凡的构造函数/析构函数)。在调用 _init 时,所有全局变量的内存已经通过 mmap“保留”。

However does the BSS segment

.bss 部分包含在与其他初始化(可写)数据相同的 PT_LOAD 段中。这就是为什么在 ElfXX_Phdr 中有一个单独的 p_fileszp_memsz 的原因:p_filesz“覆盖”了初始化数据,和(更大的)p_memsz 导致 mmap 为初始化数据和 .bss 数据“分配”空间。

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; >。通常的规则是 if fooa.out 的动态符号表中可见,那么 foo无论从何处引用,都将被使用。

a.out 不导出 foo(如果它没有与 -rdymamic 不链接到 foo.so),或者当 foo.so 链接到 -Bsymbolic 时。

关于c++ - 加载程序如何从动态模块分配/释放静态数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36316510/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com