ELF: Do not exit if it cannot open an output file.

It can fail to open an output file for various reasons, including
lack of permission, too long filename, or the output file is not
a mmap'able file.

llvm-svn: 259596
This commit is contained in:
Rui Ueyama 2016-02-02 22:48:04 +00:00
parent e1100f533f
commit cbe392629b
2 changed files with 20 additions and 5 deletions

View File

@ -56,7 +56,7 @@ private:
void assignAddresses();
void buildSectionMap();
void fixAbsoluteSymbols();
void openFile(StringRef OutputPath);
bool openFile();
void writeHeader();
void writeSections();
bool isDiscarded(InputSectionBase<ELFT> *IS) const;
@ -172,7 +172,8 @@ template <class ELFT> void Writer<ELFT>::run() {
return;
assignAddresses();
fixAbsoluteSymbols();
openFile(Config->OutputFile);
if (!openFile())
return;
writeHeader();
writeSections();
if (HasError)
@ -1384,11 +1385,14 @@ template <class ELFT> void Writer<ELFT>::writeHeader() {
Sec->writeHeaderTo(++SHdrs);
}
template <class ELFT> void Writer<ELFT>::openFile(StringRef Path) {
template <class ELFT> bool Writer<ELFT>::openFile() {
ErrorOr<std::unique_ptr<FileOutputBuffer>> BufferOrErr =
FileOutputBuffer::create(Path, FileSize, FileOutputBuffer::F_executable);
fatal(BufferOrErr, "failed to open " + Path);
FileOutputBuffer::create(Config->OutputFile, FileSize,
FileOutputBuffer::F_executable);
if (error(BufferOrErr, "failed to open " + Config->OutputFile))
return false;
Buffer = std::move(*BufferOrErr);
return true;
}
// Write section contents to a mmap'ed file.

View File

@ -1,3 +1,5 @@
# REQUIRES: x86
# RUN: not ld.lld -unknown1 -unknown2 -m foo /no/such/file -lnosuchlib \
# RUN: 2>&1 | FileCheck %s
@ -7,3 +9,12 @@
# CHECK: Unknown emulation: foo
# CHECK: cannot open /no/such/file
# CHECK: Unable to find library -lnosuchlib
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
# RUN: not ld.lld %t -o /dev/null 2>&1 | FileCheck -check-prefix=CHECK2 %s
# CHECK2: failed to open
.globl _start
_start:
nop