[EMAIL PROTECTED] wrote:
> Author: bernds
> Date: 2007-12-03 14:54:16 -0800 (Mon, 03 Dec 2007)
> New Revision: 20614
>
> Log:
> Blackfin FD-PIC patch 3/6.
> Change _dl_find_hash to _dl_lookup_hash, as on the NPTL branch.
> _dl_find_hash is now a wrapper function around it; unlike on the NPTL branch,
> it retains the old interface so that not all callers need to be changed.
>
> _dl_lookup_hash can optionally give its caller a pointer to the module where
> the symbol was found.
>
> Introduce ELF_RTYPE_CLASS_DLSYM for lookups from libdl.
>
> Spelling fixes in the Blackfin port, since Alex Oliva's original version of
> these patches used _dl_find_hash_mod as the name of the function rather than
> _dl_lookup_hash.
>
>
> Modified:
>    trunk/uClibc/ldso/include/dl-defs.h
>    trunk/uClibc/ldso/include/dl-elf.h
>    trunk/uClibc/ldso/include/dl-hash.h
>    trunk/uClibc/ldso/ldso/bfin/elfinterp.c
>    trunk/uClibc/ldso/ldso/dl-hash.c
>    trunk/uClibc/ldso/libdl/libdl.c
>
>
> [SNIP]
>
> Modified: trunk/uClibc/ldso/include/dl-hash.h
> ===================================================================
> --- trunk/uClibc/ldso/include/dl-hash.h       2007-12-03 22:46:53 UTC (rev 
> 20613)
> +++ trunk/uClibc/ldso/include/dl-hash.h       2007-12-03 22:54:16 UTC (rev 
> 20614)
> @@ -105,9 +105,23 @@
>       DL_LOADADDR_TYPE loadaddr, unsigned long * dynamic_info,
>       unsigned long dynamic_addr, unsigned long dynamic_size);
>  
> -extern char * _dl_find_hash(const char * name, struct dyn_elf * rpnt1,
> -                         struct elf_resolve *mytpnt, int type_class);
> +extern char * _dl_lookup_hash(const char * name, struct dyn_elf * rpnt,
> +                           struct elf_resolve *mytpnt, int type_class
> +#ifdef __FDPIC__
> +                           , struct elf_resolve **tpntp
> +#endif
> +                           );
>  
> +static __always_inline char *_dl_find_hash(const char *name, struct dyn_elf 
> *rpnt,
> +                                        struct elf_resolve *mytpnt, int 
> type_class)
> +{
> +#ifdef __FDPIC__
> +     return _dl_lookup_hash(name, rpnt, mytpnt, type_class, NULL);
> +#else
> +     return _dl_lookup_hash(name, rpnt, mytpnt, type_class);
> +#endif
> +}
> +
>  extern int _dl_linux_dynamic_link(void);
>  
>  extern char * _dl_library_path;
>   
I think that when nptl merge will be completed, we could use something 
like that:

#if defined USE_TLS || defined __FDPIC__
#define HASH_EXTRA_TPNT
#else
#undef HASH_EXTRA_TPNT
#endif

and use it in _dl_find_hash wrapper.
I've understood that you are keeping _dl_find_hash just the same to not 
break all other arch, right?

