[lld] r294343 - Handle the case where 'local' is the name of a global in a version script:

Sean Silva via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 7 19:28:21 PST 2017


One interesting thing is that Gold does not accept this version script:

LIBFOO_1.0 {
  global:
    local;
  local:
    *;
};



/usr/bin/ld.gold: error: foo.map:3:5: syntax error, unexpected LOCAL,
expecting STRING or QUOTED_STRING or EXTERN
/usr/bin/ld.gold: fatal error: unable to parse version script file foo.map

BFD does accept it though.

-- Sean Silva


On Tue, Feb 7, 2017 at 11:50 AM, Dmitry Mikulin via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: dmikulin
> Date: Tue Feb  7 13:50:47 2017
> New Revision: 294343
>
> URL: http://llvm.org/viewvc/llvm-project?rev=294343&view=rev
> Log:
> Handle the case where 'local' is the name of a global in a version script:
> { global : local; local: *; };
>
> Modified:
>     lld/trunk/ELF/LinkerScript.cpp
>     lld/trunk/ELF/ScriptParser.cpp
>     lld/trunk/ELF/ScriptParser.h
>     lld/trunk/test/ELF/version-script-glob.s
>
> Modified: lld/trunk/ELF/LinkerScript.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/
> LinkerScript.cpp?rev=294343&r1=294342&r2=294343&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/LinkerScript.cpp (original)
> +++ lld/trunk/ELF/LinkerScript.cpp Tue Feb  7 13:50:47 2017
> @@ -1995,7 +1995,7 @@ std::vector<SymbolVersion> ScriptParser:
>        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)});
>
> Modified: lld/trunk/ELF/ScriptParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/
> ScriptParser.cpp?rev=294343&r1=294342&r2=294343&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/ScriptParser.cpp (original)
> +++ lld/trunk/ELF/ScriptParser.cpp Tue Feb  7 13:50:47 2017
> @@ -156,11 +156,14 @@ StringRef ScriptParserBase::next() {
>    return Tokens[Pos++];
>  }
>
> -StringRef ScriptParserBase::peek() {
> -  StringRef Tok = next();
> -  if (Error)
> -    return "";
> -  --Pos;
> +StringRef ScriptParserBase::peek(unsigned N) {
> +  StringRef Tok;
> +  for (unsigned I = 0; I <= N; ++I) {
> +    Tok = next();
> +    if (Error)
> +      return "";
> +  }
> +  Pos = Pos - N - 1;
>    return Tok;
>  }
>
>
> Modified: lld/trunk/ELF/ScriptParser.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/
> ScriptParser.h?rev=294343&r1=294342&r2=294343&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/ScriptParser.h (original)
> +++ lld/trunk/ELF/ScriptParser.h Tue Feb  7 13:50:47 2017
> @@ -28,7 +28,7 @@ public:
>    static StringRef skipSpace(StringRef S);
>    bool atEOF();
>    StringRef next();
> -  StringRef peek();
> +  StringRef peek(unsigned N = 0);
>    void skip();
>    bool consume(StringRef Tok);
>    void expect(StringRef Expect);
>
> Modified: lld/trunk/test/ELF/version-script-glob.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/
> version-script-glob.s?rev=294343&r1=294342&r2=294343&view=diff
> ============================================================
> ==================
> --- lld/trunk/test/ELF/version-script-glob.s (original)
> +++ lld/trunk/test/ELF/version-script-glob.s Tue Feb  7 13:50:47 2017
> @@ -14,6 +14,9 @@ bar1:
>          .globl zed1
>  zed1:
>
> +        .globl local
> +local:
> +
>  # CHECK:      DynamicSymbols [
>  # CHECK-NEXT:   Symbol {
>  # CHECK-NEXT:     Name:
> @@ -43,3 +46,27 @@ zed1:
>  # 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: ]
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170207/25d398b0/attachment.html>


More information about the llvm-commits mailing list