1. Summary
  2. Files
  3. Support
  4. Report Spam
  5. Create account
  6. Log in

Changeset 2615

Show
Ignore:
Timestamp:
10/22/12 01:52:34 (7 months ago)
Author:
kaiwang27
Message:

Build a linked list for resolved symbols. Field "lsb->lsb_ref" points
to the symbol that the current symbol resolves to. Field
"lsb->lsb_prev" points to the symbol that resolves to the current
symbol.

Location:
trunk/ld
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/ld/ld_symbols.c

    r2614 r2615  
    6060static struct ld_symbol *_find_symbol_from_input(struct ld_symbol *tbl, 
    6161    char *name); 
     62static void _update_import_export(struct ld *ld, struct ld_symbol *lsb); 
    6263static void _update_symbol(struct ld *ld, struct ld_symbol *lsb); 
    6364static void _add_version_name(struct ld *ld, struct ld_input *li, int ndx, 
     
    7071    Elf *e, Elf_Scn *versym, Elf_Scn *verneed, Elf_Scn *verdef); 
    7172 
    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) 
    7578#define _add_symbol_to_input(tbl, s) \ 
    7679        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) 
    7893 
    7994void 
     
    402417} 
    403418 
     419static void 
     420_update_import_export(struct ld *ld, struct ld_symbol *lsb) 
     421{ 
     422 
     423        (void) ld; 
     424        (void) lsb; 
     425} 
     426 
    404427static int 
    405428_resolve_multidef_symbol(struct ld *ld, struct ld_symbol *lsb, 
     
    411434        else if (lsb->lsb_input != NULL && 
    412435            lsb->lsb_input->li_type == LIT_DSO) { 
    413                 lsb->lsb_ref = _lsb; 
     436                _resolve_symbol(lsb, _lsb); 
    414437                return (-1); 
    415438        } else if (_lsb->lsb_input != NULL && 
    416439            _lsb->lsb_input->li_type == LIT_DSO) { 
    417                 _lsb->lsb_ref = lsb; 
     440                _resolve_symbol(_lsb, lsb); 
    418441                _remove_symbol(ld->ld_symtab_def, _lsb); 
    419442        } else 
     
    442465                    (_lsb = _find_symbol(ld->ld_symtab_common, name)) != 
    443466                    NULL) { 
    444                         lsb->lsb_ref = _lsb; 
     467                        _resolve_symbol(lsb, _lsb); 
    445468                        return; 
    446469                } 
     
    459482                 */ 
    460483                if ((_lsb = _find_symbol(ld->ld_symtab_def, name)) != NULL) { 
    461                         lsb->lsb_ref = _lsb; 
     484                        _resolve_symbol(lsb, _lsb); 
    462485                        return; 
    463486                } 
     
    469492                 */ 
    470493                if ((_lsb = _find_symbol(ld->ld_symtab_undef, name)) != NULL) { 
    471                         _lsb->lsb_ref = lsb; 
     494                        _resolve_symbol(_lsb, lsb); 
    472495                        _remove_symbol(ld->ld_symtab_undef, _lsb); 
    473496                } 
     
    481504                    NULL) { 
    482505                        if (lsb->lsb_size > _lsb->lsb_size) { 
    483                                 _lsb->lsb_ref = lsb; 
     506                                _resolve_symbol(_lsb, lsb); 
    484507                                _remove_symbol(ld->ld_symtab_common, _lsb); 
    485508                        } else { 
    486                                 lsb->lsb_ref = _lsb; 
     509                                _resolve_symbol(lsb, _lsb); 
    487510                                return; 
    488511                        } 
     
    520543                 */ 
    521544                if ((_lsb = _find_symbol(ld->ld_symtab_undef, name)) != NULL) { 
    522                         _lsb->lsb_ref = lsb; 
     545                        _resolve_symbol(_lsb, lsb); 
    523546                        _remove_symbol(ld->ld_symtab_undef, _lsb); 
    524547                } 
    525548                if (lsb->lsb_default && 
    526549                    (_lsb = _find_symbol(ld->ld_symtab_undef, sn)) != NULL) { 
    527                         _lsb->lsb_ref = lsb; 
     550                        _resolve_symbol(_lsb, lsb); 
    528551                        _remove_symbol(ld->ld_symtab_undef, _lsb); 
    529552                } 
     
    538561                if ((_lsb = _find_symbol(ld->ld_symtab_common, name)) != 
    539562                    NULL) { 
    540                         _lsb->lsb_ref = lsb; 
     563                        _resolve_symbol(_lsb, lsb); 
    541564                        _remove_symbol(ld->ld_symtab_common, _lsb); 
    542565                } 
    543566                if (lsb->lsb_default && 
    544567                    (_lsb = _find_symbol(ld->ld_symtab_common, sn)) != NULL) { 
    545                         _lsb->lsb_ref = lsb; 
     568                        _resolve_symbol(_lsb, lsb); 
    546569                        _remove_symbol(ld->ld_symtab_common, _lsb); 
    547570                } 
  • trunk/ld/ld_symbols.h

    r2601 r2615  
    4141        unsigned char lsb_provide;      /* provide symbol */ 
    4242        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 ... */ 
    4445        struct ld_input *lsb_input;     /* containing input object */ 
    4546        UT_hash_handle hh;              /* hash handle */