Linux如何执行一个文件?

我想知道Linux操作系统如何执行文件。 所以从我在网上的search,我明白,每一个可运行位设置的文件可以执行。 但后来我知道有一个叫做格式的ELF,它是可执行文件的Linux标准。

所以我想知道的是,为了在系统中执行代码,具有运行权限的文件(runnable位是打开的)需要什么? 我可以用hex编辑器创build一个新文件,并写入90(NOP操作码),并期望它被执行? 还是Linux需要某种标准格式,如ELF格式或Bash格式?

还是Linux需要某种标准格式,如ELF格式或bash格式?

是的,linux要求文件采用某种支持(注册)格式,并执行位设置才能执行。 Linux中的大多数文件都有ELF格式“shebang”格式 (它们中的两个第一个符号是#!然后写入了解释器的路径,被bash,perl,python和大多数其他脚本使用)。 有时文本文件被允许作为shell脚本执行,例如,当你从bash执行./script时(不是由内核而是由bash shell来处理)。

do_execve函数开始,可以从linux内核的fs / exec.c文件中获得更多细节。

有内核子系统“binfmt”来注册其他可执行格式。 例如, binfmt_misc允许您通过/proc/sys/fs/binfmt_misc特殊文件来定义和注册自己的二进制格式。 执行通过用户定义的“解释器”来处理,该解释器可以读取,加载和执行目标可执行文件。 例如,Windows PE二进制文件可以在wine not-an-emulator的帮助下启动。

我们可以在内核源码的fs目录中看到几个内建的binfmt模块。 最常见的是: binfmt_elf.c (ELF二进制格式)和binfmt_script.c (它检测“shebang”并启动解释器)。 AT&T有简单的二进制格式“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* syscalls将返回错误:

 $ 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手册页 ,返回码意味着:

ENOEXEC

可执行文件不是可识别的格式,不适用于错误的体系结构,或者具有其他格式错误,这意味着它不能执行。