【问题标题】:Getting memory section information获取内存段信息
【发布时间】:2010-04-15 06:54:12
【问题描述】:

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

# 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 错误解决方法之后,从 __ctors_begin____ctors_end__ 的指针指向的所有函数都将被执行。我不知道汇编程序,我无法解释这段代码。

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

【问题讨论】:

  • 在我看来,这段代码是在创建部分,而不是获取它们。它来自哪里?
  • 如果这是创建节,构造函数如何放置在这个新节中?我最初认为这是从编译器放置它们的常规名称的一部分中提取构造函数。这是用 C++ 编写的 Linux 内核驱动程序的一部分。

标签: c++ c assembly


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-03-06
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2021-11-28
    • 2015-09-15
    • 1970-01-01
    相关资源
    最近更新 更多