我一直想知道如何gcc
确定生成的可执行文件的最终文件权限。为了获得一些见解,我考虑了一个简约的程序test.c
#include <fcntl.h>
#include <unistd.h>
int main(){
int fd = open("output.dat", O_CREAT, 0777);
close(fd);
}
以及以下两种场景:
该文件
test.c
驻留在没有 ACL 的目录中,并且 umask 设置为0027
。如果我执行gcc -o test test.c
,该文件test
具有(如预期的)权限,通过启动创建的rwxr-x---
文件也具有权限。output.dat
./test
该文件
test.c
位于 目录中,setfacl -m d:g::rX -m d:o:--- .
并且 umask 设置为0022
。在这种情况下,test
由 生成的可执行文件gcc
具有权限rwxr-x--x
,而文件output.dat
保留rwxr-x---
.
至于该文件output.dat
,其行为似乎与该部分一致。对象创建和默认 ACL在 acl 的手册页中。此外,还strace
揭示了gcc
首先创建输出文件,然后chmod
创建可执行标志。然而,它似乎chmod("test", 0750)
在第一个场景和chmod("test", 0751)
第二个场景中调用。
0751
我可能遗漏了一些非常明显的东西,但是后一种情况下权限的原因是什么?不应该-m d:o:---
被尊重吗?