> Modified: trunk/uClibc/ldso/ldso/bfin/elfinterp.c
> ===================================================================
> --- trunk/uClibc/ldso/ldso/bfin/elfinterp.c   2007-12-03 22:46:53 UTC (rev 
> 20613)
> +++ trunk/uClibc/ldso/ldso/bfin/elfinterp.c   2007-12-03 22:54:16 UTC (rev 
> 20614)
> @@ -72,11 +72,9 @@
>       got_entry = (struct funcdesc_value *) DL_RELOC_ADDR(tpnt->loadaddr, 
> this_reloc->r_offset);
>  
>       /* Get the address to be used to fill in the GOT entry.  */
> -     new_addr = _dl_find_hash_mod(symname, tpnt->symbol_scope, NULL, 0,
> -                                  &new_tpnt);
> +     new_addr = _dl_lookup_hash(symname, tpnt->symbol_scope, NULL, 0, 
> &new_tpnt);
>       if (!new_addr) {
> -             new_addr = _dl_find_hash_mod(symname, NULL, NULL, 0,
> -                                          &new_tpnt);
> +             new_addr = _dl_lookup_hash(symname, NULL, NULL, 0, &new_tpnt);
>               if (!new_addr) {
>                       _dl_dprintf(2, "%s: can't resolve symbol '%s'\n",
>                                   _dl_progname, symname);
> @@ -188,7 +186,7 @@
>       } else {
>  
>               symbol_addr = (unsigned long)
> -               _dl_find_hash_mod(symname, scope, NULL, 0, &symbol_tpnt);
> +               _dl_lookup_hash(symname, scope, NULL, 0, &symbol_tpnt);
>  
>               /*
>                * We want to allow undefined references to weak symbols - this 
> might
>   
I expect to see, after nptl merge, all elfinterp.c calling always 
_dl_find_hash with the extra parameter passed:
it will be NULL, if not used (not fdpic or not tls), not NULL otherwise.
I think that mixing _dl_lookup_hash and _dl_find_hash invocation could 
create confusion.
> Modified: trunk/uClibc/ldso/ldso/dl-hash.c
> ===================================================================
> --- trunk/uClibc/ldso/ldso/dl-hash.c  2007-12-03 22:46:53 UTC (rev 20613)
> +++ trunk/uClibc/ldso/ldso/dl-hash.c  2007-12-03 22:54:16 UTC (rev 20614)
> @@ -257,7 +257,12 @@
>   * This function resolves externals, and this is either called when we 
> process
>   * relocations or when we call an entry in the PLT table for the first time.
>   */
> -char *_dl_find_hash(const char *name, struct dyn_elf *rpnt, struct 
> elf_resolve *mytpnt, int type_class)
> +char *_dl_lookup_hash(const char *name, struct dyn_elf *rpnt,
> +                   struct elf_resolve *mytpnt, int type_class
> +#ifdef __FDPIC__
> +                   , struct elf_resolve **tpntp
> +#endif
> +                   )
>  {
>   
comment as above on HASH_EXTRA_TPNT
>       struct elf_resolve *tpnt = NULL;
>       ElfW(Sym) *symtab;
> @@ -265,7 +270,8 @@
>       unsigned long elf_hash_number = 0xffffffff;
>       const ElfW(Sym) *sym = NULL;
>  
> -     char *weak_result = NULL;
> +     const ElfW(Sym) *weak_sym = 0;
> +     struct elf_resolve *weak_tpnt = 0;
>  
>  #ifdef __LDSO_GNU_HASH_SUPPORT__
>       unsigned long gnu_hash_number = _dl_gnu_hash((const unsigned char 
> *)name);
> @@ -326,15 +332,32 @@
>  #if 0
>  /* Perhaps we should support old style weak symbol handling
>   * per what glibc does when you export LD_DYNAMIC_WEAK */
> -                             if (!weak_result)
> -                                     weak_result = (char *) 
> DL_RELOC_ADDR(tpnt->loadaddr, sym->st_value);
> +                             if (!weak_sym) {
> +                                     weak_tpnt = tpnt;
> +                                     weak_sym = sym;
> +                             }
>                               break;
>  #endif
>                       case STB_GLOBAL:
> -                             return (char*) DL_RELOC_ADDR(tpnt->loadaddr, 
> sym->st_value);
> +#ifdef __FDPIC__
> +                             if (tpntp)
> +                                     *tpntp = tpnt;
> +#endif
>   
comment as above on HASH_EXTRA_TPNT
> +                             return DL_FIND_HASH_VALUE (tpnt, type_class, 
> sym);
>                       default:        /* Local symbols not handled here */
>                               break;
>               }
>       }
> -     return weak_result;
> +     if (weak_sym) {
> +#ifdef __FDPIC__
> +             if (tpntp)
> +                     *tpntp = weak_tpnt;
> +#endif
> +             return DL_FIND_HASH_VALUE (weak_tpnt, type_class, weak_sym);
> +     }
> +#ifdef __FDPIC__
> +     if (tpntp)
> +             *tpntp = NULL;
> +#endif
> +     return NULL;
>  }
>
>   
same
> Modified: trunk/uClibc/ldso/libdl/libdl.c
> ===================================================================
> --- trunk/uClibc/ldso/libdl/libdl.c   2007-12-03 22:46:53 UTC (rev 20613)
> +++ trunk/uClibc/ldso/libdl/libdl.c   2007-12-03 22:54:16 UTC (rev 20614)
> @@ -500,7 +500,7 @@
>       tpnt = NULL;
>       if (handle == _dl_symbol_tables)
>          tpnt = handle->dyn; /* Only search RTLD_GLOBAL objs if global object 
> */
> -     ret = _dl_find_hash(name2, handle, tpnt, 0);
> +     ret = _dl_find_hash(name2, handle, tpnt, ELF_RTYPE_CLASS_DLSYM);
>  
>       /*
>        * Nothing found.
>
>   
I've not seen how ELF_RTYPE_CLASS_DLSYM is used... have I missed something?

Cheers,
Carmelo
> _______________________________________________
> uClibc-cvs mailing list
> [EMAIL PROTECTED]
> http://busybox.net/cgi-bin/mailman/listinfo/uclibc-cvs
>
>   

_______________________________________________
uClibc mailing list
uClibc@uclibc.org
http://busybox.net/cgi-bin/mailman/listinfo/uclibc

Reply via email to