From ef9beddf72634055b25a631850464a701599585c Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 10 Jul 2008 23:01:20 +0000 Subject: Handle output sections with more than 0x7fffffff bytes. * object.h (class Relobj): Change map_to_output_ to output_sections_, and just keep a section pointer. Change all uses. Move comdat group support to Sized_relobj. (Relobj::is_section_specially_mapped): Remove. (Relobj::output_section): Remove poff parameter. Change all callers. (Relobj::output_section_offset): New function. (Relobj::set_section_offset): Rewrite. (Relobj::map_to_output): Remove. (Relobj::output_sections): New function. (Relobj::do_output_section_offset): New pure virtual function. (Relobj::do_set_section_offset): Likewise. (class Sized_relobj): Add section_offsets_ field. Add comdat group support from Relobj. Update declarations. (Sized_relobj::get_output_section_offset): New function. (Sized_relobj::do_output_section_offset): New function. (Sized_relobj::do_set_section_offset): New function. * object.cc (Relobj::output_section_address): Remove. (Sized_relobj::Sized_relobj): Initialize new fields. (Sized_relobj::include_section_group): Cast find_kept_object to Sized_relobj. (Sized_relobj::include_linkonce_section): Likewise. (Sized_relobj::do_layout): Use separate arrays for output section and output offset. (Sized_relobj::do_count_local_symbols): Change map_to_output to output_sections. (Sized_relobj::do_finalize_local_symbols): Change map_to_output to output_sections and section_offsets. (Sized_relobj::write_local_symbols): Likewise. (map_to_kept_section): Compute output address directly. * reloc.cc (Sized_relobj::do_read_relocs): Change map_to_output to output_sections and section_offsets. (Sized_relobj::write_sections): Likewise. (Sized_relobj::relocate_sections): Likewise. * symtab.cc (sized_finalize_symbol): Use output_section_offset. * output.h (class Output_reloc): Update declarations. Change u2_.relobj to Sized_relobj*. (class Output_data_reloc): Change add functions to use Sized_relobj*. * output.cc (Output_reloc::Output_reloc): Change relobj to Sized_relobj*. (Output_reloc::local_section_offset): Change return type to Elf_Addr. Use get_output_section_offset. (Output_reloc::get_address): Likewise. (Output_section::is_input_address_mapped): Don't call is_section_specially_mapped. (Output_section::output_offset): Likewise. (Output_section::output_address): Likewise. (Output_section::starting_output_address): Likewise. * copy-relocs.cc (Copy_relocs::copy_reloc): Change object parameter to Sized_relobj*. (Copy_relocs::need_copy_reloc): Likewise. (Copy_relocs::save): Likewise. * copy-relocs.h (class Copy_relocs): Update declarations. (class Copy_relocs::Copy_reloc_entry): Change constructor to use Sized_relobj*. Change relobj_ field to Sized_relobj*. * target-reloc.h (relocate_for_relocatable): Change offset_in_output_section type to Elf_Addr. Change code that uses it as well. * layout.cc (Layout::layout): Always set *off. * mapfile.cc (Mapfile::print_input_section): Use output_section_offset. * i386.cc (Target_i386::copy_reloc): Change object parameter to Sized_relobj*. * powerpc.cc (Target_powerpc::copy_reloc): Likewise. * sparc.cc (Target_sparc::copy_reloc): Likewise. * x86_64.cc (Target_x86_64::copy_reloc): Likewise. --- gold/reloc.cc | 54 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 26 deletions(-) (limited to 'gold/reloc.cc') diff --git a/gold/reloc.cc b/gold/reloc.cc index b44dd72..daa0ea8 100644 --- a/gold/reloc.cc +++ b/gold/reloc.cc @@ -193,7 +193,8 @@ Sized_relobj::do_read_relocs(Read_relocs_data* rd) rd->relocs.reserve(shnum / 2); - std::vector& map_sections(this->map_to_output()); + const Output_sections& out_sections(this->output_sections()); + const std::vector
& out_offsets(this->section_offsets_); const unsigned char *pshdrs = this->get_view(this->elf_file_.shoff(), shnum * This::shdr_size, @@ -216,7 +217,7 @@ Sized_relobj::do_read_relocs(Read_relocs_data* rd) continue; } - Output_section* os = map_sections[shndx].output_section; + Output_section* os = out_sections[shndx]; if (os == NULL) continue; @@ -273,7 +274,7 @@ Sized_relobj::do_read_relocs(Read_relocs_data* rd) sr.sh_type = sh_type; sr.reloc_count = reloc_count; sr.output_section = os; - sr.needs_special_offset_handling = map_sections[shndx].offset == -1; + sr.needs_special_offset_handling = out_offsets[shndx] == -1U; sr.is_data_section_allocated = is_section_allocated; } @@ -534,7 +535,8 @@ Sized_relobj::write_sections(const unsigned char* pshdrs, Views* pviews) { unsigned int shnum = this->shnum(); - const std::vector& map_sections(this->map_to_output()); + const Output_sections& out_sections(this->output_sections()); + const std::vector
& out_offsets(this->section_offsets_); File_read::Read_multiple rm; bool is_sorted = true; @@ -546,10 +548,10 @@ Sized_relobj::write_sections(const unsigned char* pshdrs, pvs->view = NULL; - const Output_section* os = map_sections[i].output_section; + const Output_section* os = out_sections[i]; if (os == NULL) continue; - off_t output_offset = map_sections[i].offset; + Address output_offset = out_offsets[i]; typename This::Shdr shdr(p); @@ -584,7 +586,7 @@ Sized_relobj::write_sections(const unsigned char* pshdrs, // In the normal case, this input section is simply mapped to // the output section at offset OUTPUT_OFFSET. - // However, if OUTPUT_OFFSET == -1, then input data is handled + // However, if OUTPUT_OFFSET == -1U, then input data is handled // specially--e.g., a .eh_frame section. The relocation // routines need to check for each reloc where it should be // applied. For this case, we need an input/output view for the @@ -602,21 +604,22 @@ Sized_relobj::write_sections(const unsigned char* pshdrs, // final data to the output file. off_t output_section_offset; - off_t output_section_size; + Address output_section_size; if (!os->requires_postprocessing()) { output_section_offset = os->offset(); - output_section_size = os->data_size(); + output_section_size = convert_types(os->data_size()); } else { output_section_offset = 0; - output_section_size = os->postprocessing_buffer_size(); + output_section_size = + convert_types(os->postprocessing_buffer_size()); } off_t view_start; section_size_type view_size; - if (output_offset != -1) + if (output_offset != -1U) { view_start = output_section_offset + output_offset; view_size = convert_to_section_size_type(shdr.get_sh_size()); @@ -630,17 +633,15 @@ Sized_relobj::write_sections(const unsigned char* pshdrs, if (view_size == 0) continue; - gold_assert(output_offset == -1 - || (output_offset >= 0 - && (output_offset + static_cast(view_size) - <= output_section_size))); + gold_assert(output_offset == -1U + || output_offset + view_size <= output_section_size); unsigned char* view; if (os->requires_postprocessing()) { unsigned char* buffer = os->postprocessing_buffer(); view = buffer + view_start; - if (output_offset != -1) + if (output_offset != -1U) { off_t sh_offset = shdr.get_sh_offset(); if (!rm.empty() && rm.back().file_offset > sh_offset) @@ -651,7 +652,7 @@ Sized_relobj::write_sections(const unsigned char* pshdrs, } else { - if (output_offset == -1) + if (output_offset == -1U) view = of->get_input_output_view(view_start, view_size); else { @@ -666,11 +667,11 @@ Sized_relobj::write_sections(const unsigned char* pshdrs, pvs->view = view; pvs->address = os->address(); - if (output_offset != -1) + if (output_offset != -1U) pvs->address += output_offset; pvs->offset = view_start; pvs->view_size = view_size; - pvs->is_input_output_view = output_offset == -1; + pvs->is_input_output_view = output_offset == -1U; pvs->is_postprocessing_view = os->requires_postprocessing(); } @@ -698,7 +699,8 @@ Sized_relobj::relocate_sections( unsigned int shnum = this->shnum(); Sized_target* target = this->sized_target(); - const std::vector& map_sections(this->map_to_output()); + const Output_sections& out_sections(this->output_sections()); + const std::vector
& out_offsets(this->section_offsets_); Relocate_info relinfo; relinfo.options = &options; @@ -723,14 +725,14 @@ Sized_relobj::relocate_sections( continue; } - Output_section* os = map_sections[index].output_section; + Output_section* os = out_sections[index]; if (os == NULL) { // This relocation section is against a section which we // discarded. continue; } - off_t output_offset = map_sections[index].offset; + Address output_offset = out_offsets[index]; gold_assert((*pviews)[index].view != NULL); if (parameters->options().relocatable()) @@ -770,7 +772,7 @@ Sized_relobj::relocate_sections( continue; } - gold_assert(output_offset != -1 + gold_assert(output_offset != -1U || this->relocs_must_follow_section_writes()); relinfo.reloc_shndx = i; @@ -782,7 +784,7 @@ Sized_relobj::relocate_sections( prelocs, reloc_count, os, - output_offset == -1, + output_offset == -1U, (*pviews)[index].view, (*pviews)[index].address, (*pviews)[index].view_size); @@ -825,7 +827,7 @@ Sized_relobj::emit_relocs( const unsigned char* prelocs, size_t reloc_count, Output_section* output_section, - off_t offset_in_output_section, + typename elfcpp::Elf_types::Elf_Addr offset_in_output_section, unsigned char* view, typename elfcpp::Elf_types::Elf_Addr address, section_size_type view_size, @@ -861,7 +863,7 @@ Sized_relobj::emit_relocs_reltype( const unsigned char* prelocs, size_t reloc_count, Output_section* output_section, - off_t offset_in_output_section, + typename elfcpp::Elf_types::Elf_Addr offset_in_output_section, unsigned char* view, typename elfcpp::Elf_types::Elf_Addr address, section_size_type view_size, -- cgit v1.1