二进制文件和操作系统

lam*_*mas 3 c++ linux windows binary macos

我目前正在学习C++,还有一些(基本的)我不知道的东西,以及我在不同搜索引擎上找不到任何有用的东西.

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

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

最好的问候,喇嘛

Car*_*icz 7

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

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

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


Ale*_*own 7

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

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

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

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

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

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