const Sized_symbol<64>* gsym,
const Symbol_value<64>* psymval,
unsigned char* view,
- elfcpp::Elf_types<64>::Elf_Addr,
+ elfcpp::Elf_types<64>::Elf_Addr address,
off_t view_size)
{
Output_segment* tls_segment = relinfo->layout->tls_segment();
const Sized_relobj<64, false>* object = relinfo->object;
+ const elfcpp::Elf_Xword addend = rela.get_r_addend();
elfcpp::Elf_types<64>::Elf_Addr value = psymval->value(relinfo->object, 0);
{
// Relocate the field with the offset of the pair of GOT
// entries.
- Relocate_functions<64, false>::rel64(view, got_offset);
+ value = target->got_plt_section()->address() + got_offset;
+ Relocate_functions<64, false>::pcrela32(view, value, addend,
+ address);
break;
}
}
got_offset = (object->local_tls_got_offset(r_sym, false)
- target->got_size());
}
- Relocate_functions<64, false>::rel64(view, got_offset);
+ value = target->got_plt_section()->address() + got_offset;
+ Relocate_functions<64, false>::pcrela32(view, value, addend,
+ address);
break;
}
gold_error_at_location(relinfo, relnum, rela.get_r_offset(),
case elfcpp::R_X86_64_DTPOFF32:
gold_assert(tls_segment != NULL);
if (optimized_type == tls::TLSOPT_TO_LE)
- value = value - (tls_segment->vaddr() + tls_segment->memsz());
- else
- value = value - tls_segment->vaddr();
- Relocate_functions<64, false>::rel32(view, value);
+ value -= tls_segment->memsz();
+ Relocate_functions<64, false>::rela32(view, value, 0);
break;
case elfcpp::R_X86_64_DTPOFF64:
gold_assert(tls_segment != NULL);
if (optimized_type == tls::TLSOPT_TO_LE)
- value = value - (tls_segment->vaddr() + tls_segment->memsz());
- else
- value = value - tls_segment->vaddr();
- Relocate_functions<64, false>::rel64(view, value);
+ value -= tls_segment->memsz();
+ Relocate_functions<64, false>::rela64(view, value, 0);
break;
case elfcpp::R_X86_64_GOTTPOFF: // Initial-exec
got_offset = (object->local_got_offset(r_sym)
- target->got_size());
}
- Relocate_functions<64, false>::rel64(view, got_offset);
+ value = target->got_plt_section()->address() + got_offset;
+ Relocate_functions<64, false>::pcrela32(view, value, addend, address);
break;
}
gold_error_at_location(relinfo, relnum, rela.get_r_offset(),
break;
case elfcpp::R_X86_64_TPOFF32: // Local-exec
- value = value - (tls_segment->vaddr() + tls_segment->memsz());
- Relocate_functions<64, false>::rel32(view, value);
+ value -= tls_segment->memsz();
+ Relocate_functions<64, false>::rela32(view, value, 0);
break;
}
}
memcpy(view - 4, "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0\0", 16);
- value = value - (tls_segment->vaddr() + tls_segment->memsz());
+ value -= tls_segment->memsz();
Relocate_functions<64, false>::rela32(view + 8, value, 0);
// The next reloc should be a PLT32 reloc against __tls_get_addr.
memcpy(view - 4, "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0\0", 16);
- value = value - (tls_segment->vaddr() + tls_segment->memsz());
+ value -= tls_segment->memsz();
Relocate_functions<64, false>::rela32(view + 8, value, 0);
// The next reloc should be a PLT32 reloc against __tls_get_addr.
view[-1] = 0x80 | reg | (reg << 3);
}
- value = value - (tls_segment->vaddr() + tls_segment->memsz());
+ value -= tls_segment->memsz();
Relocate_functions<64, false>::rela32(view, value, 0);
}