<div dir="ltr">One interesting thing is that Gold does not accept this version script:<div><br></div><div><div>LIBFOO_1.0 {</div><div>  global:</div><div>    local;</div><div>  local:</div><div>    *;</div><div>};</div><div><br></div><div><br></div><div><br></div><div><div>/usr/bin/ld.gold: error: foo.map:3:5: syntax error, unexpected LOCAL, expecting STRING or QUOTED_STRING or EXTERN</div><div>/usr/bin/ld.gold: fatal error: unable to parse version script file foo.map</div></div><div><br></div><div>BFD does accept it though.</div><div><br></div><div>-- Sean Silva</div><div><br></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Feb 7, 2017 at 11:50 AM, Dmitry Mikulin via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: dmikulin<br>
Date: Tue Feb  7 13:50:47 2017<br>
New Revision: 294343<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=294343&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=294343&view=rev</a><br>
Log:<br>
Handle the case where 'local' is the name of a global in a version script:<br>
{ global : local; local: *; };<br>
<br>
Modified:<br>
    lld/trunk/ELF/LinkerScript.cpp<br>
    lld/trunk/ELF/ScriptParser.cpp<br>
    lld/trunk/ELF/ScriptParser.h<br>
    lld/trunk/test/ELF/version-<wbr>script-glob.s<br>
<br>
Modified: lld/trunk/ELF/LinkerScript.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=294343&r1=294342&r2=294343&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/<wbr>LinkerScript.cpp?rev=294343&<wbr>r1=294342&r2=294343&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/LinkerScript.cpp (original)<br>
+++ lld/trunk/ELF/LinkerScript.cpp Tue Feb  7 13:50:47 2017<br>
@@ -1995,7 +1995,7 @@ std::vector<SymbolVersion> ScriptParser:<br>
       continue;<br>
     }<br>
<br>
-    if (peek() == "}" || peek() == "local" || Error)<br>
+    if (peek() == "}" || (peek() == "local" && peek(1) == ":") || Error)<br>
       break;<br>
     StringRef Tok = next();<br>
     Ret.push_back({unquote(Tok), false, hasWildcard(Tok)});<br>
<br>
Modified: lld/trunk/ELF/ScriptParser.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/ScriptParser.cpp?rev=294343&r1=294342&r2=294343&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/<wbr>ScriptParser.cpp?rev=294343&<wbr>r1=294342&r2=294343&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/ScriptParser.cpp (original)<br>
+++ lld/trunk/ELF/ScriptParser.cpp Tue Feb  7 13:50:47 2017<br>
@@ -156,11 +156,14 @@ StringRef ScriptParserBase::next() {<br>
   return Tokens[Pos++];<br>
 }<br>
<br>
-StringRef ScriptParserBase::peek() {<br>
-  StringRef Tok = next();<br>
-  if (Error)<br>
-    return "";<br>
-  --Pos;<br>
+StringRef ScriptParserBase::peek(<wbr>unsigned N) {<br>
+  StringRef Tok;<br>
+  for (unsigned I = 0; I <= N; ++I) {<br>
+    Tok = next();<br>
+    if (Error)<br>
+      return "";<br>
+  }<br>
+  Pos = Pos - N - 1;<br>
   return Tok;<br>
 }<br>
<br>
<br>
Modified: lld/trunk/ELF/ScriptParser.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/ScriptParser.h?rev=294343&r1=294342&r2=294343&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/<wbr>ScriptParser.h?rev=294343&r1=<wbr>294342&r2=294343&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/ScriptParser.h (original)<br>
+++ lld/trunk/ELF/ScriptParser.h Tue Feb  7 13:50:47 2017<br>
@@ -28,7 +28,7 @@ public:<br>
   static StringRef skipSpace(StringRef S);<br>
   bool atEOF();<br>
   StringRef next();<br>
-  StringRef peek();<br>
+  StringRef peek(unsigned N = 0);<br>
   void skip();<br>
   bool consume(StringRef Tok);<br>
   void expect(StringRef Expect);<br>
<br>
Modified: lld/trunk/test/ELF/version-<wbr>script-glob.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/version-script-glob.s?rev=294343&r1=294342&r2=294343&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/test/ELF/<wbr>version-script-glob.s?rev=<wbr>294343&r1=294342&r2=294343&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/test/ELF/version-<wbr>script-glob.s (original)<br>
+++ lld/trunk/test/ELF/version-<wbr>script-glob.s Tue Feb  7 13:50:47 2017<br>
@@ -14,6 +14,9 @@ bar1:<br>
         .globl zed1<br>
 zed1:<br>
<br>
+        .globl local<br>
+local:<br>
+<br>
 # CHECK:      DynamicSymbols [<br>
 # CHECK-NEXT:   Symbol {<br>
 # CHECK-NEXT:     Name:<br>
@@ -43,3 +46,27 @@ zed1:<br>
 # CHECK-NEXT:     Section: .text<br>
 # CHECK-NEXT:   }<br>
 # CHECK-NEXT: ]<br>
+<br>
+# RUN: echo "{ global : local; local: *; };" > %t1.script<br>
+# RUN: ld.lld -shared --version-script %t1.script %t.o -o %t1.so<br>
+<br>
+# LOCAL:      DynamicSymbols [<br>
+# LOCAL-NEXT:   Symbol {<br>
+# LOCAL-NEXT:     Name:<br>
+# LOCAL-NEXT:     Value: 0x0<br>
+# LOCAL-NEXT:     Size: 0<br>
+# LOCAL-NEXT:     Binding: Local<br>
+# LOCAL-NEXT:     Type: None<br>
+# LOCAL-NEXT:     Other: 0<br>
+# LOCAL-NEXT:     Section: Undefined<br>
+# LOCAL-NEXT:   }<br>
+# LOCAL-NEXT:   Symbol {<br>
+# LOCAL-NEXT:     Name: local<br>
+# LOCAL-NEXT:     Value: 0x1000<br>
+# LOCAL-NEXT:     Size: 0<br>
+# LOCAL-NEXT:     Binding: Global<br>
+# LOCAL-NEXT:     Type: None<br>
+# LOCAL-NEXT:     Other: 0<br>
+# LOCAL-NEXT:     Section: .text<br>
+# LOCAL-NEXT:   }<br>
+# LOCAL-NEXT: ]<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>