我正在用NXP的I.MXRT系列皮质M7芯片开发一个嵌入式系统.我需要重新定位一些在RAM(ITCM)中的C功能,而不是在Flash中。ITCM地址从0x00000000开始,Flash从0x60000000开始。因此,位于Flash的函数位于ITCM上的函数将执行一个长分支。但是它会出现编译错误。
(.ARM.exidx.itcm.text+0x0):将重定位截断为fit: 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编译器标志是
臂-非-eabi-gcc-mcpu=皮层-m7 -mthumb ${FP_FLAGS} -std=c++11 -O3 -市政-接入-连接-区段-fdata-区段-ffreestanding
链接器标志是
“手臂-无-gcc-mcpu=皮层-m7 -mthumb ${FP_FLAGS} -std=c++11 -O3 -市政-访问-连接-节-fdata-节-ffreestanding -T ${MEM_LD_FILE} -T ${LIBS_LD_FILE} -T ${SECTIONS_LD_FILE} -nostartfiles -Xlinker -gc-节-u _printf_float -Wl,-Map=${TARGET_MAP} -规范=纳米。”
当分支地址大于0x40000000时,似乎会发生错误。那么,如何解决这个问题呢?
/*第二版*/
我通过添加编译器标志-fno-异常来解决这个问题。但我不知道为什么?
发布于 2021-11-03 19:22:16
ARM-EABI指定的例外情况单板是31位相对的。这意味着所有可以抛出或捕获的C++ (即,使用C++链接,)将不超过30位(加或减)来自..ARM extab和.ARM.exidx部分或相对偏移量将是不够的-因此错误。
ARM-EABI很可能利用了Linux默认的用户空间,即32位ARM32地址空间中较低的31位。
看你的记忆图。是否有一个存储+-30位来放置extab/exidx,以最大限度地覆盖您的.text内存(XIP、SDRAM、OCRAM)?您能(通过链接器脚本)将您的C++限制在仅覆盖的区域吗?你能放置非文本(数据、bss等)吗?在越界记忆中?(数据和非C++和C++-没有例外的.text访问不是REL31 -只有C++例外。)
https://stackoverflow.com/questions/52637962
复制相似问题