[PATCH] ld: entry size and merge/strings attributes propagation

H.J. Lu hjl.tools@gmail.com
Tue Aug 26 19:03:00 GMT 2025


On Tue, Aug 19, 2025 at 1:36 AM Jan Beulich <jbeulich@suse.com> wrote:
>
> PR ld/33291
>
> As indicated in other recent commits, the three properties can be
> largely independent (ELF generally being the target here): Entry size
> doesn't require either of merge/strings, and strings also doesn't
> require merge. Commit 98e6d3f5bd4e ("gas/ELF: allow specifying entity
> size for arbitrary sections") uncovered issues with ld's handling.
>
> Zap entry size when it doesn't match between input sections. In that
> case SEC_MERGE and SEC_STRINGS also need to be removed, as their
> underlying granularity is lost. Then deal with SEC_MERGE and
> SEC_STRINGS separately.
>
> Otoh record entry size from the first input independent of SEC_MERGE.
> ---
> The handling of the three attributes still isn't correct when it comes
> to data allocation statements within the section, or position changes
> (including alignment other than at the start): These would all need to
> clear entry size (for not coming with an entry size themselves), and
> hence also SEC_MERGE and SEC_STRINGS.
>
> --- a/ld/ldlang.c
> +++ b/ld/ldlang.c
> @@ -2857,14 +2857,24 @@ lang_add_section (lang_statement_list_ty
>        /* Only set SEC_READONLY flag on the first input section.  */
>        flags &= ~ SEC_READONLY;
>
> -      /* Keep SEC_MERGE and SEC_STRINGS only if they are the same.  */
> -      if ((output->bfd_section->flags & (SEC_MERGE | SEC_STRINGS))
> -         != (flags & (SEC_MERGE | SEC_STRINGS))
> -         || ((flags & SEC_MERGE) != 0
> -             && output->bfd_section->entsize != section->entsize))
> +      /* Keep entry size, SEC_MERGE, and SEC_STRINGS only if entry sizes are
> +        the same.  */
> +      if (output->bfd_section->entsize != section->entsize)
>         {
> -         output->bfd_section->flags &= ~ (SEC_MERGE | SEC_STRINGS);
> -         flags &= ~ (SEC_MERGE | SEC_STRINGS);
> +         output->bfd_section->entsize = 0;
> +         flags &= ~(SEC_MERGE | SEC_STRINGS);
> +       }
> +
> +      /* Keep SEC_MERGE and SEC_STRINGS (each) only if they are the same.  */
> +      if ((output->bfd_section->flags ^ flags) & SEC_MERGE)
> +       {
> +         output->bfd_section->flags &= ~SEC_MERGE;
> +         flags &= ~SEC_MERGE;
> +       }
> +      if ((output->bfd_section->flags ^ flags) & SEC_STRINGS)
> +       {
> +         output->bfd_section->flags &= ~SEC_STRINGS;
> +         flags &= ~SEC_STRINGS;
>         }
>      }
>    output->bfd_section->flags |= flags;
> @@ -2879,8 +2889,7 @@ lang_add_section (lang_statement_list_ty
>                                      link_info.output_bfd,
>                                      output->bfd_section,
>                                      &link_info);
> -      if ((flags & SEC_MERGE) != 0)
> -       output->bfd_section->entsize = section->entsize;
> +      output->bfd_section->entsize = section->entsize;
>      }
>
>    if ((flags & SEC_TIC54X_BLOCK) != 0

Tests are missing to verify that the patch is needed and does the correct
things.

-- 
H.J.


More information about the Binutils mailing list