Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Rubberduckycooly
GitHub Repository: Rubberduckycooly/RSDKv5-Decompilation
Path: blob/master/dependencies/switch/libnx-dyn/dyn.h
774 views
1
2
#pragma once
3
#include <elf.h>
4
#include <switch.h>
5
6
#define NRR0_MAGIC 0x3052524E
7
#define MOD0_MAGIC 0x30444F4D
8
9
typedef struct
10
{
11
u32 magic;
12
u32 dynamic;
13
u32 bss_start;
14
u32 bss_end;
15
u32 unwind_start;
16
u32 unwind_end;
17
u32 module_object;
18
} DynModuleHeader;
19
20
typedef enum
21
{
22
DynModuleState_Invalid,
23
DynModuleState_Queued,
24
DynModuleState_Scanned,
25
DynModuleState_Relocated,
26
DynModuleState_Initialized,
27
DynModuleState_Finalized,
28
DynModuleState_Unloaded
29
} DynModuleState;
30
31
32
typedef struct {
33
char name[FS_MAX_PATH];
34
void *base;
35
void *nro;
36
void *nrr;
37
void *bss;
38
void *loader_data;
39
bool is_nro;
40
bool is_global;
41
bool has_run_basic_relocations;
42
} DynModuleInput;
43
44
#define MAX_MODULES 32 // This might be increased...
45
#define MAX_DEPENDENCIES 32
46
47
typedef struct DynModule DynModule;
48
49
struct DynModule {
50
DynModuleState state;
51
int ref_count;
52
DynModuleInput input;
53
DynModule *dependencies[MAX_DEPENDENCIES];
54
u32 dependency_count;
55
void *address;
56
Elf64_Dyn *dynamic;
57
Elf64_Sym *symtab;
58
const char *strtab;
59
u32 *hash;
60
};
61
62
enum {
63
Module_LibnxDyn = 350,
64
};
65
66
enum {
67
LibnxDynError_InvalidInputNro = 1,
68
LibnxDynError_MissingDtEntry,
69
LibnxDynError_DuplicatedDtEntry,
70
LibnxDynError_InvalidSymEnt,
71
LibnxDynError_InvalidModuleState,
72
LibnxDynError_InvalidRelocEnt,
73
LibnxDynError_InvalidRelocTableSize,
74
LibnxDynError_RelaUnsupportedSymbol,
75
LibnxDynError_UnrecognizedRelocType,
76
LibnxDynError_InvalidRelocTableType,
77
LibnxDynError_NeedsSymTab,
78
LibnxDynError_NeedsStrTab,
79
LibnxDynError_CouldNotResolveSymbol,
80
81
LibnxDynError_InvalidInputElf = 20,
82
LibnxDynError_InsufficientSysCalls,
83
};
84
85
// Custom ELF structs grabbed from libtransistor
86
87
typedef struct {
88
u64 r_offset;
89
u32 r_reloc_type;
90
u32 r_symbol;
91
u64 r_addend;
92
} Dyn_Elf64_Rela;
93
94
typedef struct {
95
u64 r_offset;
96
u32 r_reloc_type;
97
u32 r_symbol;
98
} Dyn_Elf64_Rel;
99
100
typedef struct {
101
Elf64_Phdr phdr;
102
void *dst;
103
void *src;
104
void *clone;
105
size_t size;
106
} Dyn_Elf64_Seg;
107
108
typedef struct {
109
void *as_base;
110
size_t as_size;
111
Dyn_Elf64_Seg *segments;
112
size_t num_segments;
113
} Dyn_Elf64_Data;
114
115
Result dynElfFindValue(Elf64_Dyn *dynamic, s64 tag, u64 *value);
116
Result dynElfFindOffset(Elf64_Dyn *dynamic, s64 tag, void **value, void *aslr_base);
117
u64 dynElfHashString(const char *str);
118
119
Result dynInitialize();
120
void dynExit();
121
122
Result dynLoadFromMemory(const char *name, void *addr);
123
Result dynLoadNroModule(DynModule *out, const char *path, bool global);
124
void dynModuleUnload(DynModule *mod);
125
void dynUnloadMyName(const char *name);
126
void dynUnloadAll();
127
128
Result dynModuleLookupSymbol(DynModule *mod, const char *name, void **out_sym);
129