【发布时间】: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 内核驱动程序的一部分。