如何将 C++ 程序的编译逻辑与文件 header 数据的其余部分隔离开来?

How can I isolate the compiled logic of a C++ program from the rest of the file header data?

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

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

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

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

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

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

binary 是一种没有 headers.

的格式

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

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

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