From: Ian Lance Taylor Date: Fri, 16 Oct 2009 05:19:07 +0000 (+0000) Subject: * script.cc (Script_options::add_symbol_assignment): Always add a X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=12edd763cc3b83a257eb3173caca075f027e9afa;p=binutils-gdb.git * 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. --- diff --git a/gold/ChangeLog b/gold/ChangeLog index ea864a75746..cb3254933cd 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,5 +1,10 @@ 2009-10-15 Ian Lance Taylor + * 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 program headers with no load segment if there is a linker script. diff --git a/gold/script-sections.cc b/gold/script-sections.cc index 7ecf1424dd4..a541e9aa13e 100644 --- a/gold/script-sections.cc +++ b/gold/script-sections.cc @@ -2540,6 +2540,15 @@ Script_sections::add_dot_assignment(Expression* val) this->output_section_->add_dot_assignment(val); 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); this->sections_elements_->push_back(p); } diff --git a/gold/script.cc b/gold/script.cc index de6f4fcff16..d0ffe41a615 100644 --- a/gold/script.cc +++ b/gold/script.cc @@ -1,6 +1,6 @@ // 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 . // This file is part of gold. @@ -1070,10 +1070,11 @@ Script_options::add_symbol_assignment(const char* name, size_t length, { if (provide || hidden) 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")); - else - this->script_sections_.add_dot_assignment(value); + + // The GNU linker permits assignments to dot outside of SECTIONS + // clauses and treats them as occurring inside, so we don't + // check in_sections_clause here. + this->script_sections_.add_dot_assignment(value); } }