PPCSymbolDB: Load more SymbolMap symbols

Allows to load data symbols from symbol map files.

Symbols from all sections are loaded.

The data/function symbol type is set accordingly.
This commit is contained in:
Sepalani 2017-10-04 21:29:07 +02:00
parent 428f0fa69b
commit aed0ac0543
1 changed files with 42 additions and 32 deletions

View File

@ -13,6 +13,7 @@
#include "Common/File.h"
#include "Common/Logging/Log.h"
#include "Common/MsgHandler.h"
#include "Common/StringUtil.h"
#include "Core/PowerPC/PPCAnalyst.h"
#include "Core/PowerPC/PowerPC.h"
#include "Core/PowerPC/SignatureDB/SignatureDB.h"
@ -219,10 +220,12 @@ bool PPCSymbolDB::LoadMap(const std::string& filename, bool bad)
return false;
// four columns are used in American Mensa Academy map files and perhaps other games
bool started = false, four_columns = false;
int good_count = 0, bad_count = 0;
bool four_columns = false;
int good_count = 0;
int bad_count = 0;
char line[512];
std::string section_name;
while (fgets(line, 512, f.GetHandle()))
{
size_t length = strlen(line);
@ -240,44 +243,48 @@ bool PPCSymbolDB::LoadMap(const std::string& filename, bool bad)
if (strcmp(temp, "UNUSED") == 0)
continue;
if (strcmp(temp, ".text") == 0)
// Support CodeWarrior and Dolphin map
if (StringEndsWith(line, " section layout\n") || strcmp(temp, ".text") == 0 ||
strcmp(temp, ".init") == 0)
{
started = true;
section_name = temp;
continue;
};
if (strcmp(temp, ".init") == 0)
{
started = true;
continue;
};
}
// Skip four columns' header.
//
// Four columns example:
//
// .text section layout
// Starting Virtual
// address Size address
// -----------------------
if (strcmp(temp, "Starting") == 0)
continue;
if (strcmp(temp, "extab") == 0)
continue;
if (strcmp(temp, ".ctors") == 0)
break; // uh?
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] == ']')
// Skip link map.
//
// Link map example:
//
// Link map of __start
// 1] __start(func, weak) found in os.a __start.c
// 2] __init_registers(func, local) found in os.a __start.c
// 3] _stack_addr found as linker generated symbol
// ...
// 10] EXILock(func, global) found in exi.a EXIBios.c
if (StringEndsWith(temp, "]"))
continue;
if (!started)
// TODO - Handle/Write a parser for:
// - Memory map
// - Link map
// - Linker generated symbols
if (section_name.empty())
continue;
u32 address, vaddress, size, offset, alignment;
@ -344,7 +351,7 @@ bool PPCSymbolDB::LoadMap(const std::string& filename, bool bad)
name[strlen(name) - 1] = 0;
// Check if this is a valid entry.
if (strcmp(name, ".text") != 0 && strcmp(name, ".init") != 0 && strlen(name) > 0)
if (strlen(name) > 0)
{
// Can't compute the checksum if not in RAM
bool good = !bad && PowerPC::HostIsInstructionRAMAddress(vaddress) &&
@ -363,7 +370,10 @@ bool PPCSymbolDB::LoadMap(const std::string& filename, bool bad)
if (good)
{
++good_count;
AddKnownSymbol(vaddress, size, name); // ST_FUNCTION
if (section_name == ".text" || section_name == ".init")
AddKnownSymbol(vaddress, size, name, Symbol::Type::Function);
else
AddKnownSymbol(vaddress, size, name, Symbol::Type::Data);
}
else
{