Index: lld/trunk/ELF/SymbolTable.cpp =================================================================== --- lld/trunk/ELF/SymbolTable.cpp +++ lld/trunk/ELF/SymbolTable.cpp @@ -531,8 +531,12 @@ size_t I = 2; for (Version &V : Config->SymbolVersions) { for (StringRef Name : V.Globals) - if (SymbolBody *B = find(Name)) + if (SymbolBody *B = find(Name)) { + if (B->symbol()->VersionId != VER_NDX_GLOBAL && + B->symbol()->VersionId != VER_NDX_LOCAL) + error("duplicate symbol " + Name + " in version script"); B->symbol()->VersionId = I; + } ++I; } } Index: lld/trunk/test/ELF/version-script.s =================================================================== --- lld/trunk/test/ELF/version-script.s +++ lld/trunk/test/ELF/version-script.s @@ -47,6 +47,16 @@ # RUN: not ld.lld --version-script %t5.script -shared %t.o %t2.so -o %t5.so 2>&1 | \ # RUN: FileCheck -check-prefix=ERR %s +# RUN: echo "VERSION_1.0{ \ +# RUN: global: foo1; \ +# RUN: local: *; }; \ +# RUN: VERSION_2.0 { \ +# RUN: global: foo1; \ +# RUN: local: *; }; " > %t6.script +# RUN: not ld.lld --version-script %t6.script -shared %t.o %t2.so -o %t6.so 2>&1 | \ +# RUN: FileCheck -check-prefix=ERR2 %s +# ERR2: duplicate symbol foo1 in version script + # RUN: ld.lld --version-script %t.script --dynamic-list %t.list %t.o %t2.so -o %t2 # RUN: llvm-readobj %t2 > /dev/null