shadPS4/src/Core/PS4/Linker.h

108 lines
2.0 KiB
C
Raw Normal View History

2023-05-23 06:48:25 +02:00
#pragma once
#include "../../Loader/Elf.h"
#include <vector>
2023-05-23 06:48:25 +02:00
struct DynamicModuleInfo;
2023-05-23 06:48:25 +02:00
/*this struct keeps neccesary info about loaded modules.Main executeable is included too as well*/
struct Module
{
Elf* elf = nullptr;
u64 aligned_base_size = 0;
u64 base_virtual_addr = 0; //base virtual address
void* m_dynamic = nullptr;
void* m_dynamic_data = nullptr;
DynamicModuleInfo* dynamic_info = nullptr;
};
2023-06-11 14:35:04 +02:00
struct ModuleInfo
{
std::string name;
union
{
u64 value;
struct
{
u32 name_offset;
u08 version_minor;
u08 version_major;
u16 id;
};
};
};
struct LibraryInfo
{
std::string name;
union
{
u64 value;
struct
{
u32 name_offset;
u16 version;
u16 id;
};
};
};
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;
2023-06-13 06:43:58 +02:00
std::vector<LibraryInfo> export_libs;
std::string filename;//filename with absolute path
2023-05-23 06:48:25 +02:00
};
class Linker
{
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);
private:
std::vector<Module*> m_modules;
2023-05-23 06:48:25 +02:00
};