summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/Driver.cpp10
-rw-r--r--lld/ELF/Filesystem.cpp4
-rw-r--r--lld/ELF/Filesystem.h2
-rw-r--r--lld/test/ELF/early-exit-for-bad-paths.s21
-rw-r--r--lld/test/ELF/map-file.s2
5 files changed, 24 insertions, 15 deletions
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index dfd7eef4355..00524c68762 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -860,10 +860,12 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &Args) {
if (Config->OutputFile.empty())
Config->OutputFile = "a.out";
- // Fail early if the output file is not writable. If a user has a long link,
- // e.g. due to a large LTO link, they do not wish to run it and find that it
- // failed because there was a mistake in their command-line.
- if (!isFileWritable(Config->OutputFile))
+ // Fail early if the output file or map file is not writable. If a user has a
+ // long link, e.g. due to a large LTO link, they do not wish to run it and
+ // find that it failed because there was a mistake in their command-line.
+ if (!isFileWritable(Config->OutputFile, "output file"))
+ return;
+ if (!isFileWritable(Config->MapFile, "map file"))
return;
// Use default entry point name if no name was given via the command
diff --git a/lld/ELF/Filesystem.cpp b/lld/ELF/Filesystem.cpp
index d3a965cc78a..75f7bda75a2 100644
--- a/lld/ELF/Filesystem.cpp
+++ b/lld/ELF/Filesystem.cpp
@@ -70,9 +70,9 @@ void elf::unlinkAsync(StringRef Path) {
// FileOutputBuffer doesn't touch a desitnation file until commit()
// is called. We use that class without calling commit() to predict
// if the given file is writable.
-bool elf::isFileWritable(StringRef Path) {
+bool elf::isFileWritable(StringRef Path, StringRef Desc) {
if (auto EC = FileOutputBuffer::create(Path, 1).getError()) {
- error("cannot open output file " + Path + ": " + EC.message());
+ error("cannot open " + Desc + " " + Path + ": " + EC.message());
return false;
}
return true;
diff --git a/lld/ELF/Filesystem.h b/lld/ELF/Filesystem.h
index 7e97cbe634f..a33dc3651a4 100644
--- a/lld/ELF/Filesystem.h
+++ b/lld/ELF/Filesystem.h
@@ -15,7 +15,7 @@
namespace lld {
namespace elf {
void unlinkAsync(StringRef Path);
-bool isFileWritable(StringRef Path);
+bool isFileWritable(StringRef Path, StringRef FileDescription);
}
}
diff --git a/lld/test/ELF/early-exit-for-bad-paths.s b/lld/test/ELF/early-exit-for-bad-paths.s
index 856d48ba21e..03462f51da0 100644
--- a/lld/test/ELF/early-exit-for-bad-paths.s
+++ b/lld/test/ELF/early-exit-for-bad-paths.s
@@ -2,25 +2,32 @@
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
# RUN: not ld.lld %t.o -o does_not_exist/output 2>&1 | \
-# RUN: FileCheck %s -check-prefixes=NO-DIR,CHECK
+# RUN: FileCheck %s -check-prefixes=NO-DIR-OUTPUT,CHECK
# RUN: not ld.lld %t.o -o %s/dir_is_a_file 2>&1 | \
-# RUN: FileCheck %s -check-prefixes=DIR-IS-FILE,CHECK
+# RUN: FileCheck %s -check-prefixes=DIR-IS-OUTPUT,CHECK
# RUN: echo "OUTPUT(\"does_not_exist/output\")" > %t.script
# RUN: not ld.lld %t.o %t.script 2>&1 | \
-# RUN: FileCheck %s -check-prefixes=NO-DIR,CHECK
+# RUN: FileCheck %s -check-prefixes=NO-DIR-OUTPUT,CHECK
# RUN: echo "OUTPUT(\"%s/dir_is_a_file\")" > %t.script
# RUN: not ld.lld %t.o %t.script 2>&1 | \
-# RUN: FileCheck %s -check-prefixes=DIR-IS-FILE,CHECK
+# RUN: FileCheck %s -check-prefixes=DIR-IS-OUTPUT,CHECK
-# NO-DIR: error: cannot open output file does_not_exist/output:
-# DIR-IS-FILE: error: cannot open output file {{.*}}/dir_is_a_file:
+# RUN: not ld.lld %t.o -o %t -Map=does_not_exist/output 2>&1 | \
+# RUN: FileCheck %s -check-prefixes=NO-DIR-MAP,CHECK
+# RUN: not ld.lld %t.o -o %t -Map=%s/dir_is_a_file 2>&1 | \
+# RUN: FileCheck %s -check-prefixes=DIR-IS-MAP,CHECK
+
+# NO-DIR-OUTPUT: error: cannot open output file does_not_exist/output:
+# DIR-IS-OUTPUT: error: cannot open output file {{.*}}/dir_is_a_file:
+# NO-DIR-MAP: error: cannot open map file does_not_exist/output:
+# DIR-IS-MAP: error: cannot open map file {{.*}}/dir_is_a_file:
# We should exit before doing the actual link. If an undefined symbol error is
# discovered we haven't bailed out early as expected.
# CHECK-NOT: undefined_symbol
-# RUN: not ld.lld %t.o -o / 2>&1 | FileCheck %s -check-prefixes=ROOT
+# RUN: not ld.lld %t.o -o / 2>&1 | FileCheck %s -check-prefixes=ROOT,CHECK
# ROOT: error: cannot open output file /
.globl _start
diff --git a/lld/test/ELF/map-file.s b/lld/test/ELF/map-file.s
index 4b02aecd8de..e74c91645cb 100644
--- a/lld/test/ELF/map-file.s
+++ b/lld/test/ELF/map-file.s
@@ -59,4 +59,4 @@ local:
// RUN: not ld.lld %t1.o %t2.o %t3.o %t4.a -o %t -Map=/ 2>&1 \
// RUN: | FileCheck -check-prefix=FAIL %s
-// FAIL: cannot open /
+// FAIL: cannot open map file /
OpenPOWER on IntegriCloud