On Wed, 24 Feb 2021, Jiaxun Yang wrote: > For RISC-V, %pcrel_lo shall point to the label of corresponding %pcrel_hi, > like > > .LA0: > auipc a0, %pcrel_hi(sym) > addi a0, a0, %pcrel_lo(.LA0) I commented on it once, in the course of the FDPIC design project, and I find it broken by design. Sadly it has made it into the RISC-V psABI and it is hard to revert at this time, too many places have started relying on it. > However, for MIPS %pcrel_lo simply calculate LO16 of the symbol to current > PC, thus PC relative addressing will look like: > > .LA0: > auipc a0, %pcrel_hi(sym) > .LA1: > addi a0, %pcrel_lo(sym + (.LA1 - .LA0)) > > I found it's very difficult for GCC to generate this kind of pcrel_lo > expression, > RTX label_ref can't be lower into such LOW_SUM expression. You may want to use composed relocations to refer to .LA1 (R_MIPS_32) and .LA0 (R_MIPS_SUB). There may or may not be linker updates needed; unlike the RISC-V one the MIPS BFD backend already supports composed relocations with the usual ELF gABI semantics. It would be good to switch to RELA at this point universally too; none of new stuff will work with old linkers anyway. HTH, Maciej