[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