bfd/
authorAlan Modra <amodra@gmail.com>
Tue, 19 Apr 2005 05:44:55 +0000 (05:44 +0000)
committerAlan Modra <amodra@gmail.com>
Tue, 19 Apr 2005 05:44:55 +0000 (05:44 +0000)
* elf32-ppc.c (ppc_elf_check_relocs): Don't bother with
dynamic relocs in non-SEC_ALLOC sections.
(ppc_elf_gc_sweep_hook): Likewise.
(ppc_elf_relax_section): Likewise.
(ppc_elf_relocate_section): Likewise.
ld/testsuite/
* ld-powerpc/reloc.d: Update to suit removal of non-alloc relocs.

bfd/ChangeLog
bfd/elf32-ppc.c
ld/testsuite/ChangeLog
ld/testsuite/ld-powerpc/reloc.d

index ac1af14..f3d2148 100644 (file)
@@ -1,3 +1,11 @@
+2005-04-19  Alan Modra  <amodra@bigpond.net.au>
+
+       * elf32-ppc.c (ppc_elf_check_relocs): Don't bother with
+       dynamic relocs in non-SEC_ALLOC sections.
+       (ppc_elf_gc_sweep_hook): Likewise.
+       (ppc_elf_relax_section): Likewise.
+       (ppc_elf_relocate_section): Likewise.
+
 2005-04-18  Nick Clifton  <nickc@redhat.com>
 
        * aix5ppc-core.c (xcoff64_core_p): Fix compile time warning
index f2a1d38..02b1e48 100644 (file)
@@ -2581,6 +2581,15 @@ ppc_elf_check_relocs (bfd *abfd,
   if (info->relocatable)
     return TRUE;
 
+  /* Don't do anything special with non-loaded, non-alloced sections.
+     In particular, any relocs in such sections should not affect GOT
+     and PLT reference counting (ie. we don't allow them to create GOT
+     or PLT entries), there's no possibility or desire to optimize TLS
+     relocs, and there's not much point in propagating relocs to shared
+     libs that the dynamic linker won't relocate.  */
+  if ((sec->flags & SEC_ALLOC) == 0)
+    return TRUE;
+
 #ifdef DEBUG
   _bfd_error_handler ("ppc_elf_check_relocs called for section %A in %B",
                      sec, abfd);
@@ -2902,7 +2911,6 @@ ppc_elf_check_relocs (bfd *abfd,
                           || !h->def_regular))))
              || (ELIMINATE_COPY_RELOCS
                  && !info->shared
-                 && (sec->flags & SEC_ALLOC) != 0
                  && h != NULL
                  && (h->root.type == bfd_link_hash_defweak
                      || !h->def_regular)))
@@ -2941,9 +2949,8 @@ ppc_elf_check_relocs (bfd *abfd,
 
                      sreloc = bfd_make_section (htab->elf.dynobj, name);
                      flags = (SEC_HAS_CONTENTS | SEC_READONLY
-                              | SEC_IN_MEMORY | SEC_LINKER_CREATED);
-                     if ((sec->flags & SEC_ALLOC) != 0)
-                       flags |= SEC_ALLOC | SEC_LOAD;
+                              | SEC_IN_MEMORY | SEC_LINKER_CREATED
+                              | SEC_ALLOC | SEC_LOAD);
                      if (sreloc == NULL
                          || ! bfd_set_section_flags (htab->elf.dynobj,
                                                      sreloc, flags)
@@ -3147,6 +3154,9 @@ ppc_elf_gc_sweep_hook (bfd *abfd,
   bfd_signed_vma *local_got_refcounts;
   const Elf_Internal_Rela *rel, *relend;
 
+  if ((sec->flags & SEC_ALLOC) == 0)
+    return TRUE;
+
   elf_section_data (sec)->local_dynrel = NULL;
 
   htab = ppc_elf_hash_table (info);
@@ -4185,8 +4195,11 @@ ppc_elf_relax_section (bfd *abfd,
 
   *again = FALSE;
 
-  /* Nothing to do if there are no relocations.  */
-  if ((isec->flags & SEC_RELOC) == 0 || isec->reloc_count == 0)
+  /* Nothing to do if there are no relocations, and no need to do
+     anything with non-alloc sections.  */
+  if ((isec->flags & SEC_ALLOC) == 0
+      || (isec->flags & SEC_RELOC) == 0
+      || isec->reloc_count == 0)
     return TRUE;
 
   trampoff = (isec->size + 3) & (bfd_vma) -4;
@@ -5354,6 +5367,10 @@ ppc_elf_relocate_section (bfd *output_bfd,
            break;
          /* Fall thru.  */
 
+         if ((input_section->flags & SEC_ALLOC) == 0)
+           break;
+         /* Fall thru.  */
+
          if ((info->shared
               && (h == NULL
                   || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
@@ -5362,7 +5379,6 @@ ppc_elf_relocate_section (bfd *output_bfd,
                   || !SYMBOL_CALLS_LOCAL (info, h)))
              || (ELIMINATE_COPY_RELOCS
                  && !info->shared
-                 && (input_section->flags & SEC_ALLOC) != 0
                  && h != NULL
                  && h->dynindx != -1
                  && !h->non_got_ref
index 2b107b2..f1fbcb9 100644 (file)
@@ -1,3 +1,7 @@
+2005-04-19  Alan Modra  <amodra@bigpond.net.au>
+
+       * ld-powerpc/reloc.d: Update to suit removal of non-alloc relocs.
+
 2005-04-15  Alan Modra  <amodra@bigpond.net.au>
 
        * ld-d10v/default_layout.d: Update for unused section removal.
index 08a209d..1c7eb8a 100644 (file)
@@ -1,6 +1,5 @@
 # Test that orphan reloc sections are placed before .rela.plt even when
-# .rela.plt is the only reloc section.  Also tests that orphan non-alloc
-# reloc sections go after alloc sections.
+# .rela.plt is the only reloc section.
 
 #source: reloc.s
 #ld: -shared -z nocombreloc
@@ -11,6 +10,4 @@
 .*\.relaplatypus.*
 #...
 .*\.rela\.plt.*
-#...
-.*\.relaechidna.*
 #pass