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

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

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

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

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


person Chris    schedule 26.02.2012    source источник


Ответы (1)


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

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

person Tom Tromey    schedule 16.09.2013
comment
Только обрабатывая файл elf, gdb может предоставить эту информацию. Как gdb это делает? Можно получить тип, элементы структуры, значения адресов и т. д. - person Aykut Kllic; 09.04.2015
comment
gdb считывает отладочную информацию, которая хранится в файле ELF. Но вопрос был в том, чтобы сделать это без отладочной информации. - person Tom Tromey; 10.04.2015