// JPM Various efforts to set the ELF format support\r
// JPM Various efforts to set the DWARF format support\r
// JPM 09/15/2018 Support the unsigned char\r
-// JPM Oct./2018 Cosmetic changes, and added source file search paths\r
+// JPM Oct./2018 Cosmetic changes, added source file search paths, and ELF function name\r
//\r
\r
// To Do\r
+// To think about unique format to handle variations from ELF, DWARF, etc.\r
//\r
\r
\r
// Return NULL if no function name has been found\r
char *DBGManager_GetFunctionName(size_t Adr)\r
{\r
+ char *Symbolname = NULL;\r
+\r
if ((DBGType & DBG_ELFDWARF))\r
{\r
- return DWARFManager_GetFunctionName(Adr);\r
+ Symbolname = DWARFManager_GetFunctionName(Adr);\r
}\r
- else\r
+\r
+ if ((DBGType & DBG_ELF) && (Symbolname == NULL))\r
{\r
- return NULL;\r
+ Symbolname = ELFManager_GetFunctionName(Adr);\r
}\r
+\r
+ return Symbolname;\r
}\r
\r
\r
extern char *DBGManager_GetLineSrcFromNumLineBaseAdr(size_t Adr, size_t NumLine);\r
\r
// General manager\r
-extern char *DBGManager_GetFunctionName(size_t Adr);\r
extern char *DBGManager_GetVariableValueFromAdr(size_t Adr, size_t TypeEncoding, size_t TypeByteSize);\r
\r
+// Functions manager\r
+extern char *DBGManager_GetFunctionName(size_t Adr);\r
+\r
// Symbols manager\r
extern char *DBGManager_GetSymbolNameFromAdr(size_t Adr);\r
extern size_t DBGManager_GetAdrFromSymbolName(char *SymbolName);\r
//
// 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 <stdlib.h>
#include "DwarfManager.h"
+//#define LOG_SUPPORT // Support log
+
+
typedef struct {
const char *SectionName;
size_t SectionType;
}
+// 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)
{
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);
}
}
}ELFSECTIONTYPE;
+// Internal manager
extern void ELFManager_Init(void);
extern bool ELFManager_DwarfInit(Elf *PtrElfMem);
extern Elf *ELFManager_MemOpen(char *PtrELFExe, size_t Size);
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__