2 // ELFManager.cpp: ELF format manager
6 // JPM = Jean-Paul Mari <djipi.mari@gmail.com>
9 // --- ---------- ------------------------------------------------------------
10 // JPM Jan./2016 Created this file and added ELF format support
11 // JPM 07/13/2017 ELF DWARF format support improvement
12 // JPM 10/20/2018 Added function name support from ELF structure
13 // JPM 03/13/2020 Added ELF & DWARF .debug* types
18 #include <sys/types.h>
20 #include "libelf/libelf.h"
21 #include "libelf/gelf.h"
24 #include "ELFManager.h"
25 #include "DwarfManager.h"
28 //#define LOG_SUPPORT // Support log
32 const char *SectionName
;
47 ELFSectionType ELFTabSectionType
[] = {
48 { "", ELF_NULL_TYPE
},
49 { ".text", ELF_text_TYPE
},
50 { ".rodata", ELF_rodata_TYPE
},
51 { ".data", ELF_data_TYPE
},
52 { ".bss", ELF_bss_TYPE
},
53 { ".heap", ELF_heap_TYPE
},
54 { ".debug", ELF_debug_TYPE
},
55 { ".comment", ELF_comment_TYPE
},
56 { ".shstrtab", ELF_shstrtab_TYPE
},
57 { ".symtab", ELF_symtab_TYPE
},
58 { ".strtab", ELF_strtab_TYPE
},
59 { ".debug_abbrev", ELF_debug_abbrev_TYPE
},
60 { ".debug_aranges", ELF_debug_aranges_TYPE
},
61 { ".debug_frame", ELF_debug_frame_TYPE
},
62 { ".debug_info", ELF_debug_info_TYPE
},
63 { ".debug_line", ELF_debug_line_TYPE
},
64 { ".debug_loc", ELF_debug_loc_TYPE
},
65 { ".debug_macinfo", ELF_debug_macinfo_TYPE
},
66 { ".debug_pubnames", ELF_debug_pubnames_TYPE
},
67 { ".debug_pubtypes", ELF_debug_pubtypes_TYPE
},
68 { ".debug_ranges", ELF_debug_ranges_TYPE
},
69 { ".debug_str", ELF_debug_str_TYPE
},
70 { ".debug_types", ELF_debug_types_TYPE
}
76 void *PtrExec
; // ELF executable
78 // ELF Dwarf management
82 size_t NbELFtabStruct
;
86 char *ELFManager_GetSymbolnameFromSymbolindex(size_t Index
);
89 // ELF section type detection
90 size_t ELFManager_GetSectionType(char *SectionName
)
94 for (i
= 0; i
< ELF_END_TYPE
; i
++)
96 if (!strcmp(ELFTabSectionType
[i
].SectionName
, SectionName
))
98 return (ELFTabSectionType
[i
].SectionType
);
102 return (size_t)ELF_NO_TYPE
;
106 // ELF manager executable copy
107 void *ELFManager_ExeCopy(void *src
, size_t size
)
109 if ((PtrExec
= malloc(size
)) != NULL
)
111 memcpy(PtrExec
, src
, size
);
118 Elf
*ELFManager_MemOpen(char *PtrELFExe
, size_t Size
)
120 return(ElfMem
= elf_memory(PtrELFExe
, Size
));
124 int ELFManager_MemEnd(void)
130 err
= elf_end(ElfMem
);
138 // ELF manager Initialisation
139 void ELFManager_Init(void)
149 // ELF manager Dwarf Initialisation
150 bool ELFManager_DwarfInit(Elf
*PtrElfMem
, struct _stat FileElfInfo
)
152 return (ElfDwarf
= (DWARFManager_ElfInit(PtrElfMem
, FileElfInfo
) == DW_DLV_OK
) ? true : false);
157 void ELFManager_Reset(void)
161 DWARFManager_Reset();
173 while (NbELFtabStruct
)
175 free(ELFtab
[--NbELFtabStruct
]);
186 // ELF manager Closing
187 void ELFManager_Close(void)
193 // Save the ELF tab in memory
194 bool ELFManager_AddTab(void *Ptr
, size_t type
)
198 if ((ELFtab
= (ELFTab
**)calloc(1, sizeof(ELFTab
*))) == NULL
)
205 if ((ELFtab
= (ELFTab
**)realloc(ELFtab
, sizeof(ELFTab
*)*(NbELFtabStruct
+1))) == NULL
)
211 if ((ELFtab
[NbELFtabStruct
] = (ELFTab
*)calloc(1, sizeof(ELFTab
))) == NULL
)
217 ELFtab
[NbELFtabStruct
]->Type
= type
;
218 ELFtab
[NbELFtabStruct
]->PtrTab
= Ptr
;
225 // Get Address from his Symbol Name
226 // Return 0 if Symbol name is not found
227 size_t ELFManager_GetAdrFromSymbolName(char *SymbolName
)
232 if (ELFtab
&& SymbolName
)
234 for (size_t i
= 0; i
< NbELFtabStruct
; i
++)
236 if ((ELFtab
[i
]->Type
== ELF_symtab_TYPE
) && ((ELFtab
[i
]->PtrDataTab
) != NULL
))
240 while ((PtrST
= gelf_getsym(ELFtab
[i
]->PtrDataTab
, j
++, &ST
)) != NULL
)
242 if (!strcmp(ELFManager_GetSymbolnameFromSymbolindex(PtrST
->st_name
), SymbolName
))
244 Adr
= PtrST
->st_value
;
255 // Get function name from his address
256 // Return NULL if function name is not found
257 char *ELFManager_GetFunctionName(size_t Adr
)
259 char *SymbolName
= NULL
;
264 for (size_t i
= 0; i
< NbELFtabStruct
; i
++)
266 if ((ELFtab
[i
]->Type
== ELF_symtab_TYPE
) && ((ELFtab
[i
]->PtrDataTab
) != NULL
))
270 while ((PtrST
= gelf_getsym(ELFtab
[i
]->PtrDataTab
, j
++, &ST
)) != NULL
)
272 if (PtrST
->st_value
== Adr
)
274 if (ELF32_ST_TYPE(PtrST
->st_info
) == STT_FUNC
)
276 SymbolName
= ELFManager_GetSymbolnameFromSymbolindex(PtrST
->st_name
);
288 // Get Symbol name from his address
289 // Return NULL if Symbol name is not found
290 char *ELFManager_GetSymbolnameFromAdr(size_t Adr
)
292 char *SymbolName
= NULL
;
297 for (size_t i
= 0; i
< NbELFtabStruct
; i
++)
299 if ((ELFtab
[i
]->Type
== ELF_symtab_TYPE
) && ((ELFtab
[i
]->PtrDataTab
) != NULL
))
303 while ((PtrST
= gelf_getsym(ELFtab
[i
]->PtrDataTab
, j
++, &ST
)) != NULL
)
305 if (PtrST
->st_value
== Adr
)
308 WriteLog("ELF: .symtab: DATA: st_info=%0x, st_name=%0x, st_other=%0x, st_shndx=%0x, st_size=%0x, st_value=%0x\n", PtrST
->st_info
, PtrST
->st_name
, PtrST
->st_other
, PtrST
->st_shndx
, PtrST
->st_size
, PtrST
->st_value
);
310 SymbolName
= ELFManager_GetSymbolnameFromSymbolindex(PtrST
->st_name
);
321 // Get Symbol name from his Symbol index
322 char *ELFManager_GetSymbolnameFromSymbolindex(size_t Index
)
326 for (size_t i
= 0; i
< NbELFtabStruct
; i
++)
328 if ((ELFtab
[i
]->Type
== ELF_strtab_TYPE
) && ((ELFtab
[i
]->PtrDataTab
) != NULL
))
330 return ((char *)(ELFtab
[i
]->PtrDataTab
->d_buf
) + Index
);