2

複数の依存関係 (tinyxml、fft など)、テンプレート、... C/C++ を含む巨大なコードベースがあり、そのすべてが非常に単純な C インターフェイスの背後にきちんとラップされています。

OSX 用の動的ライブラリを構築することは問題ありませんでした。ライブラリからすべての不要なシンボルを (strip -S -x を使用して) 簡単に取り除き、必要な C インターフェイスだけを残し、すべての C++ クラス / テンプレート / 依存関係を非表示にすることができたからです。最後に、エクスポート/表示される唯一のシンボルは、API 呼び出しです: OUR_LIBNAME_FUNC1、OUR_LIBNAME_FUNC2 など

ただし、iOS の静的ライブラリについても同じことを行いたいと考えており、アイデアが不足しています。コードの融合、コードの書き換え、objdump、難読化の大きな混乱に戻ることなく、不要な/必要なシンボルをすべて非表示にする方法はありますか? 特に、他の人によって再利用される可能性があり、複数のシンボル定義になる可能性のある外部ライブラリの場合!

多くの調査の後(主にスタックオーバーフロー:-))私は絶望的になっています...

挨拶する

4

2 に答える 2

0

私自身の質問に答える:結局、私たちは匿名の名前空間とコードの融合に頼りました。

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

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

つまり

/************** 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のトリックを使ってこれを行うためのより良い方法があると確信しています...

  • ブラム
于 2013-02-18T15:58:47.123 に答える
0

OK、私はこれに似たことをするのに多くの時間を費やしました. これは完全ではありませんが、目的には十分でした。

  1. C API の最上位エントリ ポイントを 1 つのファイル「c_api.c」に入れます。
  2. リンカが追加する「_」を使用して、行に各エントリ ポイントの名前を付けたファイル「c_api.symbols」を作成します。
  3. リンカーを使用して、API を内部ライブラリに事前リンクします

このようなもの:

% 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
于 2012-08-03T19:40:52.170 に答える