aboutsummaryrefslogtreecommitdiff
path: root/gold
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@gmail.com>2017-01-31 16:32:59 -0800
committerCary Coutant <ccoutant@gmail.com>2017-01-31 16:33:58 -0800
commited35cc4a1cb76fd9ac53ad19efb97ee2caffbae9 (patch)
treec10ec94ecb20e9c9c3196d63a074368c86cd7d1c /gold
parent15a00b13aedc6300732d0b3b6b9daefa361ced6f (diff)
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.
Diffstat (limited to 'gold')
-rw-r--r--gold/ChangeLog7
-rw-r--r--gold/x86_64.cc11
2 files changed, 15 insertions, 3 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 7357c08a03..c50e1f8933 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 ffa876116a..d21c26813c 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());
}