Bug fixes master
authorRobert Pengelly <robertapengelly@hotmail.com>
Sun, 26 Apr 2026 14:53:03 +0000 (15:53 +0100)
committerRobert Pengelly <robertapengelly@hotmail.com>
Sun, 26 Apr 2026 14:53:03 +0000 (15:53 +0100)
aout.c
elks.c
link.c

diff --git a/aout.c b/aout.c
index dc72090487e21b00a37820823d04a0c6bcd69526..c7cb570955c32c3a23a5148af28db9a0f6bd165f 100644 (file)
--- 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 1757499d5e4ca084d64d33fe543cabe72b12ea0d..0e95ee4bffebfbdf070e711bb2a2b09a100d1892 100644 (file)
--- 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 71b95627245ffc659a5a59d47faf36b003ef9df9..4f76c11481946749cf990928e31546e24810ab7e 100644 (file)
--- 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: {