* target-reloc.h (relocate_section): If the reloc offset is out of
authorIan Lance Taylor <ian@airs.com>
Sat, 27 Apr 2013 00:53:16 +0000 (00:53 +0000)
committerIan Lance Taylor <ian@airs.com>
Sat, 27 Apr 2013 00:53:16 +0000 (00:53 +0000)
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
gold/arm.cc
gold/i386.cc
gold/powerpc.cc
gold/sparc.cc
gold/target-reloc.h
gold/tilegx.cc
gold/x86_64.cc

index c7dad99..97d2e35 100644 (file)
@@ -1,3 +1,14 @@
+2013-04-26  Ian Lance Taylor  <iant@google.com>
+
+       * 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  <gpike@chromium.org>
 
        * gold.cc (queue_final_tasks): invoke layout->queue_build_id_tasks().
index e9db6f9..c980c6b 100644 (file)
@@ -8844,6 +8844,9 @@ Target_arm<big_endian>::Relocate::relocate(
     Arm_address address,
     section_size_type view_size)
 {
+  if (view == NULL)
+    return true;
+
   typedef Arm_relocate_functions<big_endian> Arm_relocate_functions;
 
   r_type = get_real_reloc_type(r_type);
index c265115..59ec885 100644 (file)
@@ -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 <iant@google.com>.
 
@@ -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.
index fdb68a1..ca4aaa2 100644 (file)
@@ -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 <davem@davemloft.net>
 //        and David Edelsohn <edelsohn@gnu.org>
 
@@ -6221,6 +6221,9 @@ Target_powerpc<size, big_endian>::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:
index 6db3b10..acb39cd 100644 (file)
@@ -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 <davem@davemloft.net>.
 
 // This file is part of gold.
@@ -3189,6 +3189,10 @@ Target_sparc<size, big_endian>::Relocate::relocate(
          return false;
        }
     }
+
+  if (view == NULL)
+    return true;
+
   if (this->reloc_adjust_addr_ == view)
     view -= 4;
 
index 039621c..cf5e389 100644 (file)
@@ -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 <iant@google.com>.
 
@@ -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<section_size_type>(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<section_size_type>(offset) >= view_size)
+      if (v == NULL)
        {
          gold_error_at_location(relinfo, i, offset,
                                 _("reloc has bad offset %zu"),
index 7babf4e..ab97640 100644 (file)
@@ -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<size, big_endian>::Relocate::relocate(
     typename elfcpp::Elf_types<size>::Elf_Addr address,
     section_size_type)
 {
+  if (view == NULL)
+    return true;
+
   typedef Tilegx_relocate_functions<size, big_endian> TilegxReloc;
   typename TilegxReloc::Tilegx_howto r_howto;
 
index 8119983..8f773bd 100644 (file)
@@ -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 <iant@google.com>.
 
@@ -3230,6 +3230,9 @@ Target_x86_64<size>::Relocate::relocate(
        }
     }
 
+  if (view == NULL)
+    return true;
+
   const Sized_relobj_file<size, false>* object = relinfo->object;
 
   // Pick the value to use for symbols defined in the PLT.