簡體   English   中英

為什么a.out不使用機器語言?

[英]Why isn't a.out in machine language?

我用gcc編譯以下程序,並接收輸出可執行文件a.out

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

當我執行cat a.out ,為什么文件是“亂碼”(這叫什么?)而不是機器語言0和1s:

??????? H__PAGEZERO(__TEXT__text__TEXT?`??__stubs__TEXT 
P__unwind_info__TEXT]P]__eh_frame__TEXT?H??__DATA__program_vars [continued]

該文件位於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 

第二列包含以十六進制表示的0和1,第三列包含助記符匯編程序指令。

如果要顯示那些0和1,只需鍵入:

xxd -b a.out

輸出示例:

 0000000: 01111111 01000101 01001100 01000110 00000010 00000001  .ELF..
 0000006: 00000001 00000000 00000000 00000000 00000000 00000000  ......

它采用某種可執行文件格式 在Linux上,可能是ELF ,在Mac OS X上,可能是Mach-O ,依此類推。 甚至還有a.out格式,但現在已經不那么普遍了。

不僅僅是機器指令-操作系統需要一些有關如何加載它,要附加到哪個動態庫的信息,等等。

字符也是由0和1組成的,計算機無法知道它們之間的差異。 您要求它顯示文件,但確實如此。

除了機器指令之外,二進制文件還包含布局和可選的調試信息,這些信息可以是可讀的字符串。

a.out采用您正在使用的操作系統的加載程序可以理解的格式。 您看到的那些不同的文本是您期望的0和1的不同部分的標記。

? 和`顯示有二進制不可打印數據的位置。

目前,Linux系統上的典型格式是ELF。 ELF文件可能包含機器代碼,您可以使用objdump實用程序進行檢查。

$ gcc main.c
$ objdump -d -j .text a.out

a.out:     file format elf64-x86-64


Disassembly of section .text:

00000000004005ac :
  4005ac:       55                      push   %rbp
  4005ad:       48 89 e5                mov    %rsp,%rbp
  4005b0:       bf 6c 06 40 00          mov    $0x40066c,%edi
  4005b5:       e8 d6 fe ff ff          callq  400490 
  4005ba:       5d                      pop    %rbp
  4005bb:       c3                      retq   
  4005bc:       0f 1f 40 00             nopl   0x0(%rax)

看到? 機器碼。 objdump實用程序有助於以十六進制格式將其打印出來,並在右側顯示相應的未分配代碼,並在左側顯示地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM