Lines Matching refs:obj

95 static int do_search_info(const Obj_Entry *obj, int, struct dl_serinfo *);
128 static int relocate_object(Obj_Entry *obj, bool bind_now, Obj_Entry *rtldobj,
162 static void rtld_fill_dl_phdr_info(const Obj_Entry *obj,
345 Obj_Entry *obj; in _rtld() local
584 for (obj = obj_list; obj != NULL; obj = obj->next) { in _rtld()
585 if (obj->z_interpose && obj != obj_main) { in _rtld()
586 objlist_put_after(&list_main, last_interposer, obj); in _rtld()
587 last_interposer = obj; in _rtld()
589 objlist_push_tail(&list_main, obj); in _rtld()
591 obj->refcount++; in _rtld()
620 allocate_tls_offset(entry->obj); in _rtld()
730 Obj_Entry *obj; in _rtld_call_init() local
759 for (obj = obj_list->next; obj != NULL; obj = obj->next) { in _rtld_call_init()
760 if (ld_loadfltr || obj->z_loadfltr) in _rtld_call_init()
761 load_filtees(obj, 0, &lockstate); in _rtld_call_init()
767 rtld_resolve_ifunc(const Obj_Entry *obj, const Elf_Sym *def) in rtld_resolve_ifunc() argument
772 ptr = (void *)make_function_pointer(def, obj); in rtld_resolve_ifunc()
778 _rtld_bind(Obj_Entry *obj, Elf_Size reloff, void *stack) in _rtld_bind() argument
790 if (obj->pltrel) in _rtld_bind()
791 rel = (const Elf_Rel *) ((caddr_t) obj->pltrel + reloff); in _rtld_bind()
793 rel = (const Elf_Rel *) ((caddr_t) obj->pltrela + reloff); in _rtld_bind()
795 where = (Elf_Addr *) (obj->relocbase + rel->r_offset); in _rtld_bind()
796 def = find_symdef(ELF_R_SYM(rel->r_info), obj, &defobj, true, NULL, in _rtld_bind()
806 defobj->strtab + def->st_name, basename(obj->path), in _rtld_bind()
818 if (rtld_functrace != NULL && obj != rtld_functrace_obj) { in _rtld_bind()
819 if (rtld_functrace(obj->path, in _rtld_bind()
835 target = reloc_jmpslot(where, target, defobj, obj, rel); in _rtld_bind()
984 digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath, in digest_dynamic1() argument
988 Needed_Entry **needed_tail = &obj->needed; in digest_dynamic1()
989 Needed_Entry **needed_filtees_tail = &obj->needed_filtees; in digest_dynamic1()
990 Needed_Entry **needed_aux_filtees_tail = &obj->needed_aux_filtees; in digest_dynamic1()
1002 obj->bind_now = false; in digest_dynamic1()
1003 for (dynp = obj->dynamic; dynp->d_tag != DT_NULL; dynp++) { in digest_dynamic1()
1007 obj->rel = (const Elf_Rel *) (obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1011 obj->relsize = dynp->d_un.d_val; in digest_dynamic1()
1019 obj->pltrel = (const Elf_Rel *) in digest_dynamic1()
1020 (obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1024 obj->pltrelsize = dynp->d_un.d_val; in digest_dynamic1()
1028 obj->rela = (const Elf_Rela *) (obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1032 obj->relasize = dynp->d_un.d_val; in digest_dynamic1()
1045 obj->symtab = (const Elf_Sym *) in digest_dynamic1()
1046 (obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1054 obj->strtab = (const char *) (obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1058 obj->strsize = dynp->d_un.d_val; in digest_dynamic1()
1062 obj->verneed = (const Elf_Verneed *) (obj->relocbase + in digest_dynamic1()
1067 obj->verneednum = dynp->d_un.d_val; in digest_dynamic1()
1071 obj->verdef = (const Elf_Verdef *) (obj->relocbase + in digest_dynamic1()
1076 obj->verdefnum = dynp->d_un.d_val; in digest_dynamic1()
1080 obj->versyms = (const Elf_Versym *)(obj->relocbase + in digest_dynamic1()
1086 hashtab = (const Elf_Hashelt *)(obj->relocbase + in digest_dynamic1()
1088 obj->nbuckets = hashtab[0]; in digest_dynamic1()
1089 obj->nchains = hashtab[1]; in digest_dynamic1()
1090 obj->buckets = hashtab + 2; in digest_dynamic1()
1091 obj->chains = obj->buckets + obj->nbuckets; in digest_dynamic1()
1092 obj->valid_hash_sysv = obj->nbuckets > 0 && obj->nchains > 0 && in digest_dynamic1()
1093 obj->buckets != NULL; in digest_dynamic1()
1099 hashtab = (const Elf_Hashelt *)(obj->relocbase + in digest_dynamic1()
1101 obj->nbuckets_gnu = hashtab[0]; in digest_dynamic1()
1102 obj->symndx_gnu = hashtab[1]; in digest_dynamic1()
1107 obj->maskwords_bm_gnu = nmaskwords - 1; in digest_dynamic1()
1108 obj->shift2_gnu = hashtab[3]; in digest_dynamic1()
1109 obj->bloom_gnu = (Elf_Addr *) (hashtab + 4); in digest_dynamic1()
1110 obj->buckets_gnu = hashtab + 4 + bloom_size32; in digest_dynamic1()
1111 obj->chain_zero_gnu = obj->buckets_gnu + obj->nbuckets_gnu - in digest_dynamic1()
1112 obj->symndx_gnu; in digest_dynamic1()
1113 obj->valid_hash_gnu = nmw_power2 && obj->nbuckets_gnu > 0 && in digest_dynamic1()
1114 obj->buckets_gnu != NULL; in digest_dynamic1()
1119 if (!obj->rtld) { in digest_dynamic1()
1122 nep->obj = NULL; in digest_dynamic1()
1131 if (!obj->rtld) { in digest_dynamic1()
1134 nep->obj = NULL; in digest_dynamic1()
1143 if (!obj->rtld) { in digest_dynamic1()
1146 nep->obj = NULL; in digest_dynamic1()
1155 obj->pltgot = (Elf_Addr *) (obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1159 obj->textrel = true; in digest_dynamic1()
1163 obj->symbolic = true; in digest_dynamic1()
1183 obj->init = (Elf_Addr) (obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1187 obj->preinit_array = (Elf_Addr)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1191 obj->preinit_array_num = dynp->d_un.d_val / sizeof(Elf_Addr); in digest_dynamic1()
1195 obj->init_array = (Elf_Addr)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1199 obj->init_array_num = dynp->d_un.d_val / sizeof(Elf_Addr); in digest_dynamic1()
1203 obj->fini = (Elf_Addr)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1207 obj->fini_array = (Elf_Addr)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1211 obj->fini_array_num = dynp->d_un.d_val / sizeof(Elf_Addr); in digest_dynamic1()
1223 obj->z_origin = true; in digest_dynamic1()
1225 obj->symbolic = true; in digest_dynamic1()
1227 obj->textrel = true; in digest_dynamic1()
1229 obj->bind_now = true; in digest_dynamic1()
1231 obj->static_tls = true; in digest_dynamic1()
1236 obj->z_noopen = true; in digest_dynamic1()
1238 obj->z_origin = true; in digest_dynamic1()
1242 obj->bind_now = true; in digest_dynamic1()
1244 obj->z_nodelete = true; in digest_dynamic1()
1246 obj->z_loadfltr = true; in digest_dynamic1()
1248 obj->z_interpose = true; in digest_dynamic1()
1250 obj->z_nodeflib = true; in digest_dynamic1()
1262 obj->traced = false; in digest_dynamic1()
1265 obj->pltrela = (const Elf_Rela *) obj->pltrel; in digest_dynamic1()
1266 obj->pltrel = NULL; in digest_dynamic1()
1267 obj->pltrelasize = obj->pltrelsize; in digest_dynamic1()
1268 obj->pltrelsize = 0; in digest_dynamic1()
1272 if (obj->valid_hash_sysv) in digest_dynamic1()
1273 obj->dynsymcount = obj->nchains; in digest_dynamic1()
1274 else if (obj->valid_hash_gnu) { in digest_dynamic1()
1275 obj->dynsymcount = 0; in digest_dynamic1()
1276 for (bkt = 0; bkt < obj->nbuckets_gnu; bkt++) { in digest_dynamic1()
1277 if (obj->buckets_gnu[bkt] == 0) in digest_dynamic1()
1279 hashval = &obj->chain_zero_gnu[obj->buckets_gnu[bkt]]; in digest_dynamic1()
1281 obj->dynsymcount++; in digest_dynamic1()
1284 obj->dynsymcount += obj->symndx_gnu; in digest_dynamic1()
1289 digest_dynamic2(Obj_Entry *obj, const Elf_Dyn *dyn_rpath, in digest_dynamic2() argument
1293 if (obj->z_origin && obj->origin_path == NULL) { in digest_dynamic2()
1294 obj->origin_path = xmalloc(PATH_MAX); in digest_dynamic2()
1295 if (rtld_dirname_abs(obj->path, obj->origin_path) == -1) in digest_dynamic2()
1300 obj->runpath = (char *)obj->strtab + dyn_runpath->d_un.d_val; in digest_dynamic2()
1301 if (obj->z_origin) in digest_dynamic2()
1302 obj->runpath = origin_subst(obj->runpath, obj->origin_path); in digest_dynamic2()
1305 obj->rpath = (char *)obj->strtab + dyn_rpath->d_un.d_val; in digest_dynamic2()
1306 if (obj->z_origin) in digest_dynamic2()
1307 obj->rpath = origin_subst(obj->rpath, obj->origin_path); in digest_dynamic2()
1311 object_add_name(obj, obj->strtab + dyn_soname->d_un.d_val); in digest_dynamic2()
1315 digest_dynamic(Obj_Entry *obj, int early) in digest_dynamic() argument
1321 digest_dynamic1(obj, early, &dyn_rpath, &dyn_soname, &dyn_runpath); in digest_dynamic()
1322 digest_dynamic2(obj, dyn_rpath, dyn_soname, dyn_runpath); in digest_dynamic()
1334 Obj_Entry *obj; in digest_phdr() local
1340 obj = obj_new(); in digest_phdr()
1345 obj->phdr = phdr; in digest_phdr()
1346 obj->phsize = ph->p_memsz; in digest_phdr()
1347 obj->relocbase = (caddr_t)phdr - ph->p_vaddr; in digest_phdr()
1351 obj->stack_flags = PF_X | PF_R | PF_W; in digest_phdr()
1357 obj->interp = (const char *)(ph->p_vaddr + obj->relocbase); in digest_phdr()
1362 obj->vaddrbase = trunc_page(ph->p_vaddr); in digest_phdr()
1363 obj->mapbase = obj->vaddrbase + obj->relocbase; in digest_phdr()
1364 obj->textsize = round_page(ph->p_vaddr + ph->p_memsz) - in digest_phdr()
1365 obj->vaddrbase; in digest_phdr()
1367 obj->mapsize = round_page(ph->p_vaddr + ph->p_memsz) - in digest_phdr()
1368 obj->vaddrbase; in digest_phdr()
1374 obj->dynamic = (const Elf_Dyn *)(ph->p_vaddr + obj->relocbase); in digest_phdr()
1378 obj->tlsindex = 1; in digest_phdr()
1379 obj->tlssize = ph->p_memsz; in digest_phdr()
1380 obj->tlsalign = ph->p_align; in digest_phdr()
1381 obj->tlsinitsize = ph->p_filesz; in digest_phdr()
1382 obj->tlsinit = (void*)(ph->p_vaddr + obj->relocbase); in digest_phdr()
1386 obj->stack_flags = ph->p_flags; in digest_phdr()
1390 obj->relro_page = obj->relocbase + trunc_page(ph->p_vaddr); in digest_phdr()
1391 obj->relro_size = round_page(ph->p_memsz); in digest_phdr()
1395 obj->note_present = true; in digest_phdr()
1396 note_start = (Elf_Addr)obj->relocbase + ph->p_vaddr; in digest_phdr()
1398 digest_notes(obj, note_start, note_end); in digest_phdr()
1407 obj->entry = entry; in digest_phdr()
1408 return obj; in digest_phdr()
1412 digest_notes(Obj_Entry *obj, Elf_Addr note_start, Elf_Addr note_end) in digest_notes() argument
1436 obj->osrel = *(const int32_t *)(p); in digest_notes()
1437 dbg("note osrel %d", obj->osrel); in digest_notes()
1441 obj->crt_no_init = true; in digest_notes()
1451 Obj_Entry *obj; in dlcheck() local
1453 for (obj = obj_list; obj != NULL; obj = obj->next) in dlcheck()
1454 if (obj == (Obj_Entry *) handle) in dlcheck()
1457 if (obj == NULL || obj->refcount == 0 || obj->dl_refcount == 0) { in dlcheck()
1461 return obj; in dlcheck()
1469 donelist_check(DoneList *dlp, const Obj_Entry *obj) in donelist_check() argument
1474 if (dlp->objs[i] == obj) in donelist_check()
1483 dlp->objs[dlp->num_used++] = obj; in donelist_check()
1623 *defobj_out = cache[symnum].obj; in find_symdef()
1675 cache[symnum].obj = defobj; in find_symdef()
1846 for (needed = elm->obj->needed; needed != NULL; needed = needed->next) { in init_dag()
1847 if (needed->obj == NULL || donelist_check(&donelist, needed->obj)) in init_dag()
1849 objlist_push_tail(&needed->obj->dldags, root); in init_dag()
1850 objlist_push_tail(&root->dagmembers, needed->obj); in init_dag()
1867 if (elm->obj != NULL && elm->obj->z_nodelete && in process_nodelete()
1868 !elm->obj->ref_nodel) { in process_nodelete()
1869 dbg("obj %s nodelete", elm->obj->path); in process_nodelete()
1870 init_dag(elm->obj); in process_nodelete()
1871 ref_dag(elm->obj); in process_nodelete()
1872 elm->obj->ref_nodel = true; in process_nodelete()
1955 if (needed->obj != NULL) in initlist_add_neededs()
1956 initlist_add_objects(needed->obj, &needed->obj->next, list); in initlist_add_neededs()
1969 initlist_add_objects(Obj_Entry *obj, Obj_Entry **tail, Objlist *list) in initlist_add_objects() argument
1972 if (obj->init_scanned || obj->init_done) in initlist_add_objects()
1974 obj->init_scanned = true; in initlist_add_objects()
1977 if (&obj->next != tail) in initlist_add_objects()
1978 initlist_add_objects(obj->next, tail, list); in initlist_add_objects()
1981 if (obj->needed != NULL) in initlist_add_objects()
1982 initlist_add_neededs(obj->needed, list); in initlist_add_objects()
1983 if (obj->needed_filtees != NULL) in initlist_add_objects()
1984 initlist_add_neededs(obj->needed_filtees, list); in initlist_add_objects()
1985 if (obj->needed_aux_filtees != NULL) in initlist_add_objects()
1986 initlist_add_neededs(obj->needed_aux_filtees, list); in initlist_add_objects()
1989 if (obj->preinit_array != (Elf_Addr)NULL || obj->init != (Elf_Addr)NULL || in initlist_add_objects()
1990 obj->init_array != (Elf_Addr)NULL) in initlist_add_objects()
1991 objlist_push_tail(list, obj); in initlist_add_objects()
1994 if ((obj->fini != (Elf_Addr)NULL || obj->fini_array != (Elf_Addr)NULL) in initlist_add_objects()
1995 && !obj->on_fini_list) { in initlist_add_objects()
1996 objlist_push_head(&list_fini, obj); in initlist_add_objects()
1997 obj->on_fini_list = true; in initlist_add_objects()
2011 if (needed->obj != NULL) { in free_needed_filtees()
2012 dlclose(needed->obj); in free_needed_filtees()
2013 needed->obj = NULL; in free_needed_filtees()
2023 unload_filtees(Obj_Entry *obj) in unload_filtees() argument
2026 free_needed_filtees(obj->needed_filtees); in unload_filtees()
2027 obj->needed_filtees = NULL; in unload_filtees()
2028 free_needed_filtees(obj->needed_aux_filtees); in unload_filtees()
2029 obj->needed_aux_filtees = NULL; in unload_filtees()
2030 obj->filtees_loaded = false; in unload_filtees()
2034 load_filtee1(Obj_Entry *obj, Needed_Entry *needed, int flags, in load_filtee1() argument
2039 needed->obj = dlopen_object(obj->strtab + needed->name, -1, obj, in load_filtee1()
2040 flags, ((ld_loadfltr || obj->z_loadfltr) ? RTLD_NOW : RTLD_LAZY) | in load_filtee1()
2046 load_filtees(Obj_Entry *obj, int flags, RtldLockState *lockstate) in load_filtees() argument
2050 if (!obj->filtees_loaded) { in load_filtees()
2051 load_filtee1(obj, obj->needed_filtees, flags, lockstate); in load_filtees()
2052 load_filtee1(obj, obj->needed_aux_filtees, flags, lockstate); in load_filtees()
2053 obj->filtees_loaded = true; in load_filtees()
2058 process_needed(Obj_Entry *obj, Needed_Entry *needed, int flags) in process_needed() argument
2063 obj1 = needed->obj = load_object(obj->strtab + needed->name, -1, obj, in process_needed()
2079 Obj_Entry *obj; in load_needed_objects() local
2081 for (obj = first; obj != NULL; obj = obj->next) { in load_needed_objects()
2082 if (process_needed(obj, obj->needed, flags) == -1) in load_needed_objects()
2092 Obj_Entry *obj; in load_preload_objects() local
2107 obj = load_object(p, -1, NULL, 0); in load_preload_objects()
2108 if (obj == NULL) in load_preload_objects()
2110 obj->z_interpose = true; in load_preload_objects()
2117 res = symlook_obj(&req, obj); in load_preload_objects()
2147 Obj_Entry *obj; in load_object() local
2154 for (obj = obj_list->next; obj != NULL; obj = obj->next) { in load_object()
2155 if (object_match_name(obj, name)) in load_object()
2156 return (obj); in load_object()
2199 for (obj = obj_list->next; obj != NULL; obj = obj->next) in load_object()
2200 if (obj->ino == sb.st_ino && obj->dev == sb.st_dev) in load_object()
2202 if (obj != NULL && name != NULL) { in load_object()
2203 object_add_name(obj, name); in load_object()
2206 return obj; in load_object()
2215 obj = do_load_object(fd, name, path, &sb, flags); in load_object()
2216 if (obj == NULL) in load_object()
2220 return obj; in load_object()
2227 Obj_Entry *obj; in do_load_object() local
2245 obj = map_object(fd, printable_path(path), sbp); in do_load_object()
2246 if (obj == NULL) in do_load_object()
2254 object_add_name(obj, name); in do_load_object()
2255 obj->path = path; in do_load_object()
2256 digest_dynamic(obj, 0); in do_load_object()
2257 dbg("%s valid_hash_sysv %d valid_hash_gnu %d dynsymcount %d", obj->path, in do_load_object()
2258 obj->valid_hash_sysv, obj->valid_hash_gnu, obj->dynsymcount); in do_load_object()
2259 if (obj->z_noopen && (flags & (RTLD_LO_DLOPEN | RTLD_LO_TRACE)) == in do_load_object()
2261 dbg("refusing to load non-loadable \"%s\"", obj->path); in do_load_object()
2262 _rtld_error("Cannot dlopen non-loadable %s", obj->path); in do_load_object()
2263 munmap(obj->mapbase, obj->mapsize); in do_load_object()
2264 obj_free(obj); in do_load_object()
2268 *obj_tail = obj; in do_load_object()
2269 obj_tail = &obj->next; in do_load_object()
2272 linkmap_add(obj); /* for GDB & dlinfo() */ in do_load_object()
2274 max_stack_flags |= obj->stack_flags; in do_load_object()
2277 dbg(" %p .. %p: %s", obj->mapbase, in do_load_object()
2278 obj->mapbase + obj->mapsize - 1, obj->path); in do_load_object()
2279 if (obj->textrel) in do_load_object()
2280 dbg(" WARNING: %s has impure text", obj->path); in do_load_object()
2281 LD_UTRACE(UTRACE_LOAD_OBJECT, obj, obj->mapbase, obj->mapsize, 0, in do_load_object()
2282 obj->path); in do_load_object()
2284 return obj; in do_load_object()
2290 Obj_Entry *obj; in obj_from_addr() local
2292 for (obj = obj_list; obj != NULL; obj = obj->next) { in obj_from_addr()
2293 if (addr < (void *) obj->mapbase) in obj_from_addr()
2295 if (addr < (void *) (obj->mapbase + obj->mapsize)) in obj_from_addr()
2296 return obj; in obj_from_addr()
2351 if (root != NULL && (elm->obj->refcount != 1 || in objlist_call_fini()
2352 objlist_find(&root->dagmembers, elm->obj) == NULL)) in objlist_call_fini()
2373 fini_addr = (Elf_Addr *)elm->obj->fini_array; in objlist_call_fini()
2374 if (fini_addr != NULL && elm->obj->fini_array_num > 0) { in objlist_call_fini()
2375 for (index = elm->obj->fini_array_num - 1; index >= 0; index--) { in objlist_call_fini()
2378 elm->obj->path, (void *)fini_addr[index]); in objlist_call_fini()
2379 LD_UTRACE(UTRACE_FINI_CALL, elm->obj, in objlist_call_fini()
2380 (void *)fini_addr[index], 0, 0, elm->obj->path); in objlist_call_fini()
2381 call_initfini_pointer(elm->obj, fini_addr[index]); in objlist_call_fini()
2385 if (elm->obj->fini != (Elf_Addr)NULL) { in objlist_call_fini()
2386 dbg("calling fini function for %s at %p", elm->obj->path, in objlist_call_fini()
2387 (void *)elm->obj->fini); in objlist_call_fini()
2388 LD_UTRACE(UTRACE_FINI_CALL, elm->obj, (void *)elm->obj->fini, in objlist_call_fini()
2389 0, 0, elm->obj->path); in objlist_call_fini()
2390 call_initfini_pointer(elm->obj, elm->obj->fini); in objlist_call_fini()
2416 Obj_Entry *obj; in objlist_call_init() local
2426 for (obj = obj_list; obj != NULL; obj = obj->next) in objlist_call_init()
2427 obj->init_scanned = false; in objlist_call_init()
2435 if (elm->obj->init_done) /* Initialized early. */ in objlist_call_init()
2443 elm->obj->init_done = true; in objlist_call_init()
2452 if (elm->obj->init != (Elf_Addr)NULL) { in objlist_call_init()
2453 dbg("calling init function for %s at %p", elm->obj->path, in objlist_call_init()
2454 (void *)elm->obj->init); in objlist_call_init()
2455 LD_UTRACE(UTRACE_INIT_CALL, elm->obj, (void *)elm->obj->init, in objlist_call_init()
2456 0, 0, elm->obj->path); in objlist_call_init()
2457 call_initfini_pointer(elm->obj, elm->obj->init); in objlist_call_init()
2459 init_addr = (Elf_Addr *)elm->obj->init_array; in objlist_call_init()
2461 for (index = 0; index < elm->obj->init_array_num; index++) { in objlist_call_init()
2463 dbg("calling init array function for %s at %p", elm->obj->path, in objlist_call_init()
2465 LD_UTRACE(UTRACE_INIT_CALL, elm->obj, in objlist_call_init()
2466 (void *)init_addr[index], 0, 0, elm->obj->path); in objlist_call_init()
2467 call_init_pointer(elm->obj, init_addr[index]); in objlist_call_init()
2489 objlist_find(Objlist *list, const Obj_Entry *obj) in objlist_find() argument
2494 if (elm->obj == obj) in objlist_find()
2506 objlist_push_head(Objlist *list, Obj_Entry *obj) in objlist_push_head() argument
2511 elm->obj = obj; in objlist_push_head()
2516 objlist_push_tail(Objlist *list, Obj_Entry *obj) in objlist_push_tail() argument
2521 elm->obj = obj; in objlist_push_tail()
2526 objlist_put_after(Objlist *list, Obj_Entry *listobj, Obj_Entry *obj) in objlist_put_after() argument
2531 if (listelm->obj == listobj) in objlist_put_after()
2535 elm->obj = obj; in objlist_put_after()
2543 objlist_remove(Objlist *list, Obj_Entry *obj) in objlist_remove() argument
2547 if ((elm = objlist_find(list, obj)) != NULL) { in objlist_remove()
2567 error = relocate_object(elm->obj, bind_now, rtldobj, flags, in relocate_object_dag()
2584 reloc_textrel_prot(Obj_Entry *obj, bool before) in reloc_textrel_prot() argument
2591 for (l = obj->phsize / sizeof(*ph), ph = obj->phdr; l > 0; in reloc_textrel_prot()
2595 base = obj->relocbase + trunc_page(ph->p_vaddr); in reloc_textrel_prot()
2616 obj->path, before ? "en" : "dis", in reloc_textrel_prot()
2629 relocate_object(Obj_Entry *obj, bool bind_now, Obj_Entry *rtldobj, in relocate_object() argument
2633 if (obj->relocated) in relocate_object()
2635 obj->relocated = true; in relocate_object()
2636 if (obj != rtldobj) in relocate_object()
2637 dbg("relocating \"%s\"", obj->path); in relocate_object()
2639 if (obj->symtab == NULL || obj->strtab == NULL || in relocate_object()
2640 !(obj->valid_hash_sysv || obj->valid_hash_gnu)) { in relocate_object()
2642 obj->path); in relocate_object()
2647 if (obj->textrel && reloc_textrel_prot(obj, true) != 0) in relocate_object()
2651 if (reloc_non_plt(obj, rtldobj, flags, lockstate)) in relocate_object()
2655 if (obj->textrel && reloc_textrel_prot(obj, false) != 0) in relocate_object()
2659 init_pltgot(obj); in relocate_object()
2662 if (reloc_plt(obj) == -1) in relocate_object()
2665 if (obj->bind_now || bind_now) in relocate_object()
2666 if (reloc_jmpslots(obj, flags, lockstate) == -1) in relocate_object()
2675 if (obj->non_plt_gnu_ifunc && in relocate_object()
2676 reloc_non_plt(obj, rtldobj, flags | SYMLOOK_IFUNC, lockstate)) in relocate_object()
2684 obj->magic = RTLD_MAGIC; in relocate_object()
2685 obj->version = RTLD_VERSION; in relocate_object()
2691 if (obj->relro_size) { in relocate_object()
2692 if (mprotect(obj->relro_page, obj->relro_size, PROT_READ) == -1) { in relocate_object()
2694 obj->path, rtld_strerror(errno)); in relocate_object()
2697 obj->relro_protected = true; in relocate_object()
2712 Obj_Entry *obj; in relocate_objects() local
2715 for (error = 0, obj = first; obj != NULL; obj = obj->next) { in relocate_objects()
2716 error = relocate_object(obj, bind_now, rtldobj, flags, in relocate_objects()
2736 resolve_object_ifunc(Obj_Entry *obj, bool bind_now, int flags, in resolve_object_ifunc() argument
2739 if (obj->irelative && reloc_iresolve(obj, lockstate) == -1) in resolve_object_ifunc()
2741 if (obj->irelative_nonplt && reloc_iresolve_nonplt(obj, in resolve_object_ifunc()
2744 if ((obj->bind_now || bind_now) && obj->gnu_ifunc && in resolve_object_ifunc()
2745 reloc_gnu_ifunc(obj, flags, lockstate) == -1) in resolve_object_ifunc()
2754 Obj_Entry *obj; in resolve_objects_ifunc() local
2756 for (obj = first; obj != NULL; obj = obj->next) { in resolve_objects_ifunc()
2757 if (resolve_object_ifunc(obj, bind_now, flags, lockstate) == -1) in resolve_objects_ifunc()
2770 if (resolve_object_ifunc(elm->obj, bind_now, flags, in initlist_objects_ifunc()
3037 dlopen_cleanup(Obj_Entry *obj) in dlopen_cleanup() argument
3040 obj->dl_refcount--; in dlopen_cleanup()
3041 unref_dag(obj); in dlopen_cleanup()
3042 if (obj->refcount == 0) in dlopen_cleanup()
3043 unload_object(obj); in dlopen_cleanup()
3051 Obj_Entry *obj; in dlopen_object() local
3065 obj = NULL; in dlopen_object()
3067 obj = obj_main; in dlopen_object()
3068 obj->refcount++; in dlopen_object()
3070 obj = load_object(name, fd, refobj, lo_flags); in dlopen_object()
3073 if (obj) { in dlopen_object()
3074 obj->dl_refcount++; in dlopen_object()
3075 if (mode & RTLD_GLOBAL && objlist_find(&list_global, obj) == NULL) in dlopen_object()
3076 objlist_push_tail(&list_global, obj); in dlopen_object()
3078 assert(*old_obj_tail == obj); in dlopen_object()
3079 if ((lo_flags & RTLD_LO_EARLY) == 0 && obj->static_tls && in dlopen_object()
3080 !allocate_tls_offset(obj)) { in dlopen_object()
3083 obj->path); in dlopen_object()
3090 obj, in dlopen_object()
3093 init_dag(obj); in dlopen_object()
3094 ref_dag(obj); in dlopen_object()
3096 result = rtld_verify_versions(&obj->dagmembers); in dlopen_object()
3099 if (result == -1 || relocate_object_dag(obj, in dlopen_object()
3103 dlopen_cleanup(obj); in dlopen_object()
3104 obj = NULL; in dlopen_object()
3117 initlist_add_objects(obj, &obj->next, &initlist); in dlopen_object()
3125 if (obj != NULL) in dlopen_object()
3126 process_nodelete(obj); in dlopen_object()
3134 init_dag(obj); in dlopen_object()
3135 ref_dag(obj); in dlopen_object()
3140 if (obj != NULL && ((lo_flags & RTLD_LO_NODELETE) != 0 || in dlopen_object()
3141 obj->z_nodelete) && !obj->ref_nodel) { in dlopen_object()
3142 dbg("obj %s nodelete", obj->path); in dlopen_object()
3143 ref_dag(obj); in dlopen_object()
3144 obj->z_nodelete = obj->ref_nodel = true; in dlopen_object()
3148 LD_UTRACE(UTRACE_DLOPEN_STOP, obj, NULL, 0, obj ? obj->dl_refcount : 0, in dlopen_object()
3150 GDB_STATE(RT_CONSISTENT,obj ? &obj->linkmap : NULL); in dlopen_object()
3154 if (obj) in dlopen_object()
3162 dlopen_cleanup(obj); in dlopen_object()
3175 return obj; in dlopen_object()
3177 trace_loaded_objects(obj); in dlopen_object()
3188 const Obj_Entry *obj, *defobj; in do_dlsym() local
3210 if ((obj = obj_from_addr(retaddr)) == NULL) { in do_dlsym()
3216 obj = obj_list; in do_dlsym()
3219 res = symlook_obj(&req, obj); in do_dlsym()
3228 obj = obj->next; in do_dlsym()
3229 for (; obj != NULL; obj = obj->next) { in do_dlsym()
3230 res = symlook_obj(&req, obj); in do_dlsym()
3255 res = symlook_default(&req, obj); in do_dlsym()
3262 if ((obj = dlcheck(handle)) == NULL) { in do_dlsym()
3268 if (obj->mainprog) { in do_dlsym()
3290 res = symlook_list(&req, &obj->dagmembers, &donelist); in do_dlsym()
3359 const Obj_Entry *obj; in _rtld_addr_phdr() local
3363 obj = obj_from_addr(addr); in _rtld_addr_phdr()
3364 if (obj == NULL) { in _rtld_addr_phdr()
3369 rtld_fill_dl_phdr_info(obj, phdr_info); in _rtld_addr_phdr()
3377 const Obj_Entry *obj; in dladdr() local
3384 obj = obj_from_addr(addr); in dladdr()
3385 if (obj == NULL) { in dladdr()
3390 info->dli_fname = obj->path; in dladdr()
3391 info->dli_fbase = obj->mapbase; in dladdr()
3399 for (symoffset = 0; symoffset < obj->dynsymcount; symoffset++) { in dladdr()
3400 def = obj->symtab + symoffset; in dladdr()
3414 symbol_addr = obj->relocbase + def->st_value; in dladdr()
3419 info->dli_sname = obj->strtab + def->st_name; in dladdr()
3433 const Obj_Entry *obj; in dlinfo() local
3443 if ((obj = obj_from_addr(retaddr)) == NULL) in dlinfo()
3446 obj = dlcheck(handle); in dlinfo()
3448 if (obj == NULL) { in dlinfo()
3456 *((struct link_map const **)p) = &obj->linkmap; in dlinfo()
3459 error = rtld_dirname(obj->path, p); in dlinfo()
3464 error = do_search_info(obj, request, (struct dl_serinfo *)p); in dlinfo()
3478 rtld_fill_dl_phdr_info(const Obj_Entry *obj, struct dl_phdr_info *phdr_info) in rtld_fill_dl_phdr_info() argument
3481 phdr_info->dlpi_addr = (Elf_Addr)obj->relocbase; in rtld_fill_dl_phdr_info()
3482 phdr_info->dlpi_name = obj->path; in rtld_fill_dl_phdr_info()
3483 phdr_info->dlpi_phdr = obj->phdr; in rtld_fill_dl_phdr_info()
3484 phdr_info->dlpi_phnum = obj->phsize / sizeof(obj->phdr[0]); in rtld_fill_dl_phdr_info()
3485 phdr_info->dlpi_tls_modid = obj->tlsindex; in rtld_fill_dl_phdr_info()
3486 phdr_info->dlpi_tls_data = obj->tlsinit; in rtld_fill_dl_phdr_info()
3495 const Obj_Entry *obj; in dl_iterate_phdr() local
3504 for (obj = obj_list; obj != NULL; obj = obj->next) { in dl_iterate_phdr()
3505 rtld_fill_dl_phdr_info(obj, &phdr_info); in dl_iterate_phdr()
3549 do_search_info(const Obj_Entry *obj, int request, struct dl_serinfo *info) in do_search_info() argument
3560 path_enumerate(obj->rpath, fill_search_info, &args); in do_search_info()
3562 path_enumerate(obj->runpath, fill_search_info, &args); in do_search_info()
3563 path_enumerate(gethints(obj->z_nodeflib), fill_search_info, &args); in do_search_info()
3564 if (!obj->z_nodeflib) in do_search_info()
3585 if (path_enumerate(obj->rpath, fill_search_info, &args) != NULL) in do_search_info()
3593 if (path_enumerate(obj->runpath, fill_search_info, &args) != NULL) in do_search_info()
3597 if (path_enumerate(gethints(obj->z_nodeflib), fill_search_info, &args) in do_search_info()
3602 if (!obj->z_nodeflib && in do_search_info()
3669 linkmap_add(Obj_Entry *obj) in linkmap_add() argument
3671 struct link_map *l = &obj->linkmap; in linkmap_add()
3674 obj->linkmap.l_name = obj->path; in linkmap_add()
3675 obj->linkmap.l_addr = obj->mapbase; in linkmap_add()
3676 obj->linkmap.l_ld = obj->dynamic; in linkmap_add()
3701 linkmap_delete(Obj_Entry *obj) in linkmap_delete() argument
3703 struct link_map *l = &obj->linkmap; in linkmap_delete()
3825 res = symlook_list(&req1, &elm->obj->dagmembers, donelist); in symlook_global()
3901 res = symlook_list(&req1, &elm->obj->dagmembers, &donelist); in symlook_default()
3940 if (donelist_check(dlp, elm->obj)) in symlook_list()
3943 if ((res = symlook_obj(&req1, elm->obj)) == 0) { in symlook_list()
3979 if (n->obj == NULL || in symlook_needed()
3980 (res = symlook_list(&req1, &n->obj->dagmembers, dlp)) != 0) in symlook_needed()
4007 symlook_obj(SymLook *req, const Obj_Entry *obj) in symlook_obj() argument
4017 if (obj->valid_hash_gnu) in symlook_obj()
4018 mres = symlook_obj1_gnu(req, obj); in symlook_obj()
4019 else if (obj->valid_hash_sysv) in symlook_obj()
4020 mres = symlook_obj1_sysv(req, obj); in symlook_obj()
4025 if (obj->needed_filtees != NULL) { in symlook_obj()
4027 load_filtees(__DECONST(Obj_Entry *, obj), flags, req->lockstate); in symlook_obj()
4030 res = symlook_needed(&req1, obj->needed_filtees, &donelist); in symlook_obj()
4037 if (obj->needed_aux_filtees != NULL) { in symlook_obj()
4039 load_filtees(__DECONST(Obj_Entry *, obj), flags, req->lockstate); in symlook_obj()
4042 res = symlook_needed(&req1, obj->needed_aux_filtees, &donelist); in symlook_obj()
4055 matched_symbol(SymLook *req, const Obj_Entry *obj, Sym_Match_Result *result, in matched_symbol() argument
4062 symp = obj->symtab + symnum; in matched_symbol()
4063 strp = obj->strtab + symp->st_name; in matched_symbol()
4088 if (obj->versyms != NULL) { in matched_symbol()
4089 verndx = VER_NDX(obj->versyms[symnum]); in matched_symbol()
4090 if (verndx > obj->vernum) { in matched_symbol()
4093 obj->path, obj->strtab + symnum, verndx); in matched_symbol()
4115 if ((obj->versyms[symnum] & VER_NDX_HIDDEN) in matched_symbol()
4127 if (obj->versyms == NULL) { in matched_symbol()
4128 if (object_match_name(obj, req->ventry->name)) { in matched_symbol()
4130 "for symbol %s", obj_rtld.path, obj->path, in matched_symbol()
4131 req->ventry->name, obj->strtab + symnum); in matched_symbol()
4135 verndx = VER_NDX(obj->versyms[symnum]); in matched_symbol()
4136 if (verndx > obj->vernum) { in matched_symbol()
4138 obj->path, obj->strtab + symnum, verndx); in matched_symbol()
4141 if (obj->vertab[verndx].hash != req->ventry->hash || in matched_symbol()
4142 strcmp(obj->vertab[verndx].name, req->ventry->name)) { in matched_symbol()
4154 (obj->versyms[symnum] & VER_NDX_HIDDEN)) in matched_symbol()
4168 symlook_obj1_sysv(SymLook *req, const Obj_Entry *obj) in symlook_obj1_sysv() argument
4177 for (symnum = obj->buckets[req->hash % obj->nbuckets]; in symlook_obj1_sysv()
4178 symnum != STN_UNDEF; symnum = obj->chains[symnum]) { in symlook_obj1_sysv()
4179 if (symnum >= obj->nchains) in symlook_obj1_sysv()
4182 if (matched_symbol(req, obj, &matchres, symnum)) { in symlook_obj1_sysv()
4184 req->defobj_out = obj; in symlook_obj1_sysv()
4190 req->defobj_out = obj; in symlook_obj1_sysv()
4198 symlook_obj1_gnu(SymLook *req, const Obj_Entry *obj) in symlook_obj1_gnu() argument
4212 bloom_word = obj->bloom_gnu[(req->hash_gnu / __ELF_WORD_SIZE) & in symlook_obj1_gnu()
4213 obj->maskwords_bm_gnu]; in symlook_obj1_gnu()
4217 h2 = ((req->hash_gnu >> obj->shift2_gnu) & (__ELF_WORD_SIZE - 1)); in symlook_obj1_gnu()
4224 bucket = obj->buckets_gnu[req->hash_gnu % obj->nbuckets_gnu]; in symlook_obj1_gnu()
4227 hashval = &obj->chain_zero_gnu[bucket]; in symlook_obj1_gnu()
4230 symnum = hashval - obj->chain_zero_gnu; in symlook_obj1_gnu()
4231 if (matched_symbol(req, obj, &matchres, symnum)) { in symlook_obj1_gnu()
4233 req->defobj_out = obj; in symlook_obj1_gnu()
4240 req->defobj_out = obj; in symlook_obj1_gnu()
4247 trace_loaded_objects(Obj_Entry *obj) in trace_loaded_objects() argument
4263 for (; obj; obj = obj->next) { in trace_loaded_objects()
4268 if (list_containers && obj->needed != NULL) in trace_loaded_objects()
4269 rtld_printf("%s:\n", obj->path); in trace_loaded_objects()
4270 for (needed = obj->needed; needed; needed = needed->next) { in trace_loaded_objects()
4271 if (needed->obj != NULL) { in trace_loaded_objects()
4272 if (needed->obj->traced && !list_containers) in trace_loaded_objects()
4274 needed->obj->traced = true; in trace_loaded_objects()
4275 path = needed->obj->path; in trace_loaded_objects()
4279 name = (char *)obj->strtab + needed->name; in trace_loaded_objects()
4321 rtld_printf("%p", needed->obj ? needed->obj->mapbase : in trace_loaded_objects()
4342 Obj_Entry *obj; in unload_object() local
4355 while ((obj = *linkp) != NULL) { in unload_object()
4356 if (obj->refcount == 0) { in unload_object()
4357 LD_UTRACE(UTRACE_UNLOAD_OBJECT, obj, obj->mapbase, obj->mapsize, 0, in unload_object()
4358 obj->path); in unload_object()
4359 dbg("unloading \"%s\"", obj->path); in unload_object()
4361 munmap(obj->mapbase, obj->mapsize); in unload_object()
4362 linkmap_delete(obj); in unload_object()
4363 *linkp = obj->next; in unload_object()
4365 obj_free(obj); in unload_object()
4367 linkp = &obj->next; in unload_object()
4383 objlist_remove(&elm->obj->dldags, root); in unlink_object()
4384 if (elm->obj != root) in unlink_object()
4385 unlink_object(elm->obj); in unlink_object()
4397 elm->obj->refcount++; in ref_dag()
4407 elm->obj->refcount--; in unref_dag()
4468 Obj_Entry *obj; in allocate_tls() local
4497 for (obj = objs; obj; obj = obj->next) { in allocate_tls()
4498 if (obj->tlsoffset) { in allocate_tls()
4499 addr = (Elf_Addr)tcb - obj->tlsoffset; in allocate_tls()
4500 memset((void *)(addr + obj->tlsinitsize), in allocate_tls()
4501 0, obj->tlssize - obj->tlsinitsize); in allocate_tls()
4502 if (obj->tlsinit) { in allocate_tls()
4503 memcpy((void*) addr, obj->tlsinit, obj->tlsinitsize); in allocate_tls()
4504 obj->static_tls_copied = true; in allocate_tls()
4506 dtv[obj->tlsindex + 1] = addr; in allocate_tls()
4547 Obj_Entry* obj; in allocate_module_tls() local
4550 for (obj = obj_list; obj; obj = obj->next) { in allocate_module_tls()
4551 if (obj->tlsindex == index) in allocate_module_tls()
4554 if (!obj) { in allocate_module_tls()
4559 if (obj->tls_static) { in allocate_module_tls()
4561 p = (char *)tls_get_tcb() - obj->tlsoffset; in allocate_module_tls()
4568 p = malloc(obj->tlssize); in allocate_module_tls()
4573 memcpy(p, obj->tlsinit, obj->tlsinitsize); in allocate_module_tls()
4574 memset(p + obj->tlsinitsize, 0, obj->tlssize - obj->tlsinitsize); in allocate_module_tls()
4580 allocate_tls_offset(Obj_Entry *obj) in allocate_tls_offset() argument
4584 if (obj->tls_static) in allocate_tls_offset()
4587 if (obj->tls_dynamic) in allocate_tls_offset()
4590 if (obj->tlssize == 0) { in allocate_tls_offset()
4591 obj->tls_static = true; in allocate_tls_offset()
4595 if (obj->tlsindex == 1) in allocate_tls_offset()
4596 off = calculate_first_tls_offset(obj->tlssize, obj->tlsalign); in allocate_tls_offset()
4599 obj->tlssize, obj->tlsalign); in allocate_tls_offset()
4608 if (calculate_tls_end(off, obj->tlssize) > tls_static_space) in allocate_tls_offset()
4612 tls_last_offset = obj->tlsoffset = off; in allocate_tls_offset()
4613 tls_last_size = obj->tlssize; in allocate_tls_offset()
4614 obj->tls_static = true; in allocate_tls_offset()
4620 free_tls_offset(Obj_Entry *obj) in free_tls_offset() argument
4630 if (calculate_tls_end(obj->tlsoffset, obj->tlssize) in free_tls_offset()
4632 tls_last_offset -= obj->tlssize; in free_tls_offset()
4662 object_add_name(Obj_Entry *obj, const char *name) in object_add_name() argument
4672 STAILQ_INSERT_TAIL(&obj->names, entry, link); in object_add_name()
4677 object_match_name(const Obj_Entry *obj, const char *name) in object_match_name() argument
4681 STAILQ_FOREACH(entry, &obj->names, link) { in object_match_name()
4689 locate_dependency(const Obj_Entry *obj, const char *name) in locate_dependency() argument
4695 if (object_match_name(entry->obj, name)) in locate_dependency()
4696 return entry->obj; in locate_dependency()
4699 for (needed = obj->needed; needed != NULL; needed = needed->next) { in locate_dependency()
4700 if (strcmp(obj->strtab + needed->name, name) == 0 || in locate_dependency()
4701 (needed->obj != NULL && object_match_name(needed->obj, name))) { in locate_dependency()
4709 return (needed->obj); in locate_dependency()
4713 obj->path, name); in locate_dependency()
4755 rtld_verify_object_versions(Obj_Entry *obj) in rtld_verify_object_versions() argument
4764 if (obj->ver_checked) in rtld_verify_object_versions()
4766 obj->ver_checked = true; in rtld_verify_object_versions()
4774 vn = obj->verneed; in rtld_verify_object_versions()
4778 obj->path, vn->vn_version); in rtld_verify_object_versions()
4795 vd = obj->verdef; in rtld_verify_object_versions()
4799 obj->path, vd->vd_version); in rtld_verify_object_versions()
4818 obj->vernum = maxvernum + 1; in rtld_verify_object_versions()
4819 obj->vertab = xcalloc(obj->vernum, sizeof(Ver_Entry)); in rtld_verify_object_versions()
4821 vd = obj->verdef; in rtld_verify_object_versions()
4827 obj->vertab[vernum].hash = vd->vd_hash; in rtld_verify_object_versions()
4828 obj->vertab[vernum].name = obj->strtab + vda->vda_name; in rtld_verify_object_versions()
4829 obj->vertab[vernum].file = NULL; in rtld_verify_object_versions()
4830 obj->vertab[vernum].flags = 0; in rtld_verify_object_versions()
4837 vn = obj->verneed; in rtld_verify_object_versions()
4839 depobj = locate_dependency(obj, obj->strtab + vn->vn_file); in rtld_verify_object_versions()
4844 if (check_object_provided_version(obj, depobj, vna)) in rtld_verify_object_versions()
4848 obj->vertab[vernum].hash = vna->vna_hash; in rtld_verify_object_versions()
4849 obj->vertab[vernum].name = obj->strtab + vna->vna_name; in rtld_verify_object_versions()
4850 obj->vertab[vernum].file = obj->strtab + vn->vn_file; in rtld_verify_object_versions()
4851 obj->vertab[vernum].flags = (vna->vna_other & VER_NEED_HIDDEN) ? in rtld_verify_object_versions()
4876 if (entry->obj->strtab == NULL || entry->obj->vertab != NULL) in rtld_verify_versions()
4878 if (rtld_verify_object_versions(entry->obj) == -1) { in rtld_verify_versions()
4890 fetch_ventry(const Obj_Entry *obj, unsigned long symnum) in fetch_ventry() argument
4894 if (obj->vertab) { in fetch_ventry()
4895 vernum = VER_NDX(obj->versyms[symnum]); in fetch_ventry()
4896 if (vernum >= obj->vernum) { in fetch_ventry()
4898 obj->path, obj->strtab + symnum, vernum); in fetch_ventry()
4899 } else if (obj->vertab[vernum].hash != 0) { in fetch_ventry()
4900 return &obj->vertab[vernum]; in fetch_ventry()
4944 Obj_Entry *obj; in distribute_static_tls() local
4962 obj = elm->obj; in distribute_static_tls()
4963 if (/*obj->marker ||*/ !obj->tls_static || obj->static_tls_copied) in distribute_static_tls()
4965 dtlsfunc(obj->tlsoffset, obj->tlsinit, in distribute_static_tls()
4966 obj->tlsinitsize, obj->tlssize); in distribute_static_tls()
4967 obj->static_tls_copied = true; in distribute_static_tls()