Added function name support from ELF structure
authorJean-Paul Mari <djipi.mari@gmail.com>
Tue, 23 Oct 2018 08:28:34 +0000 (04:28 -0400)
committerJean-Paul Mari <djipi.mari@gmail.com>
Tue, 23 Oct 2018 08:28:34 +0000 (04:28 -0400)
src/debugger/DBGManager.cpp
src/debugger/DBGManager.h
src/debugger/ELFManager.cpp
src/debugger/ELFManager.h

index 720fefc..3dcb138 100644 (file)
 // 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
@@ -627,14 +628,19 @@ char *DBGManager_GetGlobalVariableName(size_t Index)
 // 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
index bf0181b..f034621 100644 (file)
@@ -235,9 +235,11 @@ extern char *DBGManager_GetLineSrcFromAdrNumLine(size_t Adr, size_t NumLine);
 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
index 6931df0..3624653 100644 (file)
@@ -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 <stdlib.h>
@@ -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);
                                        }
                                }
index aef8a54..7b03bfc 100644 (file)
@@ -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__