#include "MSVCSymbolParser.h" #include "../ParseBuffer.h" #include #include #include #include #include namespace mapfileparser { // 0001:00000000 _StreamingContext__ctor_m12118 00401000 f 98F5E16DA77CA137853023FCE84040FD.obj // 0000:00000000 __except_list 00000000 Symbol MSVCSymbolParser::Parse(const std::string& line, int64_t imageBase) { int32_t section; int32_t address; int64_t rva; char unused[5]; size_t lineLength = line.length(); ParseBuffer name(lineLength); ParseBuffer objectFile(lineLength); int fieldsParsed = sscanf(line.c_str(), "%X:%X %s %llX%c%c%c%c%c%s", §ion, &address, name.buffer, &rva, &unused[0], &unused[1], &unused[2], &unused[3], &unused[4], objectFile.buffer); if (fieldsParsed == 9) strcpy(objectFile.buffer, unused); else if (fieldsParsed != 10) throw std::runtime_error(std::string("Unable to parse symbol: ") + line); int64_t absoluteAddress = rva - imageBase; assert(absoluteAddress < std::numeric_limits::max()); Symbol symbol = { static_cast(absoluteAddress), 0, name.buffer, objectFile.buffer, kSegmentTypeCode }; return symbol; } }