This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] gold: Fix _GLOBAL_OFFSET_TABLE_ value for large GOTs
- From: Stephen Crane <sjc at immunant dot com>
- To: Binutils <binutils at sourceware dot org>
- Date: Wed, 11 Apr 2018 13:02:35 -0700
- Subject: [PATCH] gold: Fix _GLOBAL_OFFSET_TABLE_ value for large GOTs
If this looks ok, could someone with commit access commit this for me? Thanks.
[GOLD] Fix _GLOBAL_OFFSET_TABLE_ value for large GOTs
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.
* aarch64.cc (do_finalize_sections): Use size of .got section for
the _GLOBAL_OFFSET_TABLE_ symbol computation.
diff --git a/gold/aarch64.cc b/gold/aarch64.cc
index 8de9a26765..67f210876d 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