From 94a3fc8b837eb39007fa4e82120f60ec9429317d Mon Sep 17 00:00:00 2001 From: Cary Coutant Date: Fri, 22 Apr 2011 22:39:55 +0000 Subject: * incremental.cc (Sized_incremental_binary::setup_readers): Allocate global symbol map. (Sized_incremental_binary::do_apply_incremental_relocs): New function. (Sized_incr_relobj::do_add_symbols): Add symbols to global symbol map. (Sized_incr_relobj::do_relocate): Remap section indices in incremental relocations. (Sized_incr_dynobj::do_add_symbols): Add symbols to global symbol map. (Sized_incr_dynobj::do_for_all_global_symbols): Remove FIXME. (Sized_incr_dynobj::do_for_all_local_got_entries): Likewise. * incremental.h (Incremental_inputs_reader::global_symbol_reader_at_offset): New function. (Incremental_binary::apply_incremental_relocs): New function. (Incremental_binary::do_apply_incremental_relocs): New function. (Sized_incremental_binary::Sized_incremental_binary): Initialize new data member. (Sized_incremental_binary::add_global_symbol): New function. (Sized_incremental_binary::global_symbol): New function. (Sized_incremental_binary::do_apply_incremental_relocs): New function. (Sized_incremental_binary::symbol_map_): New data member. * layout.cc (Layout_task_runner::run): Apply incremental relocations. * target.h (Sized_target::apply_relocation): New function. * target-reloc.h (apply_relocation): New function. * x86_64.cc (Target_x86_64::apply_relocation): New function. --- gold/target-reloc.h | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'gold/target-reloc.h') diff --git a/gold/target-reloc.h b/gold/target-reloc.h index 2d12fa2..17c9c99 100644 --- a/gold/target-reloc.h +++ b/gold/target-reloc.h @@ -362,6 +362,46 @@ relocate_section( } } +// Apply an incremental relocation. + +template +void +apply_relocation(const Relocate_info* relinfo, + Target_type* target, + typename elfcpp::Elf_types::Elf_Addr r_offset, + unsigned int r_type, + typename elfcpp::Elf_types::Elf_Swxword r_addend, + const Symbol* gsym, + unsigned char* view, + typename elfcpp::Elf_types::Elf_Addr address, + section_size_type view_size) +{ + // Construct the ELF relocation in a temporary buffer. + const int reloc_size = elfcpp::Elf_sizes<64>::rela_size; + unsigned char relbuf[reloc_size]; + elfcpp::Rela<64, false> rel(relbuf); + elfcpp::Rela_write<64, false> orel(relbuf); + orel.put_r_offset(r_offset); + orel.put_r_info(elfcpp::elf_r_info<64>(0, r_type)); + orel.put_r_addend(r_addend); + + // Setup a Symbol_value for the global symbol. + const Sized_symbol<64>* sym = static_cast*>(gsym); + Symbol_value<64> symval; + gold_assert(sym->has_symtab_index() && sym->symtab_index() != -1U); + symval.set_output_symtab_index(sym->symtab_index()); + symval.set_output_value(sym->value()); + if (gsym->type() == elfcpp::STT_TLS) + symval.set_is_tls_symbol(); + else if (gsym->type() == elfcpp::STT_GNU_IFUNC) + symval.set_is_ifunc_symbol(); + + Relocate relocate; + relocate.relocate(relinfo, target, NULL, -1U, rel, r_type, sym, &symval, + view + r_offset, address + r_offset, view_size); +} + // This class may be used as a typical class for the // Scan_relocatable_reloc parameter to scan_relocatable_relocs. The // template parameter Classify_reloc must be a class type which -- cgit v1.1