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();
}