Я пишу код C ++ для запуска в автономной среде (в основном, на плате ARM). Все шло хорошо, за исключением того, что я наткнулся на камень преткновения - глобальные статические конструкторы.
Насколько я понимаю, секция .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