[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