[英]Why is argv[1][0] not '?' for 'a.out ?' executed in a bash shell
[英]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 ......
字符也是由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.