Eu tenho me perguntado como gcc
determina as permissões de arquivo resultantes do arquivo executável que está sendo gerado. Para obter algum insight, considerei um programa minimalista test.c
#include <fcntl.h>
#include <unistd.h>
int main(){
int fd = open("output.dat", O_CREAT, 0777);
close(fd);
}
e os dois cenários a seguir:
O arquivo test.c
reside em um diretório sem ACLs e umask é definido como 0027
. Se eu executar gcc -o test test.c
, o arquivo test
tem (como esperado) as permissões rwxr-x---
e o arquivo output.dat
criado iniciando ./test
.
O arquivo test.c
reside em um diretório com setfacl -m d:g::rX -m d:o:--- .
e umask está definido como 0022
. Sob essas circunstâncias, o arquivo executável test
gerado por gcc
tem permissões rwxr-x--x
, enquanto o arquivo output.dat
retém rwxr-x---
.
Quanto ao arquivo output.dat
, o comportamento parece estar de acordo com a seção Criação de objetos e ACLs padrão na página de manual do acl. Além disso, strace
revela que gcc
primeiro cria o arquivo de saída e chmod
s o sinalizador de executável mais tarde. No entanto, parece chamar chmod("test", 0750)
no primeiro cenário e chmod("test", 0751)
no segundo.
Provavelmente estou sentindo falta de algo muito óbvio, mas qual é o motivo das permissões 0751
no último caso? Não deveria -m d:o:---
ser respeitado?