aboutsummaryrefslogtreecommitdiff
path: root/gold/symtab.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/symtab.cc
parent4c28f408dfc2ab71b7995f061cc725d3f217ec9c (diff)
downloadgdb-ef9beddf72634055b25a631850464a701599585c.zip
gdb-ef9beddf72634055b25a631850464a701599585c.tar.gz
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/symtab.cc')
-rw-r--r--gold/symtab.cc16
1 files changed, 8 insertions, 8 deletions
diff --git a/gold/symtab.cc b/gold/symtab.cc
index 7b27350..33a9151 100644
--- a/gold/symtab.cc
+++ b/gold/symtab.cc
@@ -357,8 +357,7 @@ Symbol::output_section() const
{
gold_assert(!this->u_.from_object.object->is_dynamic());
Relobj* relobj = static_cast<Relobj*>(this->u_.from_object.object);
- section_offset_type dummy;
- return relobj->output_section(shndx, &dummy);
+ return relobj->output_section(shndx);
}
return NULL;
}
@@ -1943,6 +1942,8 @@ template<int size>
bool
Symbol_table::sized_finalize_symbol(Symbol* unsized_sym)
{
+ typedef typename Sized_symbol<size>::Value_type Value_type;
+
Sized_symbol<size>* sym = static_cast<Sized_symbol<size>*>(unsized_sym);
// The default version of a symbol may appear twice in the symbol
@@ -1958,7 +1959,7 @@ Symbol_table::sized_finalize_symbol(Symbol* unsized_sym)
return false;
}
- typename Sized_symbol<size>::Value_type value;
+ Value_type value;
switch (sym->source())
{
@@ -1991,8 +1992,7 @@ Symbol_table::sized_finalize_symbol(Symbol* unsized_sym)
else
{
Relobj* relobj = static_cast<Relobj*>(symobj);
- section_offset_type secoff;
- Output_section* os = relobj->output_section(shndx, &secoff);
+ Output_section* os = relobj->output_section(shndx);
if (os == NULL)
{
@@ -2001,6 +2001,8 @@ Symbol_table::sized_finalize_symbol(Symbol* unsized_sym)
return false;
}
+ uint64_t secoff64 = relobj->output_section_offset(shndx);
+ Value_type secoff = convert_types<Value_type, uint64_t>(secoff64);
if (sym->type() == elfcpp::STT_TLS)
value = sym->value() + os->tls_offset() + secoff;
else
@@ -2208,9 +2210,7 @@ Symbol_table::sized_write_globals(const Input_objects* input_objects,
else
{
Relobj* relobj = static_cast<Relobj*>(symobj);
- section_offset_type secoff;
- Output_section* os = relobj->output_section(in_shndx,
- &secoff);
+ Output_section* os = relobj->output_section(in_shndx);
gold_assert(os != NULL);
shndx = os->out_shndx();