summaryrefslogtreecommitdiff
path: root/masm/asm/elf32.h
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2024-10-09 12:07:59 -0400
committerFreya Murphy <freya@freyacat.org>2024-10-09 12:07:59 -0400
commitb663f827057fc9fb199293bc1920cf27315d1846 (patch)
tree477b481694ad50f28bac538bb9b301861b3af4d6 /masm/asm/elf32.h
parentupdate generator to support multipe isas, expand grammer syntax (diff)
downloadmips-b663f827057fc9fb199293bc1920cf27315d1846.tar.gz
mips-b663f827057fc9fb199293bc1920cf27315d1846.tar.bz2
mips-b663f827057fc9fb199293bc1920cf27315d1846.zip
refactor elf32 assembler, add support for multiple isa's in cmdline
Diffstat (limited to 'masm/asm/elf32.h')
-rw-r--r--masm/asm/elf32.h90
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__ */