[ELF] Better error reporting for broken archives

Differential revision: https://reviews.llvm.org/D26852

llvm-svn: 287527
This commit is contained in:
Eugene Leviant 2016-11-21 09:28:07 +00:00
parent a113a4194c
commit 7d7ff80f4b
3 changed files with 24 additions and 7 deletions

View File

@ -99,21 +99,24 @@ static std::tuple<ELFKind, uint16_t, uint8_t> parseEmulation(StringRef Emul) {
std::vector<MemoryBufferRef>
LinkerDriver::getArchiveMembers(MemoryBufferRef MB) {
std::unique_ptr<Archive> File =
check(Archive::create(MB), "failed to parse archive");
check(Archive::create(MB),
MB.getBufferIdentifier() + ": failed to parse archive");
std::vector<MemoryBufferRef> V;
Error Err = Error::success();
for (const ErrorOr<Archive::Child> &COrErr : File->children(Err)) {
Archive::Child C = check(COrErr, "could not get the child of the archive " +
File->getFileName());
Archive::Child C =
check(COrErr, MB.getBufferIdentifier() +
": could not get the child of the archive");
MemoryBufferRef MBRef =
check(C.getMemoryBufferRef(),
"could not get the buffer for a child of the archive " +
File->getFileName());
MB.getBufferIdentifier() +
": could not get the buffer for a child of the archive");
V.push_back(MBRef);
}
if (Err)
fatal("Archive::children failed: " + toString(std::move(Err)));
fatal(MB.getBufferIdentifier() + ": Archive::children failed: " +
toString(std::move(Err)));
// Take ownership of memory buffers created for members of thin archives.
for (std::unique_ptr<MemoryBuffer> &MB : File->takeThinBuffers())

View File

@ -482,7 +482,8 @@ SymbolBody *elf::ObjectFile<ELFT>::createSymbolBody(const Elf_Sym *Sym) {
}
template <class ELFT> void ArchiveFile::parse() {
File = check(Archive::create(MB), "failed to parse archive");
File = check(Archive::create(MB),
MB.getBufferIdentifier() + ": failed to parse archive");
// Read the symbol table to construct Lazy objects.
for (const Archive::Symbol &Sym : File->symbols())

View File

@ -0,0 +1,13 @@
// REQUIRES: x86
// Check bad archive error reporting with --whole-archive
// and without it.
// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
// RUN: echo "!<arch>" > %t.bad.a
// RUN: echo "bad archive" >> %t.bad.a
// RUN: not ld.lld %t.o %t.bad.a -o %t 2>&1 | FileCheck %s
// RUN: not ld.lld %t.o --whole-archive %t.bad.a -o %t 2>&1 | FileCheck %s
// CHECK: {{.*}}.bad.a: failed to parse archive
.globl _start
_start: