CC to the group.
CC to the group.
thanks
Note 1: R_MIPS_LO16 can be alone and does not have a paired R_MIPS_HI16
Note 2: Several R_MIPS_HI16s can be attached to the same R_MIPS_LO16R_MIPS_HI16 (1)
R_MIPS_HI16 (2)
R_MIPS_LO16 (3)
R_MIPS_LO16 (4)If all relocations above are against the same symbol then:
bfd linker:
a) process 1 and find 3
b) process 2 and find 3 again
c) 4 is alonegold linker:
a) save 1
b) save 2
c) process 3 and handle 1 and 2
d) 4 is aloneJust as a curiosity (from the MC perspective), why is the linker
required to match these relocations?To handle R_MIPS_HI16 and R_MIPS_LO16 relocations we need a "combined"
addend "AHL". This addend is calculated using addends from both
R_MIPS_HI16 ("AHI") and R_MIPS_LO16 ("ALO"). That is why we need to
pair these relocations.AHL = (AHI << 16) + (short)ALO
R_MIPS_LO16: AHL + symbol
R_MIPS_HI16: ((AHL + symbol) – (short)(AHL + symbol)) >> 16
Ah, having a LO16 map to multiple relocations explains the problem. If
they were 1:1, they could be applied independently, right? The linker
would just need to be careful to not overwrite the other 16 bits.
Cheers,
Rafael