Index: ELF/Writer.cpp =================================================================== --- ELF/Writer.cpp +++ ELF/Writer.cpp @@ -1833,9 +1833,11 @@ } 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 + ": " + Index: test/ELF/file-access.s =================================================================== --- test/ELF/file-access.s +++ 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 Index: test/lit.cfg.py =================================================================== --- test/lit.cfg.py +++ test/lit.cfg.py @@ -91,3 +91,11 @@ 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()