我注意到,即使从可执行文件中删除符号后,类名称及其方法仍然包含在可执行文件的末尾。

例如:

#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)

评论


请记住,在某些情况下,运行时确实可能需要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

#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