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:
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);
}