Может кто-нибудь объяснить мне, как работает следующий код?
# 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 не является задачей, которую следует считать безопасной или простой.