summaryrefslogtreecommitdiff
path: root/gold
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>2013-04-27 00:53:15 +0000
committerIan Lance Taylor <ian@airs.com>2013-04-27 00:53:15 +0000
commit2024ea8d5f9094a218e76d0087b78cdec7df9559 (patch)
treed15ab2bd7de4349452423a38b7cba9fc5652162b /gold
parent7894c193f88fa85616002f81031eaee251cb582b (diff)
downloadbinutils-redhat-2024ea8d5f9094a218e76d0087b78cdec7df9559.tar.gz
* 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.
Diffstat (limited to 'gold')
-rw-r--r--gold/ChangeLog11
-rw-r--r--gold/arm.cc3
-rw-r--r--gold/i386.cc5
-rw-r--r--gold/powerpc.cc5
-rw-r--r--gold/sparc.cc6
-rw-r--r--gold/target-reloc.h16
-rw-r--r--gold/tilegx.cc5
-rw-r--r--gold/x86_64.cc5
8 files changed, 47 insertions, 9 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index c7dad99cbd..97d2e35546 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -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().
diff --git a/gold/arm.cc b/gold/arm.cc
index e9db6f9e76..c980c6b7df 100644
--- a/gold/arm.cc
+++ b/gold/arm.cc
@@ -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);
diff --git a/gold/i386.cc b/gold/i386.cc
index c265115697..59ec88527a 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 <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.
diff --git a/gold/powerpc.cc b/gold/powerpc.cc
index fdb68a1cb4..ca4aaa2a78 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 <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:
diff --git a/gold/sparc.cc b/gold/sparc.cc
index 6db3b1014b..acb39cd5e3 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 <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;
diff --git a/gold/target-reloc.h b/gold/target-reloc.h
index 039621c50f..cf5e389565 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 <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"),
diff --git a/gold/tilegx.cc b/gold/tilegx.cc
index 7babf4e4af..ab976405ca 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<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;
diff --git a/gold/x86_64.cc b/gold/x86_64.cc
index 8119983df2..8f773bdfdd 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 <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.