This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Fix internal error with -z relro when .tbss is last relro section.


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=bccffdfdf268a84533131d6e4d6208f9873892ee

commit bccffdfdf268a84533131d6e4d6208f9873892ee
Author: Cary Coutant <ccoutant@gmail.com>
Date:   Sat Mar 21 22:30:44 2015 -0700

    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.

Diff:
---
 gold/ChangeLog | 8 ++++++++
 gold/output.cc | 5 ++---
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/gold/ChangeLog b/gold/ChangeLog
index cc0aed3..7d281a9 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,5 +1,13 @@
 2015-03-21  Cary Coutant  <cary@google.com>
 
+	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  <cary@google.com>
+
 	PR gold/18010
 	* stringpool.cc (Stringpool_template): Don't optimize if section
 	alignment is greater than sizeof(char).
diff --git a/gold/output.cc b/gold/output.cc
index 8faa040..516e01d 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<int>(ORDER_MAX); ++i)
     {
-      if (i == static_cast<int>(ORDER_TLS_DATA)
-	  || i == static_cast<int>(ORDER_TLS_BSS))
+      if (i == static_cast<int>(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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]