From 4ef97a1b459849ad190244c36b36d45bdd078030 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 28 Feb 2017 10:38:51 +1030 Subject: Nios2 dynobj handling fixes A number of places in elf32-nios.c created dynamic sections but didn't set the hash table dynobj. That meant we could have duplicate dynamic sections connected to a number of bfds, so size_dynamic_sections didn't properly discard or allocate contents. Also, the entire set of dynamic sections was created in check_relocs on seeing GOT relocs, when only .got related sections are needed, probably done to hide segfaults later in finish_dynamic_sections. The patch fixes these issues and makes the assembler emit errors when nios2 lacks the necessary pc-relative relocs for subtraction expressions, rather than silently generating bad code. eg. ld-elf/merge. I've also tidied uses of elf32_nios2_hash_table and elf_hash_table. bfd/ PR 20995 * elf32-nios2.c (nios2_elf32_relocate_section): Use htab rather than elf32_nios2_hash_table or elf_hash_table. (create_got_section): Likewise. (nios2_elf32_finish_dynamic_symbol): Likewise. (nios2_elf32_adjust_dynamic_symbol): Likewise. (nios2_elf32_size_dynamic_sections): Likewise. (nios2_elf32_check_relocs): Delete dynobj, sgot, and srelgot vars. Use htab equivalents directly instead. Don't create all dynamic sections on needing just the GOT. Use a goto rather than a fall-through with reloc test. Ensure htab->dynobj is set when making dynamic sreloc section. (nios2_elf32_finish_dynamic_sections): Delete dynobj, use htab equivalent directly instead. Don't segfault on looking for .dynamic when dynamic sections have not been created. Don't segfault on .got.plt being discarded. (nios2_elf32_size_dynamic_sections): Delete plt and got vars. Don't set "relocs" on .rela.plt. Do handle .sbss. Delete fixme and another not so relevant comment. (nios2_elf_add_symbol_hook): Delete dynobj var. If not already set, set hash table dynobj on creating .sbss. gas/ * config/tc-nios2.h (TC_FORCE_RELOCATION_SUB_LOCAL): Define. ld/ * testsuite/ld-elf/merge.d: xfail for nios. --- gas/ChangeLog | 4 ++++ gas/config/tc-nios2.h | 8 ++++++++ 2 files changed, 12 insertions(+) (limited to 'gas') diff --git a/gas/ChangeLog b/gas/ChangeLog index 30d07a8..821be3b 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,9 @@ 2017-02-28 Alan Modra + * config/tc-nios2.h (TC_FORCE_RELOCATION_SUB_LOCAL): Define. + +2017-02-28 Alan Modra + * config/tc-ppc.c (md_assemble): Use BFD_RELOC_PPC_16DX_HA for addpcis. (md_apply_fix): Remove fx_subsy check. Move code converting to pcrel reloc earlier and handle BFD_RELOC_PPC_16DX_HA. Remove code diff --git a/gas/config/tc-nios2.h b/gas/config/tc-nios2.h index 340fd76..27ae351 100644 --- a/gas/config/tc-nios2.h +++ b/gas/config/tc-nios2.h @@ -101,6 +101,14 @@ extern flagword nios2_elf_section_flags (flagword, int, int); #define DIFF_EXPR_OK +/* Don't allow the generic code to convert fixups involving the + subtraction of a label in the current section to pc-relative if we + don't have the necessary pc-relative relocation. */ +#define TC_FORCE_RELOCATION_SUB_LOCAL(FIX, SEG) \ + (!((FIX)->fx_r_type == BFD_RELOC_16 \ + || (FIX)->fx_r_type == BFD_RELOC_NIOS2_LO16 \ + || (FIX)->fx_r_type == BFD_RELOC_NIOS2_HIADJ16)) + /* Nios2 ABI doesn't have 32-bit PCREL relocation, and, as relocations for CFI information will be in section other than .text, we can't use PC-biased relocs. */ -- cgit v1.1