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 回答