From 72cac0d0f6a21ca7394b8c17c3666530979fcba9 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 8 Feb 2011 03:00:28 +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 | 51 +++++++++++++++++++++++++------------------------ 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 2ca6bc60cd6..074c8bc9b25 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 Backport from mainline diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 846f5d541b6..4e85e901053 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -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.47.3