コンパイルされたcプログラムからグローバル変数を抽出する必要があります。私が今していることは、その情報を取得するためにLinuxreadelfコマンドを使用することです。言い換えれば、私がするとき:
readelf.exe -w[i] myFile.out
ここreadelf.exe
からダウンロードできるプログラムでそれを行います。私はウィンドウを使用していて、それが私が必要とする唯一のコマンドだからです。Linuxでは、コンソールを開いて実行しますreadelf -w[i] myFile.out
とにかく、そのコマンドを実行すると、次のようになります。
<1><86923>: Abbrev Number: 2 (DW_TAG_base_type)
<86924> DW_AT_name : unsigned int
<86925> DW_AT_encoding : 7 (unsigned)
<86927> DW_AT_byte_size : 4
<1>..
...
... bla bla bla
...
<1><870a1>: Abbrev Number: 12 (DW_TAG_variable)
<870a2> DW_AT_decl_file : 25
<870a3> DW_AT_decl_line : 543
<870a5> DW_AT_external : 1
<870a6> DW_AT_name : NetBuf_ID_Ctr // <------------------- First variable
<870b4> DW_AT_type : <0x86923>
<870b8> DW_AT_location : 5 byte block: 3 ff f9 b 20 (DW_OP_addr: fff90b20)
<1><870be>: Abbrev Number: 3 (DW_TAG_typedef)
<870bf> DW_AT_decl_file : 26
<870c0> DW_AT_decl_line : 192
<870c2> DW_AT_name : NET_CONN_FAMILY
<870d2> DW_AT_type : <0x862f1>
<1><870d6>: Abbrev Number: 3 (DW_TAG_typedef)
<870d7> DW_AT_decl_file : 26
....
その「ツリー」を使用して、すべてのグローバル変数とタイプを取得できます。たとえば、最初の変数NetBuf_ID_Ctr
を見ると、ノードの型に関する情報を取得できることがわかります <0x86923>
。そのノードはツリーのどこかにあります!実際に最初のノードであるものを見てください。開始するもので <1><86923>....
、そのノードの内部を見ると、変数が4バイトのサイズのunsignedintであることがわかります。
今私の質問は、そのreadelfコマンドを使用すると 、解析する必要のある192883行のテキストを取得することです。このツリーは、私が必要としているものよりも多くの情報を私に与えてくれます。16進エディタでファイルを調べると、次のように表示されます。
同じ変数を見つけることができ、そのNetBuf_ID_Ctr
隣(強調表示)はアドレス<0x86923>
です!
木の作り方を教えてくれる場所はインターネット上にありますか?コマンドreadelf.exeは、ツリーを作成するのに.1秒かかります。出力をStreamReaderに配置するため、非常に高速です。そのStreamReaderをメモリに配置して、非常に時間がかかる文字列に変換したい場合。
編集
要約すると、myFile.outからツリー(readelfの出力)がどのように構築されているかを知りたいと思います。そのパターンを理解することも、インターネット上のその方法を説明する場所もわかりません。