aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2005-04-19 05:44:55 +0000
committerAlan Modra <amodra@gmail.com>2005-04-19 05:44:55 +0000
commitc87b5a93b231384514839c0f19c4ee1a7a6f1244 (patch)
treec7647efa1593afcb7c6a9f024060e2ce55dd3440 /bfd
parent * ppc-opc.c (RTO): Define. (diff)
downloadbinutils-gdb-c87b5a93b231384514839c0f19c4ee1a7a6f1244.tar.gz
binutils-gdb-c87b5a93b231384514839c0f19c4ee1a7a6f1244.tar.bz2
binutils-gdb-c87b5a93b231384514839c0f19c4ee1a7a6f1244.zip
bfd/
* 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.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/elf32-ppc.c30
2 files changed, 31 insertions, 7 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index ac1af14885f..f3d21489446 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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
diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index f2a1d38eb27..02b1e487e07 100644
--- a/bfd/elf32-ppc.c
+++ b/bfd/elf32-ppc.c
@@ -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