diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -223,8 +223,10 @@ // default action without the LTO hack described above. for (const std::pair &P : getArchiveMembers(MBRef)) - if (identify_magic(P.first.getBuffer()) != file_magic::bitcode) + if (identify_magic(P.first.getBuffer()) != file_magic::bitcode) { + error(Path + ": archive has no index; run ranlib to add one"); return; + } for (const std::pair &P : getArchiveMembers(MBRef)) diff --git a/lld/test/ELF/archive-no-index.s b/lld/test/ELF/archive-no-index.s new file mode 100644 --- /dev/null +++ b/lld/test/ELF/archive-no-index.s @@ -0,0 +1,13 @@ +# REQUIRES: x86 +# Tests error on archive file without a symbol table +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux -o %t.o %s +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux -o %t.archive.o %S/Inputs/archive.s +# RUN: rm -f %t.a +# RUN: llvm-ar crS %t.a %t.archive.o + +# RUN: not ld.lld -o out.wasm %t.o %t.a 2>&1 | FileCheck %s + +.globl _start +_start: + +# CHECK: error: {{.*}}.a: archive has no index; run ranlib to add one diff --git a/lld/test/ELF/lto/archive-no-index.ll b/lld/test/ELF/lto/archive-no-index.ll --- a/lld/test/ELF/lto/archive-no-index.ll +++ b/lld/test/ELF/lto/archive-no-index.ll @@ -26,7 +26,7 @@ ; RUN: rm -f %t3.a ; RUN: llvm-ar crS %t3.a %t3.o ; RUN: not ld.lld -o /dev/null -emain %t1.o %t3.a 2>&1 | FileCheck -check-prefix=ERR1 %s -; ERR1: error: undefined symbol: f +; ERR1: error: {{.*}}.a: archive has no index; run ranlib to add one ; RUN: rm -f %t4.a ; RUN: llvm-ar cr %t4.a