[英]How do I know where the .data section needs to get the init data from? (gcc linker)
[英]What would cause linker not to insert epilog in .init section?
使用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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.