Mercurial > hg-old > index.cgi
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 } |