【问题标题】:How does Linux execute a file? [closed]Linux如何执行文件? [关闭]
【发布时间】:2014-06-11 07:43:20
【问题描述】:

我想知道 Linux 操作系统是如何执行文件的。 因此,从我在网络上的搜索中,我了解到每个设置了可运行位的文件都可以执行。但后来我了解到有一种名为 format 的 ELF,它是 Linux 可执行文件的标准。

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

【问题讨论】:

标签: linux elf


【解决方案1】:

或者 linux 是否需要某种标准格式,例如 ELF 格式或 bash 格式?

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

更多细节可在 linux 内核的fs/exec.c file 中找到,从do_execve 函数开始。

有内核子系统“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* 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 man page,返回码表示:

ENOEXEC

可执行文件的格式不被识别,架构错误,或者有其他格式错误,意味着它无法执行。

【讨论】:

猜你喜欢
  • 2011-10-07
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多