【问题标题】:objdump doesn't show size for ostream classobjdump 不显示 ostream 类的大小
【发布时间】:2014-08-30 12:05:28
【问题描述】:

我有这个代码:

#include <iostream>

int main()
{
    std::cout << sizeof(std::cout) << std::endl;
    return 0;
}

g++ -g main.cpp 编译它(它在我的操作系统上打印 272)

之后我执行objdump --dwarf=info a.out 并查看ostream 的下一个调试信息条目(死):

<2><c5a>: Abbrev Number: 41 (DW_TAG_class_type)
<c5b>   DW_AT_name        : (indirect string, offset: 0x5fa): basic_ostream<char, std::char_traits<char> >
<c5f>   DW_AT_declaration : 1
<c60>   DW_AT_sibling     : <0xc77>

实际上ostream 只是basic_ostream&lt;char, std::char_traits&lt;char&gt;&gt; 的typedef Die 不包含大小属性(DW_AT_byte_size),我不明白为什么。可执行文件中没有其他用于 ostream 类的 die-s,但编译器应该知道该类的大小(它使用sizeof 打印大小)。所以我的问题是:我怎样才能从带有objdump 的矮人信息中获得ostream 类的正确大小。

【问题讨论】:

标签: c++ linux elf dwarf


【解决方案1】:

根据spec DW_AT_Declaration 表示DIE 描述的是声明而不是定义;您需要查看包含定义的目标文件。

【讨论】:

    【解决方案2】:

    独立于语言的 objdump 实用程序将符号转储到目标文件中。 std::ostream 是一个类,而不是一个对象。

    std::cout 对象来自 C++ 库。在 libstdc++.so 上使用 obdjump,找到 std::cout。

    【讨论】:

    • 如果源代码是使用调试信息编译的,则可以在目标文件中找到有关这些源代码的所有函数、变量、类型等的信息。我知道cout 对象是在共享库中定义的,但我只是好奇为什么我无法获得basic_ostream 类的矮人信息,因为编译器可以使用该信息(例如,对于 sizeof 运算符)。
    • @eXXXXXXXXXXX FWIW,虽然 cout 的大小不在可执行文件的 DWARF 部分,但它在 symtab 中,例如00601060 g O .bss 00000110 _ZSt4cout@@GLIBCXX_3.4.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多