3

したがって、32ビット環境では「.c」ファイルをコンパイルします。

       A.c and get A.o

あおを救います。

Ac に次のような変数があるとします。

     int a // i change this to long a;

変更後、コンパイルして別の Ao を取得します

「 cmp Ao Ao 」を実行すると、これらのファイルが異なることがわかります。ここで私の質問は、「.o」ファイルを比較することで正確に何が変更されたかを見つけることができますか.

アセンブリ コードを取り出して diff を実行していますが、頭と尻尾を作ることができません。誰かがよりスマートな方法を提案できますか。

4

1 に答える 1

4

私はこの質問に答えようとします。オブジェクト ファイルは、バイナリ 16 進エディタで直接比較できます。この方法で取得したものは、オブジェクト ファイルのほとんどがマシン コードであるため、人間が判読できるものではありません (まだリンクされていない場合は、リンカーのシンボルも含まれています)。この方法は、ちょっとしたこと (コード バージョンやファームウェアのビルド日など) を確認する場合にのみ役立ちます。大幅な変更の理解は、オブジェクト ファイルを逆アセンブルすることによってのみ達成できると思います。幸いなことに、Linux や UNIX のようにこの作業を行うツールが周りにありobjdump、アセンブラーは単純ではない場合もありますが、少なくとも人間が読めるものです。Linux マシンを使用していると仮定すると、次のコマンドを実行できます。

objdump -d yourobjectfile1 > out1
objdump -d yourobjectfile2 > out2

そして結果を比較します。Cコードを少し変更すると、アセンブリコードが大幅に再調整される可能性があることがわかります。実験として、helloworld.cのレベルで作業することをお勧めします。

その他の提案

  1. -O0 でコンパイルすると、最適化が無効になるため、より簡単なアセンブリ (および c に似たもの) が作成されます。
  2. 実行可能またはリンクされた共有ライブラリ (マシンコードのみ) を試して、比較する前にオブジェクトを削除してください。これにより、サイズが縮小されます。
  3. 次の方法で、読みやすくする混合 C アセンブラー コードを作成できます。gcc -g -c -fverbose-asm myfile.c; objdump -d -M intel -S ass.o > main.s

リスト項目

于 2013-11-25T22:16:36.057 に答える