C++ 获取内存段信息
有人能解释一下下面的代码是如何工作的吗C++ 获取内存段信息,c++,c,assembly,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,
# 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"
);
类似地,我们得到的是\uuuuuuuu-ctors\uu-end\uuuuuuu
,\uuuuuuuuuu-ctors0\uuuuu-end\uuuuu
,析构函数的位置也是通过这种方式获得的。在一些ld错误解决方法之后,执行从\uuuuuuuuuuuuuuuuuuuuuuuuuuuu开始\uuuuuuuuuuu
到\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我不懂汇编程序,这段代码我无法解释
BTW:我知道从C调用C++的构造/析构函数不是一个安全的或容易的任务。
< P>这不是CPU执行的代码,而是添加到对象文件的元数据中。它告诉链接器在存储构造函数的最终可执行文件(该部分称为.ctors
)的同一部分(=部分)中创建一些全局变量(.ctors\u begin\u
)。要使其正常工作,您只需确保首先链接带有“begin”变量的文件,最后链接带有“end”变量的文件(但您也可以使用\u节\u标志控制此操作)。这将为您提供所需的内存范围
“安全”:嗯,C++运行时不是魔法。不知何故,它必须知道如何在启动时运行所有构造函数和析构函数,而这不会一直改变。因此,对于编译器的主要版本号,这应该是相当安全的。此外,您很快就会知道它何时中断:-)
这实际上不是由CPU执行的代码,而是添加到对象文件的元数据中。它告诉链接器在存储构造函数的最终可执行文件(该部分称为.ctors
)的同一部分(=部分)中创建一些全局变量(.ctors\u begin\u
)。要使其正常工作,您只需确保首先链接带有“begin”变量的文件,最后链接带有“end”变量的文件(但您也可以使用\u节\u标志控制此操作)。这将为您提供所需的内存范围
“安全”:嗯,C++运行时不是魔法。不知何故,它必须知道如何在启动时运行所有构造函数和析构函数,而这不会一直改变。因此,对于编译器的主要版本号,这应该是相当安全的。另外,当代码中断时,您很快就会知道:-)
对我来说,这段代码似乎是在创建节,而不是获取它们。它来自哪里?如果这是节创建,那么构造函数如何放置在这个新节中?我最初认为,这是从编译器放置的常规名称的一部分中提取构造函数。这是用C++编写的Linux内核驱动程序的一部分。对我来说,这个代码是创建部分而不是获取它们。它来自哪里?如果这是节创建,那么构造函数如何放置在这个新节中?我最初认为,这是从编译器放置的常规名称的一部分中提取构造函数。这是用C++编写的Linux内核驱动程序的一部分。