编译对象的布局

时间:2010-01-26 10:55:53

标签: c++ c visual-c++ gcc

有没有办法 - 比如查看使用gcc -E进行预处理的结果 - 看看编译成目标文件后我的对象是什么样的?

我在谈论GCC,但包括MSVC的解决方案没问题。

6 个答案:

答案 0 :(得分:22)

对于Visual C ++:

我终于设法使用来自herehere的信息来挖掘MSVC ++支持的(隐藏得很好!)未记录的编译器标志。他们在这里:

/d1reportSingleClassLayoutXXX
/d1reportAllClassLayout

(用类名替换XXX

答案 1 :(得分:6)

对于GCC编译的可执行文件,checkout Pahole。它将向您展示编译器如何布置您的结构/类以及它们中是否有“漏洞”。由于内存对齐规则,孔是填充的。

答案 2 :(得分:0)

目标文件包含二进制数据 - 大多数编译器可以输出的唯一更高级别是汇编程序,所以如果你不能读到你运气不好。但是,请查看this question了解此区域的更多信息。

答案 3 :(得分:0)

您可以使用地图文件检查二进制文件及其内容的布局。对VC使用/MAP,为gcc使用-Map--print-map

答案 4 :(得分:0)

你的问题有点令人困惑。

如果您想查看使用MSVC进行预处理的结果,可以使用/E/P//EP

MSVC中有一个未记录的选项,用于显示结构和类的数据布局。我现在无法找到它。

答案 5 :(得分:0)

构造函数只是另一个函数(除非它是内联的)。对象文件包含链接器的大量信息;所以你应该能够在.a文件中找到该函数(虽然函数名称会被破坏)。