From: Robert Pengelly Date: Sun, 26 Apr 2026 14:53:03 +0000 (+0100) Subject: Bug fixes X-Git-Url: https://git.candlhat.org/?a=commitdiff_plain;h=HEAD;p=slink.git Bug fixes --- diff --git a/aout.c b/aout.c index dc72090..c7cb570 100644 --- a/aout.c +++ b/aout.c @@ -19,7 +19,7 @@ static void translate_relocation (struct reloc_entry *reloc, struct aout_relocat unsigned long r_symbolnum = array_to_integer (input_reloc->r_symbolnum, 4, 0); unsigned long r_address = array_to_integer (input_reloc->r_address, 4, 0); - long symbolnum = (r_symbolnum & 0xffffff); + unsigned long symbolnum = (r_symbolnum & 0xffffff); if ((r_symbolnum >> 27) & 1) { /* ext */ @@ -58,7 +58,7 @@ static void translate_relocation (struct reloc_entry *reloc, struct aout_relocat reloc->offset = r_address; reloc->n_type = ((r_symbolnum >> 24) & 0xff); - reloc->n_type &= ~(1 << 3); + reloc->n_type &= ~(1L << 3); reloc->r_symbolnum = r_symbolnum; reloc->n_ext = ((r_symbolnum >> 27) & 1); @@ -109,7 +109,7 @@ static void translate_relocation (struct reloc_entry *reloc, struct aout_relocat if ((r_symbolnum >> 24) & 1) { reloc->howto = &reloc_howtos[RELOC_TYPE_PC8]; - reloc->addend += reloc->offset + 4; + reloc->addend += reloc->offset + 1; } else { reloc->howto = &reloc_howtos[RELOC_TYPE_8]; diff --git a/elks.c b/elks.c index 1757499..0e95ee4 100644 --- a/elks.c +++ b/elks.c @@ -20,7 +20,7 @@ static void translate_relocation (struct reloc_entry *reloc, struct elks_relocat unsigned long r_symbolnum = array_to_integer (input_reloc->r_symbolnum, 4, 0); unsigned long r_address = array_to_integer (input_reloc->r_address, 4, 0); - long symbolnum = (r_symbolnum & 0x7ffffff); + unsigned long symbolnum = (r_symbolnum & 0x7ffffff); if ((r_symbolnum >> 31) & 1) { /* ext */ @@ -110,7 +110,7 @@ static void translate_relocation (struct reloc_entry *reloc, struct elks_relocat if ((r_symbolnum >> 28) & 1) { reloc->howto = &reloc_howtos[RELOC_TYPE_PC8]; - reloc->addend += reloc->offset + 4; + reloc->addend += reloc->offset + 1; } else { reloc->howto = &reloc_howtos[RELOC_TYPE_8]; diff --git a/link.c b/link.c index 71b9562..4f76c11 100644 --- a/link.c +++ b/link.c @@ -585,11 +585,9 @@ static void calculate_section_sizes_and_rvas (void) { static void reloc_generic (struct section_part *part, struct reloc_entry *rel, struct symbol *symbol) { unsigned char opcode = (part->content + rel->offset - 1)[0]; - int size = rel->howto->size; - uint64_t result = 0, offset = rel->offset; - switch (size) { + switch (rel->howto->size) { case 8: { @@ -644,7 +642,7 @@ static void reloc_generic (struct section_part *part, struct reloc_entry *rel, s if (rel->howto->pc_rel) { result -= (part->rva + offset); - result -= size; + result -= rel->howto->size; } @@ -702,9 +700,9 @@ static void reloc_generic (struct section_part *part, struct reloc_entry *rel, s } - if ((unsigned long) size < sizeof (result)) { + if ((unsigned long) rel->howto->size < sizeof (result)) { - unsigned long mask = (((uint64_t) 1) << (CHAR_BIT * size)) - 1; + unsigned long mask = (((uint64_t) 1) << (CHAR_BIT * rel->howto->size)) - 1; result &= mask; } @@ -756,7 +754,7 @@ static void reloc_generic (struct section_part *part, struct reloc_entry *rel, s } /*printf ("relocating: %s: %lx, %lx, %lx\n", rel->symbol->name, part->rva + offset + 0x60, result, size);*/ - size = 4; + rel->howto->size = 4; } else if (opcode == 0x9A || opcode == 0xFF) { @@ -777,10 +775,10 @@ static void reloc_generic (struct section_part *part, struct reloc_entry *rel, s *(p + 3) = 0x90; result -= part->rva + offset; - result -= size; + result -= 4; - while (size > 2) { - size--; + while (rel->howto->size > 2) { + rel->howto->size--; } offset++; @@ -793,14 +791,13 @@ static void reloc_generic (struct section_part *part, struct reloc_entry *rel, s *(p + 1) = 0xE8; result -= part->rva + offset; - result -= size; - - while (size > 2) { - - offset++; - size--; + result -= 4; + while (rel->howto->size > 2) { + rel->howto->size--; } + + offset += 2; } @@ -822,7 +819,7 @@ static void reloc_generic (struct section_part *part, struct reloc_entry *rel, s } - switch (size) { + switch (rel->howto->size) { case 8: {