是否可以从不为调试编译的 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>
我需要找到一种在不访问源代码的情况下执行此操作的方法,并且关闭调试信息..
任何帮助或指针表示赞赏。
谢谢,克里斯