-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathelf.h
166 lines (149 loc) · 3.36 KB
/
elf.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
/*****************************************
NanoShell Operating System
(C) 2021 iProgramInCpp
ELF Executable module header file
******************************************/
#ifndef _ELF_H
#define _ELF_H
#include <stdint.h>
#include <process.h>
#include <main.h>
#define SAFE_FREE(ptr) do { \
if (ptr) { \
MmFree(ptr); \
ptr = NULL; \
} \
} while (0)
typedef uint16_t EHalf;
typedef uint32_t EOffs;
typedef uint32_t EAddr;
typedef uint32_t EWord;
typedef int32_t ESwrd;
typedef int (*ElfEntry)(const char*);
#define ELF_IDENT_SIZE 16
typedef struct {
uint8_t m_ident[ELF_IDENT_SIZE];
EHalf m_type;
EHalf m_machine;
EWord m_version;
EAddr m_entry;
EOffs m_phOffs;
EOffs m_shOffs;
EWord m_flags;
EHalf m_ehSize;
EHalf m_phEntSize;
EHalf m_phNum;
EHalf m_shEntSize;
EHalf m_shNum;
EHalf m_shStrNdx;
}
__attribute__((packed))
ElfHeader;
typedef struct {
EWord m_type;
EOffs m_offset;
EAddr m_virtAddr;
EAddr m_physAddr;//we don't care about this
EWord m_fileSize;
EWord m_memSize;
EWord m_flags;
EWord m_align;//0x1000
}
__attribute__((packed))
ElfProgHeader;
typedef struct {
EWord m_name;
EWord m_type;
EWord m_flags;
EAddr m_addr;
EOffs m_offset;
EWord m_shSize;
EWord m_shLink;
EWord m_shInfo;
EWord m_shAddrAlign;
EWord m_shEntSize;
}
__attribute__((packed))
ElfSectHeader;
typedef struct {
union {
EWord m_stName;
const char* m_pName;
};
EAddr m_stValue;
EWord m_stSize;
uint8_t m_stInfo;
uint8_t m_stOther; // set to 255 if we have set the m_pName field. Hack!!
EHalf m_stShIndex;
}
__attribute__((packed))
ElfSymbol;
enum {
EI_MAG0 = 0, //0x7f
EI_MAG1, //'E'
EI_MAG2, //'L'
EI_MAG3, //'F'
EI_CLASS, //Arch (32/64). We only support 32 bit
EI_DATA, //Byte order. We only support little-endian.
EI_VERSION, //ELF Version. Usually 0x01
EI_OSABI, //OS Specific
EI_ABIVER, //OS Specific
EI_PADDING, //Padding
};
#define ELFMAG0 0x7f
#define ELFMAG1 'E'
#define ELFMAG2 'L'
#define ELFMAG3 'F'
#define ELF_DATA_BYTEORDER 1
#define ELF_CLASS_32BIT 1
enum {
ELF_TYPE_NONE = 0, //Unknown
ELF_TYPE_RELOC, //Relocatable file
ELF_TYPE_EXEC, //Executable file
};
#define ELF_MACH_386 3 //x86 Machine type
#define ELF_VER_CURRENT 1 //current version. V1
enum {
ELF_ERROR_NONE = 0x40000000,
ELF_HEADER_INCORRECT,
ELF_MACHINE_INCORRECT,
ELF_ENDIANNESS_INCORRECT,
ELF_CLASS_INCORRECT,
ELF_VERSION_INCORRECT,
ELF_FILETYPE_INCORRECT,
ELF_RELOCATE_ERROR,
ELF_CANT_MAKE_HEAP,
ELF_INVALID_SEGMENTS,
ELF_FILE_NOT_FOUND,
ELF_FILE_IO_ERROR,
ELF_OUT_OF_MEMORY,
ELF_PROCESS_ERROR,
ELF_KILLED,
ELF_EXEC_BLOCKED,
ELF_EXEC_BLOCKED_GLOBALLY,
ELF_RESOURCE_TABLE_NOT_ORDERED,
ELF_ERR_COUNT,
};
enum
{
SHT_NULL,
SHT_PROGBITS,
SHT_SYMTAB,
SHT_STRTAB,
SHT_RELA,
SHT_HASH,
SHT_DYNAMIC,
SHT_NOTE,
SHT_NOBITS,
SHT_REL,
SHT_SHLIB,
SHT_DYNSYM,
//...
};
const char *ElfGetErrorMsg (int error_code);
int ElfRunProgram(const char *pFileName, const char *args, bool bAsync, bool bGui, UNUSED int nHeapSize, int *pElfErrorCodeOut);
ElfSymbol* ExLookUpSymbol(Process* pProc, uintptr_t address);
bool ElfCheckHeader(ElfHeader* pHeader);
const char* ElfGetArchitectureString(uint16_t machine, uint8_t word_size);
const char* ElfGetOSABIString(uint8_t abi);
#endif//_ELF_H