私はこの質問に答えようとします。オブジェクト ファイルは、バイナリ 16 進エディタで直接比較できます。この方法で取得したものは、オブジェクト ファイルのほとんどがマシン コードであるため、人間が判読できるものではありません (まだリンクされていない場合は、リンカーのシンボルも含まれています)。この方法は、ちょっとしたこと (コード バージョンやファームウェアのビルド日など) を確認する場合にのみ役立ちます。大幅な変更の理解は、オブジェクト ファイルを逆アセンブルすることによってのみ達成できると思います。幸いなことに、Linux や UNIX のようにこの作業を行うツールが周りにありobjdump
、アセンブラーは単純ではない場合もありますが、少なくとも人間が読めるものです。Linux マシンを使用していると仮定すると、次のコマンドを実行できます。
objdump -d yourobjectfile1 > out1
objdump -d yourobjectfile2 > out2
そして結果を比較します。Cコードを少し変更すると、アセンブリコードが大幅に再調整される可能性があることがわかります。実験として、helloworld.cのレベルで作業することをお勧めします。
その他の提案
- -O0 でコンパイルすると、最適化が無効になるため、より簡単なアセンブリ (および c に似たもの) が作成されます。
- 実行可能またはリンクされた共有ライブラリ (マシンコードのみ) を試して、比較する前にオブジェクトを削除してください。これにより、サイズが縮小されます。
- 次の方法で、読みやすくする混合 C アセンブラー コードを作成できます。
gcc -g -c -fverbose-asm myfile.c; objdump -d -M intel -S ass.o > main.s
リスト項目