From 4f945aea409c9a10ea5a34f94e3b968784034479 Mon Sep 17 00:00:00 2001 From: Jean-Paul Mari Date: Tue, 23 Oct 2018 04:28:34 -0400 Subject: [PATCH] Added function name support from ELF structure --- src/debugger/DBGManager.cpp | 14 ++++++++---- src/debugger/DBGManager.h | 4 +++- src/debugger/ELFManager.cpp | 44 ++++++++++++++++++++++++++++++++++--- src/debugger/ELFManager.h | 10 ++++++++- 4 files changed, 63 insertions(+), 9 deletions(-) diff --git a/src/debugger/DBGManager.cpp b/src/debugger/DBGManager.cpp index 720fefc..3dcb138 100644 --- a/src/debugger/DBGManager.cpp +++ b/src/debugger/DBGManager.cpp @@ -11,10 +11,11 @@ // JPM Various efforts to set the ELF format support // JPM Various efforts to set the DWARF format support // JPM 09/15/2018 Support the unsigned char -// JPM Oct./2018 Cosmetic changes, and added source file search paths +// JPM Oct./2018 Cosmetic changes, added source file search paths, and ELF function name // // To Do +// To think about unique format to handle variations from ELF, DWARF, etc. // @@ -627,14 +628,19 @@ char *DBGManager_GetGlobalVariableName(size_t Index) // Return NULL if no function name has been found char *DBGManager_GetFunctionName(size_t Adr) { + char *Symbolname = NULL; + if ((DBGType & DBG_ELFDWARF)) { - return DWARFManager_GetFunctionName(Adr); + Symbolname = DWARFManager_GetFunctionName(Adr); } - else + + if ((DBGType & DBG_ELF) && (Symbolname == NULL)) { - return NULL; + Symbolname = ELFManager_GetFunctionName(Adr); } + + return Symbolname; } diff --git a/src/debugger/DBGManager.h b/src/debugger/DBGManager.h index bf0181b..f034621 100644 --- a/src/debugger/DBGManager.h +++ b/src/debugger/DBGManager.h @@ -235,9 +235,11 @@ extern char *DBGManager_GetLineSrcFromAdrNumLine(size_t Adr, size_t NumLine); extern char *DBGManager_GetLineSrcFromNumLineBaseAdr(size_t Adr, size_t NumLine); // General manager -extern char *DBGManager_GetFunctionName(size_t Adr); extern char *DBGManager_GetVariableValueFromAdr(size_t Adr, size_t TypeEncoding, size_t TypeByteSize); +// Functions manager +extern char *DBGManager_GetFunctionName(size_t Adr); + // Symbols manager extern char *DBGManager_GetSymbolNameFromAdr(size_t Adr); extern size_t DBGManager_GetAdrFromSymbolName(char *SymbolName); diff --git a/src/debugger/ELFManager.cpp b/src/debugger/ELFManager.cpp index 6931df0..3624653 100644 --- a/src/debugger/ELFManager.cpp +++ b/src/debugger/ELFManager.cpp @@ -7,9 +7,9 @@ // // WHO WHEN WHAT // --- ---------- ------------------------------------------------------------ -// JPM 12/01/2016 Created this file -// JPM 12/01/2016 ELF format support -// JPM 13/07/2017 ELF DWARF format support +// JPM Jan./2016 Created this file and added ELF format support +// JPM 07/13/2017 ELF DWARF format support improvement +// JPM 10/20/2018 Added function name support from ELF structure // #include @@ -22,6 +22,9 @@ #include "DwarfManager.h" +//#define LOG_SUPPORT // Support log + + typedef struct { const char *SectionName; size_t SectionType; @@ -241,6 +244,39 @@ size_t ELFManager_GetAdrFromSymbolName(char *SymbolName) } +// Get function name from his address +// Return NULL if function name is not found +char *ELFManager_GetFunctionName(size_t Adr) +{ + char *SymbolName = NULL; + GElf_Sym *PtrST, ST; + + if (ELFtab != NULL) + { + for (size_t i = 0; i < NbELFtabStruct; i++) + { + if ((ELFtab[i]->Type == ELF_symtab_TYPE) && ((ELFtab[i]->PtrDataTab) != NULL)) + { + int j = 0; + + while ((PtrST = gelf_getsym(ELFtab[i]->PtrDataTab, j++, &ST)) != NULL) + { + if (PtrST->st_value == Adr) + { + if (ELF32_ST_TYPE(PtrST->st_info) == STT_FUNC) + { + SymbolName = ELFManager_GetSymbolnameFromSymbolindex(PtrST->st_name); + } + } + } + } + } + } + + return SymbolName; +} + + // Get Symbol name from his address // Return NULL if Symbol name is not found char *ELFManager_GetSymbolnameFromAdr(size_t Adr) @@ -260,7 +296,9 @@ char *ELFManager_GetSymbolnameFromAdr(size_t Adr) { if (PtrST->st_value == Adr) { +#ifdef LOG_SUPPORT 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); +#endif SymbolName = ELFManager_GetSymbolnameFromSymbolindex(PtrST->st_name); } } diff --git a/src/debugger/ELFManager.h b/src/debugger/ELFManager.h index aef8a54..7b03bfc 100644 --- a/src/debugger/ELFManager.h +++ b/src/debugger/ELFManager.h @@ -28,6 +28,7 @@ typedef enum { }ELFSECTIONTYPE; +// Internal manager extern void ELFManager_Init(void); extern bool ELFManager_DwarfInit(Elf *PtrElfMem); extern Elf *ELFManager_MemOpen(char *PtrELFExe, size_t Size); @@ -35,10 +36,17 @@ extern int ELFManager_MemEnd(void); extern void ELFManager_Reset(void); extern void ELFManager_Close(void); extern bool ELFManager_AddTab(void *Ptr, size_t type); -extern char *ELFManager_GetSymbolnameFromAdr(size_t Adr); extern void *ELFManager_ExeCopy(void *src, size_t size); + +// Sections manager extern size_t ELFManager_GetSectionType(char *SectionName); + +// Symbols manager extern size_t ELFManager_GetAdrFromSymbolName(char *SymbolName); +extern char *ELFManager_GetSymbolnameFromAdr(size_t Adr); + +// Functions manager +extern char *ELFManager_GetFunctionName(size_t Adr); #endif // __ELFMANAGER_H__ -- 2.20.1