Alguém pode explicar em detalhes o que está acontecendo com o seguinte. Vamos imaginar que estou montando um diretório com noexec
opção da seguinte forma:
mount -o noexec /dev/mapper/fedora-data /data
Então, para verificar isso, executei mount | grep data
:
/dev/mapper/fedora-data on /data type ext4 (rw,noexec,relatime,seclabel,data=ordered)
Agora dentro /data
estou criando um script simples chamado hello_world
da seguinte forma:
#!/bin/bash
echo "Hello World"
whoami
Então eu fiz o script executável por chmod u+x hello_world
(isso, no entanto, não terá efeito em um sistema de arquivos com noexec
opções) e tentei executá-lo:
# ./hello_world
-bash: ./hello_world: Permission denied
No entanto, pré-pender bash
para o arquivo resulta em:
# bash hello_world
Hello World
root
Então criei um simples hello_world.c
com o seguinte conteúdo:
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
Compilei usando cc -o hello_world hello_world.c
Agora rodando:
# ./hello_world
-bash: ./hello_world: Permission denied
Então eu tentei executá-lo usando
/lib64/ld-linux-x86-64.so.2 hello_world
O erro:
./hello_world: error while loading shared libraries: ./hello_world: failed to map segment from shared object: Operation not permitted
Portanto, é claro que isso é verdade, pois ldd
retorna o seguinte:
ldd hello_world
ldd: warning: you do not have execution permission for `./hello_world'
not a dynamic executable
Em outro sistema em que noexec
a opção de montagem não se aplica, vejo:
ldd hello_world
linux-vdso.so.1 (0x00007ffc1c127000)
libc.so.6 => /lib64/libc.so.6 (0x00007facd9d5a000)
/lib64/ld-linux-x86-64.so.2 (0x00007facd9f3e000)
Agora minha pergunta é esta: Por que a execução de um script bash em um sistema de arquivos com noexec
opção funciona, mas não um c
programa compilado? O que está acontecendo sob o capô?