From df22d2233306b68aa442f16fa13811dc35b675b5 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 8 Feb 2011 02:54:42 +0000 Subject: [PATCH] * elf64-ppc.c (ppc64_elf_edit_toc): Don't segfault on NULL local_syms when looking for local symbols in .toc. --- bfd/ChangeLog | 5 +++++ bfd/elf64-ppc.c | 53 +++++++++++++++++++++++++------------------------ 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 35d534f0adb..8a6c44f13c3 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2011-02-08 Alan Modra + + * elf64-ppc.c (ppc64_elf_edit_toc): Don't segfault on NULL + local_syms when looking for local symbols in .toc. + 2011-02-01 Alan Modra * elf64-ppc.c (ppc64_elf_next_input_section): Use elf_gp value diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index d0209280c92..4e85e901053 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -1,6 +1,6 @@ /* PowerPC64-specific support for 64-bit ELF. Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, - 2009, 2010 Free Software Foundation, Inc. + 2009, 2010, 2011 Free Software Foundation, Inc. Written by Linus Nordberg, Swox AB , based on elf32-ppc.c by Ian Lance Taylor. Largely rewritten by Alan Modra. @@ -8372,34 +8372,35 @@ ppc64_elf_edit_toc (struct bfd_link_info *info) /* We shouldn't have local or global symbols defined in the TOC, but handle them anyway. */ - for (sym = local_syms; - sym < local_syms + symtab_hdr->sh_info; - ++sym) - if (sym->st_value != 0 - && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc) - { - unsigned long i; + if (local_syms != NULL) + for (sym = local_syms; + sym < local_syms + symtab_hdr->sh_info; + ++sym) + if (sym->st_value != 0 + && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc) + { + unsigned long i; - if (sym->st_value > toc->rawsize) - i = toc->rawsize >> 3; - else - i = sym->st_value >> 3; + if (sym->st_value > toc->rawsize) + i = toc->rawsize >> 3; + else + i = sym->st_value >> 3; - if ((skip[i] & (ref_from_discarded | can_optimize)) != 0) - { - if (local_toc_syms) - (*_bfd_error_handler) - (_("%s defined on removed toc entry"), - bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL)); - do - ++i; - while ((skip[i] & (ref_from_discarded | can_optimize))); - sym->st_value = (bfd_vma) i << 3; - } + if ((skip[i] & (ref_from_discarded | can_optimize)) != 0) + { + if (local_toc_syms) + (*_bfd_error_handler) + (_("%s defined on removed toc entry"), + bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL)); + do + ++i; + while ((skip[i] & (ref_from_discarded | can_optimize))); + sym->st_value = (bfd_vma) i << 3; + } - sym->st_value -= skip[i]; - symtab_hdr->contents = (unsigned char *) local_syms; - } + sym->st_value -= skip[i]; + symtab_hdr->contents = (unsigned char *) local_syms; + } /* Adjust any global syms defined in this toc input section. */ if (toc_inf.global_toc_syms) -- 2.30.2