bfd/ChangeLog:
authorBob Wilson <bob.wilson@acm.org>
Tue, 23 Mar 2004 01:37:00 +0000 (01:37 +0000)
committerBob Wilson <bob.wilson@acm.org>
Tue, 23 Mar 2004 01:37:00 +0000 (01:37 +0000)
* 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
bfd/elf32-xtensa.c
gas/ChangeLog
gas/config/tc-xtensa.c

index 18964a785e7bfa6831135bbdb4fb0d9081c14da8..dac6564204abc9d5cc25d63413deceff0497014d 100644 (file)
@@ -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.
index 782baba652ea749f7ce45d606d8e12bb82996a61..c376a1701512c77d9002a4b2de655e602309f5ad 100644 (file)
@@ -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;
 }
 
index 6565aed37c9c23863ecfb0794cf1c167bab506e4..ec4e566f315346475e42e39940919e7ab477bdbb 100644 (file)
@@ -1,3 +1,8 @@
+2004-03-22  Bob Wilson  <bob.wilson@acm.org>
+
+       * 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  <amodra@bigpond.net.au>
 
        * config/tc-sh.c: Remove trailing whitespace.
index 8f101dbccc1c9d3ce326dca8d4db6284de007aaa..6f9198a23cee31f1d9ca63d9ec0524e748aefd23 100644 (file)
@@ -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);
 }