* script.cc (Script_options::add_symbol_assignment): Always add a

dot assginment to script_sections_.
	* script-sections.cc (Script_sections::add_dot_assignment):
	Initialize if necessary.
This commit is contained in:
Ian Lance Taylor 2009-10-16 05:19:07 +00:00
parent 68b6574b4d
commit 12edd763cc
3 changed files with 20 additions and 5 deletions

View File

@ -1,5 +1,10 @@
2009-10-15 Ian Lance Taylor <iant@google.com> 2009-10-15 Ian Lance Taylor <iant@google.com>
* script.cc (Script_options::add_symbol_assignment): Always add a
dot assginment to script_sections_.
* script-sections.cc (Script_sections::add_dot_assignment):
Initialize if necessary.
* layout.cc (Layout::relaxation_loop_body): Don't crash if we see * layout.cc (Layout::relaxation_loop_body): Don't crash if we see
program headers with no load segment if there is a linker script. program headers with no load segment if there is a linker script.

View File

@ -2540,6 +2540,15 @@ Script_sections::add_dot_assignment(Expression* val)
this->output_section_->add_dot_assignment(val); this->output_section_->add_dot_assignment(val);
else else
{ {
// The GNU linker permits assignments to . to appears outside of
// a SECTIONS clause, and treats it as appearing inside, so
// sections_elements_ may be NULL here.
if (this->sections_elements_ == NULL)
{
this->sections_elements_ = new Sections_elements;
this->saw_sections_clause_ = true;
}
Sections_element* p = new Sections_element_dot_assignment(val); Sections_element* p = new Sections_element_dot_assignment(val);
this->sections_elements_->push_back(p); this->sections_elements_->push_back(p);
} }

View File

@ -1,6 +1,6 @@
// script.cc -- handle linker scripts for gold. // script.cc -- handle linker scripts for gold.
// Copyright 2006, 2007, 2008 Free Software Foundation, Inc. // Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>. // Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold. // This file is part of gold.
@ -1070,10 +1070,11 @@ Script_options::add_symbol_assignment(const char* name, size_t length,
{ {
if (provide || hidden) if (provide || hidden)
gold_error(_("invalid use of PROVIDE for dot symbol")); gold_error(_("invalid use of PROVIDE for dot symbol"));
if (!this->script_sections_.in_sections_clause())
gold_error(_("invalid assignment to dot outside of SECTIONS")); // The GNU linker permits assignments to dot outside of SECTIONS
else // clauses and treats them as occurring inside, so we don't
this->script_sections_.add_dot_assignment(value); // check in_sections_clause here.
this->script_sections_.add_dot_assignment(value);
} }
} }