diff lwlink/link.c @ 184:220a760ec654

Make lwlink display all undefined references instead of bailing after the first one
author lost
date Sat, 21 Mar 2009 17:39:45 +0000
parents 0395e6fd67e9
children 857cb407229e
line wrap: on
line diff
--- a/lwlink/link.c	Sat Mar 21 17:03:42 2009 +0000
+++ b/lwlink/link.c	Sat Mar 21 17:39:45 2009 +0000
@@ -266,8 +266,9 @@
 			}
 		}
 		// not found
+		symerr = 1;
 		fprintf(stderr, "Local symbol %s not found in %s:%s\n", sym, sect -> file -> filename, sect -> name);
-		exit(1);
+		goto outerr;
 	}
 	else
 	{
@@ -297,7 +298,8 @@
 		{
 			fprintf(stderr, "External symbol %s not found\n", sym);
 		}
-		exit(1);
+		symerr = 1;
+		goto outerr;
 	}
 	fprintf(stderr, "Shouldn't ever get here!!!\n");
 	exit(88);
@@ -307,6 +309,8 @@
 	lw_expr_stack_push(s, term);
 	lw_expr_term_free(term);
 	return s;
+outerr:
+	return NULL;
 }
 
 void resolve_references(void)
@@ -337,14 +341,19 @@
 			// is it constant? error out if not
 			if (rval != 0 || !lw_expr_is_constant(rl -> expr))
 			{
-				fprintf(stderr, "Incomplete reference at %s:%s:%02X\n", sectlist[sn].ptr -> file -> filename, sectlist[sn].ptr -> name, rl -> offset);
-				exit(1);
+				fprintf(stderr, "Incomplete reference at %s:%s+%02X\n", sectlist[sn].ptr -> file -> filename, sectlist[sn].ptr -> name, rl -> offset);
+				symerr = 1;
 			}
-			
-			// put the value into the relocation address
-			rval = lw_expr_get_value(rl -> expr);
-			sectlist[sn].ptr -> code[rl -> offset] = (rval >> 8) & 0xff;
-			sectlist[sn].ptr -> code[rl -> offset + 1] = rval & 0xff;
+			else
+			{
+				// put the value into the relocation address
+				rval = lw_expr_get_value(rl -> expr);
+				sectlist[sn].ptr -> code[rl -> offset] = (rval >> 8) & 0xff;
+				sectlist[sn].ptr -> code[rl -> offset + 1] = rval & 0xff;
+			}
 		}
 	}
+	
+	if (symerr)
+		exit(1);
 }