Moved ELF structures to C header
This commit is contained in:
119
include/elf.h
Normal file
119
include/elf.h
Normal file
@@ -0,0 +1,119 @@
|
||||
#pragma once
|
||||
|
||||
#include "types/physaddr.h"
|
||||
#include <stdint.h>
|
||||
|
||||
const uint32_t elf_magic_number = 0x464c457f;
|
||||
|
||||
enum elf_endianness_t
|
||||
{
|
||||
ELF_LITTLE_ENDIAN = 1,
|
||||
ELF_BIG_ENDIAN = 2
|
||||
};
|
||||
|
||||
enum elf_isa_t
|
||||
{
|
||||
ELF_ISA_NA = 0x00,
|
||||
ELF_ISA_x86 = 0x03,
|
||||
ELF_ISA_MIPS = 0x08,
|
||||
ELF_ISA_PPC = 0x14,
|
||||
ELF_ISA_PPC64 = 0x15,
|
||||
ELF_ISA_ARM = 0x28,
|
||||
ELF_ISA_x86_64 = 0x3E,
|
||||
ELF_ISA_AARCH64 = 0xB7
|
||||
};
|
||||
|
||||
enum elf_segment_type_t
|
||||
{
|
||||
ELF_UNUSED = 0,
|
||||
ELF_LOAD = 1,
|
||||
ELF_DYNAMIC = 2
|
||||
};
|
||||
|
||||
struct elf_file_header_t
|
||||
{
|
||||
uint32_t magic;
|
||||
char size;
|
||||
char endianness;
|
||||
char version;
|
||||
char abi;
|
||||
char abi_version;
|
||||
char reserved[7];
|
||||
uint16_t type;
|
||||
uint16_t machine;
|
||||
uint32_t _version;
|
||||
void *entry;
|
||||
#if defined __i386__ || defined __arm__
|
||||
uint32_t phoffset;
|
||||
uint32_t shoffset;
|
||||
#elif defined __x86_64__ || defined __aarch64__
|
||||
uint64_t phoffset;
|
||||
uint64_t shoffset;
|
||||
#endif
|
||||
uint32_t flags;
|
||||
uint16_t header_size;
|
||||
uint16_t phsize;
|
||||
uint16_t phcount;
|
||||
uint16_t shsize;
|
||||
uint16_t shcount;
|
||||
uint16_t shstrndx;
|
||||
};
|
||||
|
||||
struct elf_program_header_t
|
||||
{
|
||||
uint32_t type;
|
||||
#if defined __i386__ || defined __arm__
|
||||
uint32_t offset;
|
||||
void *vaddr;
|
||||
physaddr_t paddr;
|
||||
uint32_t filesize;
|
||||
uint32_t memsize;
|
||||
uint32_t flags;
|
||||
uint32_t align;
|
||||
#elif defined __x86_64__ || defined __aarch64__
|
||||
uint32_t flags;
|
||||
uint64_t offset;
|
||||
void *vaddr;
|
||||
physaddr_t paddr;
|
||||
uint64_t filesize;
|
||||
uint64_t memsize;
|
||||
uint64_t align;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct elf_section_header_t
|
||||
{
|
||||
uint32_t name;
|
||||
uint32_t type;
|
||||
#if defined __i386__ || defined __arm__
|
||||
uint32_t flags;
|
||||
void *addr;
|
||||
uint32_t offset;
|
||||
uint32_t size;
|
||||
uint32_t link;
|
||||
uint32_t info;
|
||||
uint32_t align;
|
||||
uint32_t entry_size;
|
||||
#elif defined __x86_64__ || defined __aarch64__
|
||||
uint64_t flags;
|
||||
void *addr;
|
||||
uint64_t offset;
|
||||
uint64_t size;
|
||||
uint32_t link;
|
||||
uint32_t info;
|
||||
uint64_t align;
|
||||
uint64_t entry_size;
|
||||
#endif
|
||||
};
|
||||
|
||||
#if defined __i386__
|
||||
static const elf_isa_t HOST_ISA = ELF_ISA_x86;
|
||||
#elif defined __x86_64__
|
||||
static const elf_isa_t HOST_ISA = ELF_ISA_x86_64;
|
||||
#elif defined __arm__
|
||||
static const elf_isa_t HOST_ISA = ELF_ISA_ARM;
|
||||
#elif defined __aarch64__
|
||||
static const elf_isa_t HOST_ISA = ELF_ISA_AARCH64;
|
||||
#endif
|
||||
|
||||
int load_elf_executable(void *file);
|
||||
44
src/elf.cpp
44
src/elf.cpp
@@ -1,44 +0,0 @@
|
||||
#include "elf.hpp"
|
||||
#include "util.hpp"
|
||||
|
||||
kernelns::ELF::ELF()
|
||||
{
|
||||
this->m_fileLocation = (void*) NULL;
|
||||
}
|
||||
|
||||
kernelns::ELF::ELF(void* location)
|
||||
{
|
||||
this->m_fileLocation = location;
|
||||
}
|
||||
|
||||
void* kernelns::ELF::entry()
|
||||
{
|
||||
Header* fileHeader = (Header*) m_fileLocation;
|
||||
return fileHeader->entry;
|
||||
}
|
||||
|
||||
int kernelns::ELF::validate()
|
||||
{
|
||||
Header* fileHeader = (Header*) m_fileLocation;
|
||||
if(fileHeader->magic != 0x464c457f)
|
||||
return -1;
|
||||
else if((ISA) fileHeader->machine != HOST_ISA)
|
||||
return -1;
|
||||
else if((Endianness) fileHeader->endianness != Little)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int kernelns::ELF::load()
|
||||
{
|
||||
Header* fileHeader = (Header*) m_fileLocation;
|
||||
ProgramHeader* programHeader = (ProgramHeader*) ((size_t) m_fileLocation + fileHeader->phoffset);
|
||||
int count = (int) fileHeader->phcount;
|
||||
for(int i = 0; i < count; i++)
|
||||
{
|
||||
if((SegmentType) programHeader->type != Load)
|
||||
continue;
|
||||
memcpy(programHeader->vaddr, m_fileLocation + programHeader->offset, programHeader->filesize);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
142
src/elf.hpp
142
src/elf.hpp
@@ -1,142 +0,0 @@
|
||||
#ifndef ELF_H
|
||||
#define ELF_H
|
||||
|
||||
#include "systypes.hpp"
|
||||
|
||||
namespace kernelns
|
||||
{
|
||||
|
||||
class ELF
|
||||
{
|
||||
public:
|
||||
|
||||
enum Endianness
|
||||
{
|
||||
Little = 1,
|
||||
Big = 2
|
||||
};
|
||||
|
||||
enum ISA
|
||||
{
|
||||
NA = 0x00,
|
||||
x86 = 0x03,
|
||||
MIPS = 0x08,
|
||||
PPC = 0x14,
|
||||
PPC64 = 0x15,
|
||||
ARM = 0x28,
|
||||
x86_64 = 0x3E,
|
||||
aarch64 = 0xB7
|
||||
};
|
||||
|
||||
enum SegmentType
|
||||
{
|
||||
Unused = 0,
|
||||
Load = 1,
|
||||
Dynamic = 2
|
||||
};
|
||||
|
||||
struct Header
|
||||
{
|
||||
uint32_t magic;
|
||||
char size;
|
||||
char endianness;
|
||||
char version;
|
||||
char abi;
|
||||
char abiVersion;
|
||||
char reserved[7];
|
||||
uint16_t type;
|
||||
uint16_t machine;
|
||||
uint32_t _version;
|
||||
void* entry;
|
||||
#if defined __i386__ || defined __arm__
|
||||
uint32_t phoffset;
|
||||
uint32_t shoffset;
|
||||
#elif defined __x86_64__ || defined __aarch64__
|
||||
uint64_t phoffset;
|
||||
uint64_t shoffset;
|
||||
#endif
|
||||
uint32_t flags;
|
||||
uint16_t headerSize;
|
||||
uint16_t phsize;
|
||||
uint16_t phcount;
|
||||
uint16_t shsize;
|
||||
uint16_t shcount;
|
||||
uint16_t shstrndx;
|
||||
};
|
||||
|
||||
struct ProgramHeader
|
||||
{
|
||||
uint32_t type;
|
||||
#if defined __i386__ || defined __arm__
|
||||
uint32_t offset;
|
||||
void* vaddr;
|
||||
physaddr_t paddr;
|
||||
uint32_t filesize;
|
||||
uint32_t memsize;
|
||||
uint32_t flags;
|
||||
uint32_t align;
|
||||
#elif defined __x86_64__ || defined __aarch64__
|
||||
uint32_t flags;
|
||||
uint64_t offset;
|
||||
void* vaddr;
|
||||
physaddr_t paddr;
|
||||
uint64_t filesize;
|
||||
uint64_t memsize;
|
||||
uint64_t align;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct SectionHeader
|
||||
{
|
||||
uint32_t name;
|
||||
uint32_t type;
|
||||
#if defined __i386__ || defined __arm__
|
||||
uint32_t flags;
|
||||
void* addr;
|
||||
uint32_t offset;
|
||||
uint32_t size;
|
||||
uint32_t link;
|
||||
uint32_t info;
|
||||
uint32_t align;
|
||||
uint32_t entrysize;
|
||||
#elif defined __x86_64__ || defined __aarch64__
|
||||
uint64_t flags;
|
||||
void* addr;
|
||||
uint64_t offset;
|
||||
uint64_t size;
|
||||
uint32_t link;
|
||||
uint32_t info;
|
||||
uint64_t align;
|
||||
uint64_t entrysize;
|
||||
#endif
|
||||
};
|
||||
|
||||
#if defined __i386__
|
||||
static const ISA HOST_ISA = x86;
|
||||
#elif defined __x86_64__
|
||||
static const ISA HOST_ISA = x86_64;
|
||||
#elif defined __arm__
|
||||
static const ISA HOST_ISA = ARM;
|
||||
#elif defined __aarch64__
|
||||
static const ISA HOST_ISA = aarch64;
|
||||
#endif
|
||||
|
||||
ELF();
|
||||
|
||||
ELF(void* location);
|
||||
|
||||
void* entry();
|
||||
|
||||
int validate();
|
||||
|
||||
int load();
|
||||
|
||||
private:
|
||||
|
||||
void* m_fileLocation;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user