* 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.
This commit is contained in:
Alan Modra 2005-04-19 05:44:55 +00:00
parent eed0d89a39
commit c87b5a93b2
4 changed files with 36 additions and 11 deletions

View 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

View 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

View 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.

View 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