bool SymbolMap::LoadSymbolMap(const char *filename) { Clear(); // let's not recurse the lock lock_guard guard(lock_); #if defined(_WIN32) && defined(UNICODE) gzFile f = gzopen_w(ConvertUTF8ToWString(filename).c_str(), "r"); #else gzFile f = gzopen(filename, "r"); #endif if (f == Z_NULL) return false; //char temp[256]; //fgets(temp,255,f); //.text section layout //fgets(temp,255,f); // Starting Virtual //fgets(temp,255,f); // address Size address //fgets(temp,255,f); // ----------------------- bool started = false; bool hasModules = false; while (!gzeof(f)) { char line[512], temp[256] = {0}; char *p = gzgets(f, line, 512); if (p == NULL) break; // Chop any newlines off. for (size_t i = strlen(line) - 1; i > 0; i--) { if (line[i] == '\r' || line[i] == '\n') { line[i] = '\0'; } } if (strlen(line) < 4 || sscanf(line, "%s", temp) != 1) continue; if (strcmp(temp,"UNUSED")==0) continue; if (strcmp(temp,".text")==0) {started=true;continue;}; if (strcmp(temp,".init")==0) {started=true;continue;}; if (strcmp(temp,"Starting")==0) continue; if (strcmp(temp,"extab")==0) continue; if (strcmp(temp,".ctors")==0) break; if (strcmp(temp,".dtors")==0) break; if (strcmp(temp,".rodata")==0) continue; if (strcmp(temp,".data")==0) continue; if (strcmp(temp,".sbss")==0) continue; if (strcmp(temp,".sdata")==0) continue; if (strcmp(temp,".sdata2")==0) continue; if (strcmp(temp,"address")==0) continue; if (strcmp(temp,"-----------------------")==0) continue; if (strcmp(temp,".sbss2")==0) break; if (temp[1]==']') continue; if (!started) continue; u32 address = -1, size, vaddress = -1; int moduleIndex = 0; int typeInt; SymbolType type; char name[128] = {0}; if (sscanf(line, ".module %x %08x %08x %127c", &moduleIndex, &address, &size, name) == 4) { // Found a module definition. ModuleEntry mod; mod.index = moduleIndex; strcpy(mod.name, name); mod.start = address; mod.size = size; modules.push_back(mod); hasModules = true; continue; } sscanf(line, "%08x %08x %x %i %127c", &address, &size, &vaddress, &typeInt, name); type = (SymbolType) typeInt; if (!hasModules) { if (!Memory::IsValidAddress(vaddress)) { ERROR_LOG(LOADER, "Invalid address in symbol file: %08x (%s)", vaddress, name); continue; } } else { // The 3rd field is now used for the module index. moduleIndex = vaddress; vaddress = GetModuleAbsoluteAddr(address, moduleIndex); if (!Memory::IsValidAddress(vaddress)) { ERROR_LOG(LOADER, "Invalid address in symbol file: %08x (%s)", vaddress, name); continue; } } if (type == ST_DATA && size == 0) size = 4; if (!strcmp(name, ".text") || !strcmp(name, ".init") || strlen(name) <= 1) { } else { switch (type) { case ST_FUNCTION: AddFunction(name, vaddress, size, moduleIndex); break; case ST_DATA: AddData(vaddress,size,DATATYPE_BYTE, moduleIndex); if (name[0] != 0) AddLabel(name, vaddress, moduleIndex); break; case ST_NONE: case ST_ALL: // Shouldn't be possible. break; } } } gzclose(f); SortSymbols(); return started; }
bool SymbolMap::LoadSymbolMap(const char *filename) { lock_guard guard(lock_); Clear(); FILE *f = File::OpenCFile(filename, "r"); if (!f) return false; //char temp[256]; //fgets(temp,255,f); //.text section layout //fgets(temp,255,f); // Starting Virtual //fgets(temp,255,f); // address Size address //fgets(temp,255,f); // ----------------------- bool started=false; while (!feof(f)) { char line[512], temp[256] = {0}; char *p = fgets(line, 512, f); if (p == NULL) break; // Chop any newlines off. for (size_t i = strlen(line) - 1; i > 0; i--) { if (line[i] == '\r' || line[i] == '\n') { line[i] = '\0'; } } if (strlen(line) < 4 || sscanf(line, "%s", temp) != 1) continue; if (strcmp(temp,"UNUSED")==0) continue; if (strcmp(temp,".text")==0) {started=true;continue;}; if (strcmp(temp,".init")==0) {started=true;continue;}; if (strcmp(temp,"Starting")==0) continue; if (strcmp(temp,"extab")==0) continue; if (strcmp(temp,".ctors")==0) break; if (strcmp(temp,".dtors")==0) break; if (strcmp(temp,".rodata")==0) continue; if (strcmp(temp,".data")==0) continue; if (strcmp(temp,".sbss")==0) continue; if (strcmp(temp,".sdata")==0) continue; if (strcmp(temp,".sdata2")==0) continue; if (strcmp(temp,"address")==0) continue; if (strcmp(temp,"-----------------------")==0) continue; if (strcmp(temp,".sbss2")==0) break; if (temp[1]==']') continue; if (!started) continue; u32 address, size, vaddress; SymbolType type; char name[128] = {0}; sscanf(line,"%08x %08x %08x %i %127c", &address, &size, &vaddress, (int*)&type, name); if (!Memory::IsValidAddress(vaddress)) { ERROR_LOG(LOADER, "Invalid address in symbol file: %08x (%s)", vaddress, name); continue; } if (type == ST_DATA && size == 0) size = 4; if (!strcmp(name, ".text") || !strcmp(name, ".init") || strlen(name) <= 1) { } else { switch (type) { case ST_FUNCTION: AddFunction(name, vaddress, size); break; case ST_DATA: AddData(vaddress,size,DATATYPE_BYTE); if (name[0] != 0) AddLabel(name, vaddress); break; case ST_NONE: case ST_ALL: // Shouldn't be possible. break; } } } fclose(f); SortSymbols(); return true; }