From a2d7bf59d6e7b42aa05c73d40fa7b6ebb12df4f7 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 27 Jun 2013 03:11:22 +0000 Subject: [PATCH] * 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(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 07fe2765fd5..874a20af00a 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 ca4aaa2a788..747c7b4c022 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)) { -- 2.30.2