summaryrefslogtreecommitdiffstats
path: root/binutils-2.23/gold/x86_64.cc
diff options
context:
space:
mode:
Diffstat (limited to 'binutils-2.23/gold/x86_64.cc')
-rw-r--r--binutils-2.23/gold/x86_64.cc8
1 files changed, 6 insertions, 2 deletions
diff --git a/binutils-2.23/gold/x86_64.cc b/binutils-2.23/gold/x86_64.cc
index 2014bc5..4ec7af3 100644
--- a/binutils-2.23/gold/x86_64.cc
+++ b/binutils-2.23/gold/x86_64.cc
@@ -3252,7 +3252,9 @@ Target_x86_64<size>::Relocate::relocate(
// We need to subtract the size of the GOT section to get
// the actual offset to use in the relocation.
bool have_got_offset = false;
- unsigned int got_offset = 0;
+ // Since the actual offset is always negative, we use signed int to
+ // support 64-bit GOT relocations.
+ int got_offset = 0;
switch (r_type)
{
case elfcpp::R_X86_64_GOT32:
@@ -3353,10 +3355,12 @@ Target_x86_64<size>::Relocate::relocate(
gold_assert(gsym->has_plt_offset()
|| gsym->final_value_is_known());
typename elfcpp::Elf_types<size>::Elf_Addr got_address;
- got_address = target->got_section(NULL, NULL)->address();
+ // This is the address of GLOBAL_OFFSET_TABLE.
+ got_address = target->got_plt_section()->address();
Relocate_functions<size, false>::rela64(view, object, psymval,
addend - got_address);
}
+ break;
case elfcpp::R_X86_64_GOT32:
gold_assert(have_got_offset);