comparison 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
comparison
equal deleted inserted replaced
205:42df94f30d82 206:299c5d793aca
400 void resolve_files(void) 400 void resolve_files(void)
401 { 401 {
402 int sn; 402 int sn;
403 int fn; 403 int fn;
404 reloc_t *rl; 404 reloc_t *rl;
405 lw_expr_stack_t *te;
406
405 int rval; 407 int rval;
406 408
407 // resolve entry point if required 409 // resolve entry point if required
408 // this must resolve to an *exported* symbol and will resolve to the 410 // this must resolve to an *exported* symbol and will resolve to the
409 // first instance of that symbol 411 // first instance of that symbol
430 for (sn = 0; sn < inputfiles[fn] -> nsections; sn++) 432 for (sn = 0; sn < inputfiles[fn] -> nsections; sn++)
431 { 433 {
432 for (rl = inputfiles[fn] -> sections[sn].incompletes; rl; rl = rl -> next) 434 for (rl = inputfiles[fn] -> sections[sn].incompletes; rl; rl = rl -> next)
433 { 435 {
434 // do a "simplify" on the expression 436 // do a "simplify" on the expression
435 rval = lw_expr_reval(rl -> expr, resolve_sym, &(inputfiles[fn] -> sections[sn])); 437 te = lw_expr_stack_dup(rl -> expr);
436 438 rval = lw_expr_reval(te, resolve_sym, &(inputfiles[fn] -> sections[sn]));
439
437 // is it constant? error out if not 440 // is it constant? error out if not
438 if (rval != 0 || !lw_expr_is_constant(rl -> expr)) 441 if (rval != 0 || !lw_expr_is_constant(te))
439 { 442 {
440 fprintf(stderr, "Incomplete reference at %s:%s+%02X\n", inputfiles[fn] -> filename, inputfiles[fn] -> sections[sn].name, rl -> offset); 443 fprintf(stderr, "Incomplete reference at %s:%s+%02X\n", inputfiles[fn] -> filename, inputfiles[fn] -> sections[sn].name, rl -> offset);
441 symerr = 1; 444 symerr = 1;
442 } 445 }
446 lw_expr_stack_free(te);
443 } 447 }
444 } 448 }
445 } 449 }
446 } 450 }
447 while (nforced == 1); 451 while (nforced == 1);
448 452
449 if (symerr) 453 if (symerr)
450 exit(1); 454 exit(1);
451 455
452 // theoretically, all files referenced by other files now have "forced" set to 1 456 // theoretically, all files referenced by other files now have "forced" set to 1
453 } 457 for (fn = 0; fn < ninputfiles; fn++)
458 {
459 if (inputfiles[fn] -> forced == 1)
460 continue;
461
462 fprintf(stderr, "Warning: %s (%d) does not resolve any symbols\n", inputfiles[fn] -> filename, fn);
463 }
464 }