gpt4 book ai didi

c++ - 获取内存段信息

转载 作者:太空宇宙 更新时间:2023-11-04 01:15:25 24 4
gpt4 key购买 nike

谁能解释一下下面的代码是如何工作的?

# if   defined(__ELF__)
# define __SECTION_FLAGS ", \"aw\" , @progbits"
/* writable flag needed for ld ".[cd]tors" sections bug workaround) */
# elif defined(__COFF__)
# define __SECTION_FLAGS ", \"dr\""
/* untested, may be writable flag needed */
# endif

asm
(
".section .ctors" __SECTION_FLAGS "\n"
".globl __ctors_begin__\n"
"__ctors_begin__:\n"
".previous\n"
);
asm /* ld ".[cd]tors" sections bug workaround */
(
".section .ctors0" __SECTION_FLAGS "\n"
".globl __ctors0_begin__\n"
"__ctors0_begin__:\n"
".previous\n"
);

同样,我们得到 __ctors_end____ctors0_end__ 和析构函数的位置也是通过这种方式获得的。在一些 ld bug 解决方法之后,所有由从 __ctors_begin____ctors_end__ 的指针指向的函数都被执行。我不懂汇编程序,我无法解释这段代码。

顺便说一句:我知道从 C 调用 C++ 构造器/析构器并不是一项安全或容易的任务。

最佳答案

这实际上不是由 CPU 执行的代码,而是添加到目标文件的元数据中。它告诉链接器在存储构造函数的最终可执行文件的同一部分(= 部分)中创建一些全局变量(上例中的 __ctors_begin__)(该部分称为 .ctors )。要使其工作,您只需确保首先链接带有“开始”变量的文件,最后链接带有“结束”变量的文件(但也许您也可以使用 __SECTION_FLAGS)。这将为您提供所需的内存范围。

至于“安全”:好吧,C++ 运行时并不神奇。它必须以某种方式知道如何在启动时运行所有的构造函数和析构函数,并且这不会一直改变。因此,对于编译器的主要版本号,这应该是非常安全的。另外,你很快就会知道它何时坏了:-)

关于c++ - 获取内存段信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2643264/

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