2012-02-26 9 views
1

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

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

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

cities places; 

Оба нм и readelf дают начальный адрес переменной 'места', и 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. Пример 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> 

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

Любая помощь или указатели оценили.

Спасибо, Chris

ответ

2

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

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

+0

Только обработав файл elf, gdb может предоставить эту информацию. Как это делает gdb? Можно получить элементы типа, структуры, адреса и т. Д. –

+1

gdb считывает информацию об отладке, которая хранится в файле ELF. Но вопрос заключался в том, чтобы делать это без отладочной информации. –