From 0c57224ccff9727fb699994a4c3d5f5c6d6d1881 Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Mon, 16 Jul 2018 11:03:08 -0700 Subject: 4356 - subx: first program with a data segment We read() a character from stdin and write() it out to stdout, saving it to a global variable in between. ELF binaries are inefficient; you can ask for a low alignment, but the kernel may not be able to handle it. If you set up a high alignment then you end up wasting an increasing amount of space in each segment because of the constraint that the offset bear some relationship with the loaded address. --- subx/021translate.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'subx/021translate.cc') diff --git a/subx/021translate.cc b/subx/021translate.cc index 4cecb030..2aa4efaa 100644 --- a/subx/021translate.cc +++ b/subx/021translate.cc @@ -88,9 +88,9 @@ void dump_elf_header(ostream& out, const program& p) { // p_offset emit(p_offset); // p_vaddr - emit(e_entry); + emit(p.segments.at(i).start); // p_paddr - emit(e_entry); + emit(p.segments.at(i).start); // p_filesz uint32_t size = size_of(p.segments.at(i)); assert(size < SEGMENT_SIZE); @@ -101,7 +101,7 @@ void dump_elf_header(ostream& out, const program& p) { uint32_t p_flags = (i == 0) ? /*r-x*/0x5 : /*rw-*/0x6; // convention: only first segment is code emit(p_flags); // p_align - uint32_t p_align = 0x4; + uint32_t p_align = 0x1000; // smaller alignments may not be respected by the kernel emit(p_align); // prepare for next segment -- cgit 1.4.1-2-gfad0