[PATCH] gas: elf: Relax rules for SHF_STRING sections
Alan Modra
amodra@gmail.com
Sat Jan 18 09:37:55 GMT 2025
On Fri, Jan 17, 2025 at 03:25:19PM +0000, Richard Earnshaw wrote:
> Commit af3394d97a8c5187085c0eec5fb03e8da88db5fb allowed sections
> declared with "S" (SHF_STRING) to specify the entity size, but then
> would warn if the entity size was omitted, as with the old syntax.
>
> Unfortunately, since specifying the entity size is incompatible with
> binutils 2.43 or earlier, this makes it impossible to specify a
> strings section in source code without generating an assembly warning
> (the new syntax isn't supported in older assemblers and the old syntax
> generates warnings).
>
> Nevertheless, the old code was wrong in that it did not set the entity
> size at all, in contravention of the ELF specification (though to date
> there are no known cases where this mattered outside of mergeable
> sections).
>
> Fix this by permitting the original syntax without a warning again,
> but by defaulting the entity size to 1. This is compatible with the
> most common case of strings being byte-based.
I think backward compatibility matters, and this change doesn't negate
Jan's fix for bad entsize, but rather allows a reasonable default.
> --- /dev/null
> +++ b/gas/testsuite/gas/elf/string.d
> @@ -0,0 +1,9 @@
> +#readelf: -S
You'll need -W or --wide here.
I also think we should do something about backwards compatibilty for
the ARM compiler configure bug, so that people can build released
versions of gcc. This is what I have in mind, simpler than the patch
Thiago submitted.
diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c
index 6670b9add0f..b3b2025938b 100644
--- a/gas/config/obj-elf.c
+++ b/gas/config/obj-elf.c
@@ -1324,13 +1324,27 @@ obj_elf_section (int push)
&& (bfd_section_flags (now_seg)
& (SEC_MERGE | SEC_STRINGS)) != 0)
goto fetch_entsize;
- entsize = get_absolute_expression ();
- SKIP_WHITESPACE ();
- if (entsize <= 0)
+ if (is_end_of_line[(unsigned char) *input_line_pointer])
+ {
+ /* ??? This is here for older versions of gcc that
+ test for gas string merge support with
+ '.section .rodata.str, "aMS", @progbits, 1'
+ Unfortunately '@' begins a comment on arm.
+ This isn't as_warn because gcc tests with
+ --fatal-warnings. */
+ as_tsktsk (_("missing merge / string entity size, 1 assumed"));
+ entsize = 1;
+ }
+ else
{
- as_warn (_("invalid merge / string entity size"));
- attr &= ~(SHF_MERGE | SHF_STRINGS);
- entsize = 0;
+ entsize = get_absolute_expression ();
+ SKIP_WHITESPACE ();
+ if (entsize <= 0)
+ {
+ as_warn (_("invalid merge / string entity size"));
+ attr &= ~(SHF_MERGE | SHF_STRINGS);
+ entsize = 0;
+ }
}
}
else if ((attr & (SHF_MERGE | SHF_STRINGS)) != 0 && inherit
--
Alan Modra
More information about the Binutils
mailing list