mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
789ff5b6c2
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.
24 lines
586 B
Plaintext
24 lines
586 B
Plaintext
MEMORY
|
|
{
|
|
text (rx) : ORIGIN = 0x10000000, LENGTH = 0x10000
|
|
data (w) : ORIGIN = 0x7fff7ff0, LENGTH = 0x10000
|
|
}
|
|
SECTIONS
|
|
{
|
|
.dynamic : { *(.dynamic) } >text
|
|
.hash : { *(.hash) } >text
|
|
.dynsym : { *(.dynsym) } >text
|
|
.dynstr : { *(.dynstr) } >text
|
|
.rel.plt : { *(.rel.plt) } >text
|
|
.plt : { *(.plt) } >text
|
|
.text : { *(.text) } >text
|
|
.interp : { *(.interp) } >text
|
|
.got.plt : { *(.got.plt) } >data
|
|
.rld.map : { *(.rld.map) } >data
|
|
.got : { *(.got) } >data
|
|
.symtab : { *(.symtab) }
|
|
.strtab : { *(.strtab) }
|
|
.shstrtab : { *(.shstrtab) }
|
|
/DISCARD/ : { *(*) }
|
|
}
|