Path: blob/master/dependencies/switch/libnx-dyn/dyn.h
774 views
1#pragma once2#include <elf.h>3#include <switch.h>45#define NRR0_MAGIC 0x3052524E6#define MOD0_MAGIC 0x30444F4D78typedef struct9{10u32 magic;11u32 dynamic;12u32 bss_start;13u32 bss_end;14u32 unwind_start;15u32 unwind_end;16u32 module_object;17} DynModuleHeader;1819typedef enum20{21DynModuleState_Invalid,22DynModuleState_Queued,23DynModuleState_Scanned,24DynModuleState_Relocated,25DynModuleState_Initialized,26DynModuleState_Finalized,27DynModuleState_Unloaded28} DynModuleState;293031typedef struct {32char name[FS_MAX_PATH];33void *base;34void *nro;35void *nrr;36void *bss;37void *loader_data;38bool is_nro;39bool is_global;40bool has_run_basic_relocations;41} DynModuleInput;4243#define MAX_MODULES 32 // This might be increased...44#define MAX_DEPENDENCIES 324546typedef struct DynModule DynModule;4748struct DynModule {49DynModuleState state;50int ref_count;51DynModuleInput input;52DynModule *dependencies[MAX_DEPENDENCIES];53u32 dependency_count;54void *address;55Elf64_Dyn *dynamic;56Elf64_Sym *symtab;57const char *strtab;58u32 *hash;59};6061enum {62Module_LibnxDyn = 350,63};6465enum {66LibnxDynError_InvalidInputNro = 1,67LibnxDynError_MissingDtEntry,68LibnxDynError_DuplicatedDtEntry,69LibnxDynError_InvalidSymEnt,70LibnxDynError_InvalidModuleState,71LibnxDynError_InvalidRelocEnt,72LibnxDynError_InvalidRelocTableSize,73LibnxDynError_RelaUnsupportedSymbol,74LibnxDynError_UnrecognizedRelocType,75LibnxDynError_InvalidRelocTableType,76LibnxDynError_NeedsSymTab,77LibnxDynError_NeedsStrTab,78LibnxDynError_CouldNotResolveSymbol,7980LibnxDynError_InvalidInputElf = 20,81LibnxDynError_InsufficientSysCalls,82};8384// Custom ELF structs grabbed from libtransistor8586typedef struct {87u64 r_offset;88u32 r_reloc_type;89u32 r_symbol;90u64 r_addend;91} Dyn_Elf64_Rela;9293typedef struct {94u64 r_offset;95u32 r_reloc_type;96u32 r_symbol;97} Dyn_Elf64_Rel;9899typedef struct {100Elf64_Phdr phdr;101void *dst;102void *src;103void *clone;104size_t size;105} Dyn_Elf64_Seg;106107typedef struct {108void *as_base;109size_t as_size;110Dyn_Elf64_Seg *segments;111size_t num_segments;112} Dyn_Elf64_Data;113114Result dynElfFindValue(Elf64_Dyn *dynamic, s64 tag, u64 *value);115Result dynElfFindOffset(Elf64_Dyn *dynamic, s64 tag, void **value, void *aslr_base);116u64 dynElfHashString(const char *str);117118Result dynInitialize();119void dynExit();120121Result dynLoadFromMemory(const char *name, void *addr);122Result dynLoadNroModule(DynModule *out, const char *path, bool global);123void dynModuleUnload(DynModule *mod);124void dynUnloadMyName(const char *name);125void dynUnloadAll();126127Result dynModuleLookupSymbol(DynModule *mod, const char *name, void **out_sym);128129