3

VS-android フレームワークを使用して、Microsoft Visual Studio 2012 + Android NDK から Android 共有オブジェクトを直接コンパイルしています。IDA を使用して自分の .so ファイルを逆アセンブルしたところ、すべてのコードが完全に表示されていることがわかり、ぞっとしました (関数の名前、データ バッファーの名前、クラスの名前など)。

コードを逆アセンブルして理解するのが難しくなるように、デバッグ シンボルと不要なシンボルをすべて削除したいと考えています。

コンパイル プロセスは次のとおりです。

  1. 10 個の C++ ファイルがあります。それぞれが .o ファイルにコンパイルされます
  2. 次に、main_service.c が main.o にコンパイルされ、他のすべての *.o ファイルに対してリンクされて、main_service.so ライブラリが生成されます。

次の解決策を試しましたが、うまくいきませんでした。

  1. 引数 -strip-all をコンパイラとリンカーに与えます。うまくいかないようです。
  2. リンク後、main_service.o で -strip-all を指定して objcopy.exe を呼び出します。これにより、main_serivce.so のサイズが少し小さくなりますが、シンボルは残ります。
  3. 私のC++コードでは、「attribute ((visibility()))」を使用していないため、おそらく問題は、リンカーがシンボルを削除できないことです。これは、何がプライベートで何が隠され、何がパブリックであるかを認識していないためです。JNIで使いたいmain_service.cの関数に「attribute ((visibility("default")))」をつけてみたり、コンパイラとリンカに-fvisibility=hiddenフラグをつけたりしました。しかし、警告が表示されました:「可視性」属性は無視されました [-Wattributes]、およびシンボルは削除されません

ここで何が欠けていますか?

追伸 - 私は「シンボルの削除」にまったく慣れていないので、質問が少しばかげている場合は申し訳ありません。

-

4

1 に答える 1