objdump没有显示ostream类的大小

时间:2014-08-30 12:05:28

标签: c++ linux elf dwarf

我有这段代码:

#include <iostream>

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

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

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

<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<char, std::char_traits<char>>的typedef Die不包含大小(DW_AT_byte_size)的属性,我无法理解原因。可执行文件中没有其他ostream类的die-s,但编译器应该知道该类的大小(它打印的大小为sizeof)。所以我的问题是:如何使用ostream的矮化信息为objdump类获得正确的大小。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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