From 0e8048633ef3388613bbf33822f708fc7331f234 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sat, 27 Apr 2013 00:53:16 +0000 Subject: [PATCH] * target-reloc.h (relocate_section): If the reloc offset is out of range, pass VIEW as NULL to relocate.relocate. * arm.cc (Target_arm:Relocate::relocate): Check for a NULL view. * i386.cc (Target_i386::Relocate::relocate): Likewise. * powerpc.cc (Target_powerpc::Relocate::relocate): Likewise. * sparc.cc (Target_sparc::Relocate::relocate): Likewise. * tilegx.cc (Target_tilegx::Relocate::relocate): Likewise. * x86_64.cc (Target_x86_64::Relocate::relocate): Likewise. --- gold/ChangeLog | 11 +++++++++++ gold/arm.cc | 3 +++ gold/i386.cc | 5 ++++- gold/powerpc.cc | 5 ++++- gold/sparc.cc | 6 +++++- gold/target-reloc.h | 16 ++++++++++++---- gold/tilegx.cc | 5 ++++- gold/x86_64.cc | 5 ++++- 8 files changed, 47 insertions(+), 9 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index c7dad99..97d2e35 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,14 @@ +2013-04-26 Ian Lance Taylor + + * target-reloc.h (relocate_section): If the reloc offset is out of + range, pass VIEW as NULL to relocate.relocate. + * arm.cc (Target_arm:Relocate::relocate): Check for a NULL view. + * i386.cc (Target_i386::Relocate::relocate): Likewise. + * powerpc.cc (Target_powerpc::Relocate::relocate): Likewise. + * sparc.cc (Target_sparc::Relocate::relocate): Likewise. + * tilegx.cc (Target_tilegx::Relocate::relocate): Likewise. + * x86_64.cc (Target_x86_64::Relocate::relocate): Likewise. + 2013-04-26 Geoff Pike * gold.cc (queue_final_tasks): invoke layout->queue_build_id_tasks(). diff --git a/gold/arm.cc b/gold/arm.cc index e9db6f9..c980c6b 100644 --- a/gold/arm.cc +++ b/gold/arm.cc @@ -8844,6 +8844,9 @@ Target_arm::Relocate::relocate( Arm_address address, section_size_type view_size) { + if (view == NULL) + return true; + typedef Arm_relocate_functions Arm_relocate_functions; r_type = get_real_reloc_type(r_type); diff --git a/gold/i386.cc b/gold/i386.cc index c265115..59ec885 100644 --- a/gold/i386.cc +++ b/gold/i386.cc @@ -1,6 +1,6 @@ // i386.cc -- i386 target support for gold. -// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 +// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 // Free Software Foundation, Inc. // Written by Ian Lance Taylor . @@ -2661,6 +2661,9 @@ Target_i386::Relocate::relocate(const Relocate_info<32, false>* relinfo, } } + if (view == NULL) + return true; + const Sized_relobj_file<32, false>* object = relinfo->object; // Pick the value to use for symbols defined in shared objects. diff --git a/gold/powerpc.cc b/gold/powerpc.cc index fdb68a1..ca4aaa2 100644 --- a/gold/powerpc.cc +++ b/gold/powerpc.cc @@ -1,6 +1,6 @@ // powerpc.cc -- powerpc target support for gold. -// Copyright 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +// Copyright 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. // Written by David S. Miller // and David Edelsohn @@ -6221,6 +6221,9 @@ Target_powerpc::Relocate::relocate( Address address, section_size_type view_size) { + if (view == NULL) + return true; + switch (this->maybe_skip_tls_get_addr_call(r_type, gsym)) { case Track_tls::NOT_EXPECTED: diff --git a/gold/sparc.cc b/gold/sparc.cc index 6db3b10..acb39cd 100644 --- a/gold/sparc.cc +++ b/gold/sparc.cc @@ -1,6 +1,6 @@ // sparc.cc -- sparc target support for gold. -// Copyright 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +// Copyright 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. // Written by David S. Miller . // This file is part of gold. @@ -3189,6 +3189,10 @@ Target_sparc::Relocate::relocate( return false; } } + + if (view == NULL) + return true; + if (this->reloc_adjust_addr_ == view) view -= 4; diff --git a/gold/target-reloc.h b/gold/target-reloc.h index 039621c..cf5e389 100644 --- a/gold/target-reloc.h +++ b/gold/target-reloc.h @@ -1,6 +1,6 @@ // target-reloc.h -- target specific relocation support -*- C++ -*- -// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 +// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 // Free Software Foundation, Inc. // Written by Ian Lance Taylor . @@ -389,12 +389,20 @@ relocate_section( psymval = &symval2; } + // If OFFSET is out of range, still let the target decide to + // ignore the relocation. Pass in NULL as the VIEW argument so + // that it can return quickly without trashing an invalid memory + // address. + unsigned char *v = view + offset; + if (offset < 0 || static_cast(offset) >= view_size) + v = NULL; + if (!relocate.relocate(relinfo, target, output_section, i, reloc, - r_type, sym, psymval, view + offset, - view_address + offset, view_size)) + r_type, sym, psymval, v, view_address + offset, + view_size)) continue; - if (offset < 0 || static_cast(offset) >= view_size) + if (v == NULL) { gold_error_at_location(relinfo, i, offset, _("reloc has bad offset %zu"), diff --git a/gold/tilegx.cc b/gold/tilegx.cc index 7babf4e..ab97640 100644 --- a/gold/tilegx.cc +++ b/gold/tilegx.cc @@ -1,6 +1,6 @@ // tilegx.cc -- tilegx target support for gold. -// Copyright 2012 Free Software Foundation, Inc. +// Copyright 2012, 2013 Free Software Foundation, Inc. // Written by Jiong Wang (jiwang@tilera.com) // This file is part of gold. @@ -4327,6 +4327,9 @@ Target_tilegx::Relocate::relocate( typename elfcpp::Elf_types::Elf_Addr address, section_size_type) { + if (view == NULL) + return true; + typedef Tilegx_relocate_functions TilegxReloc; typename TilegxReloc::Tilegx_howto r_howto; diff --git a/gold/x86_64.cc b/gold/x86_64.cc index 8119983..8f773bd 100644 --- a/gold/x86_64.cc +++ b/gold/x86_64.cc @@ -1,6 +1,6 @@ // x86_64.cc -- x86_64 target support for gold. -// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 +// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 // Free Software Foundation, Inc. // Written by Ian Lance Taylor . @@ -3230,6 +3230,9 @@ Target_x86_64::Relocate::relocate( } } + if (view == NULL) + return true; + const Sized_relobj_file* object = relinfo->object; // Pick the value to use for symbols defined in the PLT. -- 2.7.4