From bccffdfdf268a84533131d6e4d6208f9873892ee Mon Sep 17 00:00:00 2001 From: Cary Coutant Date: Sat, 21 Mar 2015 22:30:44 -0700 Subject: [PATCH] Fix internal error with -z relro when .tbss is last relro section. When calculating the padding necessary to align the end of the relro segment to a page boundary, gold erroneously ignores the .tdata section when checking to see if there are any relro sections (so if .tdata is the only relro section, we fail to align the segment properly), and erroneously pads the cumulative size of the segment based on the alignment of .tbss. If there are no relro sections following .tbss, it then fails to note the padding needed at the end of .tdata. This patch fixes both problems. is_first_section_relro() will return true when it sees a .tdata section, and we do not align the cumulative size until after checking for the .tbss section. gold/ PR gold/14217 * output.cc (Output_segment::is_first_section_relro): Don't ignore .tdata section. (Output_segment::set_section_addresses): Don't align size of relro segment for .tbss. --- gold/ChangeLog | 8 ++++++++ gold/output.cc | 5 ++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index cc0aed32ef1..7d281a9f23f 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,11 @@ +2015-03-21 Cary Coutant + + PR gold/14217 + * output.cc (Output_segment::is_first_section_relro): Don't ignore + .tdata section. + (Output_segment::set_section_addresses): Don't align size of relro + segment for .tbss. + 2015-03-21 Cary Coutant PR gold/18010 diff --git a/gold/output.cc b/gold/output.cc index 8faa0403dbb..516e01daff1 100644 --- a/gold/output.cc +++ b/gold/output.cc @@ -4176,8 +4176,7 @@ Output_segment::is_first_section_relro() const { for (int i = 0; i < static_cast(ORDER_MAX); ++i) { - if (i == static_cast(ORDER_TLS_DATA) - || i == static_cast(ORDER_TLS_BSS)) + if (i == static_cast(ORDER_TLS_BSS)) continue; const Output_data_list* pdl = &this->output_lists_[i]; if (!pdl->empty()) @@ -4305,11 +4304,11 @@ Output_segment::set_section_addresses(const Target* target, align = max_align; in_tls = false; } - relro_size = align_address(relro_size, align); // Ignore the size of the .tbss section. if ((*p)->is_section_flag_set(elfcpp::SHF_TLS) && (*p)->is_section_type(elfcpp::SHT_NOBITS)) continue; + relro_size = align_address(relro_size, align); if ((*p)->is_address_valid()) relro_size += (*p)->data_size(); else -- 2.30.2