libkernaux/include/kernaux/elf.h

96 lines
2.3 KiB
C

#ifndef KERNAUX_INCLUDED_ELF
#define KERNAUX_INCLUDED_ELF
#ifdef __cplusplus
extern "C" {
#endif
#include <kernaux/macro.h>
#include <stdbool.h>
#include <kernaux/macro/packing_start.run>
struct KernAux_ELF_Header {
unsigned magic_0x7f : 8;
unsigned magic_E : 8;
unsigned magic_L : 8;
unsigned magic_F : 8;
unsigned bitness : 8;
unsigned endianness : 8;
unsigned header_version : 8;
unsigned os_abi : 8;
unsigned unused1 : 32;
unsigned unused2 : 32;
unsigned obj_type : 16;
unsigned isa : 16;
unsigned elf_version : 32;
unsigned entrypoint : 32;
unsigned prog_table_pos : 32;
unsigned sect_table_pos : 32;
unsigned arch_flags : 32;
unsigned header_size : 16;
unsigned prog_entr_size : 16;
unsigned prog_entr_num : 16;
unsigned sect_entr_size : 16;
unsigned sect_entr_num : 16;
unsigned sect_names_idx : 16;
}
KERNAUX_PACKED;
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_ELF_Header, 52);
struct KernAux_ELF_ProgramEntry {
unsigned type : 32;
unsigned offset : 32;
unsigned virt_addr : 32;
unsigned phys_addr : 32;
unsigned file_size : 32;
unsigned mem_size : 32;
unsigned flags : 32;
unsigned align : 32;
}
KERNAUX_PACKED;
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_ELF_ProgramEntry, 32);
struct KernAux_ELF_SectionEntry {
unsigned name : 32;
unsigned type : 32;
unsigned flags : 32;
unsigned vaddr : 32;
unsigned file_offset : 32;
unsigned file_size : 32;
unsigned link : 32;
unsigned info : 32;
unsigned alignment : 32;
unsigned ent_size : 32;
}
KERNAUX_PACKED;
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_ELF_SectionEntry, 40);
struct KernAux_ELF_RelocationEntry {
unsigned virt_addr : 32;
unsigned info : 32;
}
KERNAUX_PACKED;
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_ELF_RelocationEntry, 8);
#include <kernaux/macro/packing_end.run>
typedef struct KernAux_ELF_ProgramEntry KernAux_ELF_ProgramTable[];
typedef struct KernAux_ELF_SectionEntry KernAux_ELF_SectionTable[];
typedef struct KernAux_ELF_RelocationEntry KernAux_ELF_RelocationTable[];
bool KernAux_ELF_Header_is_valid(const struct KernAux_ELF_Header *header);
#ifdef __cplusplus
}
#endif
#endif