我遇到了链接器重定位错误
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:我对保持一个符号“偏移量”很感兴趣,而不是像在代码中传递地址(addr1
和addr2
)并在运行时计算地址偏移量那样的解决方法。
答案 0 :(得分:0)
似乎在编译.c文件时需要-fPIC编译选项。