From 07fdb7b6d5e034b9c99f5130a5231d27576acef0 Mon Sep 17 00:00:00 2001 From: Robert Pengelly Date: Tue, 8 Apr 2025 17:31:33 +0100 Subject: [PATCH] Exit on error --- ld.c | 3 +-- link.c | 13 ++++++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/ld.c b/ld.c index 3213330..f7b83f0 100644 --- 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 7b78854..313275e 100644 --- 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); } } -- 2.34.1