编译时,ARM Cortex-M7长分支收到错误“重新截断以适合R:ARM_PREL31”

时间:2018-10-04 02:03:22

标签: gcc arm cortex-m

我正在使用NXP的I.MXRT系列Cortex-M7芯片开发嵌入式系统。我需要在RAM(ITCM)中重定位某些C函数,而不是在Flash中重定位。 ITCM的地址从0x00000000开始,Flash的地址从0x60000000开始。因此,定位在Flash上​​的函数调用在ITCM上的函数将执行一个长分支。但这会导致编译错误

  

(。ARM.exidx.itcm.text + 0x0):重新定位以适合以下位置:R_ARM_PREL31针对`.itcm.text'

这是我的代码

__attribute__ ((long_call,section(".itcm.text"),noinline))
int foo(int k)
{
     return k + 1;
}

我的链接脚本

MEMORY
{
 /*
 *  SPI Flash 
 *  
 *  
 */
ITCM(xrw) : ORIGIN = 0x00000000, LENGTH = 128K
DTCM (xrw) : ORIGIN = 0x20000000, LENGTH = 256K
RAM (xrw) : ORIGIN =   0x20200000, LENGTH = 256K
FLASH (rx) : ORIGIN =  0x60000000, LENGTH = 4096K
}
 /*************omit***************/
_siitcm = LOADADDR(.itcm.text);
.itcm.text : ALIGN(4)
{
    __itcm_start__ = .;
    *(.itcm.text .itcm.text.*)
    . = ALIGN(4);
    __itcm_end__ = .;
} >ITCM AT>FLASH

编译器标志为

  

arm-none-eabi-gcc -mcpu = cortex-m7 -mthumb $ {FP_FLAGS} -std = c ++ 11 -O3 -munaligned-access -ffunction-sections -fdata-sections -ffreestanding

链接器标志为

  

“ arm-none-eabi-gcc -mcpu = cortex-m7 -mthumb $ {FP_FLAGS} -std = c ++ 11 -O3 -munaligned-access -ffunction-sections -fdata-sections -ffreestanding -T $ { MEM_LD_FILE} -T $ {LIBS_LD_FILE} -T $ {SECTIONS_LD_FILE} -nostartfiles -Xlinker -gc-sections -u _printf_float -Wl,-Map = $ {TARGET_MAP} --specs = nano.specs“

当分支地址大于0x40000000时,似乎会发生错误。那么,如何解决此问题?

/ *第二版* /

我已经通过添加编译器标志-fno-exceptions解决了该问题。但是我不知道为什么?

0 个答案:

没有答案