MIPS/LD: Accept high-part relocations in PIC code with absolute symbols
authorMaciej W. Rozycki <macro@linux-mips.org>
Tue, 27 Nov 2018 16:34:03 +0000 (16:34 +0000)
committerMaciej W. Rozycki <macro@linux-mips.org>
Tue, 27 Nov 2018 16:34:03 +0000 (16:34 +0000)
commit3c7687b9cdacc243f7e23cd9b144e72b88d58817
tree8d3d09af45d6fa8b4a1299ba69d1129c245ebd8f
parentaff68bd0415c6f834cf1717865b5b44dea6b9ef5
MIPS/LD: Accept high-part relocations in PIC code with absolute symbols

Accept R_MIPS_HI16, R_MIPS_HIGHER and R_MIPS_HIGHEST relocations and
their compressed counterparts in PIC code where the symbol referred is
absolute.  Such an operation is meaningful, because an absolute symbol
effectively is a constant the calculation of the value of which has been
deferred to the static link time, and which is not going to change any
further at the dynamic load time.  Therefore there is no need ever to
refuse the use of these relocations with such symbols, as the resulting
run-time value observed by the program will be correct even in PIC code.

This is not the case with R_MIPS_26 and its compressed counterparts,
because the run-time value calculated by the instructions these
relocations are used with depends on the address of the instruction
itself, and that can change according to the base address used by the
dynamic loader.  Therefore these relocations have to continue being
rejected in PIC code even with absolute symbols.

This allows successful linking of code that relies on previous linker
behavior up to commit 861fb55ab50a ("Defer allocation of R_MIPS_REL32
GOT slots"), <https://sourceware.org/ml/binutils/2008-08/msg00096.html>,
which introduced the problematic check missing this special exception
for absolute symbols.

bfd/
* elfxx-mips.c (_bfd_mips_elf_check_relocs) <R_MIPS16_HI16>
<R_MIPS_HI16, R_MIPS_HIGHER, R_MIPS_HIGHEST, R_MICROMIPS_HI16>
<R_MICROMIPS_HIGHER, R_MICROMIPS_HIGHEST>: Also accept an
absolute symbol in PIC code.

ld/
* testsuite/ld-mips-elf/pic-reloc-0.d: New test.
* testsuite/ld-mips-elf/pic-reloc-1.d: New test.
* testsuite/ld-mips-elf/pic-reloc-2.d: New test.
* testsuite/ld-mips-elf/pic-reloc-3.d: New test.
* testsuite/ld-mips-elf/pic-reloc-4.d: New test.
* testsuite/ld-mips-elf/pic-reloc-absolute-hi.ld: New test
linker script.
* testsuite/ld-mips-elf/pic-reloc-absolute-lo.ld: New test
linker script.
* testsuite/ld-mips-elf/pic-reloc-ordinary.ld: New test linker
script.
* testsuite/ld-mips-elf/pic-reloc-j.s: New test source.
* testsuite/ld-mips-elf/pic-reloc-lui.s: New test source.
* testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.
14 files changed:
bfd/ChangeLog
bfd/elfxx-mips.c
ld/ChangeLog
ld/testsuite/ld-mips-elf/mips-elf.exp
ld/testsuite/ld-mips-elf/pic-reloc-0.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/pic-reloc-1.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/pic-reloc-2.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/pic-reloc-3.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/pic-reloc-4.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/pic-reloc-absolute-hi.ld [new file with mode: 0644]
ld/testsuite/ld-mips-elf/pic-reloc-absolute-lo.ld [new file with mode: 0644]
ld/testsuite/ld-mips-elf/pic-reloc-j.s [new file with mode: 0644]
ld/testsuite/ld-mips-elf/pic-reloc-lui.s [new file with mode: 0644]
ld/testsuite/ld-mips-elf/pic-reloc-ordinary.ld [new file with mode: 0644]