or1k: Support large plt_relocs when generating plt entries
authorStafford Horne <shorne@gmail.com>
Thu, 6 May 2021 11:51:25 +0000 (20:51 +0900)
committerStafford Horne <shorne@gmail.com>
Thu, 6 May 2021 11:51:25 +0000 (20:51 +0900)
commit284a1309021a0ef4c29f198470d95652f02b13f0
tree2d03e9e8e31054b85767672cc6802712b14161eb
parent3c3de29b048bca6b4aa4235c647b9328e71801b6
or1k: Support large plt_relocs when generating plt entries

The current PLT generation code will generate invalid code when the PLT
relocation offset exceeds 64k.  This fixes the issue by detecting large
plt_reloc offsets and generare code sequences to create larger plt
relocations.

The "large" plt code needs 2 extra instructions to create 32-bit offsets.

bfd/ChangeLog:

PR 27746
* elf32-or1k.c (PLT_ENTRY_SIZE_LARGE, PLT_MAX_INSN_COUNT,
OR1K_ADD, OR1K_ORI): New macros to help with plt creation.
(elf_or1k_link_hash_table): New field plt_count.
(elf_or1k_link_hash_entry): New field plt_index.
(elf_or1k_plt_entry_size): New function.
(or1k_write_plt_entry): Update to support variable size PLTs.
(or1k_elf_finish_dynamic_sections): Use new or1k_write_plt_entry
API.
(or1k_elf_finish_dynamic_symbol): Update to write large PLTs
when needed.
(allocate_dynrelocs): Use elf_or1k_plt_entry_size to account for
PLT size.

ld/ChangeLog:

PR 27746
testsuite/ld-or1k/or1k.exp (or1kplttests): Add tests for linking
along with gotha() relocations.
testsuite/ld-or1k/gotha1.dd: New file.
testsuite/ld-or1k/gotha1.s: New file.
testsuite/ld-or1k/gotha2.dd: New file.
testsuite/ld-or1k/gotha2.s: New file
testsuite/ld-or1k/pltlib.s (x): Define size to avoid link
failure.
bfd/ChangeLog
bfd/elf32-or1k.c
ld/ChangeLog
ld/testsuite/ld-or1k/gotha1.dd [new file with mode: 0644]
ld/testsuite/ld-or1k/gotha1.s [new file with mode: 0644]
ld/testsuite/ld-or1k/gotha2.dd [new file with mode: 0644]
ld/testsuite/ld-or1k/gotha2.s [new file with mode: 0644]
ld/testsuite/ld-or1k/or1k.exp
ld/testsuite/ld-or1k/pltlib.s