Index: arm.cc =================================================================== RCS file: /cvs/src/src/gold/arm.cc,v retrieving revision 1.161 diff -u -p -r1.161 arm.cc --- arm.cc 9 Jan 2013 15:27:24 -0000 1.161 +++ arm.cc 27 Apr 2013 00:51:23 -0000 @@ -8844,6 +8844,9 @@ Target_arm::Relocate::reloca 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); Index: i386.cc =================================================================== RCS file: /cvs/src/src/gold/i386.cc,v retrieving revision 1.152 diff -u -p -r1.152 i386.cc --- i386.cc 2 Nov 2012 19:50:36 -0000 1.152 +++ i386.cc 27 Apr 2013 00:51:23 -0000 @@ -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 Re } } + 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. Index: powerpc.cc =================================================================== RCS file: /cvs/src/src/gold/powerpc.cc,v retrieving revision 1.90 diff -u -p -r1.90 powerpc.cc --- powerpc.cc 13 Apr 2013 10:12:30 -0000 1.90 +++ powerpc.cc 27 Apr 2013 00:51:23 -0000 @@ -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::Reloca 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: Index: sparc.cc =================================================================== RCS file: /cvs/src/src/gold/sparc.cc,v retrieving revision 1.64 diff -u -p -r1.64 sparc.cc --- sparc.cc 1 Nov 2012 23:27:00 -0000 1.64 +++ sparc.cc 27 Apr 2013 00:51:23 -0000 @@ -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 return false; } } + + if (view == NULL) + return true; + if (this->reloc_adjust_addr_ == view) view -= 4; Index: target-reloc.h =================================================================== RCS file: /cvs/src/src/gold/target-reloc.h,v retrieving revision 1.56 diff -u -p -r1.56 target-reloc.h --- target-reloc.h 1 Nov 2012 23:27:00 -0000 1.56 +++ target-reloc.h 27 Apr 2013 00:51:23 -0000 @@ -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"), Index: tilegx.cc =================================================================== RCS file: /cvs/src/src/gold/tilegx.cc,v retrieving revision 1.5 diff -u -p -r1.5 tilegx.cc --- tilegx.cc 1 Nov 2012 23:27:00 -0000 1.5 +++ tilegx.cc 27 Apr 2013 00:51:23 -0000 @@ -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::Relocat 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; Index: x86_64.cc =================================================================== RCS file: /cvs/src/src/gold/x86_64.cc,v retrieving revision 1.161 diff -u -p -r1.161 x86_64.cc --- x86_64.cc 20 Nov 2012 05:56:06 -0000 1.161 +++ x86_64.cc 27 Apr 2013 00:51:23 -0000 @@ -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.