diff options
author | Alan Modra <amodra@gmail.com> | 2006-02-17 04:49:34 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2006-02-17 04:49:34 +0000 |
commit | dfbb6ac93371afb54c68283d7072f8e001fa01ce (patch) | |
tree | d9ffebf94a4d00f2dc429620c2bbf08654adc13f | |
parent | 86a7cd1632c97576280062ccf3d55582f179f83c (diff) | |
download | gdb-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.
-rw-r--r-- | bfd/ChangeLog | 8 | ||||
-rw-r--r-- | bfd/elf32-ppc.c | 25 | ||||
-rw-r--r-- | bfd/elf64-ppc.c | 20 |
3 files changed, 37 insertions, 16 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index a7449e5..3f4da9c 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2006-02-17 Alan Modra <amodra@bigpond.net.au> + + 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. + 2006-02-16 H.J. Lu <hongjiu.lu@intel.com> PR ld/2322 diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index e6de049..caa5ed4 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -4546,20 +4546,19 @@ 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; - - /* Make sure undefined weak symbols are output as a dynamic symbol - in PIEs. */ - if (info->pie - && eh->dyn_relocs != NULL - && h->dynindx == -1 - && h->root.type == bfd_link_hash_undefweak - && !h->forced_local) + if (h->root.type == bfd_link_hash_undefweak) { - if (! bfd_elf_link_record_dynamic_symbol (info, h)) - return FALSE; + if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT) + eh->dyn_relocs = NULL; + + /* Make sure undefined weak symbols are output as a dynamic + symbol in PIEs. */ + else if (h->dynindx == -1 + && !h->forced_local) + { + if (! bfd_elf_link_record_dynamic_symbol (info, h)) + return FALSE; + } } } else if (ELIMINATE_COPY_RELOCS) 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); |