Line 403... |
Line 403... |
void
|
void
|
reserve_global_got_entry(unsigned int got_index, Symbol* gsym,
|
reserve_global_got_entry(unsigned int got_index, Symbol* gsym,
|
unsigned int got_type);
|
unsigned int got_type);
|
|
|
// Register an existing PLT entry for a global symbol.
|
// Register an existing PLT entry for a global symbol.
|
// A target needs to implement this to support incremental linking.
|
|
void
|
void
|
register_global_plt_entry(unsigned int plt_index, Symbol* gsym);
|
register_global_plt_entry(unsigned int plt_index, Symbol* gsym);
|
|
|
|
// Force a COPY relocation for a given symbol.
|
|
void
|
|
emit_copy_reloc(Symbol_table*, Symbol*, Output_section*, off_t);
|
|
|
// Apply an incremental relocation.
|
// Apply an incremental relocation.
|
void
|
void
|
apply_relocation(const Relocate_info<64, false>* relinfo,
|
apply_relocation(const Relocate_info<64, false>* relinfo,
|
elfcpp::Elf_types<64>::Elf_Addr r_offset,
|
elfcpp::Elf_types<64>::Elf_Addr r_offset,
|
unsigned int r_type,
|
unsigned int r_type,
|
Line 910... |
Line 913... |
else
|
else
|
{
|
{
|
// For incremental updates, find an available slot.
|
// For incremental updates, find an available slot.
|
plt_offset = this->free_list_.allocate(plt_entry_size, plt_entry_size, 0);
|
plt_offset = this->free_list_.allocate(plt_entry_size, plt_entry_size, 0);
|
if (plt_offset == -1)
|
if (plt_offset == -1)
|
gold_fatal(_("out of patch space (PLT);"
|
gold_fallback(_("out of patch space (PLT);"
|
" relink with --incremental-full"));
|
" relink with --incremental-full"));
|
|
|
// The GOT and PLT entries have a 1-1 correspondance, so the GOT offset
|
// The GOT and PLT entries have a 1-1 correspondance, so the GOT offset
|
// can be calculated from the PLT index, adjusting for the three
|
// can be calculated from the PLT index, adjusting for the three
|
// reserved entries at the beginning of the GOT.
|
// reserved entries at the beginning of the GOT.
|
Line 1387... |
Line 1390... |
|
|
unsigned int got_offset = (plt_index + 3) * 8;
|
unsigned int got_offset = (plt_index + 3) * 8;
|
this->plt_->add_relocation(gsym, got_offset);
|
this->plt_->add_relocation(gsym, got_offset);
|
}
|
}
|
|
|
|
// Force a COPY relocation for a given symbol.
|
|
|
|
void
|
|
Target_x86_64::emit_copy_reloc(
|
|
Symbol_table* symtab, Symbol* sym, Output_section* os, off_t offset)
|
|
{
|
|
this->copy_relocs_.emit_copy_reloc(symtab,
|
|
symtab->get_sized_symbol<64>(sym),
|
|
os,
|
|
offset,
|
|
this->rela_dyn_section(NULL));
|
|
}
|
|
|
// Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
|
// Define the _TLS_MODULE_BASE_ symbol in the TLS segment.
|
|
|
void
|
void
|
Target_x86_64::define_tls_base_symbol(Symbol_table* symtab, Layout* layout)
|
Target_x86_64::define_tls_base_symbol(Symbol_table* symtab, Layout* layout)
|
{
|
{
|