diff lwlink/link.c @ 206:299c5d793aca

Made lwlink smarter about not included unneeded (unreferenced) members of a library file
author lost
date Mon, 20 Apr 2009 02:24:33 +0000
parents 42df94f30d82
children bae1e3ecdce1
line wrap: on
line diff
--- a/lwlink/link.c	Sun Apr 19 17:44:46 2009 +0000
+++ b/lwlink/link.c	Mon Apr 20 02:24:33 2009 +0000
@@ -402,6 +402,8 @@
 	int sn;
 	int fn;
 	reloc_t *rl;
+	lw_expr_stack_t *te;
+	
 	int rval;
 
 	// resolve entry point if required
@@ -432,14 +434,16 @@
 				for (rl = inputfiles[fn] -> sections[sn].incompletes; rl; rl = rl -> next)
 				{
 					// do a "simplify" on the expression
-					rval = lw_expr_reval(rl -> expr, resolve_sym, &(inputfiles[fn] -> sections[sn]));
-
+					te = lw_expr_stack_dup(rl -> expr);
+					rval = lw_expr_reval(te, resolve_sym, &(inputfiles[fn] -> sections[sn]));
+					
 					// is it constant? error out if not
-					if (rval != 0 || !lw_expr_is_constant(rl -> expr))
+					if (rval != 0 || !lw_expr_is_constant(te))
 					{
 						fprintf(stderr, "Incomplete reference at %s:%s+%02X\n", inputfiles[fn] -> filename, inputfiles[fn] -> sections[sn].name, rl -> offset);
 						symerr = 1;
 					}
+					lw_expr_stack_free(te);
 				}
 			}
 		}
@@ -450,4 +454,11 @@
 		exit(1);
 	
 	// theoretically, all files referenced by other files now have "forced" set to 1
+	for (fn = 0; fn < ninputfiles; fn++)
+	{
+		if (inputfiles[fn] -> forced == 1)
+			continue;
+		
+		fprintf(stderr, "Warning: %s (%d) does not resolve any symbols\n", inputfiles[fn] -> filename, fn);
+	}
 }