X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gold%2Fscript-sections.cc;h=37f729f7588718fc33944c6870da3a243ba93014;hb=2daf894ed0baf72dd3f422b7a71630145568db30;hp=90ec8d4a504d873e10b9165ea3f5c104d57981f9;hpb=bfbf34de2f27672282d4fa4c0916cc41890dcc6c;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/script-sections.cc b/gold/script-sections.cc index 90ec8d4a50..37f729f758 100644 --- a/gold/script-sections.cc +++ b/gold/script-sections.cc @@ -1,6 +1,6 @@ // script-sections.cc -- linker script SECTIONS for gold -// Copyright (C) 2008-2016 Free Software Foundation, Inc. +// Copyright (C) 2008-2019 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -632,7 +632,7 @@ class Sections_element // Output_section_definition. virtual const char* output_section_name(const char*, const char*, Output_section***, - Script_sections::Section_type*, bool*) + Script_sections::Section_type*, bool*, bool) { return NULL; } // Initialize OSP with an output section. @@ -2003,7 +2003,7 @@ class Output_section_definition : public Sections_element const char* output_section_name(const char* file_name, const char* section_name, Output_section***, Script_sections::Section_type*, - bool*); + bool*, bool); // Initialize OSP with an output section. void @@ -2289,11 +2289,12 @@ Output_section_definition::output_section_name( const char* section_name, Output_section*** slot, Script_sections::Section_type* psection_type, - bool* keep) + bool* keep, + bool match_input_spec) { - // If the input section is linker-created, just look for a match + // If the section is a linker-created output section, just look for a match // on the output section name. - if (file_name == NULL && this->name_ != "/DISCARD/") + if (!match_input_spec && this->name_ != "/DISCARD/") { if (this->name_ != section_name) return NULL; @@ -3568,7 +3569,8 @@ Script_sections::output_section_name( const char* section_name, Output_section*** output_section_slot, Script_sections::Section_type* psection_type, - bool* keep) + bool* keep, + bool is_input_section) { for (Sections_elements::const_iterator p = this->sections_elements_->begin(); p != this->sections_elements_->end(); @@ -3576,7 +3578,8 @@ Script_sections::output_section_name( { const char* ret = (*p)->output_section_name(file_name, section_name, output_section_slot, - psection_type, keep); + psection_type, keep, + is_input_section); if (ret != NULL) { @@ -3592,13 +3595,37 @@ Script_sections::output_section_name( } } - // If we couldn't find a mapping for the name, the output section - // gets the name of the input section. - + // We have an orphan section. *output_section_slot = NULL; *psection_type = Script_sections::ST_NONE; *keep = false; + General_options::Orphan_handling orphan_handling = + parameters->options().orphan_handling_enum(); + if (orphan_handling == General_options::ORPHAN_DISCARD) + return NULL; + if (orphan_handling == General_options::ORPHAN_ERROR) + { + if (file_name == NULL) + gold_error(_("unplaced orphan section '%s'"), section_name); + else + gold_error(_("unplaced orphan section '%s' from '%s'"), + section_name, file_name); + return NULL; + } + if (orphan_handling == General_options::ORPHAN_WARN) + { + if (file_name == NULL) + gold_warning(_("orphan section '%s' is being placed in section '%s'"), + section_name, section_name); + else + gold_warning(_("orphan section '%s' from '%s' is being placed " + "in section '%s'"), + section_name, file_name, section_name); + } + + // If we couldn't find a mapping for the name, the output section + // gets the name of the input section. return section_name; }