2010-09-08 Rafael Espindola <espindola@google.com>
* arm.cc (do_finalize_sections): Create the __exidx_start and __exdix_end symbols even when the section is missing.
This commit is contained in:
parent
9bd89d67b6
commit
731ca54a85
|
@ -1,3 +1,8 @@
|
||||||
|
2010-09-08 Rafael Espindola <espindola@google.com>
|
||||||
|
|
||||||
|
* arm.cc (do_finalize_sections): Create the __exidx_start and
|
||||||
|
__exdix_end symbols even when the section is missing.
|
||||||
|
|
||||||
2010-09-08 Nick Clifton <nickc@redhat.com>
|
2010-09-08 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
* README: Remove claim that MEMORY is not supported.
|
* README: Remove claim that MEMORY is not supported.
|
||||||
|
|
69
gold/arm.cc
69
gold/arm.cc
|
@ -8426,33 +8426,50 @@ Target_arm<big_endian>::do_finalize_sections(
|
||||||
|
|
||||||
// Handle the .ARM.exidx section.
|
// Handle the .ARM.exidx section.
|
||||||
Output_section* exidx_section = layout->find_output_section(".ARM.exidx");
|
Output_section* exidx_section = layout->find_output_section(".ARM.exidx");
|
||||||
if (exidx_section != NULL
|
|
||||||
&& exidx_section->type() == elfcpp::SHT_ARM_EXIDX
|
|
||||||
&& !parameters->options().relocatable())
|
|
||||||
{
|
|
||||||
// Create __exidx_start and __exdix_end symbols.
|
|
||||||
symtab->define_in_output_data("__exidx_start", NULL,
|
|
||||||
Symbol_table::PREDEFINED,
|
|
||||||
exidx_section, 0, 0, elfcpp::STT_OBJECT,
|
|
||||||
elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
|
|
||||||
false, true);
|
|
||||||
symtab->define_in_output_data("__exidx_end", NULL,
|
|
||||||
Symbol_table::PREDEFINED,
|
|
||||||
exidx_section, 0, 0, elfcpp::STT_OBJECT,
|
|
||||||
elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
|
|
||||||
true, true);
|
|
||||||
|
|
||||||
// For the ARM target, we need to add a PT_ARM_EXIDX segment for
|
if (!parameters->options().relocatable())
|
||||||
// the .ARM.exidx section.
|
{
|
||||||
if (!layout->script_options()->saw_phdrs_clause())
|
if (exidx_section != NULL
|
||||||
{
|
&& exidx_section->type() == elfcpp::SHT_ARM_EXIDX)
|
||||||
gold_assert(layout->find_output_segment(elfcpp::PT_ARM_EXIDX, 0, 0)
|
{
|
||||||
== NULL);
|
// Create __exidx_start and __exdix_end symbols.
|
||||||
Output_segment* exidx_segment =
|
symtab->define_in_output_data("__exidx_start", NULL,
|
||||||
layout->make_output_segment(elfcpp::PT_ARM_EXIDX, elfcpp::PF_R);
|
Symbol_table::PREDEFINED,
|
||||||
exidx_segment->add_output_section_to_nonload(exidx_section,
|
exidx_section, 0, 0, elfcpp::STT_OBJECT,
|
||||||
elfcpp::PF_R);
|
elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN,
|
||||||
}
|
0, false, true);
|
||||||
|
symtab->define_in_output_data("__exidx_end", NULL,
|
||||||
|
Symbol_table::PREDEFINED,
|
||||||
|
exidx_section, 0, 0, elfcpp::STT_OBJECT,
|
||||||
|
elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN,
|
||||||
|
0, true, true);
|
||||||
|
|
||||||
|
// For the ARM target, we need to add a PT_ARM_EXIDX segment for
|
||||||
|
// the .ARM.exidx section.
|
||||||
|
if (!layout->script_options()->saw_phdrs_clause())
|
||||||
|
{
|
||||||
|
gold_assert(layout->find_output_segment(elfcpp::PT_ARM_EXIDX, 0,
|
||||||
|
0)
|
||||||
|
== NULL);
|
||||||
|
Output_segment* exidx_segment =
|
||||||
|
layout->make_output_segment(elfcpp::PT_ARM_EXIDX, elfcpp::PF_R);
|
||||||
|
exidx_segment->add_output_section_to_nonload(exidx_section,
|
||||||
|
elfcpp::PF_R);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
symtab->define_as_constant("__exidx_start", NULL,
|
||||||
|
Symbol_table::PREDEFINED,
|
||||||
|
0, 0, elfcpp::STT_OBJECT,
|
||||||
|
elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
|
||||||
|
true, false);
|
||||||
|
symtab->define_as_constant("__exidx_end", NULL,
|
||||||
|
Symbol_table::PREDEFINED,
|
||||||
|
0, 0, elfcpp::STT_OBJECT,
|
||||||
|
elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
|
||||||
|
true, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create an .ARM.attributes section if we have merged any attributes
|
// Create an .ARM.attributes section if we have merged any attributes
|
||||||
|
|
Loading…
Reference in New Issue