[binutils-gdb] Fix _GLOBAL_OFFSET_TABLE_ value for large GOTs (aarch64).

Cary Coutant ccoutant@sourceware.org
Thu May 10 07:16:00 GMT 2018


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

commit a45a8f9178448171b51d9fc80d45ede73e99e399
Author: Stephen Crane <sjc@immunant.com>
Date:   Thu May 10 00:09:32 2018 -0700

    Fix _GLOBAL_OFFSET_TABLE_ value for large GOTs (aarch64).
    
    Gold resolves GOT-relative relocs relative to the GOT base +
    0x8000 when the GOT is larger than 0x8000. However, previously
    the _GLOBAL_OFFSET_TABLE_ symbol was set to GOT base + 0x8000
    when the .got.plt was larger than 0x8000. This patch makes both
    checks use the size of the .got section so that they agree when
    to add 0x8000.

Diff:
---
 gold/ChangeLog  | 5 +++++
 gold/aarch64.cc | 4 ++--
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/gold/ChangeLog b/gold/ChangeLog
index 26ccad1..bad0f29 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,8 @@
+2018-05-10  Stephen Crane  <sjc@immunant.com>
+
+	* aarch64.cc (Target_aarch64::do_finalize_sections): Use size of
+	.got section for the _GLOBAL_OFFSET_TABLE_ symbol computation.
+
 2018-04-24  Cary Coutant  <ccoutant@gmail.com>
 
 	PR gold/20642
diff --git a/gold/aarch64.cc b/gold/aarch64.cc
index 8de9a26..67f2108 100644
--- a/gold/aarch64.cc
+++ b/gold/aarch64.cc
@@ -6965,11 +6965,11 @@ Target_aarch64<size, big_endian>::do_finalize_sections(
     }
 
   // Set the size of the _GLOBAL_OFFSET_TABLE_ symbol to the size of
-  // the .got.plt section.
+  // the .got section.
   Symbol* sym = this->global_offset_table_;
   if (sym != NULL)
     {
-      uint64_t data_size = this->got_plt_->current_data_size();
+      uint64_t data_size = this->got_->current_data_size();
       symtab->get_sized_symbol<size>(sym)->set_symsize(data_size);
 
       // If the .got section is more than 0x8000 bytes, we add



More information about the Binutils-cvs mailing list