PATCH COMMITTED: Handle large output sections in gold
Ian Lance Taylor
iant@google.com
Thu Jul 10 23:09:00 GMT 2008
More information about the Binutils mailing list
Thu Jul 10 23:09:00 GMT 2008
- Previous message (by thread): [PATCH] [PPC] VSX registers support on core files
- Next message (by thread): h8300 branch relaxing
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
For speed on 32-bit hosts, gold holds some section offsets using the types size_t and ptrdiff_t. It does this when the output sections must be in memory anyhow, as with a merged section. Unfortunately, I made a mistake and also did this with the offset of an input section in an output section. This fails when the output section is more than 0x7fffffff bytes. This will generally not happen for a 32-bit target, but it can reasonably happen for a 64-bit target if the output file is very large. This patch fixes the problem. Previously a single structure, Map_to_output, hold the output section and the offset within the output section. That structure was in Relobj. I moved the offset within the output section to Sized_relobj. That permits it to remain a 32-bit value for a 32-bit target. The rest of the patch is fairly mechanical changes that result from that. The comdat group support moves to Sized_relobj. A bunch of pointers which converted from Relobj* to Sized_relobj* now remain as Sized_relobj* through a series of function calls. The biggest change is that Symbol_table::sized_finalize_symbol now calls a virtual function to get the section offset. If this turns out to be a problem, we can templatize Symbol_table::sized_finalize on the endianness and use a static cast in sized_finalize_symbol. Ian 2008-07-10 Ian Lance Taylor <iant@google.com> 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. -------------- next part -------------- A non-text attachment was scrubbed... Name: foo.patch Type: text/x-patch Size: 56873 bytes Desc: Support large output sections URL: <https://sourceware.org/pipermail/binutils/attachments/20080710/9470e7ef/attachment.bin>
- Previous message (by thread): [PATCH] [PPC] VSX registers support on core files
- Next message (by thread): h8300 branch relaxing
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Binutils mailing list