搬迁超出范围; R_AARCH64_ADR_PREL_PG_HI21;通过链接描述文件变量;

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

我有一个链接器重定位错误

relocation R_AARCH64_ADR_PREL_PG_HI21 out of range: 8556371968 is not in [-4294967296, 4294967295]

有一个使用此重新定位符号的代码(经过简化,不是实际的符号,但足以使您有所了解)

extern "C" extern void* memOffset; 

void* getAddress(const void* addr)
{
  return (void*)((uintptr_t)addr + (uintptr_t)&memOffset);
}

[memOffset是通过链接器脚本提供的,并计算为:memOffset = addr1 - addr2;

好,当地址差超过32b时,将发生重定位错误。

有没有办法像链接程序脚本符号一样提供此完整的64b'offset'变量?

谢谢

PS:我对保持一个符号“偏移量”很感兴趣,而不是像在代码中传递地址(addr1addr2)并在运行时计算地址偏移量那样的解决方法。

linker arm arm64 linker-scripts
1个回答
0
投票
似乎在编译.c文件时似乎需要-fPIC编译选项。
© www.soinside.com 2019 - 2024. All rights reserved.