Адрес элемента в структуре из исполняемого файла 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 архитектуры, для которой построен объект, вы можете воссоздать макет.