[PATCH] gold: Don't combine sections with non-zero/zero flags

Cary Coutant ccoutant@gmail.com
Fri Jun 28 17:16:00 GMT 2019


> Gold shouldn't combine sections with non-zero flags and zero flags.
>
>         PR gold/17556
>         * layout.cc (Layout::get_output_section): Don't combine sections
>         with non-zero flags and zero flags.

Why shouldn't we just remove both parts of this logic? I.e., the
following patch:

diff --git a/gold/layout.cc b/gold/layout.cc
index b83e8e6e2d..5a0d0137ef 100644
--- a/gold/layout.cc
+++ b/gold/layout.cc
@@ -848,40 +848,9 @@ Layout::get_output_section(const char* name,
Stringpool::Key name_key,
   else
     {
       // This is the first time we've seen this name/type/flags
-      // combination.  For compatibility with the GNU linker, we
-      // combine sections with contents and zero flags with sections
-      // with non-zero flags.  This is a workaround for cases where
-      // assembler code forgets to set section flags.  FIXME: Perhaps
-      // there should be an option to control this.
-      Output_section* os = NULL;
-
-      if (lookup_type == elfcpp::SHT_PROGBITS)
-       {
-         if (flags == 0)
-           {
-             Output_section* same_name = this->find_output_section(name);
-             if (same_name != NULL
-                 && (same_name->type() == elfcpp::SHT_PROGBITS
-                     || same_name->type() == elfcpp::SHT_INIT_ARRAY
-                     || same_name->type() == elfcpp::SHT_FINI_ARRAY
-                     || same_name->type() == elfcpp::SHT_PREINIT_ARRAY)
-                 && (same_name->flags() & elfcpp::SHF_TLS) == 0)
-               os = same_name;
-           }
-         else if ((flags & elfcpp::SHF_TLS) == 0)
-           {
-             elfcpp::Elf_Xword zero_flags = 0;
-             const Key zero_key(name_key, std::make_pair(lookup_type,
-                                                         zero_flags));
-             Section_name_map::iterator p =
-                 this->section_name_map_.find(zero_key);
-             if (p != this->section_name_map_.end())
-               os = p->second;
-           }
-       }
-
-      if (os == NULL)
-       os = this->make_output_section(name, type, flags, order, is_relro);
+      // combination.
+      Output_section* os =
+         this->make_output_section(name, type, flags, order, is_relro);

       ins.first->second = os;
       return os;

-cary



More information about the Binutils mailing list