assembly 在RISC-V 64中,如何通过绝对寻址加载符号的地址?

kd3sttzy  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(229)

我有一个符号_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)。

h6my8fg2

h6my8fg21#

根据@MartinRosenau的建议:在代码后放置一个64位常量(地址)。解决方案可写成:

# Use load instruction get address of _symbol
ld t1, symbol_addr
jr t1
...
# A large pc for _symbol
_symbol:
    nop
    ...
.data
# symbol_addr equals to the address of _symbol
symbol_addr: .dowrd _symbol

数据symbol_addr将自动计算为_symbol的地址,该地址可能是一个大地址,然后使用“ld”指令加载symbol_addr,寄存器“t1”等于symbol_addr,“jr”指令将工作。

相关问题