diff options
author | Alan Modra <amodra@gmail.com> | 2011-02-08 02:54:42 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2011-02-08 02:54:42 +0000 |
commit | df22d2233306b68aa442f16fa13811dc35b675b5 (patch) | |
tree | 96a01747d90d298342293bbb70b96b07160b6f34 /bfd | |
parent | dd1910a2e2a7bc2ae6f55dd3141b8ae3e1d3dc6b (diff) | |
download | gdb-df22d2233306b68aa442f16fa13811dc35b675b5.zip gdb-df22d2233306b68aa442f16fa13811dc35b675b5.tar.gz gdb-df22d2233306b68aa442f16fa13811dc35b675b5.tar.bz2 |
* elf64-ppc.c (ppc64_elf_edit_toc): Don't segfault on NULL
local_syms when looking for local symbols in .toc.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/elf64-ppc.c | 53 |
2 files changed, 32 insertions, 26 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 35d534f..8a6c44f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -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 diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index d020928..4e85e90 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 <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) |