summaryrefslogtreecommitdiff
path: root/gold/target-reloc.h
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
commit762a43c33b025000132502ac03ab00b2d831d769 (patch)
treeff36dcc44343c23dd3f1137e1ec75c077a9dee9a /gold/target-reloc.h
parentf0a026129dbe5c7bfe3046a48af28bca86236753 (diff)
downloadbinutils-redhat-762a43c33b025000132502ac03ab00b2d831d769.tar.gz
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/target-reloc.h')
-rw-r--r--gold/target-reloc.h32
1 files changed, 15 insertions, 17 deletions
diff --git a/gold/target-reloc.h b/gold/target-reloc.h
index 15d59bb901..6683ddd05f 100644
--- a/gold/target-reloc.h
+++ b/gold/target-reloc.h
@@ -417,12 +417,7 @@ scan_relocatable_relocs(
{
strategy = scan.local_section_strategy(r_type, object);
if (strategy != Relocatable_relocs::RELOC_DISCARD)
- {
- section_offset_type dummy;
- Output_section* os = object->output_section(shndx,
- &dummy);
- os->set_needs_symtab_index();
- }
+ object->output_section(shndx)->set_needs_symtab_index();
}
}
}
@@ -441,7 +436,7 @@ relocate_for_relocatable(
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,
const Relocatable_relocs* rr,
unsigned char* view,
typename elfcpp::Elf_types<size>::Elf_Addr view_address,
@@ -449,6 +444,7 @@ relocate_for_relocatable(
unsigned char* reloc_view,
section_size_type reloc_view_size)
{
+ typedef typename elfcpp::Elf_types<size>::Elf_Addr Address;
typedef typename Reloc_types<sh_type, size, big_endian>::Reloc Reltype;
typedef typename Reloc_types<sh_type, size, big_endian>::Reloc_write
Reltype_write;
@@ -500,8 +496,7 @@ relocate_for_relocatable(
unsigned int shndx =
object->local_symbol_input_shndx(r_sym, &is_ordinary);
gold_assert(is_ordinary);
- section_offset_type dummy;
- Output_section* os = object->output_section(shndx, &dummy);
+ Output_section* os = object->output_section(shndx);
gold_assert(os != NULL);
gold_assert(os->needs_symtab_index());
new_symndx = os->symtab_index();
@@ -526,16 +521,19 @@ relocate_for_relocatable(
// Get the new offset--the location in the output section where
// this relocation should be applied.
- off_t offset = reloc.get_r_offset();
- off_t new_offset;
- if (offset_in_output_section != -1)
+ Address offset = reloc.get_r_offset();
+ Address new_offset;
+ if (offset_in_output_section != -1U)
new_offset = offset + offset_in_output_section;
else
{
- new_offset = output_section->output_offset(object,
- relinfo->data_shndx,
- offset);
- gold_assert(new_offset != -1);
+ section_offset_type sot_offset =
+ convert_types<section_offset_type, Address>(offset);
+ section_offset_type new_sot_offset =
+ output_section->output_offset(object, relinfo->data_shndx,
+ sot_offset);
+ gold_assert(new_sot_offset != -1);
+ new_offset = new_sot_offset;
}
// In an object file, r_offset is an offset within the section.
@@ -544,7 +542,7 @@ relocate_for_relocatable(
if (!parameters->options().relocatable())
{
new_offset += view_address;
- if (offset_in_output_section != -1)
+ if (offset_in_output_section != -1U)
new_offset -= offset_in_output_section;
}