1

私はこのコードを持っています:

#include <iostream>

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

コンパイルしますg++ -g main.cpp(私のOSでは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には、 Die の typedef にbasic_ostream<char, std::char_traits<char>> サイズ ( ) の属性が含まれていないだけで、そのDW_AT_byte_size理由がわかりません。実行可能ファイルには ostream クラスの他のダイはありませんが、コンパイラはそのクラスのサイズを知っている必要があります (サイズは で出力されますsizeof)。だから私の質問はostream、ドワーフ情報からクラスの適切なサイズを取得するにはどうすればよいですかobjdump?

4

2 に答える 2

1

仕様によると、DW_AT_Declaration は、DIE が定義ではなく宣言を記述していることを示します。定義を含むオブジェクト ファイルを調べる必要があります。

于 2014-08-30T14:08:01.267 に答える
1

言語に依存しない objdump ユーティリティは、シンボルをオブジェクト ファイルにダンプします。std::ostream はクラスであり、オブジェクトではありません。

std::cout オブジェクトは C++ ライブラリから取得されます。std::cout を見つけるには、libstdc++.so で obdjump を使用します。

于 2014-08-30T12:43:37.587 に答える