分解

2012-05-08 6 views
-3

可能性の重複:
How do you get assembler output from C/C++ source in gcc?分解

私は素朴な疑問を持っています。

私は、Androidアプリケーションのために書かれたネイティブのC++コードをいくつか持っています。

Eclipseでプロジェクトをコンパイルするときに、GCCコンパイラがどのようなアセンブリコードを生成するかはわかりますか?

+0

こんにちはブライアン、 これはAndroidのNDKのコンテキストでは異なる質問です。私はcygwinとEclipseのセットアップを介してGCCコンパイラを使用しています。 それでは、私のプロジェクトで.cファイルとC++ファイルをコンパイルするためにmakefileを使っているcygwinのGCCコンパイラに余分なパラメータを渡すべきかどうかはわかりません。 あなたはそのことを手がかりに教えてください。 – revolutionary

答えて

8

複数の方法で実行できます。

  1. Android.mkLOCAL_CFLAGSに-Sフラグを追加します。その後、run ndk-build。しかし、これは最初のファイルで失敗するので、後のファイルでアセンブラコードを取得することはありません。
  2. arm-linux-androideabi-gcc -S file.cppを必要なファイルのコマンドラインから手動で呼び出します。さらに、正しいインクルード定義を渡す必要があるかもしれません。 ndk-build V=1を実行して、使用するコマンドラインを正確に確認してください。
  3. 共有ライブラリ(.soファイル)を取得するために通常ビルドを実行します。そしてarm-linux-androideabi-objdump -d libYourLibrary.so >disasm.txtを実行してください。これにより、1つの.cppファイルだけでなく、ライブラリ全体が分解されます。
+0

ありがとう。 リンク処理に失敗したと言ったように、#1は私のためには機能しません。 #2の場合、gcc -sオプションを試しましたが、正しいインクルード定義を与える方法はわかりません。 NDKビルドの-Vオプションは有効と認識されません。 #3の場合、オブジェクトの.oファイルにobjdumpを使用する方法を見つけました。 これは正常に動作しており、対応する.cppファイルの行番号を表示するために追加の "-l"オプションを使用します。さて、ダンプファイルにはすべての.cpp行のアセンブラコードが含まれていますが、いくつかの行は複数回繰り返されます。これは、これらの行に他の関数を呼び出すことですか? 答えてください。 – revolutionary

+0

いくつかの出力例: D:\開発\ワークスペース\ Quake3 \ Quake3/JNI /エンジン/ frustum.cpp:253 20: MOVS \t R3、#2 D:\開発\ワークスペース\ Quake3 \ Quake3 /jni/engine/frustum.cpp:251 22: STR \t R1、[SP、#24] 24: LDR \t R2、[R 2、#8] 26: STR \t r2、[sp、#20] 28:\t 6a40 \tldr \t r0、[r0、#36] \t; 0x24 D:¥Development¥Workspace¥Quake3¥Quake3/jni/engine/frustum。CPP:256 2A: MOVS \t R2、0# C:\開発\ワークスペース\ Quake3 \ Quake3/JNI /エンジン/ frustum.cpp:\t R2、[SP、#4] D STR :253 2e:\t 930b \t str \t r3、[sp、#44] \t; 0x2c 30:\t 1c06 \t \t r6、r0、#0 – revolutionary

+0

私の素敵な人を助けてください – revolutionary