assemblyriscvrelocation

How can I load the absolute address of a symbol larger than 0x7FFFFFFF in RiscV64 assembly


I am writing a kernel and I need to self relocate above 0x7FFFFFFF. To do that, I need to refer, using absolute addressing, to the beginning and end of my kernel and to a symbol, where execution continues after the relocation. I have been unable to figure out any way to do this. Can it be done? Is there a workaround?


Solution

  • The only way I found was to take the load address and subtract this from the destination address. You can then add this offset to any relative address to get the absolute address.