* elf64-ppc.c (ppc64_elf_edit_toc): Don't segfault on NULL

local_syms when looking for local symbols in .toc.
This commit is contained in:
Alan Modra 2011-02-08 02:54:42 +00:00
parent dd1910a2e2
commit df22d22333
2 changed files with 32 additions and 26 deletions

View File

@ -1,3 +1,8 @@
2011-02-08 Alan Modra <amodra@gmail.com>
* 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 <amodra@gmail.com>
* elf64-ppc.c (ppc64_elf_next_input_section): Use elf_gp value

View File

@ -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 <info@swox.com>,
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)