From 8de0e07bf381f677bb93a8da72185a54e5b014bd Mon Sep 17 00:00:00 2001 From: Cary Coutant Date: Tue, 28 Nov 2017 18:09:41 -0800 Subject: [PATCH] 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. --- 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 4cf92baa5a7..a87b99d111a 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,12 @@ +2017-11-28 Cary Coutant + + * 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 * testsuite/pr22266_a.c: Add a newline at end of file. diff --git a/gold/object.cc b/gold/object.cc index f7fe088d7ca..ee99c5fc4d7 100644 --- a/gold/object.cc +++ b/gold/object.cc @@ -476,7 +476,6 @@ Sized_relobj_file::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::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(offset); @@ -2226,9 +2219,13 @@ Sized_relobj_file::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::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 508e79cb3c0..59915d9b47b 100644 --- a/gold/object.h +++ b/gold/object.h @@ -2842,9 +2842,6 @@ class Sized_relobj_file : public Sized_relobj 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_; -- 2.30.2