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:
parent
b9502d3fd7
commit
1d946cb356
2 changed files with 28 additions and 22 deletions
|
@ -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>
|
2013-10-31 Cary Coutant <ccoutant@google.com>
|
||||||
|
|
||||||
Restore support for dwp v2 DWARF package file format.
|
Restore support for dwp v2 DWARF package file format.
|
||||||
|
|
|
@ -1704,6 +1704,28 @@ Sized_relobj_file<size, big_endian>::do_layout(Symbol_table* symtab,
|
||||||
if (!is_pass_two)
|
if (!is_pass_two)
|
||||||
layout->layout_gnu_stack(seen_gnu_stack, gnu_stack_flags, this);
|
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
|
// When doing a relocatable link handle the reloc sections at the
|
||||||
// end. Garbage collection and Identical Code Folding is not
|
// end. Garbage collection and Identical Code Folding is not
|
||||||
// turned on for relocatable code.
|
// 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;
|
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
|
// When building a .gdb_index section, scan the .debug_info and
|
||||||
// .debug_types sections.
|
// .debug_types sections.
|
||||||
gold_assert(!is_pass_one
|
gold_assert(!is_pass_one
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue