blob: 4b19f2ffce25ebe35d1bd2cd62b7fd93ed536641 (
plain) (
blame)
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
|
// MIT License, Copyright (c) 2021 Marvin Borner
// According to spec
#ifndef ELF_H
#define ELF_H
#include <def.h>
#include <dev.h>
#define ELF_MAG0 0x7F
#define ELF_MAG1 'E'
#define ELF_MAG2 'L'
#define ELF_MAG3 'F'
#define ELF_IDENT_COUNT 16
#define ELF_IDENT_MAG0 0
#define ELF_IDENT_MAG1 1
#define ELF_IDENT_MAG2 2
#define ELF_IDENT_MAG3 3
#define ELF_IDENT_CLASS 4
#define ELF_IDENT_CLASS_NONE 0
#define ELF_IDENT_CLASS_32 1
#define ELF_IDENT_CLASS_64 2
#define ELF_IDENT_DATA 5
#define ELF_IDENT_DATA_NONE 0
#define ELF_IDENT_DATA_LSB 1
#define ELF_IDENT_DATA_MSB 2
#define ELF_IDENT_VERSION 6
#define ELF_IDENT_OSABI 7
#define ELF_IDENT_ABIVERSION 8
#define ELF_IDENT_PAD 9
#define ELF_ETYPE_NONE 0
#define ELF_ETYPE_REL 1
#define ELF_ETYPE_EXEC 2
#define ELF_ETYPE_DYN 3
#define ELF_ETYPE_CORE 4
#define ELF_ETYPE_NUM 5
#define ELF_MACHINE_NONE 0
#define ELF_MACHINE_SPARC 2
#define ELF_MACHINE_386 3
#define ELF_MACHINE_SPARC32PLUS 18
#define ELF_MACHINE_SPARCV9 43
#define ELF_MACHINE_AMD64 62
#define ELF_PROGRAM_TYPE_NULL 0
#define ELF_PROGRAM_TYPE_LOAD 1
#define ELF_PROGRAM_TYPE_DYNAMIC 2
#define ELF_PROGRAM_TYPE_INTERP 3
#define ELF_PROGRAM_TYPE_NOTE 4
#define ELF_PROGRAM_TYPE_SHLIB 5
#define ELF_PROGRAM_TYPE_PHDR 6
#define ELF_PROGRAM_TYPE_TLS 7
#define ELF_PROGRAM_FLAG_X 0x1
#define ELF_PROGRAM_FLAG_W 0x2
#define ELF_PROGRAM_FLAG_R 0x4
#define ELF_SECTION_TYPE_NULL 0
#define ELF_SECTION_TYPE_PROGBITS 1
#define ELF_SECTION_TYPE_SYMTAB 2
#define ELF_SECTION_TYPE_STRTAB 3
#define ELF_SECTION_TYPE_RELA 4
#define ELF_SECTION_TYPE_HASH 5
#define ELF_SECTION_TYPE_DYNAMIC 6
#define ELF_SECTION_TYPE_NOTE 7
#define ELF_SECTION_TYPE_NOBITS 8
#define ELF_SECTION_TYPE_REL 9
#define ELF_SECTION_TYPE_SHLIB 10
#define ELF_SECTION_TYPE_DYNSYM 11
#define ELF_SECTION_TYPE_COUNT 12
#define ELF_SECTION_FLAG_WRITE 0x1
#define ELF_SECTION_FLAG_ALLOC 0x2
#define ELF_SECTION_FLAG_EXEC 0x3
#define ELF_SECTION_FLAG_MERGE 0x10
#define ELF_SECTION_FLAG_STRINGS 0x20
#define ELF_SECTION_FLAG_INFO_LINK 0x40
#define ELF_SECTION_FLAG_LINK_ORDER 0x80
#define ELF_SECTION_FLAG_OS_SPECIAL 0x100
#define ELF_SECTION_FLAG_GROUP 0x200
#define ELF_SECTION_FLAG_TLS 0x400
#define ELF_SECTION_FLAG_COMPRESSED 0x800
#define ELF_BSS ".bss"
#define ELF_DATA ".data"
#define ELF_DEBUG ".debug"
#define ELF_DYNAMIC ".dynamic"
#define ELF_DYNSTR ".dynstr"
#define ELF_DYNSYM ".dynsym"
#define ELF_FINI ".fini"
#define ELF_GOT ".got"
#define ELF_HASH ".hash"
#define ELF_INIT ".init"
#define ELF_REL_DATA ".rel.data"
#define ELF_REL_FINI ".rel.fini"
#define ELF_REL_INIT ".rel.init"
#define ELF_REL_DYN ".rel.dyn"
#define ELF_REL_RODATA ".rel.rodata"
#define ELF_REL_TEXT ".rel.text"
#define ELF_RODATA ".rodata"
#define ELF_SHSTRTAB ".shstrtab"
#define ELF_STRTAB ".strtab"
#define ELF_SYMTAB ".symtab"
#define ELF_TEXT ".text"
struct elf_header {
u8 ident[ELF_IDENT_COUNT];
u16 type;
u16 machine;
u32 version;
u32 entry;
u32 phoff;
u32 shoff;
u32 flags;
u16 ehsize;
u16 phentsize;
u16 phnum;
u16 shentsize;
u16 shnum;
u16 shstrndx;
} PACKED;
struct elf_program {
u32 type;
u32 offset;
u32 vaddr;
u32 paddr;
u32 filesz;
u32 memsz;
u32 flags;
u32 align;
} PACKED;
struct elf_section {
u32 name;
u32 type;
u32 flags;
u32 addr;
u32 offset;
u32 size;
u32 link;
u32 info;
u32 addralign;
u32 entsize;
} PACKED;
struct elf_symbol {
u32 name;
u32 value;
u32 size;
u8 info;
u8 other;
u16 shndx;
} PACKED;
u32 elf_load(struct dev *dev, const char *path);
#endif
|