From f4bbdca046b8b1fb24b900858fa146dabae85dcb Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 27 Jun 2013 03:11:21 +0000 Subject: * 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. --- gold/ChangeLog | 12 ++++++++++++ gold/powerpc.cc | 9 +++++---- 2 files changed, 17 insertions(+), 4 deletions(-) (limited to 'gold') diff --git a/gold/ChangeLog b/gold/ChangeLog index 07fe2765fd..874a20af00 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,15 @@ +2013-06-27 Cary Coutant + + * powerpc.cc (Target_powerpc::symval_for_branch): Don't assert + on garbage collected .opd section. + +2013-06-27 Alan Modra + + * 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 * resolve.cc (Symbol::override_base): Don't override st_type diff --git a/gold/powerpc.cc b/gold/powerpc.cc index ca4aaa2a78..747c7b4c02 100644 --- a/gold/powerpc.cc +++ b/gold/powerpc.cc @@ -5827,7 +5827,7 @@ Target_powerpc::do_gc_add_reference( Powerpc_relobj* ppc_object = static_cast*>(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::do_gc_mark_symbol( = static_cast*>(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* gsym = symtab->get_sized_symbol(sym); Address dst_off = gsym->value(); @@ -5882,7 +5882,7 @@ void Target_powerpc::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::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)) { -- cgit v1.2.1