我有一个用GCC编译的Cortex-M3项目。 startup_LPC177x_8x.s代码将已初始化的数据从闪存复制到RAM中,初始化该时钟初始化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
是空的(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
请不要在此引用我,但afaik,gcc将__attribute __((构造函数))调用的函数放入__init_array中。 –
这是一个纯C项目。没有C++构造函数。我相信我从未使用过这个属性。我如何识别这些结构的起源和意义。 – harper
阅读gcc手册;)'__attribute __((*))'构造被gcc用来为函数和变量等启用属性。其中一个属性是“构造函数”,它与C++构造函数无关。在程序启动时和共享库加载时,使用该属性声明的所有函数都以未定义的顺序执行。顺便说一下,请参阅http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html –