diff options
Diffstat (limited to 'masm/asm/elf32.h')
| -rw-r--r-- | masm/asm/elf32.h | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/masm/asm/elf32.h b/masm/asm/elf32.h new file mode 100644 index 0000000..76aeb19 --- /dev/null +++ b/masm/asm/elf32.h @@ -0,0 +1,90 @@ +/* Copyright (c) 2024 Freya Murphy */ + +#ifndef __ELF32_H__ +#define __ELF32_H__ + +#include <elf.h> + +#include "../gen.h" +#include "../masm.h" + +/// +/// ELF string table +/// + +struct elf_str_table { + // size of the ptr in bytes + size_t size; + + // pointer that contains + // the strings + char *ptr; +}; + +/* initalize a string table */ +int strtab_init(struct elf_str_table *strtab); + +/* free a string table */ +void strtab_free(struct elf_str_table *strtab); + +/* get a string form the string table */ +int strtab_get_str(struct elf_str_table *strtab, const char *str, size_t *res); + +/* get or append a string into the string table */ +int strtab_write_str(struct elf_str_table *strtab, const char *str, size_t *res); + +/// +/// elf section +/// + +/* holds a section of the asm file (i.e. .text, .bss, .data) */ +struct elf_section { + // section data *weak* pointer + struct section *data; + + // index of the section in + // the ELF shdr + size_t shdr_idx; + + // relocation table + size_t reltab_shidx; + uint32_t reltab_len; + Elf32_Rel *reltab; +}; + +/// +/// assembler +/// + +struct elf_assembler { + // arguments passed in + struct arguments *args; + + // the code generator + struct generator *gen; + + /// symbol table + size_t symtab_shidx; + size_t symtab_len; + Elf32_Sym *symbols; + + // sh string table + size_t strtab_shidx; + struct elf_str_table strtab; + + // string table + size_t shstrtab_shidx; + struct elf_str_table shstrtab; + + /// sections + uint32_t section_len; + struct elf_section *sections; + + /// section header + Elf32_Shdr *shdr; + uint32_t shdr_len; +}; + +int assemble_elf32(struct generator *gen, struct arguments *args); + +#endif /* __ELF32_H__ */ |