diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 531071a49093..043f3239fe98 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -1833,9 +1833,11 @@ template void Writer::openFile() { } unlinkAsync(Config->OutputFile); + unsigned Flags = 0; + if (!Config->Relocatable) + Flags = FileOutputBuffer::F_executable; Expected> BufferOrErr = - FileOutputBuffer::create(Config->OutputFile, FileSize, - FileOutputBuffer::F_executable); + FileOutputBuffer::create(Config->OutputFile, FileSize, Flags); if (!BufferOrErr) error("failed to open " + Config->OutputFile + ": " + diff --git a/lld/test/ELF/file-access.s b/lld/test/ELF/file-access.s new file mode 100644 index 000000000000..ed887c5a13b6 --- /dev/null +++ b/lld/test/ELF/file-access.s @@ -0,0 +1,16 @@ +# REQUIRES: x86, gnustat + +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o +# RUN: ld.lld -r %t.o -o %t1.o +# RUN: stat -c %%A %t1.o | FileCheck --check-prefix=CHECK-RELOC %s +# CHECK-RELOC: -rw-r--r-- +# RUN: ld.lld -shared %t.o -o %t2.so +# RUN: stat -c %%A %t2.so | FileCheck --check-prefix=CHECK-SHARED %s +# CHECK-SHARED: -rwxr-xr-x +# RUN: ld.lld %t.o -o %t3 +# RUN: stat -c %%A %t3 | FileCheck --check-prefix=CHECK-EXEC %s +# CHECK-EXEC: -rwxr-xr-x + +.global _start +_start: + nop diff --git a/lld/test/lit.cfg.py b/lld/test/lit.cfg.py index ae0dd187c607..f8436cab6135 100644 --- a/lld/test/lit.cfg.py +++ b/lld/test/lit.cfg.py @@ -91,3 +91,11 @@ if tar_executable: if 'GNU tar' in tar_version.stdout.read().decode(): config.available_features.add('gnutar') tar_version.wait() + +stat_executable = lit.util.which('stat', config.environment['PATH']) +if stat_executable: + stat_version = subprocess.Popen( + [stat_executable, '--version'], stdout=subprocess.PIPE, env={'LANG': 'C'}) + if 'GNU coreutils' in stat_version.stdout.read().decode(): + config.available_features.add('gnustat') + stat_version.wait()