二进制文件和操作系统

时间:2010-01-10 17:06:58

标签: c++ windows linux macos binary

我目前正在学习C ++,还有一些我不太了解的基本内容,以及我在不同搜索引擎上找不到任何有用的内容。

  • 因为所有操作系统的可执行程序(Windows / Linux / Mac)都有不同的“二进制格式” - 有什么区别?我的意思是它们都是二进制的,但是除了所有的OS API之外还有什么真的不同吗?

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

祝你好运, 喇嘛

4 个答案:

答案 0 :(得分:7)

Windows / Linux的可执行文件的不同之处在于:

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

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

答案 1 :(得分:7)

Windows(PE),Linux(ELF),OS / X等(MACH-O)的可执行文件格式往往旨在解决常见问题,因此它们都具有共同的功能。但是,每个平台都指定了不同的标准,因此即使平台使用相同类型的CPU,这些文件也不会跨平台兼容。

可执行文件格式不仅用于可执行文件,还用于包含代码但从不直接由用户运行的库 - 仅加载到内存中以满足直接可执行二进制文件的需要。

可执行文件格式的共同特征:

  • 一个或多个可执行代码块
  • 一个或多个只读数据块,如文本和数字
  • 一个或多个读/写数据块
  • 有关在运行应用程序时将这些块放在内存中的说明
  • 还需要加载有关哪些库(也是“可执行文件格式”)的说明,以及它们如何连接( link )到此可执行文件。
  • 将代码和数据位置映射到描述它们的字符串或id的一个或多个表,对链接和调试很有用。

将这些格式与更基本的格式进行比较很有意思,例如古老的DOS .com文件,它简单地描述了要在下一个可用位置加载的64K各种“东西”,并且具有很少的功能上面列出的。

这种意义上的二进制用于将它们与以文本格式编写的“源”文件进行比较。二进制格式只是说它们是以非文本方式编码的,并不真正与0和1二进制意义相关。

答案 2 :(得分:4)

当你了解它时,计算机中的每个文件都是“二进制”的,因为它在磁盘上存储为1和0的序列(甚至是文本文件)。在文本编辑器中打开文件时,它会根据各种编码规则将这些字符分组为字符。现在,如果文件实际上是一个文本文件,这将为您提供可读文本。但是,如果文件不是,文本编辑器将忠实地尝试和解码比特流,但很可能最终会有很多不可显示的字符,因为这些字节实际上不是字符的编码形式,而是CPU指令

至于你的问题的另一部分,关于“二进制格式”:有多种格式可以列出可执行文件的各个部分,例如ELF或Windows DLL / EXE格式。这些都准确地指定了文件在文件中的各个部分的位置(即元数据所在的位置,符号表所在的位置,入口点所在的位置,静态数据和资源所在的位置等)

答案 3 :(得分:2)

Windows最常见的文件格式为PE;对于Linux是ELF。它们都包含大部分相同的东西(数据段,代码段等),只是因为它们是分开设计而不同。

应该注意的是,即使Windows和Linux都使用相同的文件格式,它们仍然无法运行彼此的二进制文件,因为系统API和可用的DLL / SO完全不同。