强制编译器对特定符号使用位置独立代码

问题描述 投票:0回答:0

我正在尝试创建一个链接描述文件,它映射 SRAM 和 DRAM 中的一些内存。然后,内存由 C 代码中的符号引用。 DRAM 从地址 0x0 开始,SRAM 从 0x820000000 开始。 SRAM 中的

bootblock
包含引用DRAM 中
_fs_cache
符号的代码。当我尝试编译/链接它时,它会抛出一个错误
relocation truncated to fit: R_AARCH64_ADR_PREL_PG_HI21 against symbol `_fs_cache' defined in .text section in xxx/xxx/xxx/bootblock.debug
.

我将不胜感激在这方面的帮助。看起来失败的发生是因为 SRAM 和 DRAM 部分之间的地址范围大于 4GB。如何强制编译器只对

_fs_cache
符号使用与位置无关的代码?我不想使用全局
-fpic
GCC 标志,因为这会增加二进制文件的大小。

ENTRY(_start)
SECTIONS
{
 . = 0x0000000;
 _dram = .;

 . = 0x70000000;
 _fs_cache = .;
 . = 0x70000000 + 16M;

 . = 0x820000000+0x00000;
 _sram = .;

 . = 0x820000000+0x00000;
 _bootblock = .;
 _ebootblock = _bootblock + 0x40000;
 INCLUDE "xxx/xxx/program.ld"
 _esram = .;

}
linker linker-errors linker-scripts linker-flags
© www.soinside.com 2019 - 2024. All rights reserved.