diff options
author | Ian Lance Taylor <ian@airs.com> | 2013-04-27 00:53:16 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 2013-04-27 00:53:16 +0000 |
commit | 0e8048633ef3388613bbf33822f708fc7331f234 (patch) | |
tree | 366262a5bd5b546a22a8b9098ee66e866f2ac49c | |
parent | 6c6b70567b85aedf48d80a6de9c4747df4f1386f (diff) | |
download | gdb-0e8048633ef3388613bbf33822f708fc7331f234.zip gdb-0e8048633ef3388613bbf33822f708fc7331f234.tar.gz gdb-0e8048633ef3388613bbf33822f708fc7331f234.tar.bz2 |
* 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.
-rw-r--r-- | gold/ChangeLog | 11 | ||||
-rw-r--r-- | gold/arm.cc | 3 | ||||
-rw-r--r-- | gold/i386.cc | 5 | ||||
-rw-r--r-- | gold/powerpc.cc | 5 | ||||
-rw-r--r-- | gold/sparc.cc | 6 | ||||
-rw-r--r-- | gold/target-reloc.h | 16 | ||||
-rw-r--r-- | gold/tilegx.cc | 5 | ||||
-rw-r--r-- | 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 <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 e9db6f9..c980c6b 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 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 <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 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 <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 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 <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 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 <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 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<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 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 <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. |