我有一个符号_symbol
,需要加载它的绝对地址。但如果我写
lui t1, %hi(_symbol)
addi t1, t1, %lo(_symbol)
连接器的抱怨就像这样
relocation R_RISCV_HI20 out of range: -2251799813160077 is not in [-524288, 524287]
我的问题是:我如何在RISC-V asm中通过ABSOLUTE寻址加载符号的地址(没有GOT,因为没有动态链接器)?
一个类似的问题也在这里:How can I load the absolute address of a symbol larger than 0x7FFFFFFF in RiscV64 assembly但是上面给出的解决方案对我不起作用,因为加载地址和目的地址也相距很远(〉2^32)。
1条答案
按热度按时间h6my8fg21#
根据@MartinRosenau的建议:在代码后放置一个64位常量(地址)。解决方案可写成:
数据symbol_addr将自动计算为_symbol的地址,该地址可能是一个大地址,然后使用“ld”指令加载symbol_addr,寄存器“t1”等于symbol_addr,“jr”指令将工作。