PR gold/20462: Fix bogus layout on ARM with linker script using PHDRS clause
gold/ PR gold/20462 * script-sections.cc (Script_sections::release_segments): Reset this->segments_created_.
This commit is contained in:
parent
f300578f78
commit
3785f51aa2
2 changed files with 27 additions and 20 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2016-08-12 Roland McGrath <roland@hack.frob.com>
|
||||||
|
|
||||||
|
PR gold/20462
|
||||||
|
* script-sections.cc (Script_sections::release_segments):
|
||||||
|
Reset this->segments_created_.
|
||||||
|
|
||||||
2016-08-12 Roland McGrath <roland@hack.frob.com>
|
2016-08-12 Roland McGrath <roland@hack.frob.com>
|
||||||
|
|
||||||
* yyscript.y (HIDDEN): New %token.
|
* yyscript.y (HIDDEN): New %token.
|
||||||
|
|
|
@ -244,10 +244,10 @@ Memory_region::attributes_compatible(elfcpp::Elf_Xword flags,
|
||||||
attrs &= ~ (attrs & - attrs);
|
attrs &= ~ (attrs & - attrs);
|
||||||
}
|
}
|
||||||
while (attrs != 0);
|
while (attrs != 0);
|
||||||
|
|
||||||
return match;
|
return match;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print a memory region.
|
// Print a memory region.
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1503,7 +1503,7 @@ class Input_section_info
|
||||||
private:
|
private:
|
||||||
// Input section, can be a relaxed section.
|
// Input section, can be a relaxed section.
|
||||||
Output_section::Input_section input_section_;
|
Output_section::Input_section input_section_;
|
||||||
// Name of the section.
|
// Name of the section.
|
||||||
std::string section_name_;
|
std::string section_name_;
|
||||||
// Section size.
|
// Section size.
|
||||||
uint64_t size_;
|
uint64_t size_;
|
||||||
|
@ -1545,7 +1545,7 @@ Input_section_sorter::get_init_priority(const char* name)
|
||||||
// GCC uses the following section names for the init_priority
|
// GCC uses the following section names for the init_priority
|
||||||
// attribute with numerical values 101 and 65535 inclusive. A
|
// attribute with numerical values 101 and 65535 inclusive. A
|
||||||
// lower value means a higher priority.
|
// lower value means a higher priority.
|
||||||
//
|
//
|
||||||
// 1: .init_array.NNNN/.fini_array.NNNN: Where NNNN is the
|
// 1: .init_array.NNNN/.fini_array.NNNN: Where NNNN is the
|
||||||
// decimal numerical value of the init_priority attribute.
|
// decimal numerical value of the init_priority attribute.
|
||||||
// The order of execution in .init_array is forward and
|
// The order of execution in .init_array is forward and
|
||||||
|
@ -1666,7 +1666,7 @@ Output_section_element_input::set_section_addresses(
|
||||||
while (p != input_sections->end())
|
while (p != input_sections->end())
|
||||||
{
|
{
|
||||||
Relobj* relobj = p->relobj();
|
Relobj* relobj = p->relobj();
|
||||||
unsigned int shndx = p->shndx();
|
unsigned int shndx = p->shndx();
|
||||||
Input_section_info isi(*p);
|
Input_section_info isi(*p);
|
||||||
|
|
||||||
// Calling section_name and section_addralign is not very
|
// Calling section_name and section_addralign is not very
|
||||||
|
@ -1758,7 +1758,7 @@ Output_section_element_input::set_section_addresses(
|
||||||
|
|
||||||
uint64_t this_subalign = sis.addralign();
|
uint64_t this_subalign = sis.addralign();
|
||||||
if (!sis.is_input_section())
|
if (!sis.is_input_section())
|
||||||
sis.output_section_data()->finalize_data_size();
|
sis.output_section_data()->finalize_data_size();
|
||||||
uint64_t data_size = sis.data_size();
|
uint64_t data_size = sis.data_size();
|
||||||
if (this_subalign < subalign)
|
if (this_subalign < subalign)
|
||||||
{
|
{
|
||||||
|
@ -2029,7 +2029,7 @@ class Output_section_definition : public Sections_element
|
||||||
void
|
void
|
||||||
set_section_vma(Expression* address)
|
set_section_vma(Expression* address)
|
||||||
{ this->address_ = address; }
|
{ this->address_ = address; }
|
||||||
|
|
||||||
void
|
void
|
||||||
set_section_lma(Expression* address)
|
set_section_lma(Expression* address)
|
||||||
{ this->load_address_ = address; }
|
{ this->load_address_ = address; }
|
||||||
|
@ -2037,7 +2037,7 @@ class Output_section_definition : public Sections_element
|
||||||
const std::string&
|
const std::string&
|
||||||
get_section_name() const
|
get_section_name() const
|
||||||
{ return this->name_; }
|
{ return this->name_; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static const char*
|
static const char*
|
||||||
script_section_type_name(Script_section_type);
|
script_section_type_name(Script_section_type);
|
||||||
|
@ -2402,9 +2402,9 @@ Output_section_definition::set_section_addresses(Symbol_table* symtab,
|
||||||
uint64_t old_load_address = *load_address;
|
uint64_t old_load_address = *load_address;
|
||||||
|
|
||||||
// If input section sorting is requested via --section-ordering-file or
|
// If input section sorting is requested via --section-ordering-file or
|
||||||
// linker plugins, then do it here. This is important because we want
|
// linker plugins, then do it here. This is important because we want
|
||||||
// any sorting specified in the linker scripts, which will be done after
|
// any sorting specified in the linker scripts, which will be done after
|
||||||
// this, to take precedence. The final order of input sections is then
|
// this, to take precedence. The final order of input sections is then
|
||||||
// guaranteed to be according to the linker script specification.
|
// guaranteed to be according to the linker script specification.
|
||||||
if (this->output_section_ != NULL
|
if (this->output_section_ != NULL
|
||||||
&& this->output_section_->input_section_order_specified())
|
&& this->output_section_->input_section_order_specified())
|
||||||
|
@ -2495,7 +2495,7 @@ Output_section_definition::set_section_addresses(Symbol_table* symtab,
|
||||||
// The LMA address was explicitly set to the given region.
|
// The LMA address was explicitly set to the given region.
|
||||||
laddr = lma_region->get_current_address()->eval(symtab, layout,
|
laddr = lma_region->get_current_address()->eval(symtab, layout,
|
||||||
false);
|
false);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// We are not going to use the discovered lma_region, so
|
// We are not going to use the discovered lma_region, so
|
||||||
// make sure that we do not update it in the code below.
|
// make sure that we do not update it in the code below.
|
||||||
|
@ -2987,9 +2987,9 @@ Orphan_output_section::set_section_addresses(Symbol_table*, Layout*,
|
||||||
address = align_address(address, this->os_->addralign());
|
address = align_address(address, this->os_->addralign());
|
||||||
|
|
||||||
// If input section sorting is requested via --section-ordering-file or
|
// If input section sorting is requested via --section-ordering-file or
|
||||||
// linker plugins, then do it here. This is important because we want
|
// linker plugins, then do it here. This is important because we want
|
||||||
// any sorting specified in the linker scripts, which will be done after
|
// any sorting specified in the linker scripts, which will be done after
|
||||||
// this, to take precedence. The final order of input sections is then
|
// this, to take precedence. The final order of input sections is then
|
||||||
// guaranteed to be according to the linker script specification.
|
// guaranteed to be according to the linker script specification.
|
||||||
if (this->os_ != NULL
|
if (this->os_ != NULL
|
||||||
&& this->os_->input_section_order_specified())
|
&& this->os_->input_section_order_specified())
|
||||||
|
@ -3023,7 +3023,7 @@ Orphan_output_section::set_section_addresses(Symbol_table*, Layout*,
|
||||||
{
|
{
|
||||||
uint64_t addralign = p->addralign();
|
uint64_t addralign = p->addralign();
|
||||||
if (!p->is_input_section())
|
if (!p->is_input_section())
|
||||||
p->output_section_data()->finalize_data_size();
|
p->output_section_data()->finalize_data_size();
|
||||||
uint64_t size = p->data_size();
|
uint64_t size = p->data_size();
|
||||||
address = align_address(address, addralign);
|
address = align_address(address, addralign);
|
||||||
this->os_->add_script_input_section(*p);
|
this->os_->add_script_input_section(*p);
|
||||||
|
@ -3605,7 +3605,7 @@ Output_segment*
|
||||||
Script_sections::set_section_addresses(Symbol_table* symtab, Layout* layout)
|
Script_sections::set_section_addresses(Symbol_table* symtab, Layout* layout)
|
||||||
{
|
{
|
||||||
gold_assert(this->saw_sections_clause_);
|
gold_assert(this->saw_sections_clause_);
|
||||||
|
|
||||||
// Implement ONLY_IF_RO/ONLY_IF_RW constraints. These are a pain
|
// Implement ONLY_IF_RO/ONLY_IF_RW constraints. These are a pain
|
||||||
// for our representation.
|
// for our representation.
|
||||||
for (Sections_elements::iterator p = this->sections_elements_->begin();
|
for (Sections_elements::iterator p = this->sections_elements_->begin();
|
||||||
|
@ -3674,7 +3674,7 @@ Script_sections::set_section_addresses(Symbol_table* symtab, Layout* layout)
|
||||||
Output_section* os = (*p)->get_output_section();
|
Output_section* os = (*p)->get_output_section();
|
||||||
|
|
||||||
// Handle -Ttext, -Tdata and -Tbss options. We do this by looking for
|
// Handle -Ttext, -Tdata and -Tbss options. We do this by looking for
|
||||||
// the special sections by names and doing dot assignments.
|
// the special sections by names and doing dot assignments.
|
||||||
if (use_tsection_options
|
if (use_tsection_options
|
||||||
&& os != NULL
|
&& os != NULL
|
||||||
&& (os->flags() & elfcpp::SHF_ALLOC) != 0)
|
&& (os->flags() & elfcpp::SHF_ALLOC) != 0)
|
||||||
|
@ -3703,7 +3703,7 @@ Script_sections::set_section_addresses(Symbol_table* symtab, Layout* layout)
|
||||||
|
|
||||||
(*p)->set_section_addresses(symtab, layout, &dot_value, &dot_alignment,
|
(*p)->set_section_addresses(symtab, layout, &dot_value, &dot_alignment,
|
||||||
&load_address);
|
&load_address);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->phdrs_elements_ != NULL)
|
if (this->phdrs_elements_ != NULL)
|
||||||
{
|
{
|
||||||
|
@ -3890,7 +3890,7 @@ Script_sections::create_segments(Layout* layout, uint64_t dot_alignment)
|
||||||
layout->get_allocated_sections(§ions);
|
layout->get_allocated_sections(§ions);
|
||||||
|
|
||||||
// Sort the sections by address.
|
// Sort the sections by address.
|
||||||
std::stable_sort(sections.begin(), sections.end(),
|
std::stable_sort(sections.begin(), sections.end(),
|
||||||
Sort_output_sections(this->sections_elements_));
|
Sort_output_sections(this->sections_elements_));
|
||||||
|
|
||||||
this->create_note_and_tls_segments(layout, §ions);
|
this->create_note_and_tls_segments(layout, §ions);
|
||||||
|
@ -4217,7 +4217,7 @@ Script_sections::attach_sections_using_phdrs_clause(Layout* layout)
|
||||||
// Output sections in the script which do not list segments are
|
// Output sections in the script which do not list segments are
|
||||||
// attached to the same set of segments as the immediately preceding
|
// attached to the same set of segments as the immediately preceding
|
||||||
// output section.
|
// output section.
|
||||||
|
|
||||||
String_list* phdr_names = NULL;
|
String_list* phdr_names = NULL;
|
||||||
bool load_segments_only = false;
|
bool load_segments_only = false;
|
||||||
for (Sections_elements::const_iterator p = this->sections_elements_->begin();
|
for (Sections_elements::const_iterator p = this->sections_elements_->begin();
|
||||||
|
@ -4262,7 +4262,7 @@ Script_sections::attach_sections_using_phdrs_clause(Layout* layout)
|
||||||
// filtering.
|
// filtering.
|
||||||
if (old_phdr_names != phdr_names)
|
if (old_phdr_names != phdr_names)
|
||||||
load_segments_only = false;
|
load_segments_only = false;
|
||||||
|
|
||||||
// If this is an orphan section--one that was not explicitly
|
// If this is an orphan section--one that was not explicitly
|
||||||
// mentioned in the linker script--then it should not inherit
|
// mentioned in the linker script--then it should not inherit
|
||||||
// any segment type other than PT_LOAD. Otherwise, e.g., the
|
// any segment type other than PT_LOAD. Otherwise, e.g., the
|
||||||
|
@ -4459,6 +4459,7 @@ Script_sections::release_segments()
|
||||||
++p)
|
++p)
|
||||||
(*p)->release_segment();
|
(*p)->release_segment();
|
||||||
}
|
}
|
||||||
|
this->segments_created_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print the SECTIONS clause to F for debugging.
|
// Print the SECTIONS clause to F for debugging.
|
||||||
|
|
Loading…
Reference in a new issue