1

我有这个代码:

#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<char, std::char_traits<char>> Die 的 typedef 不包含带有大小(DW_AT_byte_size)的属性,我不明白为什么。可执行文件中没有其他用于 ostream 类的模具,但编译器应该知道该类的大小(它用 打印大小sizeof)。所以我的问题是:我怎样才能ostreamobjdump.

4

2 回答 2

1

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

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

于 2014-08-30T12:43:37.587 回答
1

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

于 2014-08-30T14:08:01.267 回答