获取内存部分信息

有人可以解释一下以下代码是如何工作的吗?

# 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 )(该部分称为.ctors )。 为了使它工作,你只需要确保首先链接带有“begin”变量的文件,并且最后链接带有“end”变量的文件(但也许你也可以使用__SECTION_FLAGS来控制它)。 这为您提供了所需的内存范围。

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