Адрес элемента в структуре из исполняемого файла elf - PullRequest
2 голосов
/ 27 февраля 2012

Можно ли получить адрес элемента в структуре из исполняемого файла ELF, не скомпилированного для отладки?

Пример, учитывая следующий код:

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

cities  places;

И нм, иreadelf дает начальный адрес переменной 'place', а readelf также дает размер:

    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.Пример readelf:

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

Мне нужно найти способ сделать это без доступа к исходному коду и с отключенной отладочной информацией.

Любая помощь или указатели приветствуются.

Спасибо, Крис

1 Ответ

2 голосов
/ 16 сентября 2013

Нет, нет способа сделать это. Один только ELF не описывает типы или смещения.

Если вам известны типы полей структуры и ABI архитектуры, для которой построен объект, вы можете воссоздать макет.

...