编译对象的布局
有没有办法 – 就像用gcc -E
查看预处理的结果一样,看看我的对象在编译成目标文件后会是什么样子?
我说的是GCC,但包括MSVC在内的解决方案没问题。
对于Visual C ++:
我终于设法使用来自这里和这里的信息来挖掘MSVC ++支持的(隐藏得很好!)未记录的编译器标志。 他们来了:
/d1reportSingleClassLayoutXXX /d1reportAllClassLayout
(用类名替换XXX
)
对于GCC编译的可执行文件,签出Pahole 。 它将向您展示编译器如何布置您的结构/类以及它们中是否有“漏洞”。 由于内存对齐规则,孔是填充的。
对象文件包含二进制数据 – 大多数编译器可以输出的唯一更高级别是汇编程序,因此如果您无法读取,那么您运气不好。 但是,请查看此问题以获取此领域的更多信息。
你的问题有点令人困惑。
如果要查看使用MSVC进行预处理的结果,可以使用/E
, /P/
或/EP
。
在MSVC中有一个未记录的选项来显示结构和类的数据布局。 我现在很难找到它。
您可以使用映射文件检查二进制文件及其内容的布局。 对VC和-Map
使用/MAP
或为gcc使用--print-map
。
构造函数只是另一个函数(除非它是内联的)。 对象文件包含链接器的大量信息; 所以你应该能够在.a文件中找到该函数(虽然函数名称会被破坏)。