summaryrefslogtreecommitdiff
path: root/masm/asm.c
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2024-09-13 11:11:18 -0400
committerFreya Murphy <freya@freyacat.org>2024-09-13 11:11:18 -0400
commitdf4a225ccf79dd9f5fa3faef4fd68ae87471f0ca (patch)
tree44629775a57e229024f56d087ab5d1aebed978d3 /masm/asm.c
parentdont upload those :p (diff)
downloadmips-df4a225ccf79dd9f5fa3faef4fd68ae87471f0ca.tar.gz
mips-df4a225ccf79dd9f5fa3faef4fd68ae87471f0ca.tar.bz2
mips-df4a225ccf79dd9f5fa3faef4fd68ae87471f0ca.zip
better
Diffstat (limited to 'masm/asm.c')
-rw-r--r--masm/asm.c28
1 files changed, 11 insertions, 17 deletions
diff --git a/masm/asm.c b/masm/asm.c
index 883cb55..fb8d12c 100644
--- a/masm/asm.c
+++ b/masm/asm.c
@@ -247,24 +247,15 @@ static int handle_ins(struct assembler *assembler,
if (sec_push(sec, entry))
return M_ERROR;
- unsigned char type = 0;
- switch (ref->type) {
- case REF_NONE:
+ if (ref->type == R_MIPS_NONE)
continue;
- case REF_OFFESET:
- type = R_MIPS_PC16;
- break;
- case REF_TARGET:
- type = R_MIPS_26;
- break;
- }
size_t symidx;
if (find_symbol_or_stub(assembler, ref->name, NULL, &symidx))
return M_ERROR;
Elf32_Rela rel = {
- .r_info = htonl(ELF32_R_INFO(symidx, type)),
+ .r_info = htonl(ELF32_R_INFO(symidx, ref->type)),
.r_addend = htonl(ref->addend),
.r_offset = htonl(sec_index(sec, secidx + i)),
};
@@ -543,7 +534,7 @@ static void update_offsets(struct assembler *assembler, Elf32_Ehdr *ehdr)
}
// sections
- size_t v_addr = 0x00400000;
+ size_t v_addr = 0;
for (uint32_t i = 0; i < assembler->sectab.len; i++) {
struct section *sec = &assembler->sectab.sections[i];
uint32_t idx = sec->shdr_idx;
@@ -631,11 +622,14 @@ static int write_file(struct assembler *assembler, Elf32_Ehdr *ehdr,
for (uint32_t j = 0; j < sec->len; j++) {
struct section_entry *entry = &sec->entries[j];
size_t size = entry->size;
- fwrite(&entry->data, size, 1, out);
- while(size % sec->alignment) {
- uint8_t zero = 0;
- fwrite(&zero, 1, 1, out);
- size++;
+ size_t zeros = size % sec->alignment;;
+ if (entry->type != ENT_NO_DATA)
+ fwrite(&entry->data, size, 1, out);
+ else
+ zeros += size;
+ while(zeros) {
+ fputc(0, out);
+ zeros--;
}
}
}