91 lines
1.6 KiB
C
91 lines
1.6 KiB
C
|
/* 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__ */
|