mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-29 10:30:46 +00:00
* 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:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user