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++ 代码时那样拆分秘密类的接口和实现,那么剥离的可执行文件中就没有不需要的符号。可悲的是,我得到了一个包含数千行代码的现有代码库,这不是我的选择之一。

我试过-fno-rtti,作为一个疯狂的猜测,但这并没有解决任何问题。我向谷歌众神祈祷,发现很多脱衣舞俱乐部的参考资料,但没有有用的链接。我浏览了 mac 上的 strip、g++ 和 ld 的手册页,没有明显的尝试,尽管“私人外部人员”这个短语很有趣,但我不知道该怎么做。

[更新]可悲的是,我尝试做一个小例子时出现了问题。这是一个更复杂的例子,它更接近真正的问题,如果它被优化构建,它仍然有不需要的符号。

我为不好的例子道歉。事实证明,很难找到最小的实际问题。非常感谢您的答案,但是,每个答案都使我接近解决方案。

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

这似乎可以按需要工作......:

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

听起来您真正想要的不是剥离可执行文件,而是混淆其符号表。我不确定,但也许这样的事情有所帮助。至少,“C++ 符号表混淆器”可能是一个更好的 Google 搜索字符串。

于 2009-12-21T20:01:20.163 回答
1

鉴于您发布的示例代码,添加“-O”优化标志会导致nm编译后不显示这些符号。

于 2009-12-19T02:25:00.220 回答