Exit on error
authorRobert Pengelly <robertapengelly@hotmail.com>
Tue, 8 Apr 2025 16:31:33 +0000 (17:31 +0100)
committerRobert Pengelly <robertapengelly@hotmail.com>
Tue, 8 Apr 2025 16:31:33 +0000 (17:31 +0100)
ld.c
link.c

diff --git a/ld.c b/ld.c
index 3213330a4fe9a618c9bd2a1a1fe42037ad9949a2..f7b83f0025306d8c02312a417bcc46aaf7224022 100644 (file)
--- a/ld.c
+++ b/ld.c
@@ -159,10 +159,9 @@ static void read_archive (const char *filename, unsigned char *data) {
             free (temp);
             
             read_object_file (name, pos + sizeof (*hdr), data_size);
-            
-            memcpy (pos, ALREADY_READ, sizeof (ALREADY_READ));
             free (name);
             
+            memcpy (pos, ALREADY_READ, sizeof (ALREADY_READ));
             change = 1;
         
         }
diff --git a/link.c b/link.c
index 7b78854745d2f110241d444a90dc5d6a6f73c9f9..313275e4205c49a5893d052ac7d257c977d8a070 100644 (file)
--- a/link.c
+++ b/link.c
@@ -200,7 +200,9 @@ static void check_unresolved (void) {
             if (!(symbol = symbol_find (symbol->name))) {
             
                 symbol = of->symbol_arr + i;
+                
                 report_at (program_name, 0, REPORT_INTERNAL_ERROR, "external symbol '%s' not found in hashtab", symbol->name);
+                exit (EXIT_FAILURE);
             
             }
             
@@ -216,7 +218,10 @@ static void check_unresolved (void) {
     }
     
     if (unresolved) {
+    
         report_at (program_name, 0, REPORT_FATAL_ERROR, "%lu unresolved external%s", unresolved, (unresolved > 1 ? "s" : ""));
+        exit (EXIT_FAILURE);
+    
     }
 
 }
@@ -519,7 +524,7 @@ static void relocate_part (struct section_part *part) {
     struct reloc_entry *relocs = part->reloc_arr;
     
     struct symbol *symbol;
-    unsigned long i;
+    unsigned long undef = 0, i;
     
     for (i = 0; i < part->reloc_cnt; i++) {
     
@@ -534,13 +539,17 @@ static void relocate_part (struct section_part *part) {
             if (!(symbol = symbol_find (symbol->name))) {
             
                 symbol = relocs[i].symbol;
+                
                 report_at (program_name, 0, REPORT_INTERNAL_ERROR, "external symbol '%s' not found in hashtab", symbol->name);
+                exit (EXIT_FAILURE);
             
             }
             
             if (symbol_is_undefined (symbol)) {
             
                 report_at (program_name, 0, REPORT_ERROR, "%s:(%s+%#lu): undefined reference to '%s'", part->of->filename, part->section->name, relocs[i].offset, symbol->name);
+                undef++;
+                
                 continue;
             
             }
@@ -557,6 +566,8 @@ static void relocate_part (struct section_part *part) {
         reloc_generic (part, &relocs[i], symbol);
     
     }
+    
+    if (undef) { exit (EXIT_FAILURE); }
 
 }