diff options
author | Bob Wilson <bob.wilson@acm.org> | 2004-03-23 01:36:59 +0000 |
---|---|---|
committer | Bob Wilson <bob.wilson@acm.org> | 2004-03-23 01:36:59 +0000 |
commit | d9efaa5780924fc9e261538e62cc21798c50c913 (patch) | |
tree | 4c9ea7e2622dacbb47c26f605abd2198476ef169 | |
parent | 94176564b75517861b6b87c4d210b57c16c45007 (diff) | |
download | gdb-d9efaa5780924fc9e261538e62cc21798c50c913.tar.gz |
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.
-rw-r--r-- | bfd/ChangeLog | 11 | ||||
-rw-r--r-- | bfd/elf32-xtensa.c | 66 |
2 files changed, 39 insertions, 38 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 18964a785e7..dac6564204a 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,14 @@ +2004-03-22 Bob Wilson <bob.wilson@acm.org> + + * 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 <amodra@bigpond.net.au> PR 51. diff --git a/bfd/elf32-xtensa.c b/bfd/elf32-xtensa.c index 782baba652e..c376a170151 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; } |