Files
Project_CTR/makerom/elf.h
2015-12-17 16:20:03 +08:00

130 lines
2.1 KiB
C

#pragma once
typedef enum elf_errors
{
NOT_ELF_FILE = -10,
NOT_CTR_ARM_ELF = -11,
NON_EXECUTABLE_ELF = -12,
ELF_SECTION_NOT_FOUND = -13,
NOT_FIND_TEXT_SEGMENT = -14,
NOT_FIND_DATA_SEGMENT = -15,
ELF_SEGMENT_SECTION_SIZE_MISMATCH = -16,
ELF_SEGMENTS_NOT_CONTINUOUS = -17,
ELF_SEGMENTS_NOT_FOUND = -18,
} elf_errors;
typedef enum elf_section_type
{
SHT_NULL,
SHT_PROGBITS,
SHT_SYMTAB,
SHT_STRTAB,
SHT_RELA,
SHT_HASH,
SHT_DYNAMIC,
SHT_NOTE,
SHT_NOBITS,
SHT_REL,
SHT_SHLIB,
SHT_DYNSYM,
SHT_UNKNOWN12,
SHT_UNKNOWN13,
SHT_INIT_ARRAY,
SHT_FINI_ARRAY,
SHT_PREINIT_ARRAY,
SHT_GROUP,
SHT_SYMTAB_SHNDX,
SHT_NUM,
SHT_ARM_EXIDX = 0x70000001,
SHT_ARM_PREEMPTMAP,
SHT_ARM_ATTRIBUTES,
SHT_ARM_DEBUGOVERLAY,
SHT_ARM_OVERLAYSECTION
} elf_section_type;
typedef enum elf_section_flag
{
SHF_WRITE = 0x1,
SHF_ALLOC = 0x2,
SHF_EXECINSTR = 0x4,
SHF_MERGE = 0x10,
SHF_STRINGS = 0x20,
SHF_INFO_LINK = 0x40,
SHF_LINK_ORDER = 0x80,
SHF_OS_NONCONFORMING = 0x100,
SHF_GROUP = 0x200,
SHF_TLS = 0x400
} elf_section_flag;
typedef struct elf_section
{
const char *name;
u32 type;
u32 flags;
const u8 *ptr;
u32 fileOffset;
u32 size;
u32 vAddr;
u32 alignment;
} elf_section;
typedef enum elf_program_type
{
PT_NULL,
PT_LOAD,
PT_DYNAMIC,
PT_INTERP,
PT_NOTE,
PT_SHLIB,
PT_PHDR,
} elf_program_type;
typedef enum elf_program_flag
{
PF_X = 0x1,
PF_W = 0x2,
PF_R = 0x4,
PF_CTRSDK = 0x80000000,
PF_TEXT = (PF_R|PF_X),
PF_DATA = (PF_R|PF_W),
PF_RODATA = PF_R
} elf_program_flag;
typedef struct elf_segment
{
u32 type;
u32 flags;
const u8 *ptr;
u32 fileOffset;
u32 fileSize;
u32 memSize;
u32 vAddr;
u32 pAddr;
u32 alignment;
} elf_segment;
typedef struct elf_context
{
const u8 *file;
u32 shdrOffset;
u16 shdrNameIndex;
u32 phdrOffset;
u16 sectionNum;
elf_section *sections;
u16 segmentNum;
elf_segment *segments;
} elf_context;
int elf_Init(elf_context *ctx, const u8 *fp);
void elf_Free(elf_context *ctx);
u16 elf_SectionNum(elf_context *ctx);
const elf_section* elf_GetSections(elf_context *ctx);
u16 elf_SegmentNum(elf_context *ctx);
const elf_segment* elf_GetSegments(elf_context *ctx);