From 1d946cb356d22867128b40b9560857f930b2b0b0 Mon Sep 17 00:00:00 2001 From: Cary Coutant Date: Wed, 6 Nov 2013 10:34:26 -0800 Subject: Fix assert failure with --emit-relocs and .eh_frame sections. gold/ PR gold/15758 * object.cc (Sized_relobj_file::do_layout): Handle .eh_frame sections before reloc sections. --- gold/ChangeLog | 6 ++++++ gold/object.cc | 44 ++++++++++++++++++++++---------------------- 2 files changed, 28 insertions(+), 22 deletions(-) (limited to 'gold') diff --git a/gold/ChangeLog b/gold/ChangeLog index 4ba00a3..e6910f0 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,9 @@ +2013-11-06 Cary Coutant + + PR gold/15758 + * object.cc (Sized_relobj_file::do_layout): Handle .eh_frame sections + before reloc sections. + 2013-10-31 Cary Coutant Restore support for dwp v2 DWARF package file format. diff --git a/gold/object.cc b/gold/object.cc index c98b3c5..b1feacc 100644 --- a/gold/object.cc +++ b/gold/object.cc @@ -1704,6 +1704,28 @@ Sized_relobj_file::do_layout(Symbol_table* symtab, if (!is_pass_two) layout->layout_gnu_stack(seen_gnu_stack, gnu_stack_flags, this); + // Handle the .eh_frame sections after the other sections. + gold_assert(!is_pass_one || eh_frame_sections.empty()); + for (std::vector::const_iterator p = eh_frame_sections.begin(); + p != eh_frame_sections.end(); + ++p) + { + unsigned int i = *p; + const unsigned char* pshdr; + pshdr = section_headers_data + i * This::shdr_size; + typename This::Shdr shdr(pshdr); + + this->layout_eh_frame_section(layout, + symbols_data, + symbols_size, + symbol_names_data, + symbol_names_size, + i, + shdr, + reloc_shndx[i], + reloc_type[i]); + } + // When doing a relocatable link handle the reloc sections at the // end. Garbage collection and Identical Code Folding is not // turned on for relocatable code. @@ -1756,28 +1778,6 @@ Sized_relobj_file::do_layout(Symbol_table* symtab, out_section_offsets[i] = invalid_address; } - // Handle the .eh_frame sections at the end. - gold_assert(!is_pass_one || eh_frame_sections.empty()); - for (std::vector::const_iterator p = eh_frame_sections.begin(); - p != eh_frame_sections.end(); - ++p) - { - unsigned int i = *p; - const unsigned char* pshdr; - pshdr = section_headers_data + i * This::shdr_size; - typename This::Shdr shdr(pshdr); - - this->layout_eh_frame_section(layout, - symbols_data, - symbols_size, - symbol_names_data, - symbol_names_size, - i, - shdr, - reloc_shndx[i], - reloc_type[i]); - } - // When building a .gdb_index section, scan the .debug_info and // .debug_types sections. gold_assert(!is_pass_one -- cgit v1.1