* 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.
This commit is contained in:
Cary Coutant
2011-04-22 22:39:55 +00:00
parent c87e430233
commit 94a3fc8b83
7 changed files with 304 additions and 20 deletions

View File

@@ -298,10 +298,11 @@ Layout::Relaxation_debug_check::verify_sections(
void
Layout_task_runner::run(Workqueue* workqueue, const Task* task)
{
off_t file_size = this->layout_->finalize(this->input_objects_,
this->symtab_,
this->target_,
task);
Layout* layout = this->layout_;
off_t file_size = layout->finalize(this->input_objects_,
this->symtab_,
this->target_,
task);
// Now we know the final size of the output file and we know where
// each piece of information goes.
@@ -309,11 +310,11 @@ Layout_task_runner::run(Workqueue* workqueue, const Task* task)
if (this->mapfile_ != NULL)
{
this->mapfile_->print_discarded_sections(this->input_objects_);
this->layout_->print_to_mapfile(this->mapfile_);
layout->print_to_mapfile(this->mapfile_);
}
Output_file* of;
if (this->layout_->incremental_base() == NULL)
if (layout->incremental_base() == NULL)
{
of = new Output_file(parameters->options().output_file_name());
if (this->options_.oformat_enum() != General_options::OBJECT_FORMAT_ELF)
@@ -322,13 +323,24 @@ Layout_task_runner::run(Workqueue* workqueue, const Task* task)
}
else
{
of = this->layout_->incremental_base()->output_file();
of = layout->incremental_base()->output_file();
// Apply the incremental relocations for symbols whose values
// have changed. We do this before we resize the file and start
// writing anything else to it, so that we can read the old
// incremental information from the file before (possibly)
// overwriting it.
if (parameters->incremental_update())
layout->incremental_base()->apply_incremental_relocs(this->symtab_,
this->layout_,
of);
of->resize(file_size);
}
// Queue up the final set of tasks.
gold::queue_final_tasks(this->options_, this->input_objects_,
this->symtab_, this->layout_, workqueue, of);
this->symtab_, layout, workqueue, of);
}
// Layout methods.