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.
This commit is contained in:
Cary Coutant 2013-11-06 10:34:26 -08:00
parent b9502d3fd7
commit 1d946cb356
2 changed files with 28 additions and 22 deletions

View File

@ -1,3 +1,9 @@
2013-11-06 Cary Coutant <ccoutant@google.com>
PR gold/15758
* object.cc (Sized_relobj_file::do_layout): Handle .eh_frame sections
before reloc sections.
2013-10-31 Cary Coutant <ccoutant@google.com>
Restore support for dwp v2 DWARF package file format.

View File

@ -1704,6 +1704,28 @@ Sized_relobj_file<size, big_endian>::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<unsigned int>::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<size, big_endian>::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<unsigned int>::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