如何在 MacOs 中真正剥离二进制文件
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1931626/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to REALLY strip a binary in MacOs
提问by mtoy
MacOs 10.6, if I have a file "unwanted.c" which contains:
MacOs 10.6,如果我有一个文件“unwanted.c”,其中包含:
class secret_thing {
public:
secret_thing() {}
void revealing_method_name() {}
};
main()
{
secret_thing obj;
obj.revealing_method_name();
}
Now I do:
现在我这样做:
$ g++ unwanted.c -o unwanted
$ strip unwanted
$ nm unwanted | grep secret
0000000100000eb8 T __ZN12secret_thing21revealing_method_nameEv
0000000100000eae T __ZN12secret_thingC1Ev
If I split out the interface and implementation of the secret class, as most people do when writing C++ code, then there are no unwanted symbols in the stripped executable. Sadly, I am handed an existing code base of many thousand lines of code and this isn't one of my choices.
如果我像大多数人在编写 C++ 代码时那样拆分秘密类的接口和实现,那么剥离的可执行文件中就没有不需要的符号。可悲的是,我收到了一个包含数千行代码的现有代码库,这不是我的选择之一。
I have tried -fno-rtti, as a wild guess, and that didn't fix anything. I have prayed to the Google gods and found many references to strip clubs, but no helpful links. I have skimmed the man pages for strip, g++, and ld on the mac, and there were no obvious things to try, though the phrase "private externs" was intriguing, I couldn't figure out what to do about that.
我试过 -fno-rtti,这是一个疯狂的猜测,但没有解决任何问题。我向谷歌众神祈祷,发现了许多脱衣舞俱乐部的参考资料,但没有有用的链接。我已经浏览了 mac 上关于 strip、g++ 和 ld 的手册页,没有明显的东西可以尝试,尽管“私人外部人员”这句话很有趣,但我不知道该怎么做。
[ update ] Sadly, there turns out to be a problem with my attempt to make a small example. Here is a more complicated example, which is closer to what the real problem is, which still has unwanted symbols if it is built optimized.
[更新] 遗憾的是,我尝试做一个小例子时出现问题。这是一个更复杂的例子,它更接近真正的问题,如果它被构建优化,它仍然有不需要的符号。
I apologize for the bad examples. It turns out to be hard to find the smallest actual problem. Many thanks for the answers, though, each answer pushes me close to a solution.
我为不好的例子道歉。事实证明,很难找到最小的实际问题。非常感谢您的答案,但是,每个答案都使我接近解决方案。
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();
}
采纳答案by mtoy
Using the following compile line I successfully strip the symbols from the executable:
使用以下编译行,我成功地从可执行文件中去除了符号:
$ g++ -Xlinker -unexported_symbol -Xlinker "*" -o executable file.cpp
$ strip executable
Given the latest sample file, this results in:
鉴于最新的示例文件,这将导致:
$ 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
回答by Jeremy Friesner
It sounds like what you really want isn't to strip the executable, but to obfuscate its symbol table. I'm not sure, but perhaps something like thiswould be helpful. At least, "C++ symbol table obfuscator" is probably a better Google search string..
听起来您真正想要的不是剥离可执行文件,而是混淆其符号表。我不知道,但也许像这将是有益的。至少,“C++ 符号表混淆器”可能是一个更好的谷歌搜索字符串。
回答by Alex Martelli
This seems to work as desired...:
这似乎按预期工作......:
$ strip unwanted
$ nm unwanted | grep secret | cut -f 3 -d ' ' > /tmp/remove
$ strip -R /tmp/remove unwanted
回答by Ciarán Walsh
Given the example code you've posted, adding the ‘-O' optimisation flag results in those symbols not being shown by nm
after compilation.
鉴于您发布的示例代码,添加“-O”优化标志会导致nm
编译后不显示这些符号。