]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gas: Check @@@ before renaming the versioned symbol
authorH.J. Lu <hjl.tools@gmail.com>
Sun, 11 Jan 2026 22:55:34 +0000 (06:55 +0800)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 12 Jan 2026 23:22:28 +0000 (07:22 +0800)
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>
gas/config/obj-elf.c
gas/testsuite/gas/symver/symver.exp
gas/testsuite/gas/symver/symver17.l [new file with mode: 0644]
gas/testsuite/gas/symver/symver17.s [new file with mode: 0644]

index 579c1df2dc30da39d20b187b6d3f12e0d7d78b8f..ef338913893eb92fab2c4b7fcece1eb631f5b9ba 100644 (file)
@@ -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
index 34b11cc39eb03fba5d85643c9425e8d08c7fa387..6ec6979f5dc49bc59b9e3efca3f680a78064b6f9 100644 (file)
@@ -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 (file)
index 0000000..98233ee
--- /dev/null
@@ -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 (file)
index 0000000..99f51e7
--- /dev/null
@@ -0,0 +1,2 @@
+       .symver foo,foo@@@version1
+       .symver foo,foo@version2