[binutils-gdb] gas: Check @@@ before renaming the versioned symbol

H.J. Lu hjl@sourceware.org
Mon Jan 12 23:22:42 GMT 2026


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=35a56991b31fa913ec7a611eddeb6ed702e1547e

commit 35a56991b31fa913ec7a611eddeb6ed702e1547e
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Mon Jan 12 06:55:34 2026 +0800

    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 <hjl.tools@gmail.com>

Diff:
---
 gas/config/obj-elf.c                | 5 ++++-
 gas/testsuite/gas/symver/symver.exp | 1 +
 gas/testsuite/gas/symver/symver17.l | 2 ++
 gas/testsuite/gas/symver/symver17.s | 2 ++
 4 files changed, 9 insertions(+), 1 deletion(-)

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


More information about the Binutils-cvs mailing list