* powerpc.cc (Target_powerpc::symval_for_branch): Don't assert

on garbage collected .opd section.

	* powerpc.cc (Target_powerpc::do_gc_add_reference): Test dst_shndx
	is non-zero.
	(Target_powerpc::do_gc_mark_symbols): Likewise for sym->shndx().
	(Target_powerpc::do_function_location): Likewise for loc->shndx.
This commit is contained in:
Alan Modra 2013-06-27 03:11:22 +00:00
parent 02b1871e58
commit a2d7bf59d6
2 changed files with 17 additions and 4 deletions

View File

@ -1,3 +1,15 @@
2013-06-27 Cary Coutant <ccoutant@google.com>
* powerpc.cc (Target_powerpc::symval_for_branch): Don't assert
on garbage collected .opd section.
2013-06-27 Alan Modra <amodra@gmail.com>
* powerpc.cc (Target_powerpc::do_gc_add_reference): Test dst_shndx
is non-zero.
(Target_powerpc::do_gc_mark_symbols): Likewise for sym->shndx().
(Target_powerpc::do_function_location): Likewise for loc->shndx.
2013-06-14 Cary Coutant <ccoutant@google.com>
* resolve.cc (Symbol::override_base): Don't override st_type

View File

@ -5827,7 +5827,7 @@ Target_powerpc<size, big_endian>::do_gc_add_reference(
Powerpc_relobj<size, big_endian>* ppc_object
= static_cast<Powerpc_relobj<size, big_endian>*>(dst_obj);
if (dst_shndx == ppc_object->opd_shndx())
if (dst_shndx != 0 && dst_shndx == ppc_object->opd_shndx())
{
if (ppc_object->opd_valid())
{
@ -5859,7 +5859,7 @@ Target_powerpc<size, big_endian>::do_gc_mark_symbol(
= static_cast<Powerpc_relobj<size, big_endian>*>(sym->object());
bool is_ordinary;
unsigned int shndx = sym->shndx(&is_ordinary);
if (is_ordinary && shndx == ppc_object->opd_shndx())
if (is_ordinary && shndx != 0 && shndx == ppc_object->opd_shndx())
{
Sized_symbol<size>* gsym = symtab->get_sized_symbol<size>(sym);
Address dst_off = gsym->value();
@ -5882,7 +5882,7 @@ void
Target_powerpc<size, big_endian>::do_function_location(
Symbol_location* loc) const
{
if (size == 64)
if (size == 64 && loc->shndx != 0)
{
if (loc->object->is_dynamic())
{
@ -6183,7 +6183,8 @@ Target_powerpc<size, big_endian>::symval_for_branch(
if (shndx == 0)
return value;
Address opd_addr = symobj->get_output_section_offset(shndx);
gold_assert(opd_addr != invalid_address);
if (opd_addr == invalid_address)
return value;
opd_addr += symobj->output_section(shndx)->address();
if (value >= opd_addr && value < opd_addr + symobj->section_size(shndx))
{