二进制文件和操作系统

3
我目前正在学习C ++,有一些(基础)东西我不太了解,在不同的搜索引擎上也没有找到任何有用的信息。
  • 由于所有操作系统都有不同的“二进制格式”用于执行文件(Windows / Linux / Mac),它们之间有什么区别?我的意思是它们都是二进制的,但除了所有操作系统API之外,是否真的有什么不同之处?

  • (Windows)这是一个愚蠢的问题 - 所有应用程序都只是二进制的吗(我的意思是只有0和1)?它们存储在哪种格式中?(因为您在所有文本编辑器中都看不到0和1,而主要是非可显示字符)

此致, lamas


你是希腊人吗?如果是,那么向你致以“干杯”! - Carl Smotricz
4个回答

7

Windows/Linux的可执行文件在以下方面存在差异:

  • 文件头的格式,即文件的一部分索引文件中其余部分的位置和内容;
  • 系统调用所需的指令(中断、寄存器内容等);
  • 二进制代码链接的实际格式;Linux有几种不同的格式,我认为Windows也是如此。

应用程序是数据和机器语言操作码,压缩到一个文件中。可执行文件中大多数字节不包含文本,因此可以包含0到255之间的值,即所有可能的值。人们会说这是二进制的。一个字节有8位,因此每个字节可以说包含8个二进制数字,其中一些将是0,而另一些将是1。


你是最棒的!如果不提到大坝的基础,我就无法呈现这样的主题! - alemjerus

7
Windows(PE)、Linux(ELF)、OS/X等(MACH-O)的可执行文件格式通常被设计用于解决共同问题,因此它们具有共同的特征。但是,每个平台都指定了不同的标准,因此即使平台使用相同类型的CPU,这些文件也不能在平台之间兼容。
可执行文件格式不仅用于可执行文件,还用于库,这些库也包含代码,但永远不会直接由用户运行-只有在内存中加载以满足直接可执行二进制文件的需求。
可执行文件格式的共同特征:
- 一个或多个可执行代码块 - 一个或多个只读数据块,例如文本和数字 - 一个或多个读/写数据块 - 指令告知应用程序在运行时将这些块放置在内存中的位置 - 指令告知需要加载哪些库(这些库也处于“可执行文件格式”),以及它们如何连接(链接)到此可执行文件。 - 一个或多个表将代码和数据位置映射到字符串或ID,以描述它们,对于链接和调试非常有用。
将这些格式与更基本的格式进行比较,例如古老的DOS .com文件,它仅描述要在下一个可用位置加载的64K各种“东西”,并且没有上面列出的许多功能,这很有趣。
在这里,“二进制”用于将它们与文本格式的“源”文件进行比较。二进制格式仅表示它们以非文本方式编码,并不真正涉及二进制的0和1意义。

4
当谈到计算机中的文件时,实际上每个文件都是“二进制”的,因为它以磁盘上一系列1和0的序列的形式存储(即使是文本文件也是如此)。当你在文本编辑器中打开一个文件时,它会根据各种编码规则将这些字符分组成字符。如果文件确实是文本文件,那么这将给你可读的文本。然而,如果文件不是文本文件,文本编辑器将忠实地尝试解码比特流,但最终很可能会出现许多不可显示的字符,因为这些比特实际上不是字符的编码形式,而是CPU指令的编码形式。
至于你问题中提到的“二进制格式”的另一部分:有多种格式来布置可执行文件的各个部分,例如ELF或Windows DLL/EXE格式。这些格式都精确指定了可执行文件各个部分在文件中的位置(即元数据、符号表、入口点、静态数据和资源等的位置)。

2
Windows最常见的文件格式是PE;Linux则是ELF。它们都包含大部分相同的内容(数据段、代码段等),只是因为它们是分别设计的,所以有所不同。
需要注意的是,即使Windows和Linux使用相同的文件格式,它们仍然无法运行彼此的二进制文件,因为系统API和可用的DLLs/SOs完全不同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接