summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/elf.c
blob: ae0fa71b1e38aa4729d6a86b4afe6bad0f620fb9 (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
#include "elf.h"
#include "init.h"
#include <stddef.h>

int 
elf64_ehdr_valid(Elf64_Ehdr *ehdr)
{
    if(ehdr->e_ident[EI_MAG0] != ELFMAG0 ||
       ehdr->e_ident[EI_MAG1] != ELFMAG1 ||
       ehdr->e_ident[EI_MAG2] != ELFMAG2 ||
       ehdr->e_ident[EI_MAG3] != ELFMAG3) 
        return 0;
    if(ehdr->e_ident[EI_CLASS] != ELFCLASS64) return 0;
    if(ehdr->e_ident[EI_DATA] != ELFDATA2LSB) return 0;
    if(ehdr->e_type != ET_EXEC) return 0;
    if(ehdr->e_machine != EM_X86_64) return 0;

    return 1;
}

void*
elf64_loadexec(Elf64_Ehdr *ehdr)
{
    if(!elf64_ehdr_valid(ehdr)) return NULL;

    void *entry = (void*)ehdr->e_entry;

    return entry;
}