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.
This commit is contained in:
Stephen Crane
2018-05-10 00:09:32 -07:00
committed by Cary Coutant
parent 6fe88226c2
commit a45a8f9178
2 changed files with 7 additions and 2 deletions

View File

@ -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

View File

@ -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