summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/elf.h68
-rw-r--r--include/types.h1
-rw-r--r--kernel/elf.c29
3 files changed, 81 insertions, 17 deletions
diff --git a/include/elf.h b/include/elf.h
index ad8c550..76c384d 100644
--- a/include/elf.h
+++ b/include/elf.h
@@ -4,31 +4,52 @@
#define ELF_MAGIC_LE 0x464C457F
#define ELF_PAD 0
-#define EI_MAG0 0
-#define EI_MAG1 1
-#define EI_MAG2 2
-#define EI_MAG3 3
#define EI_CLASS 4
#define EI_DATA 5
#define EI_VERSION 6
#define EI_OSABI 7
#define EI_ABI_VERSION 8
+#define ELFDATA2LSB 1
+#define ELFDATA2MSB 2
+
+#define ELFCLASS32 1
+#define ELFCLASS64 2
+
+#define EV_CURRENT 1
+
+#ifdef __SYS_LITTLE_ENDIAN__
+ #define ELFHOSTDATA ELFDATA2LSB
+#else
+ #define ELFHOSTDATA ELFDATA2MSB
+#endif
+
+#ifdef __SYS_64_BIT__
+ #define ELFHOSTCLASS ELFCLASS64
+#else
+ #define ELFHOSTCLASS ELFCLASS32
+#endif
+
struct elf_header {
uint8_t e_ident[16];
- uint8_t e_type;
- uint8_t e_machine;
- uint8_t e_version;
- uint8_t e_entry;
- uint8_t e_phoff;
- uint8_t e_shoff;
- uint8_t e_flags;
- uint8_t e_ehsize;
- uint8_t e_phentsize;
- uint8_t e_phnum;
- uint8_t e_shentsize;
- uint8_t e_shnum;
- uint8_t e_shstrndx;
+
+ uint16_t e_type;
+ uint16_t e_machine;
+ uint32_t e_version;
+
+ uint32_t e_entry;
+ uint32_t e_phoff;
+ uint32_t e_shoff;
+
+ uint32_t e_flags;
+
+ uint16_t e_ehsize;
+ uint16_t e_phentsize;
+ uint16_t e_phnum;
+
+ uint16_t e_shentsize;
+ uint16_t e_shnum;
+ uint16_t e_shstrndx;
};
struct elf_section_header {
@@ -44,4 +65,17 @@ struct elf_section_header {
uint32_t sh_entsize;
};
+struct elf_program_header {
+ uint32_t p_type;
+ uint32_t p_offset;
+ uint32_t p_vaddr;
+ uint32_t p_paddr;
+ uint32_t p_filesz;
+ uint32_t p_memsz;
+ uint32_t p_flags;
+ uint32_t p_align;
+};
+
int elf_chk_header(struct elf_header *header);
+struct elf_section_header *elf_get_section(struct elf_header *hdr, void *data, uint32_t index);
+char *elf_get_section_name(struct elf_header *hdr, struct elf_section_header *section, void *data);
diff --git a/include/types.h b/include/types.h
index 821e108..5be3023 100644
--- a/include/types.h
+++ b/include/types.h
@@ -2,6 +2,7 @@
#define NULL (void*)0
+#define uintptr_t __wk_size_t
#define size_t __wk_size_t
#define uint8_t __wk_uint8_t
#define uint16_t __wk_uint16_t
diff --git a/kernel/elf.c b/kernel/elf.c
index f1ceb2d..69c4128 100644
--- a/kernel/elf.c
+++ b/kernel/elf.c
@@ -8,5 +8,34 @@ int elf_chk_header(struct elf_header *header) {
return -1;
}
+ if (header->e_ident[EI_CLASS] != ELFHOSTCLASS) {
+ return -1;
+ }
+
+ if (header->e_ident[EI_DATA] != ELFHOSTDATA) {
+ return -1;
+ }
+
+ if (header->e_ident[EI_VERSION] != EV_CURRENT) {
+ return -1;
+ }
+
return 0;
}
+
+struct elf_section_header *elf_get_section(struct elf_header *hdr, void *data, uint32_t index) {
+ uint8_t *base = (uint8_t *)data;
+
+ if (index >= hdr->e_shnum) {
+ return 0;
+ }
+
+ return (struct elf_section_header *)(base
+ + hdr->e_shoff
+ + index * hdr->e_shentsize);
+}
+
+char *elf_get_section_name(struct elf_header *hdr, struct elf_section_header *section, void *data) {
+ struct elf_section_header *shstrtab = elf_get_section(hdr, data, hdr->e_shstrndx);
+ return (char *)((uintptr_t)section->sh_name + (uintptr_t)shstrtab->sh_offset + (uintptr_t)data);
+}