2012-03-21 8 views
2

C/C++では、複数の依存関係(tinyxml、fft stuffなど)、テンプレート、非常にシンプルなCインターフェイスの後ろにきちんとラップされています。iOS静的ライブラリでのBIG C++プロジェクトのラップアップ:依存関係、ストリッピング&隠蔽

OSX用の動的ライブラリを構築するのはうまくいきました。希望のCインタフェースだけを残し、すべてのC++クラス/テンプレート/依存関係/ ...最後にエクスポート/表示されるシンボルはAPIコールです:OUR_LIBNAME_FUNC1、OUR_LIBNAME_FUNC2など

ただし、私たちはiOS静的ライブラリでも同じことをしたいと考えています。コードの混乱、コードの書き換え、objdump-ing、難読化などの大きな混乱に戻らずに、必要のないすべてのシンボルを隠す方法はありますか?特に、他の人が再利用する可能性のある外部ライブラリでは、複数のシンボル定義が生成されます。研究(主に、スタックオーバーフロー:-))の多くの後

私は一種の絶望的になってきています...

答えて

0

自分の質問に答える:私たちは、匿名の名前空間とコード合併に頼っ終わりに。

I.e.すべてのcpp/cコードは、大規模で比較的複雑な/醜いpythonスクリプトを使用して、大きなCファイルに統合されました。 CPPファイル内のすべての関数は匿名の名前空間にラップされ、エクスポートされた関数のみが名前空間の外部に残っていました。

その後、ライブラリの-S -xストリップを実行すると、ほとんどのジャンクがクリアされました。

I.e.

/************** AMALGAMATED CPP FILE **************/ 

/************** STD HEADERS **************/ 
#include "OurLibraryHeader.h" 
#include <cmath> 
#include <string> 
// more standard includes here and includes that aren't possible to do in the anonymous namespace 

/************** AMALGAM **************/ 
namespace { 
#include "OneofOurheaders1.h" 
#include "OneofOurheaders2.h" 
#include "SomeExternalLib.h" 

/************************* OneofOurImplementations.cpp *************************/ 
// included literally 

/************************* OneofOurImplementations2.cpp *************************/ 
// included literally 

// etc 
} 

int OneOfOurLibraryFunctions() 
{ 
} 

// etc 

これはむしろ汚れていますが、仕事が完了します。私はいくつかのLLVMの策略でこれを行うにはよりよい方法があると確信している ...

  • ブラム
0

OKを迎えて、私はこれに似た何かをすることに多くの時間を費やしました。これは完璧ではありませんが、これは私たちの目的のために十分に機能しました。

  1. C apiのトップレベルエントリポイントを1つのファイル "c_api.c"に置きます。
  2. リンカは
  3. 社内ライブラリ
  4. へのリンク前あなたのAPIにリンカーを使用しますが追加されますことを、「_」で単独行 上の各エントリポイントの名前のファイル「c_api.symbols」を作成します。このような

何か:

% cat c_api.c 
#include "libA.h" 
#include "libB.h" 
#include "libC.h" 

void init() 
{ 
    libA_startup(); 
} 

void run() 
{ 
    libB_execute(libA_context()); 
} 

void stop() 
{ 
    libA_shutdown(); 
    libB_end(); 
    libC_log(); 
} 
% cat c_api.symbols 
_init 
_run 
_stop 
% cc -c a_api.c 
% ld -x -r c_api.o libA.a libB.a libC.a -exported_symbols_list c_api.symbols -o c_api_hidden.o 
% ar r c_api.a c_api_hidden.o 
+0

これは試して興味深いものになるだろう...私は、これは物事を得るためにさらに多くの手順が必要としビルドする。以下に説明する私の方法は、完全なビルドを行い、その後にストリッピングすることによって動作します。 –

+0

追加の手順では、c APIのエクスポートを明示的にリストしています。 ldは、exported_symbols_listのシンボル以外のすべてを削除します。間違いなく、すべてを1つのファイルに入れるよりも恐ろしいことではありません。 "ar"のステップは、あなたが誰かに ".o"の代わりに ".a"を渡したければ、 – mtoy

関連する問題