2

これを取得するためにbinutilsツールを使用する方法はありますか?例えば:

// x.cc
typedef long long MyInt;
int main(int argc, char* argv[]) {
  // blah blah blah
}

それで:

g++ -g x.cc -o a.out

a.outを分析してsizeof(MyInt)を取得するにはどうすればよいですか?GDBはそれを行うことができますが、大きなバイナリでは非常に遅いため、GDBは使用したくありません。

4

3 に答える 3

1

readelf は、dwarf デバッグ情報を一覧表示できます。

readelf -wi

DW_AT_name が MyInt に等しく、このコンパイル ユニットを表す DW_TAG_compile_unit の直接の子である DW_TAG_variable 要素を見つけます。

DW_AT_type 属性を使用して、この変数の DW_TAG_base_type を検索します。DW_AT_type 属性は、このタイプに関する情報が格納されているこの CU の先頭からのオフセットです。これらのオフセットは、出力の左側に一覧表示されます (<> 単位)。この DIE の DW_AT_byte_size 属性を見てください。これは、型のバイト単位のサイズです。

于 2010-08-14T21:18:41.000 に答える
0

これについては、gdb を使用したほうがよいと思います。

bintuls は主に実行形式 (ELF) を扱います。デバッグ用のものはdwarf形式で保持されます。実行する以外objdump -g -x yourbinaryに、デバッグ シンボルを扱うユーティリティはあまり見たことがありません。

全体として、型を引き出すために elf と dwarf を解析することはかなり恐ろしく、自明ではありません - デバッガーが既に行っていることとまったく同じですが。

于 2010-04-20T21:46:36.697 に答える
0

GDB が行っていることを実行し、DWARF デバッグ情報を自分で読む必要があります。readelf や dwarfdump など、これに役立つツールがいくつかあります。http://dwarfstd.org/にある FAQ やその他のグッズを読んで、必要なことが行われるかどうかを確認してください。

この回答は、バニラ Linux プラットフォームで実行していることを前提としています。あなたのために働くかもしれない他のプラットフォーム用の他のツールがありますが、私はそれらについて尋ねる人ではありません.

于 2010-04-20T21:48:40.383 に答える