60 lines
2.0 KiB
C++
60 lines
2.0 KiB
C++
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#include "common/io_file.h"
|
|
#include "common/logging/log.h"
|
|
#include "common/string_util.h"
|
|
#include "common/types.h"
|
|
#include "core/aerolib/aerolib.h"
|
|
#include "core/loader/symbols_resolver.h"
|
|
|
|
namespace Core::Loader {
|
|
|
|
void SymbolsResolver::AddSymbol(const SymbolResolver& s, u64 virtual_addr) {
|
|
SymbolRecord& r = m_symbols.emplace_back();
|
|
r.name = GenerateName(s);
|
|
r.virtual_address = virtual_addr;
|
|
}
|
|
|
|
std::string SymbolsResolver::GenerateName(const SymbolResolver& s) {
|
|
return fmt::format("{}#{}#{}#{}#{}#{}#{}", s.name, s.library, s.library_version, s.module,
|
|
s.module_version_major, s.module_version_minor, SymbolTypeToS(s.type));
|
|
}
|
|
|
|
const SymbolRecord* SymbolsResolver::FindSymbol(const SymbolResolver& s) const {
|
|
const std::string name = GenerateName(s);
|
|
for (u32 i = 0; i < m_symbols.size(); i++) {
|
|
if (m_symbols[i].name == name) {
|
|
return &m_symbols[i];
|
|
}
|
|
}
|
|
|
|
// LOG_INFO(Core_Linker, "Unresolved! {}", name);
|
|
return nullptr;
|
|
}
|
|
|
|
void SymbolsResolver::DebugDump(const std::filesystem::path& file_name) {
|
|
Common::FS::IOFile f{file_name, Common::FS::FileAccessMode::Write,
|
|
Common::FS::FileType::TextFile};
|
|
for (const auto& symbol : m_symbols) {
|
|
const auto ids = Common::SplitString(symbol.name, '#');
|
|
std::string nidName = "";
|
|
auto aeronid = AeroLib::FindByNid(ids.at(0).c_str());
|
|
if (aeronid != nullptr) {
|
|
nidName = aeronid->name;
|
|
} else {
|
|
nidName = "UNK";
|
|
}
|
|
f.WriteString(
|
|
fmt::format("0x{:<20x} {:<16} {:<60} {:<30} {:<2} {:<30} {:<2} {:<2} {:<10}\n",
|
|
symbol.virtual_address, ids.at(0), nidName, ids.at(1), ids.at(2), ids.at(3),
|
|
ids.at(4), ids.at(5), ids.at(6)));
|
|
}
|
|
}
|
|
|
|
int SymbolsResolver::GetSize() {
|
|
return m_symbols.size();
|
|
}
|
|
|
|
} // namespace Core::Loader
|