From: Eli Friedman Date: Tue, 12 Mar 2019 01:24:39 +0000 (+0000) Subject: [ELF] Print a better error for an archive containing a non-ELF file. X-Git-Tag: llvmorg-10-init~10240 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3751ae4a94379d572cc722ee0beac8019241f5d4;p=platform%2Fupstream%2Fllvm.git [ELF] Print a better error for an archive containing a non-ELF file. Hopefully gives a more readable error message for the most obvious mistake. Differential Revision: https://reviews.llvm.org/D59170 llvm-svn: 355888 --- diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index c3acb12..d2a93af 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -1196,20 +1196,22 @@ static ELFKind getELFKind(MemoryBufferRef MB, StringRef ArchiveName) { auto Fatal = [&](StringRef Msg) { StringRef Filename = MB.getBufferIdentifier(); if (ArchiveName.empty()) - fatal(Filename + ": corrupted ELF file: " + Msg); + fatal(Filename + ": " + Msg); else - fatal(ArchiveName + "(" + Filename + "): corrupted ELF file: " + Msg); + fatal(ArchiveName + "(" + Filename + "): " + Msg); }; + if (!MB.getBuffer().startswith(ElfMagic)) + Fatal("not an ELF file"); if (Endian != ELFDATA2LSB && Endian != ELFDATA2MSB) - Fatal("invalid data encoding"); + Fatal("corrupted ELF file: invalid data encoding"); if (Size != ELFCLASS32 && Size != ELFCLASS64) - Fatal("invalid file class"); + Fatal("corrupted ELF file: invalid file class"); size_t BufSize = MB.getBuffer().size(); if ((Size == ELFCLASS32 && BufSize < sizeof(Elf32_Ehdr)) || (Size == ELFCLASS64 && BufSize < sizeof(Elf64_Ehdr))) - Fatal("file is too short"); + Fatal("corrupted ELF file: file is too short"); if (Size == ELFCLASS32) return (Endian == ELFDATA2LSB) ? ELF32LEKind : ELF32BEKind; diff --git a/lld/test/ELF/invalid/invalid-elf.test b/lld/test/ELF/invalid/invalid-elf.test index cef173b..583703c 100644 --- a/lld/test/ELF/invalid/invalid-elf.test +++ b/lld/test/ELF/invalid/invalid-elf.test @@ -1,11 +1,18 @@ # REQUIRES: x86 -# RUN: llvm-mc %s -o %t -filetype=obj -triple x86_64-pc-linux +# RUN: rm -rf %t && mkdir -p %t +# RUN: llvm-mc %s -o %t/simple.o -filetype=obj -triple x86_64-pc-linux +# RUN: echo > %t/empty.o +# RUN: llvm-ar cr %t/not-elf.a %t/empty.o -# RUN: not ld.lld %t %p/Inputs/data-encoding.a -o %t2 2>&1 | \ +# RUN: not ld.lld %t/simple.o %t/not-elf.a -o %t2 2>&1 | \ +# RUN: FileCheck --check-prefix=NOT-ELF %s +# NOT-ELF: not-elf.a(empty.o): not an ELF file + +# RUN: not ld.lld %t/simple.o %p/Inputs/data-encoding.a -o %t2 2>&1 | \ # RUN: FileCheck --check-prefix=INVALID-DATA-ENC %s # INVALID-DATA-ENC: data-encoding.a(test.o): corrupted ELF file: invalid data encoding -# RUN: not ld.lld %t %p/Inputs/file-class.a -o %t2 2>&1 | \ +# RUN: not ld.lld %t/simple.o %p/Inputs/file-class.a -o %t2 2>&1 | \ # RUN: FileCheck --check-prefix=INVALID-FILE-CLASS %s # INVALID-FILE-CLASS: file-class.a(test.o): corrupted ELF file: invalid file class