50 lines
1.6 KiB
C
50 lines
1.6 KiB
C
#ifndef MR4TH_ELF_PARSE_H
|
|
#define MR4TH_ELF_PARSE_H
|
|
|
|
////////////////////////////////
|
|
// Elf Parse Types
|
|
|
|
#define ELFP_SYMBOL_TABLE_symtab 0
|
|
#define ELFP_SYMBOL_TABLE_dynsym 1
|
|
#define ELFP_SYMBOL_TABLE_COUNT 2
|
|
|
|
typedef struct ELF_Parse{
|
|
ELF_Class elf_class;
|
|
ELF_Encoding encoding;
|
|
U32 section_count;
|
|
U32 segment_count;
|
|
void *header;
|
|
U64 size;
|
|
void *sections;
|
|
void *segments;
|
|
U8 *section_strtable_first;
|
|
U8 *section_strtable_opl;
|
|
void *symbols[ELFP_SYMBOL_TABLE_COUNT];
|
|
U32 symbol_count[ELFP_SYMBOL_TABLE_COUNT];
|
|
U8 *symbol_strtable_first[ELFP_SYMBOL_TABLE_COUNT];
|
|
U8 *symbol_strtable_opl[ELFP_SYMBOL_TABLE_COUNT];
|
|
} ELF_Parse;
|
|
|
|
////////////////////////////////
|
|
// Elf Parse Functions
|
|
|
|
MR4TH_SYMBOL ELF_Parse* elfp_begin(Arena *arena, String8 data);
|
|
|
|
MR4TH_SYMBOL void elfp_header_read(ELF_Parse *elf, ELF_Header64 *out);
|
|
|
|
MR4TH_SYMBOL U32 elfp_section_count(ELF_Parse *elf);
|
|
MR4TH_SYMBOL void elfp_section_read(ELF_Parse *elf, U32 idx, ELF_Section64 *out);
|
|
MR4TH_SYMBOL String8 elfp_section_name(ELF_Parse *elf, U32 idx);
|
|
|
|
MR4TH_SYMBOL U32 elfp_segment_count(ELF_Parse *elf);
|
|
MR4TH_SYMBOL void elfp_segment_read(ELF_Parse *elf, U32 idx, ELF_Segment64 *out);
|
|
|
|
MR4TH_SYMBOL U32 elfp_symbol_count(ELF_Parse *elf, U32 table);
|
|
MR4TH_SYMBOL void elfp_symbol_read(ELF_Parse *elf, U32 table, U32 idx, ELF_Symbol64 *out);
|
|
MR4TH_SYMBOL String8 elfp_symbol_name(ELF_Parse *elf, U32 table, U32 idx);
|
|
|
|
MR4TH_SYMBOL U32 elfp_relocs_count(ELF_Parse *elf, U32 secidx);
|
|
MR4TH_SYMBOL void elfp_relocs_read(ELF_Parse *elf, U32 secidx, U32 relocidx, ELF_RelocationAdd64 *out);
|
|
|
|
#endif //MR4TH_ELF_PARSE_H
|