<html>
    <head>
      <base href="http://bugs.llvm.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - lld doesn't give error about missing archive symbol table"
   href="http://bugs.llvm.org/show_bug.cgi?id=32281">32281</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>lld doesn't give error about missing archive symbol table
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>lld
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>unspecified
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Linux
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>enhancement
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>ELF
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>tejohnson@google.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>When bootstrapping clang with ThinLTO or LTO, ranlib must know how to create an
archive symbol table in the archives of bitcode files. This requires either
setting up the system ranlib to know where to find the LLVM gold plugin, or
just use llvm-ranlib via -DCMAKE_RANLIB=$BUILD_COMPILER/bin/llvm-ranlib.
Otherwise the link step can't read the symbols and there are many undefined
references.

When gold is used, it immediately emits a meaningful error:
ld.gold: error: lib/libLLVMSupport.a: no archive symbol table (run ranlib)
ld.gold: error: lib/libLLVMDemangle.a: no archive symbol table (run ranlib)

However, when lld is used, no such error is emitted and the user just gets
undefined references, making it harder to identify the issue.

Reproducer:

$ cat main.c
extern void foo();
int main() {
  foo();
  return 1;
}
$ cat foo.c
void foo() {
}
$ clang -c main.c
$ clang -c foo.c -flto  <- produce bitcode
$ ar qc foo.a foo.o

(skip running ranlib, which would be the same as using a system ranlib without
the LLVM gold plugin)

$ ld.gold -o a.out main.o foo.a
ld.gold: error: foo.a: no archive symbol table (run ranlib)
main.o:main.c:function main: error: undefined reference to 'foo'

vs

$ ld.lld  -o a.out main.o foo.a
ld.lld: error: main.c:(function main): undefined symbol 'foo'</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>