nooc

nooc programming language compiler
git clone git://git.nihaljere.xyz/nooc
Log | Files | Refs | LICENSE

commit f09a5cc343cd3480c4461a4ad37cb18e233521a1
parent bb848388ac86ca2155a7b06cca844612df96d8c3
Author: Nihal Jere <nihal@nihaljere.xyz>
Date:   Tue, 18 Jan 2022 11:52:38 -0600

use toplevel data struct instead of global one

Diffstat:
Melf.c | 16++++++++--------
Melf.h | 2+-
Mmain.c | 15++++++---------
3 files changed, 15 insertions(+), 18 deletions(-)

diff --git a/elf.c b/elf.c @@ -6,7 +6,7 @@ #include "elf.h" void -elf(size_t entry, char *text, size_t len, char* data, size_t dlen, FILE *f) +elf(size_t entry, struct data *text, struct data *data, FILE *f) { Elf64_Ehdr ehdr = { 0 }; Elf64_Phdr phdr_text = { 0 }; @@ -38,8 +38,8 @@ elf(size_t entry, char *text, size_t len, char* data, size_t dlen, FILE *f) phdr_text.p_offset = 0x1000; phdr_text.p_vaddr = TEXT_OFFSET; phdr_text.p_paddr = TEXT_OFFSET; - phdr_text.p_filesz = len; - phdr_text.p_memsz = len; + phdr_text.p_filesz = text->len; + phdr_text.p_memsz = text->len; phdr_text.p_flags = PF_R | PF_X; phdr_text.p_align = 0x1000; @@ -47,8 +47,8 @@ elf(size_t entry, char *text, size_t len, char* data, size_t dlen, FILE *f) phdr_data.p_offset = 0x2000; phdr_data.p_vaddr = DATA_OFFSET; phdr_data.p_paddr = DATA_OFFSET; - phdr_data.p_filesz = dlen; - phdr_data.p_memsz = dlen; + phdr_data.p_filesz = data->len; + phdr_data.p_memsz = data->len; phdr_data.p_flags = PF_R | PF_W; phdr_data.p_align = 0x1000; @@ -60,9 +60,9 @@ elf(size_t entry, char *text, size_t len, char* data, size_t dlen, FILE *f) for (int i = 0; i < 0x1000 - pretextlen; i++) { fwrite(&empty, 1, 1, f); } - fwrite(text, 1, len, f); - for (int i = 0; i < 0x1000 - len; i++) { + fwrite(text->data, 1, text->len, f); + for (int i = 0; i < 0x1000 - text->len; i++) { fwrite(&empty, 1, 1, f); } - fwrite(data, 1, dlen, f); + fwrite(data->data, 1, data->len, f); } diff --git a/elf.h b/elf.h @@ -1 +1 @@ -void elf(size_t entry, char *text, size_t len, char* data, size_t dlen, FILE *f); +void elf(size_t entry, struct data *text, struct data *data, FILE *f); diff --git a/main.c b/main.c @@ -37,27 +37,24 @@ struct toplevel toplevel; char *infile; -// TODO: remove -struct data data_seg; - uint64_t data_push(char *ptr, size_t len) { - array_push((&data_seg), ptr, len); - return DATA_OFFSET + data_seg.len - len; + array_push((&toplevel.data), ptr, len); + return DATA_OFFSET + toplevel.data.len - len; } uint64_t data_pushzero(size_t len) { - array_zero((&data_seg), len); - return DATA_OFFSET + data_seg.len - len; + array_zero((&toplevel.data), len); + return DATA_OFFSET + toplevel.data.len - len; } void data_set(uint64_t addr, void *ptr, size_t len) { - memcpy(&data_seg.data[addr - DATA_OFFSET], ptr, len); + memcpy(&toplevel.data.data[addr - DATA_OFFSET], ptr, len); } void @@ -198,7 +195,7 @@ main(int argc, char *argv[]) munmap(addr, statbuf.st_size); - elf(toplevel.entry, toplevel.text.data, toplevel.text.len, data_seg.data, data_seg.len, out); + elf(toplevel.entry, &toplevel.text, &toplevel.data, out); fclose(out); }