[binutils-gdb] Don't allow mov-to-lea optimization for __ehdr_start.

Cary Coutant ccoutant@sourceware.org
Wed Feb 1 00:35:00 GMT 2017


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=ed35cc4a1cb76fd9ac53ad19efb97ee2caffbae9

commit ed35cc4a1cb76fd9ac53ad19efb97ee2caffbae9
Author: Cary Coutant <ccoutant@gmail.com>
Date:   Tue Jan 31 16:32:59 2017 -0800

    Don't allow mov-to-lea optimization for __ehdr_start.
    
    gold/
    	PR gold/21090
    	* x86_64.cc (Target_x86_64::can_convert_mov_to_lea): Add check
    	for predefined symbol.
    	(Target_x86_64::Relocate::relocate): Fix formatting.

Diff:
---
 gold/ChangeLog |  7 +++++++
 gold/x86_64.cc | 11 ++++++++---
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/gold/ChangeLog b/gold/ChangeLog
index 7357c08..c50e1f8 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,10 @@
+2017-01-31  Cary Coutant  <ccoutant@gmail.com>
+
+	PR gold/21090
+	* x86_64.cc (Target_x86_64::can_convert_mov_to_lea): Add check
+	for predefined symbol.
+	(Target_x86_64::Relocate::relocate): Fix formatting.
+
 2017-01-23  Rahul Chaudhry  <rahulchaudhry@google.com>
 
         * testsuite/icf_safe_so_test.sh: Use "set -e".
diff --git a/gold/x86_64.cc b/gold/x86_64.cc
index ffa8761..d21c268 100644
--- a/gold/x86_64.cc
+++ b/gold/x86_64.cc
@@ -1046,8 +1046,11 @@ class Target_x86_64 : public Sized_target<size, false>
       return false;
     // We cannot convert references to IFUNC symbols, or to symbols that
     // are not local to the current module.
+    // We can't do predefined symbols because they may become undefined
+    // (e.g., __ehdr_start when the headers aren't mapped to a segment).
     if (gsym->type() == elfcpp::STT_GNU_IFUNC
-        || gsym->is_undefined ()
+        || gsym->is_undefined()
+        || gsym->is_predefined()
         || gsym->is_from_dynobj()
         || gsym->is_preemptible())
       return false;
@@ -4244,12 +4247,14 @@ Target_x86_64<size>::Relocate::relocate(
 	  if (gsym != NULL)
 	    {
 	      gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD));
-	      got_offset = gsym->got_offset(GOT_TYPE_STANDARD) - target->got_size();
+	      got_offset = (gsym->got_offset(GOT_TYPE_STANDARD)
+			    - target->got_size());
 	    }
 	  else
 	    {
 	      unsigned int r_sym = elfcpp::elf_r_sym<size>(rela.get_r_info());
-	      gold_assert(object->local_has_got_offset(r_sym, GOT_TYPE_STANDARD));
+	      gold_assert(object->local_has_got_offset(r_sym,
+						       GOT_TYPE_STANDARD));
 	      got_offset = (object->local_got_offset(r_sym, GOT_TYPE_STANDARD)
 			    - target->got_size());
 	    }



More information about the Binutils-cvs mailing list