diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/elf.c | 29 |
1 files changed, 29 insertions, 0 deletions
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); +} |
