0

次のプログラムをコンパイルしてgcc、出力実行可能ファイルを受け取りますa.out。:

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

を実行する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]
4

5 に答える 5

13

ファイルは 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 

2 番目の列には 0 と 1 が 16 進表記で含まれ、3 番目の列にはニーモニック アセンブラー命令が含まれます。

これらの 0 と 1 を表示するには、次のように入力します。

xxd -b a.out

出力例:

 0000000: 01111111 01000101 01001100 01000110 00000010 00000001  .ELF..
 0000006: 00000001 00000000 00000000 00000000 00000000 00000000  ......
于 2012-12-27T20:40:16.717 に答える
5

ある種の実行可能ファイル形式です。Linux ではおそらくELFであり、Mac OS X ではおそらくMach-Oなどです。a.outフォーマットもありますが、あまり一般的ではありません。

単なるマシン命令ではありません。オペレーティング システムは、それをロードする方法、どの動的ライブラリをアタッチするかなどについての情報を必要とします。

于 2012-12-27T20:40:22.820 に答える
1

文字も 0 と 1 でできており、コンピュータはその違いを知ることができません。ファイルを表示するように要求したところ、表示されました。

マシン命令に加えて、バイナリ ファイルには、読み取り可能な文字列であるレイアウトとオプションのデバッグ情報も含まれています。

于 2012-12-27T20:40:57.853 に答える
1

a.out は、使用している OS のローダーが理解できる形式です。表示されるさまざまなテキストは、予想される 0 と 1 のさまざまな部分のマーカーです。

および `は?、印刷できないバイナリ データがある場所を示しています。

于 2012-12-27T20:41:08.217 に答える
0

最近の Linux システムの典型的な形式は ELF です。objdumpELF ファイルには、ユーティリティで調べることができるマシン コードが含まれている場合があります。

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

a.out: ファイル形式 elf64-x86-64


セクション .text の分解:
(簡潔にするためにコードは省略されています)
00000000004005ac :
  4005ac: 55 プッシュ %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 ポップ %rbp
  4005bb: c3 retq   
  4005bc: 0f 1f 40 00 nopl 0x0(%rax)

見る?マシンコード。ユーティリティはobjdump、対応する逆アセンブルされたコードを右側に、アドレスを左側に 16 進数で出力します。

于 2012-12-27T20:48:27.103 に答える