[PATCH] gold: Fix _GLOBAL_OFFSET_TABLE_ value for large GOTs
Stephen Crane
sjc@immunant.com
Wed Apr 11 20:02:00 GMT 2018
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
More information about the Binutils
mailing list