我想知道Linux操作系统如何执行文件。 因此,通过我在网络上的搜索,我了解到每个运行可运行位的文件都可以执行。但后来我了解到有一种称为格式的ELF,它是可执行文件的Linux标准。
所以我想知道的是,为了在系统中执行代码,有权运行(runnable bit is)的文件需要什么?我可以用十六进制编辑器创建一个新文件并在内部写入90(NOP操作码)并期望它被执行吗?或者Linux是否需要某种标准格式,如ELF格式或Bash格式?
答案 0 :(得分:10)
或者Linux是否需要某种标准格式,如ELF格式或bash格式?
是的,linux要求文件采用某种支持(注册)格式并执行位设置才能执行它。 Linux中的大多数文件都有ELF format或"shebang" format(它们的两个第一个符号是#!
,然后写入解释器的路径,由bash,perl,python和大多数其他脚本使用) 。有时允许文本文件作为shell脚本执行,例如当你从bash执行./script
时(不是由内核处理,而是由bash shell处理)。
从do_execve
函数开始,Linux内核的fs/exec.c file提供了更多详细信息。
有内核子系统" binfmt"注册其他可执行格式。例如,binfmt_misc
允许您通过/proc/sys/fs/binfmt_misc
特殊文件定义和注册自己的二进制格式。执行是通过用户定义的"解释器"来处理的,该程序可以读取,加载和执行目标可执行文件。例如,Windows PE二进制文件可以在wine
not-an-emulator的帮助下启动。
我们可以在fs
directory内核源代码中看到几个内置的binfmt
模块。最常见的是:binfmt_elf.c
(ELF二进制格式)和binfmt_script.c
(检测" shebang"并启动解释器)。来自AT& T的简单binary format "a.out"由binfmt_aout.c
处理,比ELF更容易生成。
binfmt_aout.c 11374 bytes
binfmt_elf.c 58415 bytes
binfmt_elf_fdpic.c 48256 bytes
binfmt_em86.c 2710 bytes
binfmt_flat.c 27054 bytes
binfmt_misc.c 15175 bytes
binfmt_script.c 2768 bytes
binfmt_som.c 7315 bytes
如果您尝试执行的文件不支持格式,exec*
系统调用将返回错误:
$ hexdump -C asd
00000000 07 01 09 00 11 12 13 14 0a |.........|
00000009
$ strace ./asd
execve("./asd", ["./asd"], [/* 179 vars */]) = -1 ENOEXEC (Exec format error)
....
根据execve
man page,返回码表示:
ENOEXEC
可执行文件不是可识别的格式,是错误的体系结构,或者有其他格式错误,这意味着它无法执行。