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

H.J. Lu hjl.tools@gmail.com
Fri Jun 28 17:27:00 GMT 2019


On Fri, Jun 28, 2019 at 10:16 AM Cary Coutant <ccoutant@gmail.com> wrote:
>
> > 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;
>

This should work.


-- 
H.J.



More information about the Binutils mailing list