2010-06-02 4 views
1

Я пишу код 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 
+3

Ну. Просто чтобы сформулировать очевидный вопрос. У вас действительно есть экземпляры статического класса? –

+0

Я конечно делаю - по крайней мере два должны быть в финальном двоичном формате для ARM. –

+0

Вопрос обновлен немного подробнее. –

ответ

1

Это закончилось тем, что проблема системы сборки - скрипт компоновщика указывался несколько раз в командной строке компоновщика, что каким-то образом заставило g ++ задохнуться.