summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xmasm/a.outbin0 -> 4848 bytes
-rw-r--r--masm/asm.c34
-rw-r--r--masm/asm.h1
-rw-r--r--masm/out.obin0 -> 4632 bytes
-rw-r--r--masm/test.asm5
5 files changed, 33 insertions, 7 deletions
diff --git a/masm/a.out b/masm/a.out
new file mode 100755
index 0000000..0a4bfee
--- /dev/null
+++ b/masm/a.out
Binary files differ
diff --git a/masm/asm.c b/masm/asm.c
index 1050b18..883cb55 100644
--- a/masm/asm.c
+++ b/masm/asm.c
@@ -17,6 +17,8 @@ extern char *current_file;
#define SYMSEC_STUB -1
#define SYMSEC_EXTERN -1
+#define SEC_ALIGN 0x1000
+
static int create_symbol(struct assembler *assembler,
const char name[MAX_LEX_LENGTH],
ssize_t section_idx,
@@ -338,7 +340,7 @@ static int assemble_phdr(struct assembler *assembler, Elf32_Phdr **res,
hdr->p_paddr = 0;
hdr->p_filesz = htonl(size);
hdr->p_memsz = htonl(size);
- hdr->p_align = htonl(0x1000);
+ hdr->p_align = htonl(SEC_ALIGN);
}
*res = phdr;
@@ -530,17 +532,30 @@ static void update_offsets(struct assembler *assembler, Elf32_Ehdr *ehdr)
ptr += len * sizeof(Elf32_Rela);
}
+ // section padding
+ {
+ uint32_t mod = ptr % SEC_ALIGN;
+ if (mod != 0)
+ assembler->secalign = (SEC_ALIGN - mod);
+ else
+ assembler->secalign = 0;
+ ptr += assembler->secalign;
+ }
+
// sections
+ size_t v_addr = 0x00400000;
for (uint32_t i = 0; i < assembler->sectab.len; i++) {
struct section *sec = &assembler->sectab.sections[i];
- int idx = sec->shdr_idx;
+ uint32_t idx = sec->shdr_idx;
+ uint32_t size = ntohl(phdr[i].p_filesz);
phdr[i].p_offset = htonl(ptr);
- phdr[i].p_vaddr = htonl(ptr);
- phdr[i].p_paddr = htonl(ptr);
+ phdr[i].p_vaddr = htonl(v_addr);
+ phdr[i].p_paddr = htonl(v_addr);
shdr[idx].sh_offset = htonl(ptr);
shdr[idx].sh_size = phdr[i].p_filesz;
shdr[idx].sh_addr = phdr[i].p_vaddr;
- ptr += ntohl(phdr[i].p_filesz);
+ v_addr += size;
+ ptr += size;
}
// symtab
@@ -567,8 +582,7 @@ static void update_offsets(struct assembler *assembler, Elf32_Ehdr *ehdr)
static void update_sym_shindx(struct assembler *assembler)
{
- for (size_t i = 0; i < assembler->symtab.len; i++)
- {
+ for (size_t i = 0; i < assembler->symtab.len; i++) {
Elf32_Sym *sym = &assembler->symtab.symbols[i];
ssize_t sec = assembler->symtab.sections[i];
@@ -605,6 +619,12 @@ static int write_file(struct assembler *assembler, Elf32_Ehdr *ehdr,
fwrite(ptr, sizeof(Elf32_Rela), len, out);
}
+ // section padding
+ for (uint32_t i = 0; i < assembler->secalign; i++) {
+ uint8_t zero = 0;
+ fwrite(&zero, 1, 1, out);
+ }
+
// sections
for (uint32_t i = 0; i < assembler->sectab.len; i++) {
struct section *sec = &assembler->sectab.sections[i];
diff --git a/masm/asm.h b/masm/asm.h
index 81099fc..1162164 100644
--- a/masm/asm.h
+++ b/masm/asm.h
@@ -213,6 +213,7 @@ struct assembler {
/// Segments
struct section_table sectab;
+ uint32_t secalign; // align sections to 0x1000 when writing
/// program header
Elf32_Phdr *phdr;
diff --git a/masm/out.o b/masm/out.o
new file mode 100644
index 0000000..0b697af
--- /dev/null
+++ b/masm/out.o
Binary files differ
diff --git a/masm/test.asm b/masm/test.asm
index b4c1498..d848d29 100644
--- a/masm/test.asm
+++ b/masm/test.asm
@@ -1,3 +1,8 @@
+.rodata
+gay:
+.word 3
+
+
.data
str: