From 88d65ad6f1503fecf3f07d742ca76b218ff08518 Mon Sep 17 00:00:00 2001 From: Bob Wilson Date: Tue, 23 Mar 2004 01:37:00 +0000 Subject: bfd/ChangeLog: * elf32-xtensa.c (elf_xtensa_check_relocs): Remove code to read literal tables and check for relocs outside of literal pools. (elf_xtensa_make_sym_local): Don't clear ELF_LINK_NON_GOT_REF flag. (elf_xtensa_fix_refcounts): Don't check ELF_LINK_NON_GOT_REF or set DF_TEXTREL. (elf_xtensa_size_dynamic_sections): Don't add DT_TEXTREL entry. (elf_xtensa_relocate_section): Read literal tables and check for dynamic relocations in read-only sections and not in literal pools. gas/ChangeLog: * config/tc-xtensa.c (xtensa_post_relax_hook): Create literal tables even when use_literal_section flag is not set. --- bfd/ChangeLog | 11 +++++++++ bfd/elf32-xtensa.c | 66 +++++++++++++++++++++----------------------------- gas/ChangeLog | 5 ++++ gas/config/tc-xtensa.c | 7 +++--- 4 files changed, 47 insertions(+), 42 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 18964a7..dac6564 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,14 @@ +2004-03-22 Bob Wilson + + * elf32-xtensa.c (elf_xtensa_check_relocs): Remove code to read + literal tables and check for relocs outside of literal pools. + (elf_xtensa_make_sym_local): Don't clear ELF_LINK_NON_GOT_REF flag. + (elf_xtensa_fix_refcounts): Don't check ELF_LINK_NON_GOT_REF or + set DF_TEXTREL. + (elf_xtensa_size_dynamic_sections): Don't add DT_TEXTREL entry. + (elf_xtensa_relocate_section): Read literal tables and check for + dynamic relocations in read-only sections and not in literal pools. + 2004-03-23 Alan Modra PR 51. diff --git a/bfd/elf32-xtensa.c b/bfd/elf32-xtensa.c index 782baba..c376a17 100644 --- a/bfd/elf32-xtensa.c +++ b/bfd/elf32-xtensa.c @@ -619,8 +619,6 @@ elf_xtensa_check_relocs (abfd, info, sec, relocs) struct elf_link_hash_entry **sym_hashes; const Elf_Internal_Rela *rel; const Elf_Internal_Rela *rel_end; - property_table_entry *lit_table; - int ltblsize; if (info->relocatable) return TRUE; @@ -628,11 +626,6 @@ elf_xtensa_check_relocs (abfd, info, sec, relocs) symtab_hdr = &elf_tdata (abfd)->symtab_hdr; sym_hashes = elf_sym_hashes (abfd); - ltblsize = xtensa_read_table_entries (abfd, sec, &lit_table, - XTENSA_LIT_SEC_NAME); - if (ltblsize < 0) - return FALSE; - rel_end = relocs + sec->reloc_count; for (rel = relocs; rel < rel_end; rel++) { @@ -669,11 +662,6 @@ elf_xtensa_check_relocs (abfd, info, sec, relocs) if ((sec->flags & SEC_ALLOC) != 0) { - if ((sec->flags & SEC_READONLY) != 0 - && !elf_xtensa_in_literal_pool (lit_table, ltblsize, - sec->vma + rel->r_offset)) - h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF; - if (h->got.refcount <= 0) h->got.refcount = 1; else @@ -689,11 +677,6 @@ elf_xtensa_check_relocs (abfd, info, sec, relocs) if ((sec->flags & SEC_ALLOC) != 0) { - if ((sec->flags & SEC_READONLY) != 0 - && !elf_xtensa_in_literal_pool (lit_table, ltblsize, - sec->vma + rel->r_offset)) - h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF; - if (h->plt.refcount <= 0) { h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT; @@ -736,14 +719,6 @@ elf_xtensa_check_relocs (abfd, info, sec, relocs) elf_local_got_refcounts (abfd) = local_got_refcounts; } local_got_refcounts[r_symndx] += 1; - - /* If the relocation is not inside the GOT, the DF_TEXTREL - flag needs to be set. */ - if (info->shared - && (sec->flags & SEC_READONLY) != 0 - && !elf_xtensa_in_literal_pool (lit_table, ltblsize, - sec->vma + rel->r_offset)) - info->flags |= DF_TEXTREL; } break; @@ -774,7 +749,6 @@ elf_xtensa_check_relocs (abfd, info, sec, relocs) } } - free (lit_table); return TRUE; } @@ -1044,7 +1018,6 @@ elf_xtensa_make_sym_local (info, h) else { /* Don't need any dynamic relocations at all. */ - h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF; h->plt.refcount = 0; h->got.refcount = 0; } @@ -1064,11 +1037,6 @@ elf_xtensa_fix_refcounts (h, arg) if (! xtensa_elf_dynamic_symbol_p (h, info)) elf_xtensa_make_sym_local (info, h); - /* If the symbol has a relocation outside the GOT, set the - DF_TEXTREL flag. */ - if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) != 0) - info->flags |= DF_TEXTREL; - return TRUE; } @@ -1391,12 +1359,6 @@ elf_xtensa_size_dynamic_sections (output_bfd, info) return FALSE; } - if ((info->flags & DF_TEXTREL) != 0) - { - if (!add_dynamic_entry (DT_TEXTREL, 0)) - return FALSE; - } - if (!add_dynamic_entry (DT_XTENSA_GOT_LOC_OFF, 0) || !add_dynamic_entry (DT_XTENSA_GOT_LOC_SZ, 0)) return FALSE; @@ -1851,6 +1813,8 @@ elf_xtensa_relocate_section (output_bfd, info, input_bfd, struct elf_link_hash_entry **sym_hashes; asection *srelgot, *srelplt; bfd *dynobj; + property_table_entry *lit_table = 0; + int ltblsize = 0; char *error_message = NULL; if (xtensa_default_isa == NULL) @@ -1868,6 +1832,14 @@ elf_xtensa_relocate_section (output_bfd, info, input_bfd, srelplt = bfd_get_section_by_name (dynobj, ".rela.plt"); } + if (elf_hash_table (info)->dynamic_sections_created) + { + ltblsize = xtensa_read_table_entries (input_bfd, input_section, + &lit_table, XTENSA_LIT_SEC_NAME); + if (ltblsize < 0) + return FALSE; + } + rel = relocs; relend = relocs + input_section->reloc_count; for (; rel < relend; rel++) @@ -2068,6 +2040,21 @@ elf_xtensa_relocate_section (output_bfd, info, input_bfd, outrel.r_offset += (input_section->output_section->vma + input_section->output_offset); + /* Complain if the relocation is in a read-only section + and not in a literal pool. */ + if ((input_section->flags & SEC_READONLY) != 0 + && !elf_xtensa_in_literal_pool (lit_table, ltblsize, + input_section->vma + + rel->r_offset)) + { + error_message = + _("dynamic relocation in read-only section"); + if (!((*info->callbacks->reloc_dangerous) + (info, error_message, input_bfd, input_section, + rel->r_offset))) + return FALSE; + } + if (dynamic_symbol) { outrel.r_addend = rel->r_addend; @@ -2155,6 +2142,9 @@ elf_xtensa_relocate_section (output_bfd, info, input_bfd, } } + if (lit_table) + free (lit_table); + return TRUE; } diff --git a/gas/ChangeLog b/gas/ChangeLog index 6565aed..ec4e566 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2004-03-22 Bob Wilson + + * config/tc-xtensa.c (xtensa_post_relax_hook): Create literal + tables even when use_literal_section flag is not set. + 2004-03-22 Alan Modra * config/tc-sh.c: Remove trailing whitespace. diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c index 8f101db..6f9198a 100644 --- a/gas/config/tc-xtensa.c +++ b/gas/config/tc-xtensa.c @@ -7888,10 +7888,9 @@ xtensa_post_relax_hook () xtensa_create_property_segments (get_frag_is_insn, XTENSA_INSN_SEC_NAME, xt_insn_sec); - if (use_literal_section) - xtensa_create_property_segments (get_frag_is_literal, - XTENSA_LIT_SEC_NAME, - xt_literal_sec); + xtensa_create_property_segments (get_frag_is_literal, + XTENSA_LIT_SEC_NAME, + xt_literal_sec); } -- cgit v1.1