Index: ELF/LinkerScript.cpp =================================================================== --- ELF/LinkerScript.cpp +++ ELF/LinkerScript.cpp @@ -1996,7 +1996,7 @@ continue; } - if (peek() == "}" || peek() == "local" || Error) + if (peek() == "}" || (peek() == "local" && peek(1) == ":") || Error) break; StringRef Tok = next(); Ret.push_back({unquote(Tok), false, hasWildcard(Tok)}); Index: ELF/ScriptParser.h =================================================================== --- ELF/ScriptParser.h +++ ELF/ScriptParser.h @@ -28,7 +28,7 @@ static StringRef skipSpace(StringRef S); bool atEOF(); StringRef next(); - StringRef peek(); + StringRef peek(size_t n = 0); void skip(); bool consume(StringRef Tok); void expect(StringRef Expect); Index: ELF/ScriptParser.cpp =================================================================== --- ELF/ScriptParser.cpp +++ ELF/ScriptParser.cpp @@ -156,11 +156,15 @@ return Tokens[Pos++]; } -StringRef ScriptParserBase::peek() { - StringRef Tok = next(); - if (Error) - return ""; - --Pos; +StringRef ScriptParserBase::peek(size_t n) { + StringRef Tok; + size_t i = 0; + while (i++ <= n) { + Tok = next(); + if (Error) + return ""; + } + Pos -= (n + 1); return Tok; } Index: test/ELF/version-script-glob.s =================================================================== --- test/ELF/version-script-glob.s +++ test/ELF/version-script-glob.s @@ -14,6 +14,9 @@ .globl zed1 zed1: + .globl local +local: + # CHECK: DynamicSymbols [ # CHECK-NEXT: Symbol { # CHECK-NEXT: Name: @@ -43,3 +46,27 @@ # CHECK-NEXT: Section: .text # CHECK-NEXT: } # CHECK-NEXT: ] + +# RUN: echo "{ global : local; local: *; };" > %t1.script +# RUN: ld.lld -shared --version-script %t1.script %t.o -o %t1.so + +# LOCAL: DynamicSymbols [ +# LOCAL-NEXT: Symbol { +# LOCAL-NEXT: Name: +# LOCAL-NEXT: Value: 0x0 +# LOCAL-NEXT: Size: 0 +# LOCAL-NEXT: Binding: Local +# LOCAL-NEXT: Type: None +# LOCAL-NEXT: Other: 0 +# LOCAL-NEXT: Section: Undefined +# LOCAL-NEXT: } +# LOCAL-NEXT: Symbol { +# LOCAL-NEXT: Name: local +# LOCAL-NEXT: Value: 0x1000 +# LOCAL-NEXT: Size: 0 +# LOCAL-NEXT: Binding: Global +# LOCAL-NEXT: Type: None +# LOCAL-NEXT: Other: 0 +# LOCAL-NEXT: Section: .text +# LOCAL-NEXT: } +# LOCAL-NEXT: ]