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