获取内存部分信息

Bas*_*evs 1 c c++ assembly

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

# 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"
);
Run Code Online (Sandbox Code Playgroud)

同样我们得到了__ctors_end__,__ctors0_end__ 析构函数的位置也是这样获得的.在一些ld bug变通方法之后__ctors_begin__,__ctors_end__执行从指针指向的所有函数 .我不知道汇编程序,这个代码对我来说是不可能解释的.

BTW:我知道从C调用C++构造函数/析构函数不是一个安全或简单的任务.

Aar*_*lla 5

这实际上不是CPU执行的代码,而是添加到目标文件的元数据中.它告诉链接器__ctors_begin__在存储构造函数的最终可执行文件的同一部分(=部分)中创建一些全局变量(在上面的例子中)(该部分被调用.ctors).为了使它工作,你只需要确保首先链接带有"begin"变量的文件,并且最后链接带有"end"变量的文件(但也许你也可以用它来控制它__SECTION_FLAGS).这为您提供了所需的内存范围.

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