some improvements on symbols types

This commit is contained in:
georgemoralis 2024-03-09 15:37:30 +02:00
parent bf69754b5e
commit eb306fccfa
4 changed files with 38 additions and 17 deletions

View File

@ -434,7 +434,7 @@ void Linker::LoadSymbols(Module* m) {
nidName = "UNK"; nidName = "UNK";
} }
Loader::SymbolRes sym_r{}; Loader::SymbolResolver sym_r{};
sym_r.name = ids.at(0); sym_r.name = ids.at(0);
sym_r.nidName = nidName; sym_r.nidName = nidName;
sym_r.library = library->name; sym_r.library = library->name;
@ -442,8 +442,21 @@ void Linker::LoadSymbols(Module* m) {
sym_r.module = module->name; sym_r.module = module->name;
sym_r.module_version_major = module->version_major; sym_r.module_version_major = module->version_major;
sym_r.module_version_minor = module->version_minor; sym_r.module_version_minor = module->version_minor;
sym_r.type = type; switch (type) {
case STT_NOTYPE:
sym_r.type = Loader::SymbolType::NoType;
break;
case STT_FUN:
sym_r.type = Loader::SymbolType::Function;
break;
case STT_OBJECT:
sym_r.type = Loader::SymbolType::Object;
break;
default:
sym_r.type = Loader::SymbolType::Unknown;
break;
}
if (is_sym_export) { if (is_sym_export) {
m->export_sym.AddSymbol(sym_r, sym->st_value + m->base_virtual_addr); m->export_sym.AddSymbol(sym_r, sym->st_value + m->base_virtual_addr);
} else { } else {
@ -471,7 +484,7 @@ void Linker::Relocate(Module* m) {
u64 rel_base_virtual_addr = m->base_virtual_addr; u64 rel_base_virtual_addr = m->base_virtual_addr;
u64 rel_virtual_addr = m->base_virtual_addr + rel->rel_offset; u64 rel_virtual_addr = m->base_virtual_addr + rel->rel_offset;
bool rel_isResolved = false; bool rel_isResolved = false;
u8 rel_sym_type = 0; Loader::SymbolType rel_sym_type = Loader::SymbolType::Unknown;
std::string rel_name; std::string rel_name;
switch (type) { switch (type) {
@ -495,10 +508,10 @@ void Linker::Relocate(Module* m) {
Loader::SymbolRecord symrec{}; Loader::SymbolRecord symrec{};
switch (sym_type) { switch (sym_type) {
case STT_FUN: case STT_FUN:
rel_sym_type = 2; rel_sym_type = Loader::SymbolType::Function;
break; break;
case STT_OBJECT: case STT_OBJECT:
rel_sym_type = 1; rel_sym_type = Loader::SymbolType::Object;
break; break;
default: default:
LOG_INFO(Core_Linker, "unknown symbol type {}", sym_type); LOG_INFO(Core_Linker, "unknown symbol type {}", sym_type);
@ -558,7 +571,7 @@ void Linker::Relocate(Module* m) {
} }
} }
void Linker::Resolve(const std::string& name, int Symtype, Module* m, void Linker::Resolve(const std::string& name, Loader::SymbolType Symtype, Module* m,
Loader::SymbolRecord* return_info) { Loader::SymbolRecord* return_info) {
const auto ids = Common::SplitString(name, '#'); const auto ids = Common::SplitString(name, '#');
if (ids.size() == 3) // symbols are 3 parts name , library , module if (ids.size() == 3) // symbols are 3 parts name , library , module
@ -567,7 +580,7 @@ void Linker::Resolve(const std::string& name, int Symtype, Module* m,
const auto* module = FindModule(*m, ids.at(2)); const auto* module = FindModule(*m, ids.at(2));
if (library != nullptr && module != nullptr) { if (library != nullptr && module != nullptr) {
Loader::SymbolRes sr{}; Loader::SymbolResolver sr{};
sr.name = ids.at(0); sr.name = ids.at(0);
sr.library = library->name; sr.library = library->name;
sr.library_version = library->version; sr.library_version = library->version;

View File

@ -124,7 +124,7 @@ public:
return m_hle_symbols; return m_hle_symbols;
} }
void Relocate(Module* m); void Relocate(Module* m);
void Resolve(const std::string& name, int Symtype, Module* m, void Resolve(const std::string& name, Loader::SymbolType Symtype, Module* m,
Loader::SymbolRecord* return_info); Loader::SymbolRecord* return_info);
void Execute(); void Execute();

View File

@ -7,19 +7,19 @@
namespace Core::Loader { namespace Core::Loader {
void SymbolsResolver::AddSymbol(const SymbolRes& s, u64 virtual_addr) { void SymbolsResolver::AddSymbol(const SymbolResolver& s, u64 virtual_addr) {
SymbolRecord r{}; SymbolRecord r{};
r.name = GenerateName(s); r.name = GenerateName(s);
r.virtual_address = virtual_addr; r.virtual_address = virtual_addr;
m_symbols.push_back(r); m_symbols.push_back(r);
} }
std::string SymbolsResolver::GenerateName(const SymbolRes& s) { std::string SymbolsResolver::GenerateName(const SymbolResolver& s) {
return fmt::format("{} lib[{}_v{}]mod[{}_v{}.{}]", s.name, s.library, s.library_version, return fmt::format("{} lib[{}_v{}]mod[{}_v{}.{}]", s.name, s.library, s.library_version,
s.module, s.module_version_major, s.module_version_minor); s.module, s.module_version_major, s.module_version_minor);
} }
const SymbolRecord* SymbolsResolver::FindSymbol(const SymbolRes& s) const { const SymbolRecord* SymbolsResolver::FindSymbol(const SymbolResolver& s) const {
const std::string name = GenerateName(s); const std::string name = GenerateName(s);
for (u32 i = 0; i < m_symbols.size(); i++) { for (u32 i = 0; i < m_symbols.size(); i++) {
if (m_symbols[i].name.compare(name) == 0) { if (m_symbols[i].name.compare(name) == 0) {

View File

@ -10,12 +10,20 @@
namespace Core::Loader { namespace Core::Loader {
enum class SymbolType {
Unknown,
Function,
Object,
Tls,
NoType,
};
struct SymbolRecord { struct SymbolRecord {
std::string name; std::string name;
u64 virtual_address; u64 virtual_address;
}; };
struct SymbolRes { struct SymbolResolver {
std::string name; std::string name;
std::string nidName; std::string nidName;
std::string library; std::string library;
@ -23,7 +31,7 @@ struct SymbolRes {
std::string module; std::string module;
u8 module_version_major; u8 module_version_major;
u8 module_version_minor; u8 module_version_minor;
u32 type; SymbolType type;
}; };
class SymbolsResolver { class SymbolsResolver {
@ -31,10 +39,10 @@ public:
SymbolsResolver() = default; SymbolsResolver() = default;
virtual ~SymbolsResolver() = default; virtual ~SymbolsResolver() = default;
void AddSymbol(const SymbolRes& s, u64 virtual_addr); void AddSymbol(const SymbolResolver& s, u64 virtual_addr);
const SymbolRecord* FindSymbol(const SymbolRes& s) const; const SymbolRecord* FindSymbol(const SymbolResolver& s) const;
static std::string GenerateName(const SymbolRes& s); static std::string GenerateName(const SymbolResolver& s);
private: private:
std::vector<SymbolRecord> m_symbols; std::vector<SymbolRecord> m_symbols;