aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf64-ppc.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2006-02-17 04:49:34 +0000
committerAlan Modra <amodra@gmail.com>2006-02-17 04:49:34 +0000
commitdfbb6ac93371afb54c68283d7072f8e001fa01ce (patch)
treed9ffebf94a4d00f2dc429620c2bbf08654adc13f /bfd/elf64-ppc.c
parent86a7cd1632c97576280062ccf3d55582f179f83c (diff)
downloadgdb-dfbb6ac93371afb54c68283d7072f8e001fa01ce.zip
gdb-dfbb6ac93371afb54c68283d7072f8e001fa01ce.tar.gz
gdb-dfbb6ac93371afb54c68283d7072f8e001fa01ce.tar.bz2
PR ld/2218
* elf64-ppc.c (allocate_dynrelocs): Ensure undef weak sym is dynamic. (ppc64_elf_relocate_section): Check output reloc section size. * elf32-ppc.c (allocate_dynrelocs): Simplify undef weak test.
Diffstat (limited to 'bfd/elf64-ppc.c')
-rw-r--r--bfd/elf64-ppc.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 3a807eb..785c859 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -7582,9 +7582,20 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
/* Also discard relocs on undefined weak syms with non-default
visibility. */
- if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
- && h->root.type == bfd_link_hash_undefweak)
- eh->dyn_relocs = NULL;
+ if (h->root.type == bfd_link_hash_undefweak)
+ {
+ if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
+ eh->dyn_relocs = NULL;
+
+ /* Make sure this symbol is output as a dynamic symbol.
+ Undefined weak syms won't yet be marked as dynamic. */
+ else if (h->dynindx == -1
+ && !h->forced_local)
+ {
+ if (! bfd_elf_link_record_dynamic_symbol (info, h))
+ return FALSE;
+ }
+ }
}
else if (ELIMINATE_COPY_RELOCS)
{
@@ -10757,6 +10768,9 @@ ppc64_elf_relocate_section (bfd *output_bfd,
if (sreloc == NULL)
abort ();
+ if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
+ >= sreloc->size)
+ abort ();
loc = sreloc->contents;
loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);