首页 > 解决方案 > 如何将 C++ 程序的编译逻辑与文件头数据的其余部分隔离开来?

问题描述

我想观察一个非常基本的 C++ 程序的两个版本之间编译的操作码二进制输出的差异。例如,2 + 2 = ?,没有调用任何库。我希望编译后的输出是一个带有一些小标题的二进制操作码的小文件,对于已编译的程序来说是新的,但是有很大的标题。

simple.cpp

int main()
{
    unsigned int a = 2;
    unsigned int b = 2;
    unsigned int c = a + b;
}

编译器:

g++ -std=c++0x simple.cpp -o simple

是否有一种我可以导出的格式不包含标题,只是我们指示机器执行的操作码二进制文件?如果不是,我可以在结果文件中查找哪些字节或位置以将相关逻辑与程序隔离?

我需要机器代码,而不是汇编,因为我的项目是分析源文件的不同混淆版本,以尝试基于另一个识别一个。一个具有可疑可行性的复杂主题,但这就是为什么我要求隔离机器代码而不仅仅是程序集 - 以测试对真实机器代码输出的分析。

我尝试用谷歌搜索标题结构,但似乎找不到太多信息。

标签: c++binaryg++

解决方案


看到ld(1): GNU linker - Linux man page,你会发现你可以使用--oformat=output-format选项来指定输出格式。

binary是一种没有标题的格式。

然后,查看gcc(1): GNU project C/C++ compiler - Linux man page,您会发现可以使用-Wloption 将选项传递给链接器。 -nostdlib选项对于避免添加额外的东西也很有用。

结合这些,你可以试试这个命令:

g++ -std=c++0x simple.cpp -nostdlib -Wl,--oformat=binary -o simple

推荐阅读