Fix problem with optimization of .eh_frame section and --sort-section option.
authorCary Coutant <ccoutant@google.com>
Wed, 2 Jul 2014 16:39:41 +0000 (09:39 -0700)
committerCary Coutant <ccoutant@google.com>
Tue, 2 Sep 2014 21:49:18 +0000 (14:49 -0700)
commit9860cbcfb60bdae2f9800e6a6ea5f21ef1507d08
treeda0a996a6e7e26eec815fc647283fe878fe23e7a
parentdf7e526582809b829ee8651a1315a17627cfea4d
Fix problem with optimization of .eh_frame section and --sort-section option.

When --sort-section=name is used, gold will sort the linker-generated contents
of .eh_frame (after optimization) after the endcap provided by crtendS.o.
This causes two problems: the .eh_frame_hdr section is generated assuming that
the optimized .eh_frame contents will be placed at the very beginning of the
section, and the endcap no longer appears at the end of the section.

This patch fixes the first problem by adjusting FDE offsets to take into account
the actual starting offset within the output section, and fixes the second
problem by sorting linker-generated (Output_section_data) sections based on the
name of the output section.

gold/
PR gold/17005
* ehframe.cc (Fde::write): Add output_offset parameter.
(Cie::write): Likewise.
(Eh_frame::set_final_data_size): Account for offset within output
section.
(Eh_frame::do_sized_write): Likewise.
* ehframe.h (Fde::write): Add output_offset parameter.
(Cie::write): Likewise.
* output.cc (Output_section::Input_section_sort_entry): Remove
section_has_name_; add output_section_name parameter. Use
output section name for non-input sections.
(Output_section::Input_section_sort_entry::section_has_name): Remove.
(Output_section::Input_section_sort_entry::section_has_name_): Remove.
(Output_section::Input_section_sort_compare): Remove logic for
sections without names.
(Output_section::Input_section_sort_init_fini_compare): Likewise.
(Output_section::Input_section_sort_section_prefix_special_ordering_compare):
Likewise.
(Output_section::Input_section_sort_section_name_compare): Likewise.
gold/ChangeLog
gold/ehframe.cc
gold/ehframe.h
gold/output.cc