为什么机器语言不是a.out?

jay*_*ynp 0 c executable machine-language

我编译以下程序gcc并接收输出可执行文件a.out.:

#include <stdio.h>
int main () {
  printf("hello, world\n");
}
Run Code Online (Sandbox Code Playgroud)

当我执行时cat a.out,为什么文件是"乱码"(这叫什么?)而不是0和1的机器语言:

??????? H__PAGEZERO(__TEXT__text__TEXT?`??__stubs__TEXT 
P__unwind_info__TEXT]P]__eh_frame__TEXT?H??__DATA__program_vars [continued]
Run Code Online (Sandbox Code Playgroud)

Ada*_*der 11

该文件为0和1,但是当您使用文本编辑器打开它时,这些位按字节分组,然后作为文本处理;)在Linux中,您可以尝试反汇编输出文件以确保它包含机器指令(x86体系结构) :

objdump -D -mi386 a.out

示例输出:

1:  83 ec 08                sub    $0x8,%esp
4:  be 01 00 00 00          mov    $0x1,%esi
9:  bf 00 00 00 00          mov    $0x0,%edi 
Run Code Online (Sandbox Code Playgroud)

第二列包含十六进制表示的0和1,第三列包含助记符汇编程序指令.

如果你想显示那些0和1,只需输入:

xxd -b a.out

示例输出:

 0000000: 01111111 01000101 01001100 01000110 00000010 00000001  .ELF..
 0000006: 00000001 00000000 00000000 00000000 00000000 00000000  ......
Run Code Online (Sandbox Code Playgroud)

  • 您还应该提到每个文件都是这种情况,而不仅仅是可执行文件. (3认同)
  • 是的,没有模拟文件这样的东西,所以每个文件都由二进制数字(位)组成.机器代码,文本文件,源文件,目标文件,数据库.都是二进制文件. (2认同)

Car*_*rum 5

它是某种可执行文件格式.在Linux上,它可能是ELF,在Mac OS X上它可能是Mach-O,依此类推.甚至有一种a.out格式,但它不再那么常见了.

它不仅仅是裸机指令 - 操作系统需要一些有关如何加载它的信息,附加到它的动态库等.

  • 虽然这是真的,但我认为你错过了OP的主要困惑.即使它是裸机指令,OP在文本编辑器中打开文件时肯定不会看到0和1(这是他显然预期的). (2认同)