10

MacOs 10.6、以下を含むファイル「unwanted.c」がある場合:

class secret_thing {
public:
secret_thing() {}
void revealing_method_name() {}
};

main()
{
    secret_thing obj;
    obj.revealing_method_name();
}

今私がやります:

$ g++ unwanted.c -o unwanted
$ strip unwanted
$ nm unwanted | grep secret
0000000100000eb8 T __ZN12secret_thing21revealing_method_nameEv 
0000000100000eae T __ZN12secret_thingC1Ev

ほとんどの人が C++ コードを記述するときに行うように、シークレット クラスのインターフェイスと実装を分割すると、削除された実行可能ファイルに不要なシンボルはありません。悲しいことに、私は数千行のコードからなる既存のコード ベースを渡されましたが、これは私の選択の 1 つではありません。

勝手な推測で -fno-rtti を試してみましたが、何も解決しませんでした。Google の神々に祈ったところ、ストリップ クラブに関する情報はたくさん見つかりましたが、役立つリンクはありませんでした。Mac の strip、g++、および ld の man ページをざっと読んだところ、試してみるべき明らかなことはありませんでしたが、「プライベート外部」というフレーズは興味をそそられましたが、それについて何をすべきかわかりませんでした。

[更新] 悲しいことに、小さな例を作成しようとすると問題が発生することが判明しました。これは、実際の問題に近い、より複雑な例です。ビルドが最適化されている場合でも、不要なシンボルが残っています。

例えが悪くてすみません。実際の最小の問題を見つけるのは難しいことがわかりました。回答に感謝しますが、各回答は私を解決策に近づけます。

class base {
public:
    virtual int revealing_method_name() = 0;
    virtual ~base() {};
};

class secret_thing : public base {
public:
    int revealing_method_name() { return 0; };
};

class other_thing : public base {
public:
    int revealing_method_name() { return 1; };
};

int main(int argc, char**)
{
    base *object = 0;
    if( argc > 1 ) object = new secret_thing;
    else object = new other_thing;

    return object->revealing_method_name();
}
4

4 に答える 4

10

次のコンパイル行を使用して、実行可能ファイルからシンボルを正常に削除しました。

$ g++ -Xlinker -unexported_symbol -Xlinker "*" -o executable file.cpp
$ strip executable

最新のサンプル ファイルを指定すると、次のようになります。

$ nm executable
                 U __ZTVN10__cxxabiv117__class_type_infoE
                 U __ZTVN10__cxxabiv120__si_class_type_infoE
                 U __ZdlPv
                 U __Znwm
                 U ___cxa_pure_virtual
                 U ___gxx_personality_v0
0000000100000000 A __mh_execute_header
                 U _exit
                 U dyld_stub_binder
于 2009-12-21T23:16:20.797 に答える
2

あなたが本当に望んでいるのは、実行可能ファイルを削除することではなく、そのシンボル テーブルを難読化することのようです。よくわかりませんが、おそらくこのようなものが役立つでしょう。少なくとも、「C++ シンボル テーブルの難読化ツール」は、おそらくより優れた Google 検索文字列です。

于 2009-12-21T20:01:20.163 に答える
2

これは希望どおりに機能するようです...:

$ strip unwanted
$ nm unwanted | grep secret | cut -f 3 -d ' ' > /tmp/remove
$ strip -R /tmp/remove unwanted
于 2009-12-19T01:45:33.327 に答える
1

投稿したサンプルコードを前提として、「-O」最適化フラグを追加すると、nmコンパイル後にこれらのシンボルが表示されなくなります。

于 2009-12-19T02:25:00.220 に答える