3

デバッグ用にコンパイルされていない ELF 実行可能ファイルから構造内の要素のアドレスを取得することは可能ですか?

例、次のコードが与えられた場合:

typedef struct {
   int tokyo;
   int paris;
   int london;
}cities;

cities  places;

nm と readelf の両方が変数「places」の開始アドレスを提供し、readelf も sizeof を提供します。

    Num:    Value  Size Type    Bind   Vis      Ndx Name
1994983: d0003ae8    12 OBJECT  GLOBAL DEFAULT   23 cities

ただし、必要なのは、構造内の各要素のアドレスです。したがって、上から私が欲しいのは次のとおりです。

d0003ae8    cities.tokyo
d0003aec    cities.paris
d0003af0    cities.london

現時点で私の唯一のルートは、dwarf2 デバッグ情報を使用してコンパイルし、readelf (-wliao) を使用して .debug_info セクションをダンプし、DW_TAG_variable から型ツリーを解析して base_type のサイズを加算することです。例の読み取り:

 <1><e00b>: Abbrev Number: 5 (DW_TAG_structure_type)
     DW_AT_byte_size   : 12
     DW_AT_decl_file   : 3  
     DW_AT_decl_line   : 25 
 <2><e013>: Abbrev Number: 6 (DW_TAG_member)
     DW_AT_name        : tokyo
     DW_AT_decl_file   : 3  
     DW_AT_decl_line   : 15 
     DW_AT_type        : <df04>
 <2><e02e>: Abbrev Number: 6 (DW_TAG_member)
     DW_AT_name        : paris
     DW_AT_decl_file   : 3  
     DW_AT_decl_line   : 16 
     DW_AT_type        : <df04> 
 <2><e02e>: Abbrev Number: 6 (DW_TAG_member)
     DW_AT_name        : london
     DW_AT_decl_file   : 3  
     DW_AT_decl_line   : 16 
     DW_AT_type        : <df04> 

ソースコードにアクセスせず、デバッグ情報をオフにしてこれを行う方法を見つける必要があります..

ヘルプやポインタをいただければ幸いです。

ありがとう、クリス

4

1 に答える 1

2

いいえ、これを行う方法はありません。ELF だけでは型やオフセットは記述されません。

構造体のフィールドの型と、オブジェクトが構築されるアーキテクチャの ABI がわかっている場合は、レイアウトを再作成できます。

于 2013-09-16T02:27:10.210 に答える