我正在尝试创建一个链接描述文件,它映射 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 = .;
}