comparison 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
comparison
equal deleted inserted replaced
183:302b8db5fd89 184:220a760ec654
264 goto out; 264 goto out;
265 } 265 }
266 } 266 }
267 } 267 }
268 // not found 268 // not found
269 symerr = 1;
269 fprintf(stderr, "Local symbol %s not found in %s:%s\n", sym, sect -> file -> filename, sect -> name); 270 fprintf(stderr, "Local symbol %s not found in %s:%s\n", sym, sect -> file -> filename, sect -> name);
270 exit(1); 271 goto outerr;
271 } 272 }
272 else 273 else
273 { 274 {
274 // external symbol 275 // external symbol
275 // read all files in order until found (or not found) 276 // read all files in order until found (or not found)
295 } 296 }
296 else 297 else
297 { 298 {
298 fprintf(stderr, "External symbol %s not found\n", sym); 299 fprintf(stderr, "External symbol %s not found\n", sym);
299 } 300 }
300 exit(1); 301 symerr = 1;
302 goto outerr;
301 } 303 }
302 fprintf(stderr, "Shouldn't ever get here!!!\n"); 304 fprintf(stderr, "Shouldn't ever get here!!!\n");
303 exit(88); 305 exit(88);
304 out: 306 out:
305 s = lw_expr_stack_create(); 307 s = lw_expr_stack_create();
306 term = lw_expr_term_create_int(val & 0xffff); 308 term = lw_expr_term_create_int(val & 0xffff);
307 lw_expr_stack_push(s, term); 309 lw_expr_stack_push(s, term);
308 lw_expr_term_free(term); 310 lw_expr_term_free(term);
309 return s; 311 return s;
312 outerr:
313 return NULL;
310 } 314 }
311 315
312 void resolve_references(void) 316 void resolve_references(void)
313 { 317 {
314 int sn; 318 int sn;
335 rval = lw_expr_reval(rl -> expr, resolve_sym, sectlist[sn].ptr); 339 rval = lw_expr_reval(rl -> expr, resolve_sym, sectlist[sn].ptr);
336 340
337 // is it constant? error out if not 341 // is it constant? error out if not
338 if (rval != 0 || !lw_expr_is_constant(rl -> expr)) 342 if (rval != 0 || !lw_expr_is_constant(rl -> expr))
339 { 343 {
340 fprintf(stderr, "Incomplete reference at %s:%s:%02X\n", sectlist[sn].ptr -> file -> filename, sectlist[sn].ptr -> name, rl -> offset); 344 fprintf(stderr, "Incomplete reference at %s:%s+%02X\n", sectlist[sn].ptr -> file -> filename, sectlist[sn].ptr -> name, rl -> offset);
341 exit(1); 345 symerr = 1;
342 } 346 }
343 347 else
344 // put the value into the relocation address 348 {
345 rval = lw_expr_get_value(rl -> expr); 349 // put the value into the relocation address
346 sectlist[sn].ptr -> code[rl -> offset] = (rval >> 8) & 0xff; 350 rval = lw_expr_get_value(rl -> expr);
347 sectlist[sn].ptr -> code[rl -> offset + 1] = rval & 0xff; 351 sectlist[sn].ptr -> code[rl -> offset] = (rval >> 8) & 0xff;
348 } 352 sectlist[sn].ptr -> code[rl -> offset + 1] = rval & 0xff;
349 } 353 }
350 } 354 }
355 }
356
357 if (symerr)
358 exit(1);
359 }