From: H.J. Lu Date: Sun, 11 Jan 2026 22:55:34 +0000 (+0800) Subject: gas: Check @@@ before renaming the versioned symbol X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=35a56991b31fa913ec7a611eddeb6ed702e1547e;p=thirdparty%2Fbinutils-gdb.git gas: Check @@@ before renaming the versioned symbol The versioned symbol with the @@@ syntax is a special case. If the symbol is not defined, 2 `@'s will be removed from the versioned_name. Otherwise, 1 `@' will be removed. But for malformed versioned symbols may not have @@@: .symver foo,foo@@@version1 .symver foo,foo@version2 Check @@@ before renaming the versioned symbol. PR gas/33745 * config/obj-elf.c (elf_frob_file_before_adjust): Check @@@ before renaming the versioned symbol. * testsuite/gas/symver/symver.exp: Run symver17. * testsuite/gas/symver/symver17.l: New file. * testsuite/gas/symver/symver17.s: Likewise. Signed-off-by: H.J. Lu --- diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c index 579c1df2dc3..ef338913893 100644 --- a/gas/config/obj-elf.c +++ b/gas/config/obj-elf.c @@ -2827,7 +2827,10 @@ elf_frob_file_before_adjust (void) char *p = strchr (sy_obj->versioned_name->name, ELF_VER_CHR); - if (sy_obj->rename) + /* NB: Malformed versioned symbols may not have @@@. */ + if (sy_obj->rename + && p[1] == ELF_VER_CHR + && p[2] == ELF_VER_CHR) { /* The @@@ syntax is a special case. If the symbol is not defined, 2 `@'s will be removed from the diff --git a/gas/testsuite/gas/symver/symver.exp b/gas/testsuite/gas/symver/symver.exp index 34b11cc39eb..6ec6979f5dc 100644 --- a/gas/testsuite/gas/symver/symver.exp +++ b/gas/testsuite/gas/symver/symver.exp @@ -63,4 +63,5 @@ if { [is_elf_format] } then { # run_error_test "symver5" "" run_error_test "symver14" "" run_error_test "symver15" "" + run_error_test "symver17" "" } diff --git a/gas/testsuite/gas/symver/symver17.l b/gas/testsuite/gas/symver/symver17.l new file mode 100644 index 00000000000..98233eebb2a --- /dev/null +++ b/gas/testsuite/gas/symver/symver17.l @@ -0,0 +1,2 @@ +.*: Assembler messages: +.*: Error: multiple versions \[`foo@version2'\|`foo@@@version1'\] for symbol `foo' diff --git a/gas/testsuite/gas/symver/symver17.s b/gas/testsuite/gas/symver/symver17.s new file mode 100644 index 00000000000..99f51e711c6 --- /dev/null +++ b/gas/testsuite/gas/symver/symver17.s @@ -0,0 +1,2 @@ + .symver foo,foo@@@version1 + .symver foo,foo@version2