aboutsummaryrefslogtreecommitdiff
path: root/gold/reloc.cc
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>2008-07-10 23:01:20 +0000
committerIan Lance Taylor <ian@airs.com>2008-07-10 23:01:20 +0000
commitef9beddf72634055b25a631850464a701599585c (patch)
treefa8661a29f81c137fffc658c4104657e22732c2f /gold/reloc.cc
parent4c28f408dfc2ab71b7995f061cc725d3f217ec9c (diff)
downloadfsf-binutils-gdb-ef9beddf72634055b25a631850464a701599585c.zip
fsf-binutils-gdb-ef9beddf72634055b25a631850464a701599585c.tar.gz
fsf-binutils-gdb-ef9beddf72634055b25a631850464a701599585c.tar.bz2
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.
Diffstat (limited to 'gold/reloc.cc')
-rw-r--r--gold/reloc.cc54
1 files changed, 28 insertions, 26 deletions
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<size, big_endian>::do_read_relocs(Read_relocs_data* rd)
rd->relocs.reserve(shnum / 2);
- std::vector<Map_to_output>& map_sections(this->map_to_output());
+ const Output_sections& out_sections(this->output_sections());
+ const std::vector<Address>& 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<size, big_endian>::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<size, big_endian>::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<size, big_endian>::write_sections(const unsigned char* pshdrs,
Views* pviews)
{
unsigned int shnum = this->shnum();
- const std::vector<Map_to_output>& map_sections(this->map_to_output());
+ const Output_sections& out_sections(this->output_sections());
+ const std::vector<Address>& out_offsets(this->section_offsets_);
File_read::Read_multiple rm;
bool is_sorted = true;
@@ -546,10 +548,10 @@ Sized_relobj<size, big_endian>::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<size, big_endian>::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<size, big_endian>::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<Address, off_t>(os->data_size());
}
else
{
output_section_offset = 0;
- output_section_size = os->postprocessing_buffer_size();
+ output_section_size =
+ convert_types<Address, off_t>(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<size, big_endian>::write_sections(const unsigned char* pshdrs,
if (view_size == 0)
continue;
- gold_assert(output_offset == -1
- || (output_offset >= 0
- && (output_offset + static_cast<off_t>(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<size, big_endian>::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<size, big_endian>::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<size, big_endian>::relocate_sections(
unsigned int shnum = this->shnum();
Sized_target<size, big_endian>* target = this->sized_target();
- const std::vector<Map_to_output>& map_sections(this->map_to_output());
+ const Output_sections& out_sections(this->output_sections());
+ const std::vector<Address>& out_offsets(this->section_offsets_);
Relocate_info<size, big_endian> relinfo;
relinfo.options = &options;
@@ -723,14 +725,14 @@ Sized_relobj<size, big_endian>::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<size, big_endian>::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<size, big_endian>::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<size, big_endian>::emit_relocs(
const unsigned char* prelocs,
size_t reloc_count,
Output_section* output_section,
- off_t offset_in_output_section,
+ typename elfcpp::Elf_types<size>::Elf_Addr offset_in_output_section,
unsigned char* view,
typename elfcpp::Elf_types<size>::Elf_Addr address,
section_size_type view_size,
@@ -861,7 +863,7 @@ Sized_relobj<size, big_endian>::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<size>::Elf_Addr offset_in_output_section,
unsigned char* view,
typename elfcpp::Elf_types<size>::Elf_Addr address,
section_size_type view_size,