Adresse de l'élément au sein d'une structure d'ELF exécutable
Question
Est-il possible d'obtenir l'adresse d'un élément au sein d'une structure à partir d'un exécutable ELF et non de compiler pour débogage?
Exemple, compte tenu du code suivant:
typedef struct {
int tokyo;
int paris;
int london;
}cities;
cities places;
NM et Readelf donnent l'adresse de départ des «lieux» variables, et Readeld donne également la taille:
Num: Value Size Type Bind Vis Ndx Name
1994983: d0003ae8 12 OBJECT GLOBAL DEFAULT 23 cities
Cependant, ce dont j'ai besoin, c'est de l'adresse de chaque élément de la structure. Donc d'en haut ce que je veux est:
d0003ae8 cities.tokyo
d0003aec cities.paris
d0003af0 cities.london
Mon seul itinéraire actuellement consiste à compiler avec les informations de débogage DWARF2, à utiliser la lecture (-wliao) pour vider la section .debug_info, puis analyser l'arborescence de type à partir d'un DW_TAG_VARIABLE ajoutant des tailles de base_type. Exemple de lecture:
<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>
J'ai besoin de trouver un moyen de le faire sans accès au code source, et avec les informations de débogage désactivées.
Toute aide ou pointeurs apprécié.
Merci, Chris
La solution
Non, il n'y a aucun moyen de le faire. ELF seul ne décrit pas les types ou les décalages.
Si vous connaissez les types des champs de la structure et l'ABI de l'architecture pour laquelle l'objet est construit, vous pouvez recréer la disposition.