Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取内存段信息_C++_C_Assembly - Fatal编程技术网

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内核驱动程序的一部分。