X-Git-Url: http://git.hcoop.net/clinton/Virtual-Jaguar-Rx.git/blobdiff_plain/5fe21518fc4536c25c40716b3fbdf81a7edac56c..79a018fa160ead41dc5ea29a3939531f0e4a7e21:/src/debugger/ELFManager.cpp diff --git a/src/debugger/ELFManager.cpp b/src/debugger/ELFManager.cpp index 7f3857f..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; @@ -218,7 +221,7 @@ size_t ELFManager_GetAdrFromSymbolName(char *SymbolName) size_t Adr = 0; GElf_Sym *PtrST, ST; - if (ELFtab != NULL) + if (ELFtab && SymbolName) { for (size_t i = 0; i < NbELFtabStruct; i++) { @@ -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); } }