Получение информации о разделе памяти - PullRequest
1 голос
/ 15 апреля 2010

Может кто-нибудь объяснить мне, как работает следующий код?

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

1 Ответ

5 голосов
/ 15 апреля 2010

На самом деле это не код, выполняемый ЦП, а добавление к метаданным объектных файлов. Он говорит компоновщику создать некоторые глобальные переменные (__ctors_begin__ в примере выше) в том же разделе (= часть) конечного исполняемого файла, где хранятся конструкторы (этот раздел называется .ctors). Чтобы это работало, вам просто нужно убедиться, что файл с переменной «begin» связан первым, а файл с переменной «end» связан последним (но, возможно, вы также можете управлять этим с помощью __SECTION_FLAGS). Это дает вам диапазон памяти, который вы ищете.

Что касается «безопасного»: Ну, среда выполнения C ++ не волшебна. Каким-то образом он должен знать, как запускать все конструкторы и деструкторы при запуске, и это не меняется постоянно. Так что для основного номера версии вашего компилятора это должно быть довольно безопасно. Кроме того, вы узнаете довольно скоро, когда он сломается: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...