Адрес элемента в структуре из исполняемого файла elf

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

Пример, приведенный следующий код:

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

cities  places;

И nm, и 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 ответ

Решение

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

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

Другие вопросы по тегам