我有一个用 GCC 编译的 Cortex-M3 项目。startup_LPC177x_8x.s 代码将初始化数据从闪存复制到 RAM,初始化bss,调用时钟初始化 SystemInit
。在调用_main
函数之前,代码还会调用函数_libc_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
是空的(start==end),并且第二次调用__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