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] Allow multiple .eh_frame sections per object file.


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

commit 8de0e07bf381f677bb93a8da72185a54e5b014bd
Author: Cary Coutant <ccoutant@gmail.com>
Date:   Tue Nov 28 18:09:41 2017 -0800

    Allow multiple .eh_frame sections per object file.
    
    LLVM is experimenting with placing .eh_frame sections in the COMDAT group
    with the function's text. This triggers an internal error in gold because
    we don't expect to see but one .eh_frame section in an object, and we use
    a single data member in class Sized_relobj_file to keep track of that section.
    
    This patch removes that data member, and instead checks the output section
    and the input section offset to identify an optimized .eh_frame section.
    
    gold/
    	* object.h (class Sized_relobj_file): Remove discarded_eh_frame_shndx_.
    	* object.cc (Sized_relobj_file::Sized_relobj_file): Likewise.
    	(Sized_relobj_file::layout_eh_frame_section): Likewise.
    	(Sized_relobj_file::do_count_local_symbols): Check for optimized
    	.eh_frame section by other means.
    	(Sized_relobj_file::compute_final_local_value_internal): Likewise.

Diff:
---
 gold/ChangeLog |  9 +++++++++
 gold/object.cc | 23 ++++++++++-------------
 gold/object.h  |  3 ---
 3 files changed, 19 insertions(+), 16 deletions(-)

diff --git a/gold/ChangeLog b/gold/ChangeLog
index 4cf92ba..a87b99d 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,12 @@
+2017-11-28  Cary Coutant  <ccoutant@gmail.com>
+
+	* object.h (class Sized_relobj_file): Remove discarded_eh_frame_shndx_.
+	* object.cc (Sized_relobj_file::Sized_relobj_file): Likewise.
+	(Sized_relobj_file::layout_eh_frame_section): Likewise.
+	(Sized_relobj_file::do_count_local_symbols): Check for optimized
+	.eh_frame section by other means.
+	(Sized_relobj_file::compute_final_local_value_internal): Likewise.
+
 2017-11-28  H.J. Lu  <hongjiu.lu@intel.com>
 
 	* testsuite/pr22266_a.c: Add a newline at end of file.
diff --git a/gold/object.cc b/gold/object.cc
index f7fe088..ee99c5f 100644
--- a/gold/object.cc
+++ b/gold/object.cc
@@ -476,7 +476,6 @@ Sized_relobj_file<size, big_endian>::Sized_relobj_file(
     local_plt_offsets_(),
     kept_comdat_sections_(),
     has_eh_frame_(false),
-    discarded_eh_frame_shndx_(-1U),
     is_deferred_layout_(false),
     deferred_layout_(),
     deferred_layout_relocs_(),
@@ -1303,13 +1302,7 @@ Sized_relobj_file<size, big_endian>::layout_eh_frame_section(
 					       &offset);
   this->output_sections()[shndx] = os;
   if (os == NULL || offset == -1)
-    {
-      // An object can contain at most one section holding exception
-      // frame information.
-      gold_assert(this->discarded_eh_frame_shndx_ == -1U);
-      this->discarded_eh_frame_shndx_ = shndx;
-      this->section_offsets()[shndx] = invalid_address;
-    }
+    this->section_offsets()[shndx] = invalid_address;
   else
     this->section_offsets()[shndx] = convert_types<Address, off_t>(offset);
 
@@ -2226,9 +2219,13 @@ Sized_relobj_file<size, big_endian>::do_count_local_symbols(Stringpool* pool,
       // Decide whether this symbol should go into the output file.
 
       if (is_ordinary
-	  && ((shndx < shnum && out_sections[shndx] == NULL)
-	      || shndx == this->discarded_eh_frame_shndx_))
+	  && shndx < shnum
+	  && (out_sections[shndx] == NULL
+	      || (out_sections[shndx]->order() == ORDER_EHFRAME
+		  && out_section_offsets[shndx] == invalid_address)))
 	{
+	  // This is either a discarded section or an optimized .eh_frame
+	  // section.
 	  lv.set_no_output_symtab_entry();
 	  gold_assert(!lv.needs_output_dynsym_entry());
 	  continue;
@@ -2393,10 +2390,10 @@ Sized_relobj_file<size, big_endian>::compute_final_local_value_internal(
 
 	  // This is a SHF_MERGE section or one which otherwise
 	  // requires special handling.
-	  if (shndx == this->discarded_eh_frame_shndx_)
+	  if (os->order() == ORDER_EHFRAME)
 	    {
-	      // This local symbol belongs to a discarded .eh_frame
-	      // section.  Just treat it like the case in which
+	      // This local symbol belongs to a discarded or optimized
+	      // .eh_frame section.  Just treat it like the case in which
 	      // os == NULL above.
 	      gold_assert(this->has_eh_frame_);
 	      return This::CFLV_DISCARDED;
diff --git a/gold/object.h b/gold/object.h
index 508e79c..59915d9 100644
--- a/gold/object.h
+++ b/gold/object.h
@@ -2842,9 +2842,6 @@ class Sized_relobj_file : public Sized_relobj<size, big_endian>
   Kept_comdat_section_table kept_comdat_sections_;
   // Whether this object has a GNU style .eh_frame section.
   bool has_eh_frame_;
-  // If this object has a GNU style .eh_frame section that is discarded in
-  // output, record the index here.  Otherwise it is -1U.
-  unsigned int discarded_eh_frame_shndx_;
   // True if the layout of this object was deferred, waiting for plugin
   // replacement files.
   bool is_deferred_layout_;


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