cat > ./a.s <<eof .symver foo, foo@v1 .globl foo foo: eof cat > ./ver <<eof v1 {}; v2 { foo; }; eof # Note that v2 { foo; } is ignored. ld/ld-new -shared --version-script=ver a.o -o a.so .dynsym has foo@v1. This is error-prone and it'd be nice to report a warning. (The gold output has both foo@v1 and foo@@v2. You might call it a bug because you consider GNU ld the standard, but I'll insist that it's the design flaw of the assembler @ syntax. Linkers wouldn't need indirection complexity or combining version complexity if the ",remove" semantics were used in the beginning.)