首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ARM Cortex-M7长分支在编译时出现“重定位截断以适合: R_ARM_PREL31”错误

ARM Cortex-M7长分支在编译时出现“重定位截断以适合: R_ARM_PREL31”错误
EN

Stack Overflow用户
提问于 2018-10-04 02:03:22
回答 1查看 1.2K关注 0票数 0

我正在用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‘

这是我的密码

代码语言:javascript
复制
__attribute__ ((long_call,section(".itcm.text"),noinline))
int foo(int k)
{
     return k + 1;
}

我的链接脚本

代码语言:javascript
复制
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-异常来解决这个问题。但我不知道为什么?

EN

回答 1

Stack Overflow用户

发布于 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++例外。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52637962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档