我有一个用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
答案 0 :(得分: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>
获取相关函数的文件名和行号。
这有帮助吗?