任何人都可以详细解释以下内容。假设我正在安装一个带有noexec
以下选项的目录:
mount -o noexec /dev/mapper/fedora-data /data
所以为了验证这一点,我跑了mount | grep data
:
/dev/mapper/fedora-data on /data type ext4 (rw,noexec,relatime,seclabel,data=ordered)
现在/data
我正在创建一个简单的脚本hello_world
,如下所示:
#!/bin/bash
echo "Hello World"
whoami
所以我使脚本可执行chmod u+x hello_world
(但这对带有noexec
选项的文件系统没有影响),我尝试运行它:
# ./hello_world
-bash: ./hello_world: Permission denied
但是,准备bash
文件会产生:
# bash hello_world
Hello World
root
所以我创建了一个简单hello_world.c
的内容如下:
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
编译它使用 cc -o hello_world hello_world.c
现在运行:
# ./hello_world
-bash: ./hello_world: Permission denied
所以我尝试使用
/lib64/ld-linux-x86-64.so.2 hello_world
错误:
./hello_world: error while loading shared libraries: ./hello_world: failed to map segment from shared object: Operation not permitted
所以这当然是正确的,因为ldd
返回以下内容:
ldd hello_world
ldd: warning: you do not have execution permission for `./hello_world'
not a dynamic executable
在另一个noexec
安装选项不适用的系统上,我看到:
ldd hello_world
linux-vdso.so.1 (0x00007ffc1c127000)
libc.so.6 => /lib64/libc.so.6 (0x00007facd9d5a000)
/lib64/ld-linux-x86-64.so.2 (0x00007facd9f3e000)
现在我的问题是:为什么在带有noexec
选项的文件系统上运行 bash 脚本而不是c
编译程序?引擎盖下发生了什么?