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

时间:2019-03-18 23:52:57

标签: linker arm arm64 linker-scripts

我遇到了链接器重定位错误

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)并在运行时计算地址偏移量那样的解决方法。

1 个答案:

答案 0 :(得分:0)

似乎在编译.c文件时需要-fPIC编译选项。

相关问题