* script.cc (read_input_script): If we see a new SECTIONS clause,
	and we have added an input section, give an error.
	* layout.h (class Layout): Add have_added_input_section function.
	Add have_added_input_section_ field.
	* layout.cc (Layout::Layout): Initialize
	have_added_input_section_.
	(Layout::layout): Set have_added_input_section_.
	(Layout::layout_eh_frame): Likewise.
This commit is contained in:
Ian Lance Taylor 2009-12-31 03:48:46 +00:00
parent fc59c57250
commit d7bb574500
4 changed files with 31 additions and 0 deletions

View File

@ -1,3 +1,15 @@
2009-12-30 Ian Lance Taylor <iant@google.com>
PR 10979
* script.cc (read_input_script): If we see a new SECTIONS clause,
and we have added an input section, give an error.
* layout.h (class Layout): Add have_added_input_section function.
Add have_added_input_section_ field.
* layout.cc (Layout::Layout): Initialize
have_added_input_section_.
(Layout::layout): Set have_added_input_section_.
(Layout::layout_eh_frame): Likewise.
2009-12-30 Ian Lance Taylor <iant@google.com> 2009-12-30 Ian Lance Taylor <iant@google.com>
PR 10931 PR 10931

View File

@ -192,6 +192,7 @@ Layout::Layout(int number_of_input_files, Script_options* script_options)
debug_info_(NULL), debug_info_(NULL),
group_signatures_(), group_signatures_(),
output_file_size_(-1), output_file_size_(-1),
have_added_input_section_(false),
sections_are_attached_(false), sections_are_attached_(false),
input_requires_executable_stack_(false), input_requires_executable_stack_(false),
input_with_gnu_stack_note_(false), input_with_gnu_stack_note_(false),
@ -610,6 +611,7 @@ Layout::layout(Sized_relobj<size, big_endian>* object, unsigned int shndx,
*off = os->add_input_section(object, shndx, name, shdr, reloc_shndx, *off = os->add_input_section(object, shndx, name, shdr, reloc_shndx,
this->script_options_->saw_sections_clause()); this->script_options_->saw_sections_clause());
this->have_added_input_section_ = true;
return os; return os;
} }
@ -818,6 +820,7 @@ Layout::layout_eh_frame(Sized_relobj<size, big_endian>* object,
bool saw_sections_clause = this->script_options_->saw_sections_clause(); bool saw_sections_clause = this->script_options_->saw_sections_clause();
*off = os->add_input_section(object, shndx, name, shdr, reloc_shndx, *off = os->add_input_section(object, shndx, name, shdr, reloc_shndx,
saw_sections_clause); saw_sections_clause);
this->have_added_input_section_ = true;
} }
return os; return os;

View File

@ -433,6 +433,11 @@ class Layout
is_linkonce(const char* name) is_linkonce(const char* name)
{ return strncmp(name, ".gnu.linkonce", sizeof(".gnu.linkonce") - 1) == 0; } { return strncmp(name, ".gnu.linkonce", sizeof(".gnu.linkonce") - 1) == 0; }
// Whether we have added an input section.
bool
have_added_input_section() const
{ return this->have_added_input_section_; }
// Return true if a section is a debugging section. // Return true if a section is a debugging section.
static inline bool static inline bool
is_debug_info_section(const char* name) is_debug_info_section(const char* name)
@ -990,6 +995,8 @@ class Layout
Group_signatures group_signatures_; Group_signatures group_signatures_;
// The size of the output file. // The size of the output file.
off_t output_file_size_; off_t output_file_size_;
// Whether we have added an input section to an output section.
bool have_added_input_section_;
// Whether we have attached the sections to the segments. // Whether we have attached the sections to the segments.
bool sections_are_attached_; bool sections_are_attached_;
// Whether we have seen an object file marked to require an // Whether we have seen an object file marked to require an

View File

@ -1398,6 +1398,9 @@ read_input_script(Workqueue* workqueue, Symbol_table* symtab, Layout* layout,
&lex, &lex,
input_file->will_search_for()); input_file->will_search_for());
bool old_saw_sections_clause =
layout->script_options()->saw_sections_clause();
if (yyparse(&closure) != 0) if (yyparse(&closure) != 0)
{ {
if (closure.found_incompatible_target()) if (closure.found_incompatible_target())
@ -1411,6 +1414,12 @@ read_input_script(Workqueue* workqueue, Symbol_table* symtab, Layout* layout,
return false; return false;
} }
if (!old_saw_sections_clause
&& layout->script_options()->saw_sections_clause()
&& layout->have_added_input_section())
gold_error(_("%s: SECTIONS seen after other input files; try -T/--script"),
input_file->filename().c_str());
if (!closure.saw_inputs()) if (!closure.saw_inputs())
return true; return true;