C语言 已编译对象的布局

jslywgbw  于 2023-06-21  发布在  其他
关注(0)|答案(7)|浏览(104)

有没有一种方法类似于使用gcc -E查看预处理的结果来查看对象编译成目标文件后的样子?
我说的是GCC,但包括MSVC的解决方案也不错。

nbysray5

nbysray51#

对于Visual C++:

我终于设法挖出了(隐藏得很好!))MSVC++支持使用来自herehere的信息的未记录编译器标志。以下是:

/d1reportSingleClassLayoutXXX
/d1reportAllClassLayout

(将XXX替换为类名)

smdncfj3

smdncfj32#

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

pgccezyw

pgccezyw3#

目标文件包含二进制数据-大多数编译器可以输出的唯一更高级别是汇编程序,所以如果你不能阅读,你就倒霉了。但是,请查看this question以了解这方面的更多信息。

qf9go6mv

qf9go6mv4#

你的问题有点令人困惑。
如果您想查看MSVC预处理的结果,可以使用/E/P//EP
MSVC中有一个未记录的选项,用于显示结构和类的数据布局。我现在找不到它。

vaj7vani

vaj7vani5#

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

gblwokeq

gblwokeq6#

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

gmxoilav

gmxoilav7#

如果你想了解对象字段的内存布局(其他答案似乎暗示了这一点),那么有一个visual studio扩展可以做到这一点:Struct Layout by Ramon Viladomat(也可通过Github获得)
这将在您右键单击结构定义时添加一个上下文项,这将打开内存布局可视化工具窗口。
显示内容如下所示:

它有它的怪癖,我一直在努力在一些大型项目中正确设置它,但当它工作时,它非常有用。
MS developer community forums上还有一个打开的特性请求票据,用于在默认情况下将特性添加到编辑器中。如果你想让它吸引眼球,请投赞成票。

相关问题