当前位置: 首页 > 知识库问答 >
问题:

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

曾嘉荣
2023-03-14

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

(. ARM.exidx.itcm.text0x0):重新定位被截断以适合: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-FFFunction sections-fdata sections-FFRerestanding

链接器标志是

“arm none eabi gcc-mcpu=cortex-m7-mthumb${FP_FLAGS}-std=c 11-O3-munaligned access-FFFunction sections-fdata sections-FFRerestanding-T${MEM LD_FILE}-T${LIBS_LD_FILE}-T${sections____FILE}-nostartfiles Xlinker-gc sections-u_printf u_-float.-Wl Map

当分支地址大于0x40000000时,似乎会出现错误。那么,如何解决这个问题呢?

/*第二版*/

我通过添加编译器标志fno exceptions解决了这个问题。但我不知道为什么?

共有1个答案

殳阳飙
2023-03-14

ARM-EABI指定单板是31位相对的。这意味着,所有可以抛出或捕获的C(即,具有C链接的C,not-fno异常)都需要位于内存中,且距离。手臂外伸并移动。臂exidx部分或相对偏移量不足,因此会导致错误。

ARM-EABI很可能利用了Linux默认用户空间,即ARM32地址空间32位中较低的31位。

所以,看看你的内存映射。是否有一个-30位的存储空间来放置extab/exidx,以最大限度地覆盖你的. text内存(XIP闪存、SDRAM、OCRAM)?你能通过链接器脚本将你的C限制在被覆盖的区域吗?你能把非文本(数据、bss等)放在范围外的内存中吗?(数据和非C和C无异常。文本访问不是REL31——只有C异常是。)

 类似资料:
  • 我在Windows 7中使用Python 3.4和Pygame为我的小儿子创建了一个小游戏。它也适用于Python 2。十、 有一些小错误。然后我尝试创建一个。使用py2exe的exe文件。我准备了一个设置。py文件复制我在pygame2exe wiki上找到的源(http://www.pygame.org/wiki/Pygame2exe?parent=CookBook)还尝试使用我在这里和pyt

  • 我有两个分支(和master)。分支2基于分支1基于master。我已经提交了分支1进行审查,它有一些更改,我将其中一些更改重新基于历史并将结果合并到master中。 现在我需要将Branch 2放在master之上,为审查/合并做准备。 问题是分支2仍然包含分支1的原始提交,这些提交已经不存在了,所以git会感到困惑。我尝试rebase -i删除分支1的原始提交,但是分支2的提交并不基于分支1之

  • 我正在尝试为协议缓冲区构建Java运行时库。我在Windows和OS X上都犯了错误,因为我遵循了Protocol Buffers项目(从中克隆而来)中Java目录下的自述指令https://github.com/google/protobuf). 当我在protobuf/java目录下运行

  • 最近我实现了一个新的构建器与gradle运行詹金斯。我们的项目包含jasper报告,所以我在下面添加了一个由jasper报告api提供的蚂蚁任务来编译jasper报告。 一切都很好,编译和预期的工作,但在部署项目到服务器后,在运行时得到以下错误。 [8/3/17 14:38:53:340 EET] 000000f5 SystemOut O ERROR[14:38:53,333-WebContain

  • null 脚本'C:\src\flutter\packages\flutter_tools\gradle\flutter.gradle'行:838 出了什么问题: 任务“:app:CompileFlutterBuildreLease”执行失败。 null null 应用程序:Build.Gradle