У меня есть проект 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
не цитируйте меня по этому вопросу, но afaik, gcc помещает функции, которые вызывается с __attribute __ ((constructor)) в __init_array. –
Это простой проект на C. Нет конструкторов C++. И я убежден, что никогда не использовал этот атрибут. Как определить происхождение и значение таких конструкций. – harper
прочитал руководство gcc;) '__attribute __ ((*))' construct используется gcc для включения атрибутов для функций и переменных и т. Д. одним из этих атрибутов является «конструктор», который не имеет ничего общего с конструкторами C++. При запуске программы и при загрузке совместно используемой библиотеки все функции, объявленные с этим атрибутом, выполняются в неопределенном порядке. см. также http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html –