PR ld/22966: Fix n64 MIPS `.got.plt' range checks
authorMaciej W. Rozycki <macro@mips.com>
Tue, 19 Jun 2018 23:37:51 +0000 (00:37 +0100)
committerMaciej W. Rozycki <macro@mips.com>
Tue, 19 Jun 2018 23:37:51 +0000 (00:37 +0100)
commit789ff5b6c26ce7e4ebfcfa5a9a695407c17fa4ea
treece7958d48139f89d91d1137fdeebe4df2c040c27
parent6a382bceadc7228d20746079570a15f115e55d0c
PR ld/22966: Fix n64 MIPS `.got.plt' range checks

The addressable signed 32-bit range for n64 MIPS `.got.plt' references
is from 0xffffffff7fff8000 to 0x7fff7fff, due to how the composition of
an LUI and an LD instruction works for address calculation in the 64-bit
addressing mode, such as when CP0.Status.UX=1.

We currently have a range check in `mips_finish_exec_plt', however it is
not correct as it verifies that the `.got.plt' start address referred is
between 0xffffffff80000000 and 0x7fffffff.  It is also implemented as an
assertion rather than a proper error message despite that the situation
can be triggered by user input.  Additionally there is no check made for
individual `.got.plt' entries referred even though they can be out of
range while the `.got.plt' start address is not.

Fix all these problems and use the correct range for the check, limiting
it to n64 output files, and then issue a proper error message both in
`mips_finish_exec_plt' and in `_bfd_mips_elf_finish_dynamic_symbol',
suggesting the use of the `-Ttext-segment=...' option that will often
work and with the default linker scripts in particular.  Add suitable
tests covering boundary cases.

bfd/
PR ld/22966
* elfxx-mips.c (_bfd_mips_elf_finish_dynamic_symbol): Verify the
`.got.plt' entry referred is in range.
(mips_finish_exec_plt): Correct the range check for `.got.plt'
start.  Replace the assertion used for that with a proper error
message.

ld/
PR ld/22966
* testsuite/ld-mips-elf/n64-plt-1.dd: New test.
* testsuite/ld-mips-elf/n64-plt-1.gd: New test.
* testsuite/ld-mips-elf/n64-plt-2.ed: New test.
* testsuite/ld-mips-elf/n64-plt-3.ed: New test.
* testsuite/ld-mips-elf/n64-plt-4.dd: New test.
* testsuite/ld-mips-elf/n64-plt-4.gd: New test.
* testsuite/ld-mips-elf/n64-plt-1.ld: New test linker script.
* testsuite/ld-mips-elf/n64-plt-2.ld: New test linker script.
* testsuite/ld-mips-elf/n64-plt-3.ld: New test linker script.
* testsuite/ld-mips-elf/n64-plt-4.ld: New test linker script.
* testsuite/ld-mips-elf/n64-plt.s: New test source.
* testsuite/ld-mips-elf/n64-plt-lib.s: New test source.
* testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.
16 files changed:
bfd/ChangeLog
bfd/elfxx-mips.c
ld/ChangeLog
ld/testsuite/ld-mips-elf/mips-elf.exp
ld/testsuite/ld-mips-elf/n64-plt-1.dd [new file with mode: 0644]
ld/testsuite/ld-mips-elf/n64-plt-1.gd [new file with mode: 0644]
ld/testsuite/ld-mips-elf/n64-plt-1.ld [new file with mode: 0644]
ld/testsuite/ld-mips-elf/n64-plt-2.ed [new file with mode: 0644]
ld/testsuite/ld-mips-elf/n64-plt-2.ld [new file with mode: 0644]
ld/testsuite/ld-mips-elf/n64-plt-3.ed [new file with mode: 0644]
ld/testsuite/ld-mips-elf/n64-plt-3.ld [new file with mode: 0644]
ld/testsuite/ld-mips-elf/n64-plt-4.dd [new file with mode: 0644]
ld/testsuite/ld-mips-elf/n64-plt-4.gd [new file with mode: 0644]
ld/testsuite/ld-mips-elf/n64-plt-4.ld [new file with mode: 0644]
ld/testsuite/ld-mips-elf/n64-plt-lib.s [new file with mode: 0644]
ld/testsuite/ld-mips-elf/n64-plt.s [new file with mode: 0644]