2016-09-14 5 views
-2

Os Xでは、作成したCプログラムをgcc -o binaryoutName inputfileでコンパイルし、結果のバイナリ "Exec"ファイルに対して16進ダンプを実行しました。私が理解しているように、ExecファイルはUNIXの実行可能ファイルです。これは、実行可能ファイルのUNIXに相当します。UNIX Executableファイル 'Exec'、アセンブリではなくCコードを示しています

私はコマンドxxd -b binaryを使用して進ダンプを実行したとき、それはしかし、このASCIIは私が最初に.CファイルをプログラムリテラルのCコードを表し、バイナリのASCIIコンテンツを返さ

進ダンプエキス。:

0007c4a: 01101100 01110101 01110011 01101000 00000000 01011111 lush._ 0007c50: 01100110 01101111 01110000 01100101 01101110 00000000 fopen. 0007c56: 01011111 01100110 01110000 01110010 01101001 01101110 _fprin 0007c5c: 01110100 01100110 00000000 01011111 01100111 01100101 tf._ge 0007c62: 01110100 01100011 01101000 01100001 01110010 00000000 tchar. 0007c68: 01011111 01100111 01100101 01110100 01100011 01110111 _getcw 0007c6e: 01100100 00000000 01011111 01100111 01100101 01110100 d._get 0007c74: 01100101 01101110 01110110 00000000 01011111 01101100 env._l 0007c7a: 01101111 01100011 01100001 01101100 01110100 01101001 ocalti 0007c80: 01101101 01100101 00000000 01011111 01101101 01100101 me._me 0007c86: 01101101 01100011 01110000 01111001 00000000 01011111 mcpy._ 0007c8c: 01110000 01110010 01101001 01101110 01110100 01100110 printf 0007c92: 00000000 01011111 01110000 01110101 01110100 01100011 ._putc 0007c98: 01101000 01100001 01110010 00000000 01011111 01110011 har._s 0007c9e: 01100011 01100001 01101110 01100110 00000000 01011111 canf._ 0007ca4: 01110011 01101100 01100101 01100101 01110000 00000000 sleep.

右端の列のASCII変換は、私が最初にコンパイルされた.cファイル内のコードに非常に似ていることに注意してください。 これは、コンパイラが論理的にもコンパイルするアセンブラコードのASCIIバイナリを16進ダンプに含めることを期待していたため、直感的でした。

これはコンパイルプロセスの理解の極限にある質問であり、私はいくつかの間違った詳細があることを期待しています。

私の質問:なぜ、16進ダンプがアセンブリの代わりにCコードのASCIIを返すのですか?

ありがとうございました。

+4

あなたがプログラムと正確な出力のサンプルをコンパイルする方法私たちを示していない場合はどのように我々はおそらく言うことができますか?おそらく、いくつかのコマンドを間違って実行しているかもしれません。実際のデータを表示しない限り、何も確認できません。 – kaylum

+2

あなたはどのように 'gcc'を呼び出しましたか? – Serge

+0

コマンドは 'gcc -o BinaryOuputfile FilenameInput'でした。コンパイル時にコマンドの構文が正しいので、質問を書くときに間違いました。現在、16進ダンプ抽出が含まれています。 – user4493605

答えて

0

文字列を含む実行可能ファイルまたはオブジェクトファイルのセクション(またはそれに類似するセクション)が.strtabであると思います。

#include <stdio.h> 

int main(void) 
{ 
    printf("Hello world!\n"); 
} 

次のコマンドでコンパイル:

$ xxd a.out 
... 
00022e0: 0000 0000 0000 0000 0063 7274 7374 7566 .........crtstuf 
00022f0: 662e 6300 5f5f 4a43 525f 4c49 5354 5f5f f.c.__JCR_LIST__ 
0002300: 0064 6572 6567 6973 7465 725f 746d 5f63 .deregister_tm_c 
0002310: 6c6f 6e65 7300 7265 6769 7374 6572 5f74 lones.register_t 
0002320: 6d5f 636c 6f6e 6573 005f 5f64 6f5f 676c m_clones.__do_gl 
... 
:我々はそれをhexdumpに対してならば、私たちのようなものを見つけるでしょう

gcc -Wall -g -std=c11 c00.c 

次のCプログラムの例

そして、セクション関連情報は

$ readelf -WS a.out 
... 
    [34] .strtab   STRTAB   0000000000000000 0022e8 000235 00  0 0 1 

特記事項.strtabのオフセットは0x0022e8で、これは出力から見たものと一致します(xxd)。

0

Cコードではなく、実行可能ファイルまたはオブジェクトファイルのシンボルテーブル(外部リンクプロパティを持つシンボル)が表示されます。シンボルテーブルの場合、コンパイラは、リンク可能なファイルを生成したり、デバッグを容易にする目的で、シンボルテーブルのためにそれを生成します。

実行可能ファイルでは、これらのシンボルは必須ではなく、オブジェクトファイルを削除してリンクできない場合は、コマンドで簡単に削除できます。

nmなどのコマンドを使用して、シンボルテーブルの内容をよりわかりやすい形式で表示できます。

読むコンパイラはオブジェクトファイルをリンクする方法stripnmコマンドのオンラインマニュアル、...

関連する問題