2014-01-27 4 views
3

У меня есть проект Cortex-M3, составленный с помощью GCC. Код startup_LPC177x_8x.s копирует инициализированные данные из флэш-памяти в ОЗУ, инициализирует bss, вызывает инициализацию часов SystemInit. Перед вызовом функции _main код также вызывает функцию _libc_init_array.Что входит в __init_array?

__libc_init_array функция вызывает все процедуры инициализации, которые определены в __preinit_array, вызывает функцию _init, и все процедуры, которые определены в __init_array:

void __libc_init_array (void) 
{ 
    size_t count; 
    size_t i; 

    count = __preinit_array_end - __preinit_array_start; 
    for (i = 0; i < count; i++) 
     __preinit_array_start[i](); 

    _init(); 

    count = __init_array_end - __init_array_start; 
    for (i = 0; i < count; i++) 
     __init_array_start[i](); 
} 

С помощью GDB я мог бы найти, что __preinit_array пуст (начало == конец), и что второй вызов __init_array_start[i]() сбой.

Я не знаю, какие функции включены в этот массив. Сценарий компоновщика приводит к тому, что весь раздел .init.array.* будет расположен здесь. Но как найти соответствующие .o и исходные файлы?

.init_array : 
{ 
    PROVIDE_HIDDEN (__init_array_start = .); 
    KEEP (*(SORT(.init_array.*))) 
    KEEP (*(.init_array*)) 
    PROVIDE_HIDDEN (__init_array_end = .); 
} >FLASH 
+0

не цитируйте меня по этому вопросу, но afaik, gcc помещает функции, которые вызывается с __attribute __ ((constructor)) в __init_array. –

+0

Это простой проект на C. Нет конструкторов C++. И я убежден, что никогда не использовал этот атрибут. Как определить происхождение и значение таких конструкций. – harper

+0

прочитал руководство gcc;) '__attribute __ ((*))' construct используется gcc для включения атрибутов для функций и переменных и т. Д. одним из этих атрибутов является «конструктор», который не имеет ничего общего с конструкторами C++. При запуске программы и при загрузке совместно используемой библиотеки все функции, объявленные с этим атрибутом, выполняются в неопределенном порядке. см. также http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html –

ответ

1

Могу быть, я могу помочь вам здесь -

пробега

objdump -D -j .init_array <your-application> 

и вы получите список адресов, как

Disassembly of section .init_array: 

c1008db4 <.init_array>: 
c1008db4: c1000000 .word 0xc1000000 
c1008db8: c1000a68 .word 0xc1000a68 
c1008dbc: c1000b64 .word 0xc1000b64 
c1008dc0: c1000c04 .word 0xc1000c04 
c1008dc4: c1000c68 .word 0xc1000c68 

теперь, если вы собрали это Вещь самостоятельно, теперь вы можете запустить

addr2line 0xc1000a68 -e <your-application> 

, чтобы получить имя файла и номер строки соответствующих функций.

Помогло ли это?

+0

objdump 2.22.0.20121207 не показывает '.word', но пытается разобрать байты. Но я могу использовать необработанные байты во втором столбце в качестве адреса. В моей установке GCC нет addr2line. Но я могу использовать файл карты вручную и найти соответствующую функцию 'register_fini'. Эта функция считывает значение, проверяющее условие и возвращает. К сожалению, код в '__libc_init_array' доходит до нирваны после возвращения. – harper

+0

@harper weird - звучит так, будто он читает из границ массива init и пытается перейти в случайные адреса (UB). вы можете узнать значение '__init_array_end - __init_array_start'? возможно, ваша инструментальная цепочка глючит. –