我有这段代码:
#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
类获得正确的大小。
答案 0 :(得分:1)
与语言无关的objdump实用程序将符号转储到目标文件中。 std :: ostream是一个类,而不是一个对象。
std :: cout对象来自C ++库。在libstdc ++上使用obdjump。所以,找到std :: cout。
答案 1 :(得分:1)
根据spec DW_AT_Declaration表明DIE正在描述声明而不是定义;您需要查看包含该定义的目标文件。