0

我正在尝试为基于 ARM M7 的嵌入式系统构建可引导代码,该代码能够在 QSPI 中的两个不同位置就地执行,因此如果一个版本损坏,则可以在其中执行映像的备份版本不同的地方。

使用 -fpic 编译似乎会生成一个可重定位的代码映像,该映像(几乎)能够在两个地方都可以正常执行。但是,问题在于代码所引用的数据/bss偏移了相同的量 - 也就是说,编译器假设 .data 和 .bss 段紧随 .text 段之后,这不是适用于 XIP 嵌入式系统(RAM 是独立的)。

结果,如果原始二进制文件链接到在 0x60000000 处运行(并在 0x20000000 处使用固定 ram 区域),但随后在 0x60100000 处执行,则 ram 地址也将移动 0x100000(即到 0x20100000),这根本不是我想要的。

显然,我想做的是修改 gcc 的行为,以便对代码的引用(在 QSPI 中的两个不同位置执行)与位置无关,而对 .data/bss 段的引用(在固定的RAM 中的位置)是位置相关的(按照正常情况)。

这是否可以通过调整 gcc 来实现(例如,通过一些晦涩的链接器属性标志)?或者这只是遥不可及?谢谢!

4

0 回答 0