pussuw opened a new pull request, #11322:
URL: https://github.com/apache/nuttx/pull/11322

   ## Summary
   There is a problem with the current elf loader for risc-v: when a pair of 
PCREL_HI20 / LO12 relocations are encountered, it is assumed that these will 
follow each other immediately, as follows:
   
   label:
        auipc      a0, %pcrel_hi(symbol)    // R_RISCV_PCREL_HI20
        load/store a0, %pcrel_lo(label)(a0) // R_RISCV_PCREL_LO12_I/S
   
   With this assumption, the hi/lo relocations are both done when a hi20 
relocation entry is encountered, first to the current instruction (addr) and to 
the next instruction (addr + 4).
   
   However, this assumption is wrong. There is nothing in the elf relocation 
specification[1] that mandates this. Thus, the hi/lo relocation always needs to 
first fixup the hi-part, and when the lo-part is encountered, it needs to find 
the corresponding hi relocation entry, via the given "label". This necessitates 
(re-)visiting the relocation entries for the current section as well as looking 
for "label" in the symbol table.
   
   The NuttX elf loader does not allow such operations to be done in the 
machine specific part, so this patch fixes the relocation issue by introducing 
an architecture specific cache for the hi20 relocation and symbol table 
entries. When a lo12 relocation is encountered, the cache can be consulted to 
find the hi20 part.
   
   [1] 
https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-elf.adoc
   ## Impact
   Fix elf loader for risc-v
   ## Testing
   qemu-rv:knsh64
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to