From a45a8f9178448171b51d9fc80d45ede73e99e399 Mon Sep 17 00:00:00 2001 From: Stephen Crane Date: Thu, 10 May 2018 00:09:32 -0700 Subject: 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. --- 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 + + * aarch64.cc (Target_aarch64::do_finalize_sections): Use size of + .got section for the _GLOBAL_OFFSET_TABLE_ symbol computation. + 2018-04-24 Cary Coutant 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::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(sym)->set_symsize(data_size); // If the .got section is more than 0x8000 bytes, we add -- cgit v1.1