为什么可执行文件需要二进制格式规范?

RKA

我了解像Linux或Windows这样的操作系统是用C / C ++编写的,并已编译为给定的体系结构(例如AMD64),以生成适合该体系结构的机器代码。

我的问题-

  1. 为什么二进制代码需要单独的规范-Linux使用ELF,Windows使用可移植可执行格式?
  2. 是否可以在没有此二进制格式规范的情况下创建操作系统和在该操作系统上运行的程序?
  3. 二进制格式是:与体系结构有关,与操作系统有关或两者兼有吗?
  4. 二进制格式仅适用于可执行文件还是适用于操作系统代码?
鲍勃

您可能已经猜到,可执行文件格式不仅仅包含机器代码。例如,他们可以:

  • 指定OS的元数据,例如可执行文件的目标体系结构。此元数据包含文件

  • 指定程序在内存中的布局在现代OS上,大多数可执行文件不会以单个块的形式加载到内存中-它们通常具有许多单独的区域/部分/这些段中的一些将包含可执行代码。其中一些将包含不可变的数据,例如文本字符串。其中一些将被指定为程序堆的可写内存。

    对于这些部分的大小,不同的程序将有不同的要求(要求)。所有这些都在标题中指定。

  • 某些格式还允许您嵌入数字签名,该签名可以验证二进制文件的来源。


  1. 为什么二进制代码需要单独的规范-Linux使用ELF,Windows使用可移植可执行格式?

原因主要是历史原因,并且操作系统倾向于坚持使用其现有的“本机”(或“默认”)格式,除非有令人信服的理由进行切换(例如,从NT 3.1中的DOS MZ格式转换为PE,以及从NT 3.1中转换为PE)。 .out到Linux 1.2中的ELF,以及多年来从各种Unix中的COFF到ELF)。

应当注意的是,底层机器代码取决于CPU体系结构,但其他方面(除了syscalls和链接库)在操作系统之间可移植性很强。实际上,现代Windows和Linux都可以运行两种可执行格式:ELF可执行文件将通过WSL在Windows上运行,PE可执行文件将通过WINE在Linux上运行。

  1. 是否可以在没有此二进制格式规范的情况下创建操作系统和在该操作系统上运行的程序?

我们回到这些格式的主要目的。如果没有元数据告诉OS将程序的某些部分加载到何处,则大多数现代可执行文件将无法运行。一些非常古老的格式(例如COM)几乎都包含纯代码,但不是特别灵活,因此不受欢迎。

实际上,甚至不需要操作系统。在硬件级别上,假设存在(旧版)BIOS,BIOS会简单地在磁盘(MBR)上的特定位置开始执行,该位置可以是任意机器代码,然后由它们接管并启动操作系统或执行任何操作其他喜欢。(您可以将MBR本身视为二进制格式,尽管它与可执行代码没有直接关系。)但是,更现代的UEFI确实指定了更复杂的可执行格式(PE)。

  1. 二进制格式体系结构是依赖于操作系统还是依赖于操作系统?

确实取决于格式。某些格式采用特定的体系结构。其他允许您从标题中指定的“魔数”列表中选择体系结构。还有一些是完全与体系结构无关的(例如Java和.NET / CIL字节码)。

同样,格式通常不会对OS施加任何限制,尽管将限制OS可以(本机)识别和执行的格式。当然,核心操作系统之上的兼容性层可以执行核心操作系统可能无法识别的其他格式(例如JVM,.NET / CLR,WSL&WINE等)。

  1. 二进制格式仅适用于可执行文件还是适用于操作系统代码?

在大多数现代操作系统中,很大一部分只是“正常”可执行文件的集合。但是,操作系统的某些部分是“特殊的”,不一定使用与其余部分相同的格式。通常,这仅适用于引导加载程序和内核。

举一个特定的,非常常见的例子,传统的BIOS引导加载程序将既不是Linux操作系统,也不是Windows操作系统使用的ELF或PE格式。Linux内核通常以GRB引导加载程序可以加载ELF派生格式构建,但可以采用不同的格式来与所使用的引导加载程序兼容。Linux内核还支持EFI存根模式,该模式包含最小的PE / COFF标头,以便与直接UEFI引导兼容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

与位置无关的可执行文件:什么是“主要可执行二进制文件”?

“执行构建”命令后无法找到可执行文件/二进制文件

在Linux中从可执行文件到机器代码的二进制执行步骤

bash文件包含可执行文件/二进制代码

在自包含的可执行文件中提取二进制文件的位置

如何为二进制可执行文件创建 APK 文件?

从Debian到Ubuntu的二进制可执行文件?

无法在Ubuntu 12.04上运行二进制可执行文件

从JAR为AWS Lambda运行二进制可执行文件

如何将机器代码转换为二进制可执行文件?

增加二进制可执行文件的大小

在Mac上将Python3编译为二进制可执行文件

Android:在AOSP版本中包含su二进制可执行文件

使用LLVM工具将二进制数据嵌入可执行文件

Python软件包安装脚本安装二进制可执行文件

如何通过指令读取二进制可执行文件?

UiPath进程可以转换为二进制可执行文件吗?

可执行文件上的通配符(二进制)

Bash:将原始二进制变量用作可执行文件吗?

在 x86_64 系统上运行 x86-64 可执行文件无法执行二进制文件:Exec 格式错误

ndisasm手册中提到的二进制文件和可执行文件有什么区别?

通过编辑可执行文件来修复二进制文件中的库位置

如何知道链接到二进制可执行文件的调试符号文件的名称和/或路径?

无法在hadoop二进制文件中找到可执行文件null \ bin \ winutils.exe

将二进制文件上传到github版本时保持可执行文件权限

如何在Mac OS X的可执行文件中嵌入二进制文件的内容?

如何将linux可执行文件(二进制)转换为Windows exe文件?

确定Linux中二进制文件(库或可执行文件)的目标ISA扩展

漏洞扫描程序会扫描源代码还是可执行文件(二进制文件)?