【问题标题】:Layout of compiled objects编译对象的布局
【发布时间】:2011-01-09 11:32:27
【问题描述】:

有没有办法——就像查看使用gcc -E 的预处理结果一样——查看我的对象在编译成目标文件后的样子?

我说的是 GCC,但包含 MSVC 的解决方案就可以了。

【问题讨论】:

  • 好点约翰。构造函数将是代码,并且像所有代码一样属于类,而不是单个对象。因此,您不会在对象布局中找到它。
  • 您可以使用g++ -S file.cppfile.s 中获取汇编程序输出。这是你想要的吗?

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


【解决方案1】:

对于 Visual C++:

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

/d1reportSingleClassLayoutXXX
/d1reportAllClassLayout

(将XXX替换为类名)

【讨论】:

  • 其他可能进入此任务的注意事项:此开关将直接输出到构建输出窗口。因此,将其添加到 .cpp 属性“命令行 > 附加选项”中。如果您想要的类/结构没有出现在列表中(尽管它已在头文件中声明),我在 cpp 中声明了一个新类并使其继承自该类,这对我来说完成了这项工作。
【解决方案2】:

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

【讨论】:

【解决方案3】:

目标文件包含二进制数据 - 大多数编译器可以输出的唯一更高级别是汇编程序,因此如果您无法读取,那您就不走运了。不过,请查看this question 以了解有关此领域的更多信息。

【讨论】:

    【解决方案4】:

    你的问题有点混乱。

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

    MSVC 中有一个未记录的选项来显示结构和类的数据布局。我现在很难找到它。

    【讨论】:

    • >MSVC 中有一个未记录的选项来显示结构和类的数据布局。我现在很难找到它。这正是我要找的!
    • 我终于找到了这些开关:/d1reportSingleClassLayoutXXX/d1reportAllClassLayout
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-28
        • 2011-07-21
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-27
        • 2013-06-26
        相关资源
        最近更新 更多