使用gcc arm-none-eabi 4_8编译器,链接后我的二进制文件出现问题。没有错误,但是当我在调试器中提出它时,我从未达到主要。通过它跟踪它似乎链接器没有将epilog添加到crt的.init部分。这导致我的代码在.rodata节中运行.init并在未定义的指令上遇到硬故障。
当我使用相同的makefile的非常相似的代码不能解决为什么这段代码有这个问题时,我很难过。我知道这是一个广泛的问题,但链接器没有创建一个好的.init部分的原因是什么?
坏.map:
*(.init)
.init 0x00001cec 0x4 /usr/local/.../gcc/linux/4_8-2013q4/bin/../lib/gcc/arm-none-eabi/4.8.3/armv6-m/crti.o
0x00001cec _init
*(.fini)
.fini 0x00001cf0 0x4 /usr/local/.../gcc/linux/4_8-2013q4/bin/../lib/gcc/arm-none-eabi/4.8.3/armv6-m/crti.o
0x00001cf0 _fini
好.map:
*(.init)
.init 0x00015c48 0x4 /usr/local/.../gcc/linux/4_6-2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/armv6-m/crti.o
0x00015c48 _init
.init 0x00015c4c 0x8 /usr/local/.../gcc/linux/4_6-2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/armv6-m/crtn.o
*(.fini)
.fini 0x00015c54 0x4 /usr/local/.../gcc/linux/4_6-2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/armv6-m/crti.o
0x00015c54 _fini
.fini 0x00015c58 0x8 /usr/local/.../gcc/linux/4_6-2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/armv6-m/crtn.o
答案 0 :(得分:0)
原来这个问题是一个过时的链接器命令文件。
失踪:
KEEP(*(.init))
KEEP(*(.fini))