Я пишу код C++ для работы в автономной среде (в основном плата ARM). Это происходит хорошо, за исключением того, что я столкнулся с камнем преткновения - глобальными статическими конструкторами.Freestanding ARM C++ Code - пустой .ctors раздел
Насколько я понимаю, раздел .ctors содержит список адресов для каждого статического конструктора, и моему коду просто нужно перебирать этот список и выполнять вызовы каждой функции по мере ее появления. Тем не менее, я обнаружил, что этот раздел в моем двоичном коде фактически пуст! Google указал на использование «.init_array» вместо «.ctors» (вещь EABI), но это ничего не изменило.
Любые идеи относительно того, почему мои статические конструкторы не существуют? Соответствующий скрипт линкера и objdump выхода следующим образом:
.ctors :
{
. = ALIGN(4096);
start_ctors = .;
*(.init_array);
*(.ctors);
end_ctors = .;
}
.dtors :
{
. = ALIGN(4096);
start_dtors = .;
*(.fini_array);
*(.dtors);
end_dtors = .;
}
-
2 .ctors 00001000 8014c000 8014c000 00054000 2**2
CONTENTS, ALLOC, LOAD, DATA
<snip>
8014d000 g O .ctors 00000004 start_ctors
<snip>
8014d000 g O .ctors 00000004 end_ctors
Я использую рычажный эльф целевой GCC компилятор (4.4.1).
Обновление: Выходной двоичный код также полон __static_initialization_and_destruction_0
символов, которые я никогда раньше не видел.
Обновление 2: Это выдержка из objdump скомпилированного файла объекта (который связан в основные двоичный) с секцией .ctors неповрежденная:
21 .ctors 00000004 00000000 00000000 00000864 2**2
CONTENTS, ALLOC, LOAD, RELOC, DATA
RELOCATION RECORDS FOR [.ctors]:
OFFSET TYPE VALUE
00000000 R_ARM_ABS32 _GLOBAL__I__ZN9SomeStaticClass10m_InstanceE
Ну. Просто чтобы сформулировать очевидный вопрос. У вас действительно есть экземпляры статического класса? –
Я конечно делаю - по крайней мере два должны быть в финальном двоичном формате для ARM. –
Вопрос обновлен немного подробнее. –