Changeset 2615
- Timestamp:
- 10/22/12 01:52:34 (7 months ago)
- Location:
- trunk/ld
- Files:
-
- 2 modified
-
ld_symbols.c (modified) (10 diffs)
-
ld_symbols.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ld/ld_symbols.c
r2614 r2615 60 60 static struct ld_symbol *_find_symbol_from_input(struct ld_symbol *tbl, 61 61 char *name); 62 static void _update_import_export(struct ld *ld, struct ld_symbol *lsb); 62 63 static void _update_symbol(struct ld *ld, struct ld_symbol *lsb); 63 64 static void _add_version_name(struct ld *ld, struct ld_input *li, int ndx, … … 70 71 Elf *e, Elf_Scn *versym, Elf_Scn *verneed, Elf_Scn *verdef); 71 72 72 #define _add_symbol(tbl, s) \ 73 HASH_ADD_KEYPTR(hh, (tbl), (s)->lsb_longname, \ 74 strlen((s)->lsb_longname), (s)) 73 #define _add_symbol(tbl, s) do { \ 74 HASH_ADD_KEYPTR(hh, (tbl), (s)->lsb_longname, \ 75 strlen((s)->lsb_longname), (s)); \ 76 _update_import_export(ld, (s)); \ 77 } while (0) 75 78 #define _add_symbol_to_input(tbl, s) \ 76 79 HASH_ADD_KEYPTR(hhi, (tbl), (s)->lsb_name, strlen((s)->lsb_name), (s)) 77 #define _remove_symbol(tbl, s) HASH_DEL((tbl), (s)) 80 #define _remove_symbol(tbl, s) do { \ 81 HASH_DEL((tbl), (s)); \ 82 _update_import_export(ld, (s)); \ 83 } while (0) 84 #define _resolve_symbol(_s, s) do { \ 85 assert((_s) != (s)); \ 86 if ((s)->lsb_prev != NULL) { \ 87 (s)->lsb_prev->lsb_ref = (_s); \ 88 (_s)->lsb_prev = (s)->lsb_prev; \ 89 } \ 90 (s)->lsb_prev = (_s); \ 91 (_s)->lsb_ref = (s); \ 92 } while (0) 78 93 79 94 void … … 402 417 } 403 418 419 static void 420 _update_import_export(struct ld *ld, struct ld_symbol *lsb) 421 { 422 423 (void) ld; 424 (void) lsb; 425 } 426 404 427 static int 405 428 _resolve_multidef_symbol(struct ld *ld, struct ld_symbol *lsb, … … 411 434 else if (lsb->lsb_input != NULL && 412 435 lsb->lsb_input->li_type == LIT_DSO) { 413 lsb->lsb_ref = _lsb;436 _resolve_symbol(lsb, _lsb); 414 437 return (-1); 415 438 } else if (_lsb->lsb_input != NULL && 416 439 _lsb->lsb_input->li_type == LIT_DSO) { 417 _ lsb->lsb_ref = lsb;440 _resolve_symbol(_lsb, lsb); 418 441 _remove_symbol(ld->ld_symtab_def, _lsb); 419 442 } else … … 442 465 (_lsb = _find_symbol(ld->ld_symtab_common, name)) != 443 466 NULL) { 444 lsb->lsb_ref = _lsb;467 _resolve_symbol(lsb, _lsb); 445 468 return; 446 469 } … … 459 482 */ 460 483 if ((_lsb = _find_symbol(ld->ld_symtab_def, name)) != NULL) { 461 lsb->lsb_ref = _lsb;484 _resolve_symbol(lsb, _lsb); 462 485 return; 463 486 } … … 469 492 */ 470 493 if ((_lsb = _find_symbol(ld->ld_symtab_undef, name)) != NULL) { 471 _ lsb->lsb_ref = lsb;494 _resolve_symbol(_lsb, lsb); 472 495 _remove_symbol(ld->ld_symtab_undef, _lsb); 473 496 } … … 481 504 NULL) { 482 505 if (lsb->lsb_size > _lsb->lsb_size) { 483 _ lsb->lsb_ref = lsb;506 _resolve_symbol(_lsb, lsb); 484 507 _remove_symbol(ld->ld_symtab_common, _lsb); 485 508 } else { 486 lsb->lsb_ref = _lsb;509 _resolve_symbol(lsb, _lsb); 487 510 return; 488 511 } … … 520 543 */ 521 544 if ((_lsb = _find_symbol(ld->ld_symtab_undef, name)) != NULL) { 522 _ lsb->lsb_ref = lsb;545 _resolve_symbol(_lsb, lsb); 523 546 _remove_symbol(ld->ld_symtab_undef, _lsb); 524 547 } 525 548 if (lsb->lsb_default && 526 549 (_lsb = _find_symbol(ld->ld_symtab_undef, sn)) != NULL) { 527 _ lsb->lsb_ref = lsb;550 _resolve_symbol(_lsb, lsb); 528 551 _remove_symbol(ld->ld_symtab_undef, _lsb); 529 552 } … … 538 561 if ((_lsb = _find_symbol(ld->ld_symtab_common, name)) != 539 562 NULL) { 540 _ lsb->lsb_ref = lsb;563 _resolve_symbol(_lsb, lsb); 541 564 _remove_symbol(ld->ld_symtab_common, _lsb); 542 565 } 543 566 if (lsb->lsb_default && 544 567 (_lsb = _find_symbol(ld->ld_symtab_common, sn)) != NULL) { 545 _ lsb->lsb_ref = lsb;568 _resolve_symbol(_lsb, lsb); 546 569 _remove_symbol(ld->ld_symtab_common, _lsb); 547 570 } -
trunk/ld/ld_symbols.h
r2601 r2615 41 41 unsigned char lsb_provide; /* provide symbol */ 42 42 unsigned char lsb_provide_refed; /* provide symbol is referenced */ 43 struct ld_symbol *lsb_ref; /* resolved symbol reference */ 43 struct ld_symbol *lsb_prev; /* symbol resolved by this symbol */ 44 struct ld_symbol *lsb_ref; /* this symbol resolves to ... */ 44 45 struct ld_input *lsb_input; /* containing input object */ 45 46 UT_hash_handle hh; /* hash handle */