【问题标题】:What would cause linker not to insert epilog in .init section?什么会导致链接器不在 .init 部分插入结语?
【发布时间】:2014-03-18 02:56:55
【问题描述】:

使用 gcc arm-none-eabi 4_8 ​​编译器,链接后我的二进制文件出现问题。没有错误,但是当我在调试器中启动它时,我永远不会到达 main.跟踪它似乎链接器没有将epilog添加到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

【问题讨论】:

    标签: linker crt


    【解决方案1】:

    原来问题是链接器命令文件过时。

    失踪了:

               KEEP(*(.init))
               KEEP(*(.fini))
    

    【讨论】:

      猜你喜欢
      • 2015-06-29
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      • 2015-05-20
      相关资源
      最近更新 更多