VS-android フレームワークを使用して、Microsoft Visual Studio 2012 + Android NDK から Android 共有オブジェクトを直接コンパイルしています。IDA を使用して自分の .so ファイルを逆アセンブルしたところ、すべてのコードが完全に表示されていることがわかり、ぞっとしました (関数の名前、データ バッファーの名前、クラスの名前など)。
コードを逆アセンブルして理解するのが難しくなるように、デバッグ シンボルと不要なシンボルをすべて削除したいと考えています。
コンパイル プロセスは次のとおりです。
- 10 個の C++ ファイルがあります。それぞれが .o ファイルにコンパイルされます
- 次に、main_service.c が main.o にコンパイルされ、他のすべての *.o ファイルに対してリンクされて、main_service.so ライブラリが生成されます。
次の解決策を試しましたが、うまくいきませんでした。
- 引数 -strip-all をコンパイラとリンカーに与えます。うまくいかないようです。
- リンク後、main_service.o で -strip-all を指定して objcopy.exe を呼び出します。これにより、main_serivce.so のサイズが少し小さくなりますが、シンボルは残ります。
- 私のC++コードでは、「attribute ((visibility()))」を使用していないため、おそらく問題は、リンカーがシンボルを削除できないことです。これは、何がプライベートで何が隠され、何がパブリックであるかを認識していないためです。JNIで使いたいmain_service.cの関数に「attribute ((visibility("default")))」をつけてみたり、コンパイラとリンカに-fvisibility=hiddenフラグをつけたりしました。しかし、警告が表示されました:「可視性」属性は無視されました [-Wattributes]、およびシンボルは削除されません
ここで何が欠けていますか?
追伸 - 私は「シンボルの削除」にまったく慣れていないので、質問が少しばかげている場合は申し訳ありません。
-