Index: reloc.c =================================================================== RCS file: /cvsroot/src/libexec/ld.elf_so/reloc.c,v retrieving revision 1.114 diff -u -r1.114 reloc.c --- reloc.c 30 Dec 2018 01:48:37 -0000 1.114 +++ reloc.c 28 Feb 2020 17:20:05 -0000 @@ -67,7 +67,6 @@ void *dstaddr = (void *)(dstobj->relocbase + rela->r_offset); const Elf_Sym *dstsym = dstobj->symtab + ELF_R_SYM(rela->r_info); const char *name = dstobj->strtab + dstsym->st_name; - unsigned long hash = _rtld_elf_hash(name); size_t size = dstsym->st_size; const void *srcaddr; const Elf_Sym *srcsym = NULL; @@ -90,7 +89,7 @@ } for (srcobj = dstobj->next; srcobj != NULL; srcobj = srcobj->next) { - srcsym = _rtld_symlook_obj(name, hash, srcobj, 0, + srcsym = _rtld_symlook_obj(name, srcobj, 0, _rtld_fetch_ventry(dstobj, ELF_R_SYM(rela->r_info))); if (srcsym != NULL) break; Index: rtld.c =================================================================== RCS file: /cvsroot/src/libexec/ld.elf_so/rtld.c,v retrieving revision 1.201 diff -u -r1.201 rtld.c --- rtld.c 8 Dec 2019 22:35:27 -0000 1.201 +++ rtld.c 28 Feb 2020 17:20:05 -0000 @@ -1098,16 +1098,14 @@ void * _rtld_objmain_sym(const char *name) { - unsigned long hash; const Elf_Sym *def; const Obj_Entry *obj; DoneList donelist; - hash = _rtld_elf_hash(name); obj = _rtld_objmain; _rtld_donelist_init(&donelist); - def = _rtld_symlook_list(name, hash, &_rtld_list_main, &obj, 0, + def = _rtld_symlook_list(name, &_rtld_list_main, &obj, 0, NULL, &donelist); if (def != NULL) @@ -1142,7 +1140,6 @@ do_dlsym(void *handle, const char *name, const Ver_Entry *ventry, void *retaddr) { const Obj_Entry *obj; - unsigned long hash; const Elf_Sym *def; const Obj_Entry *defobj; DoneList donelist; @@ -1153,7 +1150,6 @@ lookup_mutex_enter(); - hash = _rtld_elf_hash(name); def = NULL; defobj = NULL; @@ -1170,7 +1166,7 @@ switch ((intptr_t)handle) { case (intptr_t)NULL: /* Just the caller's shared object. */ - def = _rtld_symlook_obj(name, hash, obj, flags, ventry); + def = _rtld_symlook_obj(name, obj, flags, ventry); defobj = obj; break; @@ -1180,7 +1176,7 @@ case (intptr_t)RTLD_SELF: /* Caller included */ for (; obj; obj = obj->next) { - if ((def = _rtld_symlook_obj(name, hash, obj, + if ((def = _rtld_symlook_obj(name, obj, flags, ventry)) != NULL) { defobj = obj; break; @@ -1194,7 +1190,7 @@ */ if (!def || ELF_ST_BIND(def->st_info) == STB_WEAK) { const Elf_Sym *symp = _rtld_symlook_obj(name, - hash, &_rtld_objself, flags, ventry); + &_rtld_objself, flags, ventry); if (symp != NULL) { def = symp; defobj = &_rtld_objself; @@ -1203,7 +1199,7 @@ break; case (intptr_t)RTLD_DEFAULT: - def = _rtld_symlook_default(name, hash, obj, &defobj, + def = _rtld_symlook_default(name, obj, &defobj, flags, ventry); break; @@ -1222,7 +1218,7 @@ if (obj->mainprog) { /* Search main program and all libraries loaded by it */ - def = _rtld_symlook_list(name, hash, &_rtld_list_main, + def = _rtld_symlook_list(name, &_rtld_list_main, &defobj, flags, ventry, &donelist); } else { Needed_Entry fake; @@ -1234,7 +1230,7 @@ fake.name = 0; _rtld_donelist_init(&depth); - def = _rtld_symlook_needed(name, hash, &fake, &defobj, + def = _rtld_symlook_needed(name, &fake, &defobj, flags, ventry, &donelist, &depth); } Index: rtld.h =================================================================== RCS file: /cvsroot/src/libexec/ld.elf_so/rtld.h,v retrieving revision 1.136 diff -u -r1.136 rtld.h --- rtld.h 30 Dec 2018 01:48:37 -0000 1.136 +++ rtld.h 28 Feb 2020 17:20:05 -0000 @@ -109,7 +109,7 @@ } Search_Path; typedef struct Struct_Ver_Entry { - Elf_Word hash; + Elf_Word hash; u_int flags; const char *name; const char *file; @@ -411,18 +411,18 @@ /* symbol.c */ unsigned long _rtld_elf_hash(const char *); -const Elf_Sym *_rtld_symlook_obj(const char *, unsigned long, +const Elf_Sym *_rtld_symlook_obj(const char *, const Obj_Entry *, u_int, const Ver_Entry *); const Elf_Sym *_rtld_find_symdef(unsigned long, const Obj_Entry *, const Obj_Entry **, u_int); const Elf_Sym *_rtld_find_plt_symdef(unsigned long, const Obj_Entry *, const Obj_Entry **, bool); -const Elf_Sym *_rtld_symlook_list(const char *, unsigned long, +const Elf_Sym *_rtld_symlook_list(const char *, const Objlist *, const Obj_Entry **, u_int, const Ver_Entry *, DoneList *); -const Elf_Sym *_rtld_symlook_default(const char *, unsigned long, +const Elf_Sym *_rtld_symlook_default(const char *, const Obj_Entry *, const Obj_Entry **, u_int, const Ver_Entry *); -const Elf_Sym *_rtld_symlook_needed(const char *, unsigned long, +const Elf_Sym *_rtld_symlook_needed(const char *, const Needed_Entry *, const Obj_Entry **, u_int, const Ver_Entry *, DoneList *, DoneList *); Index: symbol.c =================================================================== RCS file: /cvsroot/src/libexec/ld.elf_so/symbol.c,v retrieving revision 1.69 diff -u -r1.69 symbol.c --- symbol.c 9 Aug 2017 18:44:32 -0000 1.69 +++ symbol.c 28 Feb 2020 17:20:05 -0000 @@ -104,7 +104,7 @@ } const Elf_Sym * -_rtld_symlook_list(const char *name, unsigned long hash, const Objlist *objlist, +_rtld_symlook_list(const char *name, const Objlist *objlist, const Obj_Entry **defobj_out, u_int flags, const Ver_Entry *ventry, DoneList *dlp) { @@ -120,7 +120,7 @@ continue; rdbg(("search object %p (%s) for %s", elm->obj, elm->obj->path, name)); - symp = _rtld_symlook_obj(name, hash, elm->obj, flags, ventry); + symp = _rtld_symlook_obj(name, elm->obj, flags, ventry); if (symp != NULL) { if ((def == NULL) || (ELF_ST_BIND(symp->st_info) != STB_WEAK)) { @@ -142,7 +142,7 @@ * to the symbol, or NULL if no definition was found. */ const Elf_Sym * -_rtld_symlook_needed(const char *name, unsigned long hash, +_rtld_symlook_needed(const char *name, const Needed_Entry *needed, const Obj_Entry **defobj_out, u_int flags, const Ver_Entry *ventry, DoneList *breadth, DoneList *depth) { @@ -157,7 +157,7 @@ continue; if (_rtld_donelist_check(breadth, obj)) continue; - def = _rtld_symlook_obj(name, hash, obj, flags, ventry); + def = _rtld_symlook_obj(name, obj, flags, ventry); if (def == NULL) continue; defobj = obj; @@ -176,7 +176,7 @@ continue; if (_rtld_donelist_check(depth, obj)) continue; - def_w = _rtld_symlook_needed(name, hash, obj->needed, &defobj1, + def_w = _rtld_symlook_needed(name, obj->needed, &defobj1, flags, ventry, breadth, depth); if (def_w == NULL) continue; @@ -197,18 +197,16 @@ * Search the symbol table of a single shared object for a symbol of * the given name. Returns a pointer to the symbol, or NULL if no * definition was found. - * - * The symbol's hash value is passed in for efficiency reasons; that - * eliminates many recomputations of the hash value. */ const Elf_Sym * -_rtld_symlook_obj(const char *name, unsigned long hash, +_rtld_symlook_obj(const char *name, const Obj_Entry *obj, u_int flags, const Ver_Entry *ventry) { unsigned long symnum; const Elf_Sym *vsymp = NULL; Elf_Half verndx; int vcount = 0; + unsigned long hash = _rtld_elf_hash(name); for (symnum = obj->buckets[fast_remainder32(hash, obj->nbuckets, obj->nbuckets_m, obj->nbuckets_s1, obj->nbuckets_s2)]; @@ -337,7 +335,6 @@ const Elf_Sym *def; const Obj_Entry *defobj; const char *name; - unsigned long hash; ref = refobj->symtab + symnum; name = refobj->strtab + ref->st_name; @@ -353,9 +350,8 @@ refobj->path, symnum); } - hash = _rtld_elf_hash(name); defobj = NULL; - def = _rtld_symlook_default(name, hash, refobj, &defobj, flags, + def = _rtld_symlook_default(name, refobj, &defobj, flags, _rtld_fetch_ventry(refobj, symnum)); } else { rdbg(("STB_LOCAL symbol %s in %s", name, refobj->path)); @@ -415,7 +411,7 @@ * defining object via the reference parameter DEFOBJ_OUT. */ const Elf_Sym * -_rtld_symlook_default(const char *name, unsigned long hash, +_rtld_symlook_default(const char *name, const Obj_Entry *refobj, const Obj_Entry **defobj_out, u_int flags, const Ver_Entry *ventry) { @@ -433,7 +429,7 @@ /* Look first in the referencing object if linked symbolically. */ if (refobj->symbolic && !_rtld_donelist_check(&donelist, refobj)) { rdbg(("search referencing object for %s", name)); - symp = _rtld_symlook_obj(name, hash, refobj, flags, ventry); + symp = _rtld_symlook_obj(name, refobj, flags, ventry); if (symp != NULL) { def = symp; defobj = refobj; @@ -443,7 +439,7 @@ /* Search all objects loaded at program start up. */ if (def == NULL || ELF_ST_BIND(def->st_info) == STB_WEAK) { rdbg(("search _rtld_list_main for %s", name)); - symp = _rtld_symlook_list(name, hash, &_rtld_list_main, &obj, + symp = _rtld_symlook_list(name, &_rtld_list_main, &obj, flags, ventry, &donelist); if (symp != NULL && (def == NULL || ELF_ST_BIND(symp->st_info) != STB_WEAK)) { @@ -455,7 +451,7 @@ /* Search all RTLD_GLOBAL objects. */ if (def == NULL || ELF_ST_BIND(def->st_info) == STB_WEAK) { rdbg(("search _rtld_list_global for %s", name)); - symp = _rtld_symlook_list(name, hash, &_rtld_list_global, + symp = _rtld_symlook_list(name, &_rtld_list_global, &obj, flags, ventry, &donelist); if (symp != NULL && (def == NULL || ELF_ST_BIND(symp->st_info) != STB_WEAK)) { @@ -470,7 +466,7 @@ break; rdbg(("search DAG with root %p (%s) for %s", elm->obj, elm->obj->path, name)); - symp = _rtld_symlook_list(name, hash, &elm->obj->dagmembers, + symp = _rtld_symlook_list(name, &elm->obj->dagmembers, &obj, flags, ventry, &donelist); if (symp != NULL && (def == NULL || ELF_ST_BIND(symp->st_info) != STB_WEAK)) { @@ -487,7 +483,7 @@ if ((def == NULL || ELF_ST_BIND(def->st_info) == STB_WEAK) && !refobj->symbolic && !_rtld_donelist_check(&donelist, refobj)) { rdbg(("search referencing object for %s", name)); - symp = _rtld_symlook_obj(name, hash, refobj, flags, ventry); + symp = _rtld_symlook_obj(name, refobj, flags, ventry); if (symp != NULL) { def = symp; defobj = refobj; @@ -501,7 +497,7 @@ */ if (def == NULL || ELF_ST_BIND(def->st_info) == STB_WEAK) { rdbg(("Search the dynamic linker itself.")); - symp = _rtld_symlook_obj(name, hash, &_rtld_objself, flags, + symp = _rtld_symlook_obj(name, &_rtld_objself, flags, ventry); if (symp != NULL) { def = symp;