Linux如何执行文件?

前端之家收集整理的这篇文章主要介绍了Linux如何执行文件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道 Linux操作系统如何执行文件. @H_403_2@因此,通过我在网络上的搜索,我了解到每个运行可运行位的文件都可以执行.但后来我了解到有一种称为格式的ELF,它是可执行文件的Linux标准.

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

解决方法

Or does linux requires some kind of standard format,like ELF format or bash format?

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

有关更多详细信息,请参阅fs/exec.c file中的linux内核,从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

An executable is not in a recognized format,is for the wrong architecture,or has some other format error that means it cannot be executed.

猜你在找的Linux相关文章