shadPS4/src/core/linker.h

129 lines
2.9 KiB
C
Raw Normal View History

2023-05-23 06:48:25 +02:00
#pragma once
2023-06-19 06:51:56 +02:00
#include <vector>
#include <mutex>
2023-11-06 00:11:54 +01:00
#include "core/loader/elf.h"
#include "core/loader/symbols_resolver.h"
namespace Core {
2023-05-23 06:48:25 +02:00
struct DynamicModuleInfo;
class Linker;
struct EntryParams {
int argc;
u32 padding;
const char* argv[3];
};
2023-11-06 00:11:54 +01:00
struct ModuleInfo {
2023-06-11 14:35:04 +02:00
std::string name;
2023-11-06 00:11:54 +01:00
union {
2023-06-11 14:35:04 +02:00
u64 value;
2023-11-06 00:11:54 +01:00
struct {
2023-06-11 14:35:04 +02:00
u32 name_offset;
u08 version_minor;
u08 version_major;
u16 id;
};
};
2023-06-14 06:47:44 +02:00
std::string enc_id;
2023-06-11 14:35:04 +02:00
};
2023-11-06 00:11:54 +01:00
struct LibraryInfo {
std::string name;
2023-11-06 00:11:54 +01:00
union {
u64 value;
2023-11-06 00:11:54 +01:00
struct {
u32 name_offset;
u16 version;
u16 id;
};
};
2023-06-14 06:47:44 +02:00
std::string enc_id;
};
2023-11-06 00:11:54 +01:00
struct DynamicModuleInfo {
void* hash_table = nullptr;
u64 hash_table_size = 0;
char* str_table = nullptr;
u64 str_table_size = 0;
elf_symbol* symbol_table = nullptr;
u64 symbol_table_total_size = 0;
u64 symbol_table_entries_size = 0;
u64 init_virtual_addr = 0;
u64 fini_virtual_addr = 0;
u64 pltgot_virtual_addr = 0;
u64 init_array_virtual_addr = 0;
u64 fini_array_virtual_addr = 0;
u64 preinit_array_virtual_addr = 0;
u64 init_array_size = 0;
u64 fini_array_size = 0;
u64 preinit_array_size = 0;
elf_relocation* jmp_relocation_table = nullptr;
u64 jmp_relocation_table_size = 0;
s64 jmp_relocation_type = 0;
elf_relocation* relocation_table = nullptr;
u64 relocation_table_size = 0;
u64 relocation_table_entries_size = 0;
u64 debug = 0;
u64 textrel = 0;
u64 flags = 0;
std::vector<const char*> needed;
std::vector<ModuleInfo> import_modules;
std::vector<ModuleInfo> export_modules;
std::vector<LibraryInfo> import_libs;
std::vector<LibraryInfo> export_libs;
std::string filename; // Filename with absolute path
2023-05-23 06:48:25 +02:00
};
// This struct keeps neccesary info about loaded modules. Main executeable is included too as well
2023-11-06 00:11:54 +01:00
struct Module {
Loader::Elf elf;
u64 aligned_base_size = 0;
u64 base_virtual_addr = 0; // Base virtual address
Linker* linker = nullptr;
std::vector<u08> m_dynamic;
std::vector<u08> m_dynamic_data;
DynamicModuleInfo dynamic_info{};
2023-11-06 00:11:54 +01:00
Loader::SymbolsResolver export_sym;
Loader::SymbolsResolver import_sym;
};
class Linker {
2023-05-23 06:48:25 +02:00
public:
Linker();
virtual ~Linker();
Module* LoadModule(const std::string& elf_name);
Module* FindModule(/*u32 id*/);
void LoadModuleToMemory(Module* m);
2023-06-13 06:43:58 +02:00
void LoadDynamicInfo(Module* m);
void LoadSymbols(Module* m);
2023-11-06 00:11:54 +01:00
Loader::SymbolsResolver& getHLESymbols() { return m_hle_symbols; }
2023-07-04 17:34:23 +02:00
void Relocate(Module* m);
2023-11-06 00:11:54 +01:00
void Resolve(const std::string& name, int Symtype, Module* m, Loader::SymbolRecord* return_info);
void Execute();
private:
2023-06-18 16:54:22 +02:00
const ModuleInfo* FindModule(const Module& m, const std::string& id);
const LibraryInfo* FindLibrary(const Module& program, const std::string& id);
2023-06-28 19:15:19 +02:00
std::vector<Module> m_modules;
2023-11-06 00:11:54 +01:00
Loader::SymbolsResolver m_hle_symbols{};
std::mutex m_mutex;
2023-10-26 21:55:13 +02:00
};
2023-11-06 00:11:54 +01:00
} // namespace Core