summaryrefslogtreecommitdiffstats
path: root/src/PEImage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/PEImage.cpp')
-rw-r--r--src/PEImage.cpp20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/PEImage.cpp b/src/PEImage.cpp
index 460f2bd..2d6f03f 100644
--- a/src/PEImage.cpp
+++ b/src/PEImage.cpp
@@ -285,7 +285,7 @@ bool PEImage::initDWARFPtr(bool initDbgDir)
dbgDir = 0;
sec = hdr32 ? IMAGE_FIRST_SECTION(hdr32) : IMAGE_FIRST_SECTION(hdr64);
int nsec = IMGHDR(FileHeader.NumberOfSections);
- const char* strtable = DPV<char>(IMGHDR(FileHeader.PointerToSymbolTable) + IMGHDR(FileHeader.NumberOfSymbols * IMAGE_SIZEOF_SYMBOL));
+ const char* strtable = DPV<char>(IMGHDR(FileHeader.PointerToSymbolTable) + IMGHDR(FileHeader.NumberOfSymbols) * IMAGE_SIZEOF_SYMBOL);
for(int s = 0; s < nsec; s++)
{
const char* name = (const char*) sec[s].Name;
@@ -335,6 +335,24 @@ int PEImage::findSection(unsigned int off) const
return -1;
}
+int PEImage::findSymbol(const char* name, unsigned long& off) const
+{
+ IMAGE_SYMBOL* symtable = DPV<IMAGE_SYMBOL>(IMGHDR(FileHeader.PointerToSymbolTable));
+ int syms = IMGHDR(FileHeader.NumberOfSymbols);
+ const char* strtable = (const char*) (symtable + syms);
+ for(int i = 0; i < syms; i++)
+ {
+ IMAGE_SYMBOL* sym = symtable + i;
+ const char* symname = sym->N.Name.Short == 0 ? strtable + sym->N.Name.Long : (char*)sym->N.ShortName;
+ if(strcmp(symname, name) == 0 || (symname[0] == '_' && strcmp(symname + 1, name) == 0))
+ {
+ off = sym->Value;
+ return sym->SectionNumber;
+ }
+ }
+ return -1;
+}
+
///////////////////////////////////////////////////////////////////////
int PEImage::countCVEntries() const
{