例如:
#include <iostream>
using namespace std;
class Clingons
{
public:
void clingForever()
{
cout << "Qapla" << endl;
}
};
int main(int argc, char *argv[])
{
Clingons cling;
cling.clingForever();
return 0;
}
然后编译并链接: ,我可以看到“ Clingons”类名称及其方法。即使在我剥离它们之后,我也可以在调试时看到此信息。
即使在我将它们剥离后,也仍然可以看到这些信息:
br />
那么当我使用上面的命令时为什么没有删除这些信息?除了手动以外,还有其他方法可以剥离(或篡改)此信息吗?
使用的GCC版本是
i686-apple-darwin10-llvm-g++-4.2 (GCC) 4.2.1
这只是一个示例。我真正的项目涉及Qt框架。
#1 楼
尝试使用选项
-fno-rtti
编译代码。更新:这确实是RTTI。
我不知道它是如何工作的,但是我成功删除了这些字符串,如下所示:
$ g++ -Xlinker -unexported_symbol -Xlinker "*" -o executable file.cpp
$ strip executable
https://stackoverflow.com/questions/1931626/how-to-really-strip-a-binary-in-macos)
#2 楼
尝试将程序编译为静态程序集,然后使用编译器将其剥离。在生成的可执行文件中找不到任何“粘贴”引用。$ g++ -static -s cling.cpp -o cling
$ ls -l cling*
-rwxr-x--- 1 lornix lornix 1,313,792 Jun 22 19:19 cling*
-rw-r----- 1 lornix lornix 222 Jun 22 19:16 cling.cpp
$ strings -a cling | grep -ic cling
0
评论
我尝试了您的建议,但无法构建:无法找到以下文件:-lcrt0.o ...此外,我的实际项目使用的是Qt框架,因此除非购买商业许可证,否则无法构建静态文件。
–user2005
14年6月24日在2:44
#3 楼
工具箱ELFKicker有一个名为sstrip
的实用程序,可将ELF可执行文件剥离到最底层。因此,我建议您查看sstrip
的源代码并构建自己的剥离器。 您还可以查看Mach-O的
strip
命令的源代码并获得启发。而且,这个Python脚本strip_save_dsym
也可能会给出一些提示。最后,这是ELF和Mach-O格式之间的一些比较:链接:ELF vs. Mach-O
动态符号表对决:ELF vs. Mach-O,第2轮
制作微型Mach-O可执行文件
评论
尽管您的答案没有提供即时解决方案,但它大胆,我非常喜欢。学习条带看起来很有趣,也许我最终会为这项工作创建自己的特殊工具。
–user2005
14年6月24日在3:04
谢谢,但我也完全同意您将WS答案标记为答案的选择!我的最多是有关该主题的一些补充信息。
–恐怖
14年6月24日在6:30
评论
请记住,在某些情况下,运行时确实可能需要RTTI。
– 0xC0000022L♦
2014年6月23日下午6:25
我知道这一点(我对接受的答案进行了评论),但似乎并没有从我当前的Qt项目中删除所有内容。
–user2005
14年6月24日在2:36
@Access被拒绝:默认情况下,Qt库上的RTTI被禁用,因此我认为禁用它不会导致问题。我尝试通过-fno-rtti禁用它,但它没有执行任何操作。
–user2005
14年6月24日在2:38
经过进一步检查,我意识到此解决方案确实有效。它的确在外部库中保留了对类和函数的引用,但我自己的代码中没有。
–user2005
14年6月24日在2:53