使用gcc arm-none-eabi 4_8编译器,链接后我的二进制文件出现问题。没有错误,但是当我在调试器中启动它时,我永远不会到达main。跟踪它似乎链接器没有将结尾添加到crt的.init节中。这导致我的代码经过.init进入.rodata节,并在未定义的指令上遇到严重错误。
我很困惑,试图弄清楚为什么使用相同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
原来问题是链接器命令文件已过期。
失踪:
KEEP(*(.init))
KEEP(*(.fini))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句