Lines Matching refs:obj

102 static int do_search_info(const Obj_Entry *obj, int, struct dl_serinfo *);
149 static int relocate_object(Obj_Entry *obj, bool bind_now, Obj_Entry *rtldobj,
180 static bool obj_resolve_origin(Obj_Entry *obj);
187 static void rtld_fill_dl_phdr_info(const Obj_Entry *obj,
264 Elf_Addr _rtld_bind(Obj_Entry *obj, Elf_Size reloff);
514 Obj_Entry *last_interposer, *obj, *preload_tail; in _rtld() local
875 TAILQ_FOREACH(obj, &obj_list, next) { in _rtld()
876 if (obj->marker) in _rtld()
878 if (obj->z_interpose && obj != obj_main) { in _rtld()
879 objlist_put_after(&list_main, last_interposer, obj); in _rtld()
880 last_interposer = obj; in _rtld()
882 objlist_push_tail(&list_main, obj); in _rtld()
884 obj->refcount++; in _rtld()
915 allocate_tls_offset(entry->obj); in _rtld()
993 TAILQ_FOREACH(obj, &obj_list, next) { in _rtld()
994 if (obj->marker) in _rtld()
996 if (ld_loadfltr || obj->z_loadfltr) in _rtld()
997 load_filtees(obj, 0, &lockstate); in _rtld()
1015 rtld_resolve_ifunc(const Obj_Entry *obj, const Elf_Sym *def) in rtld_resolve_ifunc() argument
1020 ptr = (void *)make_function_pointer(def, obj); in rtld_resolve_ifunc()
1026 _rtld_bind(Obj_Entry *obj, Elf_Size reloff) in _rtld_bind() argument
1038 if (obj->pltrel) in _rtld_bind()
1039 rel = (const Elf_Rel *)((const char *)obj->pltrel + reloff); in _rtld_bind()
1041 rel = (const Elf_Rel *)((const char *)obj->pltrela + reloff); in _rtld_bind()
1043 where = (Elf_Addr *)(obj->relocbase + rel->r_offset); in _rtld_bind()
1044 def = find_symdef(ELF_R_SYM(rel->r_info), obj, &defobj, SYMLOOK_IN_PLT, in _rtld_bind()
1055 obj->path == NULL ? NULL : basename(obj->path), in _rtld_bind()
1066 target = reloc_jmpslot(where, target, defobj, obj, rel); in _rtld_bind()
1135 origin_subst_one(Obj_Entry *obj, char *real, const char *kw, in origin_subst_one() argument
1160 if (subst_count == 0 || (obj != NULL && !obj_resolve_origin(obj))) in origin_subst_one()
1162 if (obj != NULL) in origin_subst_one()
1163 subst = obj->origin_path; in origin_subst_one()
1217 origin_subst(Obj_Entry *obj, const char *real) in origin_subst() argument
1222 if (obj == NULL || !trust) in origin_subst()
1234 res = origin_subst_one(tokens[i].pass_obj ? obj : NULL, in origin_subst()
1258 digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath, in digest_dynamic1() argument
1262 Needed_Entry **needed_tail = &obj->needed; in digest_dynamic1()
1263 Needed_Entry **needed_filtees_tail = &obj->needed_filtees; in digest_dynamic1()
1264 Needed_Entry **needed_aux_filtees_tail = &obj->needed_aux_filtees; in digest_dynamic1()
1275 obj->bind_now = false; in digest_dynamic1()
1276 dynp = obj->dynamic; in digest_dynamic1()
1283 obj->rel = (const Elf_Rel *)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1287 obj->relsize = dynp->d_un.d_val; in digest_dynamic1()
1295 obj->pltrel = (const Elf_Rel *) in digest_dynamic1()
1296 (obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1300 obj->pltrelsize = dynp->d_un.d_val; in digest_dynamic1()
1304 obj->rela = (const Elf_Rela *)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1308 obj->relasize = dynp->d_un.d_val; in digest_dynamic1()
1316 obj->relr = (const Elf_Relr *)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1320 obj->relrsize = dynp->d_un.d_val; in digest_dynamic1()
1333 obj->symtab = (const Elf_Sym *) in digest_dynamic1()
1334 (obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1342 obj->strtab = (const char *)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1346 obj->strsize = dynp->d_un.d_val; in digest_dynamic1()
1350 obj->verneed = (const Elf_Verneed *)(obj->relocbase + in digest_dynamic1()
1355 obj->verneednum = dynp->d_un.d_val; in digest_dynamic1()
1359 obj->verdef = (const Elf_Verdef *)(obj->relocbase + in digest_dynamic1()
1364 obj->verdefnum = dynp->d_un.d_val; in digest_dynamic1()
1368 obj->versyms = (const Elf_Versym *)(obj->relocbase + in digest_dynamic1()
1374 hashtab = (const Elf_Hashelt *)(obj->relocbase + in digest_dynamic1()
1376 obj->nbuckets = hashtab[0]; in digest_dynamic1()
1377 obj->nchains = hashtab[1]; in digest_dynamic1()
1378 obj->buckets = hashtab + 2; in digest_dynamic1()
1379 obj->chains = obj->buckets + obj->nbuckets; in digest_dynamic1()
1380 obj->valid_hash_sysv = obj->nbuckets > 0 && obj->nchains > 0 && in digest_dynamic1()
1381 obj->buckets != NULL; in digest_dynamic1()
1387 hashtab = (const Elf_Hashelt *)(obj->relocbase + in digest_dynamic1()
1389 obj->nbuckets_gnu = hashtab[0]; in digest_dynamic1()
1390 obj->symndx_gnu = hashtab[1]; in digest_dynamic1()
1393 obj->maskwords_bm_gnu = nmaskwords - 1; in digest_dynamic1()
1394 obj->shift2_gnu = hashtab[3]; in digest_dynamic1()
1395 obj->bloom_gnu = (const Elf_Addr *)(hashtab + 4); in digest_dynamic1()
1396 obj->buckets_gnu = hashtab + 4 + bloom_size32; in digest_dynamic1()
1397 obj->chain_zero_gnu = obj->buckets_gnu + obj->nbuckets_gnu - in digest_dynamic1()
1398 obj->symndx_gnu; in digest_dynamic1()
1400 obj->valid_hash_gnu = powerof2(nmaskwords) && in digest_dynamic1()
1401 obj->nbuckets_gnu > 0 && obj->buckets_gnu != NULL; in digest_dynamic1()
1406 if (!obj->rtld) { in digest_dynamic1()
1409 nep->obj = NULL; in digest_dynamic1()
1418 if (!obj->rtld) { in digest_dynamic1()
1421 nep->obj = NULL; in digest_dynamic1()
1427 if (obj->linkmap.l_refname == NULL) in digest_dynamic1()
1428 obj->linkmap.l_refname = (char *)dynp->d_un.d_val; in digest_dynamic1()
1433 if (!obj->rtld) { in digest_dynamic1()
1436 nep->obj = NULL; in digest_dynamic1()
1445 obj->pltgot = (Elf_Addr *)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1449 obj->textrel = true; in digest_dynamic1()
1453 obj->symbolic = true; in digest_dynamic1()
1473 obj->init = (Elf_Addr)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1477 obj->preinit_array = (Elf_Addr)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1481 obj->preinit_array_num = dynp->d_un.d_val / sizeof(Elf_Addr); in digest_dynamic1()
1485 obj->init_array = (Elf_Addr)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1489 obj->init_array_num = dynp->d_un.d_val / sizeof(Elf_Addr); in digest_dynamic1()
1493 obj->fini = (Elf_Addr)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1497 obj->fini_array = (Elf_Addr)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1501 obj->fini_array_num = dynp->d_un.d_val / sizeof(Elf_Addr); in digest_dynamic1()
1512 obj->z_origin = true; in digest_dynamic1()
1514 obj->symbolic = true; in digest_dynamic1()
1516 obj->textrel = true; in digest_dynamic1()
1518 obj->bind_now = true; in digest_dynamic1()
1520 obj->static_tls = true; in digest_dynamic1()
1526 obj->glink = (Elf_Addr)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1530 obj->gotptr = (Elf_Addr *)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1537 obj->z_noopen = true; in digest_dynamic1()
1539 obj->z_origin = true; in digest_dynamic1()
1541 obj->z_global = true; in digest_dynamic1()
1543 obj->bind_now = true; in digest_dynamic1()
1545 obj->z_nodelete = true; in digest_dynamic1()
1547 obj->z_loadfltr = true; in digest_dynamic1()
1549 obj->z_interpose = true; in digest_dynamic1()
1551 obj->z_nodeflib = true; in digest_dynamic1()
1553 obj->z_pie = true; in digest_dynamic1()
1565 obj->traced = false; in digest_dynamic1()
1568 obj->pltrela = (const Elf_Rela *) obj->pltrel; in digest_dynamic1()
1569 obj->pltrel = NULL; in digest_dynamic1()
1570 obj->pltrelasize = obj->pltrelsize; in digest_dynamic1()
1571 obj->pltrelsize = 0; in digest_dynamic1()
1575 if (obj->valid_hash_sysv) in digest_dynamic1()
1576 obj->dynsymcount = obj->nchains; in digest_dynamic1()
1577 else if (obj->valid_hash_gnu) { in digest_dynamic1()
1578 obj->dynsymcount = 0; in digest_dynamic1()
1579 for (bkt = 0; bkt < obj->nbuckets_gnu; bkt++) { in digest_dynamic1()
1580 if (obj->buckets_gnu[bkt] == 0) in digest_dynamic1()
1582 hashval = &obj->chain_zero_gnu[obj->buckets_gnu[bkt]]; in digest_dynamic1()
1584 obj->dynsymcount++; in digest_dynamic1()
1587 obj->dynsymcount += obj->symndx_gnu; in digest_dynamic1()
1590 if (obj->linkmap.l_refname != NULL) in digest_dynamic1()
1591 obj->linkmap.l_refname = obj->strtab + (unsigned long)obj-> in digest_dynamic1()
1596 obj_resolve_origin(Obj_Entry *obj) in obj_resolve_origin() argument
1599 if (obj->origin_path != NULL) in obj_resolve_origin()
1601 obj->origin_path = xmalloc(PATH_MAX); in obj_resolve_origin()
1602 return (rtld_dirname_abs(obj->path, obj->origin_path) != -1); in obj_resolve_origin()
1606 digest_dynamic2(Obj_Entry *obj, const Elf_Dyn *dyn_rpath, in digest_dynamic2() argument
1610 if (obj->z_origin && !obj_resolve_origin(obj)) in digest_dynamic2()
1614 obj->runpath = (const char *)obj->strtab + dyn_runpath->d_un.d_val; in digest_dynamic2()
1615 obj->runpath = origin_subst(obj, obj->runpath); in digest_dynamic2()
1617 obj->rpath = (const char *)obj->strtab + dyn_rpath->d_un.d_val; in digest_dynamic2()
1618 obj->rpath = origin_subst(obj, obj->rpath); in digest_dynamic2()
1621 object_add_name(obj, obj->strtab + dyn_soname->d_un.d_val); in digest_dynamic2()
1626 digest_dynamic(Obj_Entry *obj, int early) in digest_dynamic() argument
1632 digest_dynamic1(obj, early, &dyn_rpath, &dyn_soname, &dyn_runpath); in digest_dynamic()
1633 return (digest_dynamic2(obj, dyn_rpath, dyn_soname, dyn_runpath)); in digest_dynamic()
1645 Obj_Entry *obj; in digest_phdr() local
1651 obj = obj_new(); in digest_phdr()
1656 obj->phdr = phdr; in digest_phdr()
1657 obj->phsize = ph->p_memsz; in digest_phdr()
1658 obj->relocbase = __DECONST(char *, phdr) - ph->p_vaddr; in digest_phdr()
1662 obj->stack_flags = PF_X | PF_R | PF_W; in digest_phdr()
1668 obj->interp = (const char *)(ph->p_vaddr + obj->relocbase); in digest_phdr()
1673 obj->vaddrbase = rtld_trunc_page(ph->p_vaddr); in digest_phdr()
1674 obj->mapbase = obj->vaddrbase + obj->relocbase; in digest_phdr()
1676 obj->mapsize = rtld_round_page(ph->p_vaddr + ph->p_memsz) - in digest_phdr()
1677 obj->vaddrbase; in digest_phdr()
1683 obj->dynamic = (const Elf_Dyn *)(ph->p_vaddr + obj->relocbase); in digest_phdr()
1687 obj->tlsindex = 1; in digest_phdr()
1688 obj->tlssize = ph->p_memsz; in digest_phdr()
1689 obj->tlsalign = ph->p_align; in digest_phdr()
1690 obj->tlsinitsize = ph->p_filesz; in digest_phdr()
1691 obj->tlsinit = (void*)(ph->p_vaddr + obj->relocbase); in digest_phdr()
1692 obj->tlspoffset = ph->p_offset; in digest_phdr()
1696 obj->stack_flags = ph->p_flags; in digest_phdr()
1700 obj->relro_page = obj->relocbase + rtld_trunc_page(ph->p_vaddr); in digest_phdr()
1701 obj->relro_size = rtld_trunc_page(ph->p_vaddr + ph->p_memsz) - in digest_phdr()
1706 note_start = (Elf_Addr)obj->relocbase + ph->p_vaddr; in digest_phdr()
1708 digest_notes(obj, note_start, note_end); in digest_phdr()
1717 obj->entry = entry; in digest_phdr()
1718 return (obj); in digest_phdr()
1722 digest_notes(Obj_Entry *obj, Elf_Addr note_start, Elf_Addr note_end) in digest_notes() argument
1732 if (arch_digest_note(obj, note)) in digest_notes()
1751 obj->osrel = *(const int32_t *)(p); in digest_notes()
1752 dbg("note osrel %d", obj->osrel); in digest_notes()
1758 obj->fctl0 = *(const uint32_t *)(p); in digest_notes()
1759 dbg("note fctl0 %#x", obj->fctl0); in digest_notes()
1763 obj->crt_no_init = true; in digest_notes()
1773 Obj_Entry *obj; in dlcheck() local
1775 TAILQ_FOREACH(obj, &obj_list, next) { in dlcheck()
1776 if (obj == (Obj_Entry *) handle) in dlcheck()
1780 if (obj == NULL || obj->refcount == 0 || obj->dl_refcount == 0) { in dlcheck()
1784 return (obj); in dlcheck()
1792 donelist_check(DoneList *dlp, const Obj_Entry *obj) in donelist_check() argument
1797 if (dlp->objs[i] == obj) in donelist_check()
1806 dlp->objs[dlp->num_used++] = obj; in donelist_check()
1995 *defobj_out = cache[symnum].obj; in find_symdef()
2046 cache[symnum].obj = defobj; in find_symdef()
2288 for (needed = elm->obj->needed; needed != NULL; needed = needed->next) { in init_dag()
2289 if (needed->obj == NULL || donelist_check(&donelist, needed->obj)) in init_dag()
2291 objlist_push_tail(&needed->obj->dldags, root); in init_dag()
2292 objlist_push_tail(&root->dagmembers, needed->obj); in init_dag()
2307 globallist_curr(const Obj_Entry *obj) in globallist_curr() argument
2311 if (obj == NULL) in globallist_curr()
2313 if (!obj->marker) in globallist_curr()
2314 return (__DECONST(Obj_Entry *, obj)); in globallist_curr()
2315 obj = TAILQ_PREV(obj, obj_entry_q, next); in globallist_curr()
2320 globallist_next(const Obj_Entry *obj) in globallist_next() argument
2324 obj = TAILQ_NEXT(obj, next); in globallist_next()
2325 if (obj == NULL) in globallist_next()
2327 if (!obj->marker) in globallist_next()
2328 return (__DECONST(Obj_Entry *, obj)); in globallist_next()
2334 hold_object(Obj_Entry *obj) in hold_object() argument
2337 obj->holdcount++; in hold_object()
2341 unhold_object(Obj_Entry *obj) in unhold_object() argument
2344 assert(obj->holdcount > 0); in unhold_object()
2345 if (--obj->holdcount == 0 && obj->unholdfree) in unhold_object()
2346 release_object(obj); in unhold_object()
2353 Obj_Entry *obj; in process_z() local
2366 obj = elm->obj; in process_z()
2367 if (obj == NULL) in process_z()
2369 if (obj->z_nodelete && !obj->ref_nodel) { in process_z()
2370 dbg("obj %s -z nodelete", obj->path); in process_z()
2371 init_dag(obj); in process_z()
2372 ref_dag(obj); in process_z()
2373 obj->ref_nodel = true; in process_z()
2375 if (obj->z_global && objlist_find(&list_global, obj) == NULL) { in process_z()
2376 dbg("obj %s -z global", obj->path); in process_z()
2377 objlist_push_tail(&list_global, obj); in process_z()
2378 init_dag(obj); in process_z()
2384 parse_rtld_phdr(Obj_Entry *obj) in parse_rtld_phdr() argument
2389 obj->stack_flags = PF_X | PF_R | PF_W; in parse_rtld_phdr()
2390 for (ph = obj->phdr; (const char *)ph < (const char *)obj->phdr + in parse_rtld_phdr()
2391 obj->phsize; ph++) { in parse_rtld_phdr()
2394 obj->stack_flags = ph->p_flags; in parse_rtld_phdr()
2397 obj->relro_page = obj->relocbase + in parse_rtld_phdr()
2399 obj->relro_size = rtld_round_page(ph->p_memsz); in parse_rtld_phdr()
2402 note_start = (Elf_Addr)obj->relocbase + ph->p_vaddr; in parse_rtld_phdr()
2404 digest_notes(obj, note_start, note_end); in parse_rtld_phdr()
2546 if (needed->obj != NULL) in initlist_add_neededs()
2547 initlist_add_objects(needed->obj, needed->obj, list); in initlist_add_neededs()
2560 initlist_add_objects(Obj_Entry *obj, Obj_Entry *tail, Objlist *list) in initlist_add_objects() argument
2564 if (obj->init_scanned || obj->init_done) in initlist_add_objects()
2566 obj->init_scanned = true; in initlist_add_objects()
2569 nobj = globallist_next(obj); in initlist_add_objects()
2570 if (nobj != NULL && obj != tail) in initlist_add_objects()
2574 if (obj->needed != NULL) in initlist_add_objects()
2575 initlist_add_neededs(obj->needed, list); in initlist_add_objects()
2576 if (obj->needed_filtees != NULL) in initlist_add_objects()
2577 initlist_add_neededs(obj->needed_filtees, list); in initlist_add_objects()
2578 if (obj->needed_aux_filtees != NULL) in initlist_add_objects()
2579 initlist_add_neededs(obj->needed_aux_filtees, list); in initlist_add_objects()
2582 objlist_push_tail(list, obj); in initlist_add_objects()
2585 if ((obj->fini != (Elf_Addr)NULL || obj->fini_array != (Elf_Addr)NULL) in initlist_add_objects()
2586 && !obj->on_fini_list) { in initlist_add_objects()
2587 objlist_push_head(&list_fini, obj); in initlist_add_objects()
2588 obj->on_fini_list = true; in initlist_add_objects()
2598 if (needed->obj != NULL) { in free_needed_filtees()
2599 dlclose_locked(needed->obj, lockstate); in free_needed_filtees()
2600 needed->obj = NULL; in free_needed_filtees()
2610 unload_filtees(Obj_Entry *obj, RtldLockState *lockstate) in unload_filtees() argument
2613 free_needed_filtees(obj->needed_filtees, lockstate); in unload_filtees()
2614 obj->needed_filtees = NULL; in unload_filtees()
2615 free_needed_filtees(obj->needed_aux_filtees, lockstate); in unload_filtees()
2616 obj->needed_aux_filtees = NULL; in unload_filtees()
2617 obj->filtees_loaded = false; in unload_filtees()
2621 load_filtee1(Obj_Entry *obj, Needed_Entry *needed, int flags, in load_filtee1() argument
2626 needed->obj = dlopen_object(obj->strtab + needed->name, -1, obj, in load_filtee1()
2627 flags, ((ld_loadfltr || obj->z_loadfltr) ? RTLD_NOW : RTLD_LAZY) | in load_filtee1()
2633 load_filtees(Obj_Entry *obj, int flags, RtldLockState *lockstate) in load_filtees() argument
2635 if (obj->filtees_loaded || obj->filtees_loading) in load_filtees()
2638 obj->filtees_loading = true; in load_filtees()
2639 load_filtee1(obj, obj->needed_filtees, flags, lockstate); in load_filtees()
2640 load_filtee1(obj, obj->needed_aux_filtees, flags, lockstate); in load_filtees()
2641 obj->filtees_loaded = true; in load_filtees()
2642 obj->filtees_loading = false; in load_filtees()
2646 process_needed(Obj_Entry *obj, Needed_Entry *needed, int flags) in process_needed() argument
2651 obj1 = needed->obj = load_object(obj->strtab + needed->name, -1, obj, in process_needed()
2667 Obj_Entry *obj; in load_needed_objects() local
2669 for (obj = first; obj != NULL; obj = TAILQ_NEXT(obj, next)) { in load_needed_objects()
2670 if (obj->marker) in load_needed_objects()
2672 if (process_needed(obj, obj->needed, flags) == -1) in load_needed_objects()
2681 Obj_Entry *obj; in load_preload_objects() local
2710 obj = load_object(name, fd, NULL, 0); in load_preload_objects()
2711 if (obj == NULL) { in load_preload_objects()
2715 obj->z_interpose = true; in load_preload_objects()
2745 Obj_Entry *obj; in load_object() local
2752 TAILQ_FOREACH(obj, &obj_list, next) { in load_object()
2753 if (obj->marker || obj->doomed) in load_object()
2755 if (object_match_name(obj, name)) in load_object()
2756 return (obj); in load_object()
2799 TAILQ_FOREACH(obj, &obj_list, next) { in load_object()
2800 if (obj->marker || obj->doomed) in load_object()
2802 if (obj->ino == sb.st_ino && obj->dev == sb.st_dev) in load_object()
2805 if (obj != NULL) { in load_object()
2807 object_add_name(obj, name); in load_object()
2810 return (obj); in load_object()
2819 obj = do_load_object(fd, name, path, &sb, flags); in load_object()
2820 if (obj == NULL) in load_object()
2824 return (obj); in load_object()
2831 Obj_Entry *obj; in do_load_object() local
2847 obj = map_object(fd, printable_path(path), sbp); in do_load_object()
2848 if (obj == NULL) in do_load_object()
2856 object_add_name(obj, name); in do_load_object()
2857 obj->path = path; in do_load_object()
2858 if (!digest_dynamic(obj, 0)) in do_load_object()
2860 dbg("%s valid_hash_sysv %d valid_hash_gnu %d dynsymcount %d", obj->path, in do_load_object()
2861 obj->valid_hash_sysv, obj->valid_hash_gnu, obj->dynsymcount); in do_load_object()
2862 if (obj->z_pie && (flags & RTLD_LO_TRACE) == 0) { in do_load_object()
2863 dbg("refusing to load PIE executable \"%s\"", obj->path); in do_load_object()
2864 _rtld_error("Cannot load PIE binary %s as DSO", obj->path); in do_load_object()
2867 if (obj->z_noopen && (flags & (RTLD_LO_DLOPEN | RTLD_LO_TRACE)) == in do_load_object()
2869 dbg("refusing to load non-loadable \"%s\"", obj->path); in do_load_object()
2870 _rtld_error("Cannot dlopen non-loadable %s", obj->path); in do_load_object()
2874 obj->dlopened = (flags & RTLD_LO_DLOPEN) != 0; in do_load_object()
2875 TAILQ_INSERT_TAIL(&obj_list, obj, next); in do_load_object()
2878 linkmap_add(obj); /* for GDB & dlinfo() */ in do_load_object()
2879 max_stack_flags |= obj->stack_flags; in do_load_object()
2881 dbg(" %p .. %p: %s", obj->mapbase, in do_load_object()
2882 obj->mapbase + obj->mapsize - 1, obj->path); in do_load_object()
2883 if (obj->textrel) in do_load_object()
2884 dbg(" WARNING: %s has impure text", obj->path); in do_load_object()
2885 LD_UTRACE(UTRACE_LOAD_OBJECT, obj, obj->mapbase, obj->mapsize, 0, in do_load_object()
2886 obj->path); in do_load_object()
2888 return (obj); in do_load_object()
2891 munmap(obj->mapbase, obj->mapsize); in do_load_object()
2892 obj_free(obj); in do_load_object()
2899 Obj_Entry *obj; in load_kpreload() local
2907 obj = obj_new(); in load_kpreload()
2909 obj->phdr = phdr; in load_kpreload()
2910 obj->phsize = ehdr->e_phnum * sizeof(*phdr); in load_kpreload()
2921 obj->stack_flags = phdr->p_flags; in load_kpreload()
2933 obj->mapbase = __DECONST(caddr_t, addr); in load_kpreload()
2934 obj->mapsize = segn->p_vaddr + segn->p_memsz - (Elf_Addr)addr; in load_kpreload()
2935 obj->vaddrbase = 0; in load_kpreload()
2936 obj->relocbase = obj->mapbase; in load_kpreload()
2938 object_add_name(obj, kname); in load_kpreload()
2939 obj->path = xstrdup(kname); in load_kpreload()
2940 obj->dynamic = (const Elf_Dyn *)(obj->relocbase + phdyn->p_vaddr); in load_kpreload()
2942 if (!digest_dynamic(obj, 0)) { in load_kpreload()
2943 obj_free(obj); in load_kpreload()
2954 obj->path, obj->mapbase, obj->phdr, seg0, in load_kpreload()
2955 obj->relocbase + seg0->p_vaddr, obj->dynamic); in load_kpreload()
2957 TAILQ_INSERT_TAIL(&obj_list, obj, next); in load_kpreload()
2960 linkmap_add(obj); /* for GDB & dlinfo() */ in load_kpreload()
2961 max_stack_flags |= obj->stack_flags; in load_kpreload()
2963 LD_UTRACE(UTRACE_LOAD_OBJECT, obj, obj->mapbase, 0, 0, obj->path); in load_kpreload()
2970 Obj_Entry *obj; in obj_from_addr() local
2972 TAILQ_FOREACH(obj, &obj_list, next) { in obj_from_addr()
2973 if (obj->marker) in obj_from_addr()
2975 if (addr < (void *) obj->mapbase) in obj_from_addr()
2977 if (addr < (void *)(obj->mapbase + obj->mapsize)) in obj_from_addr()
2978 return obj; in obj_from_addr()
3031 if (root != NULL && (elm->obj->refcount != 1 || in objlist_call_fini()
3032 objlist_find(&root->dagmembers, elm->obj) == NULL)) in objlist_call_fini()
3037 elm->obj->doomed = true; in objlist_call_fini()
3039 hold_object(elm->obj); in objlist_call_fini()
3045 fini_addr = (Elf_Addr *)elm->obj->fini_array; in objlist_call_fini()
3046 if (fini_addr != NULL && elm->obj->fini_array_num > 0) { in objlist_call_fini()
3047 for (index = elm->obj->fini_array_num - 1; index >= 0; in objlist_call_fini()
3051 elm->obj->path, (void *)fini_addr[index]); in objlist_call_fini()
3052 LD_UTRACE(UTRACE_FINI_CALL, elm->obj, in objlist_call_fini()
3053 (void *)fini_addr[index], 0, 0, elm->obj->path); in objlist_call_fini()
3054 call_initfini_pointer(elm->obj, fini_addr[index]); in objlist_call_fini()
3058 if (elm->obj->fini != (Elf_Addr)NULL) { in objlist_call_fini()
3059 dbg("calling fini function for %s at %p", elm->obj->path, in objlist_call_fini()
3060 (void *)elm->obj->fini); in objlist_call_fini()
3061 LD_UTRACE(UTRACE_FINI_CALL, elm->obj, (void *)elm->obj->fini, in objlist_call_fini()
3062 0, 0, elm->obj->path); in objlist_call_fini()
3063 call_initfini_pointer(elm->obj, elm->obj->fini); in objlist_call_fini()
3066 unhold_object(elm->obj); in objlist_call_fini()
3090 Obj_Entry *obj; in objlist_call_init() local
3101 TAILQ_FOREACH(obj, &obj_list, next) { in objlist_call_init()
3102 if (obj->marker) in objlist_call_init()
3104 obj->init_scanned = false; in objlist_call_init()
3113 if (elm->obj->init_done) /* Initialized early. */ in objlist_call_init()
3120 elm->obj->init_done = true; in objlist_call_init()
3121 hold_object(elm->obj); in objlist_call_init()
3123 if (elm->obj == obj_main && obj_main->crt_no_init) { in objlist_call_init()
3137 if (elm->obj->init != (Elf_Addr)NULL) { in objlist_call_init()
3138 dbg("calling init function for %s at %p", elm->obj->path, in objlist_call_init()
3139 (void *)elm->obj->init); in objlist_call_init()
3140 LD_UTRACE(UTRACE_INIT_CALL, elm->obj, (void *)elm->obj->init, in objlist_call_init()
3141 0, 0, elm->obj->path); in objlist_call_init()
3142 call_init_pointer(elm->obj, elm->obj->init); in objlist_call_init()
3144 init_addr = (Elf_Addr *)elm->obj->init_array; in objlist_call_init()
3146 for (index = 0; index < elm->obj->init_array_num; index++) { in objlist_call_init()
3148 dbg("calling init function for %s at %p", elm->obj->path, in objlist_call_init()
3150 LD_UTRACE(UTRACE_INIT_CALL, elm->obj, in objlist_call_init()
3151 (void *)init_addr[index], 0, 0, elm->obj->path); in objlist_call_init()
3152 call_init_pointer(elm->obj, init_addr[index]); in objlist_call_init()
3157 unhold_object(elm->obj); in objlist_call_init()
3175 objlist_find(Objlist *list, const Obj_Entry *obj) in objlist_find() argument
3180 if (elm->obj == obj) in objlist_find()
3192 objlist_push_head(Objlist *list, Obj_Entry *obj) in objlist_push_head() argument
3197 elm->obj = obj; in objlist_push_head()
3202 objlist_push_tail(Objlist *list, Obj_Entry *obj) in objlist_push_tail() argument
3207 elm->obj = obj; in objlist_push_tail()
3212 objlist_put_after(Objlist *list, Obj_Entry *listobj, Obj_Entry *obj) in objlist_put_after() argument
3217 if (listelm->obj == listobj) in objlist_put_after()
3221 elm->obj = obj; in objlist_put_after()
3229 objlist_remove(Objlist *list, Obj_Entry *obj) in objlist_remove() argument
3233 if ((elm = objlist_find(list, obj)) != NULL) { in objlist_remove()
3253 error = relocate_object(elm->obj, bind_now, rtldobj, flags, in relocate_object_dag()
3270 reloc_textrel_prot(Obj_Entry *obj, bool before) in reloc_textrel_prot() argument
3277 for (l = obj->phsize / sizeof(*ph), ph = obj->phdr; l > 0; in reloc_textrel_prot()
3281 base = obj->relocbase + rtld_trunc_page(ph->p_vaddr); in reloc_textrel_prot()
3288 obj->path, before ? "en" : "dis", in reloc_textrel_prot()
3298 reloc_relr(Obj_Entry *obj) in reloc_relr() argument
3303 relrlim = (const Elf_Relr *)((const char *)obj->relr + obj->relrsize); in reloc_relr()
3304 for (relr = obj->relr; relr < relrlim; relr++) { in reloc_relr()
3308 where = (Elf_Addr *)(obj->relocbase + entry); in reloc_relr()
3309 *where++ += (Elf_Addr)obj->relocbase; in reloc_relr()
3313 where[i] += (Elf_Addr)obj->relocbase; in reloc_relr()
3324 relocate_object(Obj_Entry *obj, bool bind_now, Obj_Entry *rtldobj, in relocate_object() argument
3328 if (obj->relocated) in relocate_object()
3330 obj->relocated = true; in relocate_object()
3331 if (obj != rtldobj) in relocate_object()
3332 dbg("relocating \"%s\"", obj->path); in relocate_object()
3334 if (obj->symtab == NULL || obj->strtab == NULL || in relocate_object()
3335 !(obj->valid_hash_sysv || obj->valid_hash_gnu)) in relocate_object()
3336 dbg("object %s has no run-time symbol table", obj->path); in relocate_object()
3339 if (obj->textrel && reloc_textrel_prot(obj, true) != 0) in relocate_object()
3343 if (reloc_non_plt(obj, rtldobj, flags, lockstate)) in relocate_object()
3345 reloc_relr(obj); in relocate_object()
3348 if (obj->textrel && reloc_textrel_prot(obj, false) != 0) in relocate_object()
3352 init_pltgot(obj); in relocate_object()
3355 if (reloc_plt(obj, flags, lockstate) == -1) in relocate_object()
3358 if ((obj->bind_now || bind_now) && reloc_jmpslots(obj, flags, in relocate_object()
3362 if (!obj->mainprog && obj_enforce_relro(obj) == -1) in relocate_object()
3370 obj->magic = RTLD_MAGIC; in relocate_object()
3371 obj->version = RTLD_VERSION; in relocate_object()
3386 Obj_Entry *obj; in relocate_objects() local
3389 for (error = 0, obj = first; obj != NULL; in relocate_objects()
3390 obj = TAILQ_NEXT(obj, next)) { in relocate_objects()
3391 if (obj->marker) in relocate_objects()
3393 error = relocate_object(obj, bind_now, rtldobj, flags, in relocate_objects()
3413 resolve_object_ifunc(Obj_Entry *obj, bool bind_now, int flags, in resolve_object_ifunc() argument
3417 if (obj->ifuncs_resolved) in resolve_object_ifunc()
3419 obj->ifuncs_resolved = true; in resolve_object_ifunc()
3420 if (!obj->irelative && !obj->irelative_nonplt && in resolve_object_ifunc()
3421 !((obj->bind_now || bind_now) && obj->gnu_ifunc) && in resolve_object_ifunc()
3422 !obj->non_plt_gnu_ifunc) in resolve_object_ifunc()
3424 if (obj_disable_relro(obj) == -1 || in resolve_object_ifunc()
3425 (obj->irelative && reloc_iresolve(obj, lockstate) == -1) || in resolve_object_ifunc()
3426 (obj->irelative_nonplt && reloc_iresolve_nonplt(obj, in resolve_object_ifunc()
3428 ((obj->bind_now || bind_now) && obj->gnu_ifunc && in resolve_object_ifunc()
3429 reloc_gnu_ifunc(obj, flags, lockstate) == -1) || in resolve_object_ifunc()
3430 (obj->non_plt_gnu_ifunc && reloc_non_plt(obj, &obj_rtld, in resolve_object_ifunc()
3432 obj_enforce_relro(obj) == -1) in resolve_object_ifunc()
3442 Obj_Entry *obj; in initlist_objects_ifunc() local
3445 obj = elm->obj; in initlist_objects_ifunc()
3446 if (obj->marker) in initlist_objects_ifunc()
3448 if (resolve_object_ifunc(obj, bind_now, flags, in initlist_objects_ifunc()
3765 dlopen_cleanup(Obj_Entry *obj, RtldLockState *lockstate) in dlopen_cleanup() argument
3768 obj->dl_refcount--; in dlopen_cleanup()
3769 unref_dag(obj); in dlopen_cleanup()
3770 if (obj->refcount == 0) in dlopen_cleanup()
3771 unload_object(obj, lockstate); in dlopen_cleanup()
3778 Obj_Entry *obj; in dlopen_object() local
3794 obj = NULL; in dlopen_object()
3796 obj = obj_main; in dlopen_object()
3797 obj->refcount++; in dlopen_object()
3799 obj = load_object(name, fd, refobj, lo_flags); in dlopen_object()
3802 if (obj) { in dlopen_object()
3803 obj->dl_refcount++; in dlopen_object()
3804 if (mode & RTLD_GLOBAL && objlist_find(&list_global, obj) == NULL) in dlopen_object()
3805 objlist_push_tail(&list_global, obj); in dlopen_object()
3807 if (!obj->init_done) { in dlopen_object()
3810 obj->deepbind = true; in dlopen_object()
3813 obj->static_tls && !allocate_tls_offset(obj)) { in dlopen_object()
3815 "for static Thread Local Storage", obj->path); in dlopen_object()
3819 result = load_needed_objects(obj, lo_flags & (RTLD_LO_DLOPEN | in dlopen_object()
3821 init_dag(obj); in dlopen_object()
3822 ref_dag(obj); in dlopen_object()
3824 result = rtld_verify_versions(&obj->dagmembers); in dlopen_object()
3827 if (result == -1 || relocate_object_dag(obj, in dlopen_object()
3831 dlopen_cleanup(obj, lockstate); in dlopen_object()
3832 obj = NULL; in dlopen_object()
3845 initlist_add_objects(obj, obj, &initlist); in dlopen_object()
3853 if (obj != NULL) in dlopen_object()
3854 process_z(obj); in dlopen_object()
3862 init_dag(obj); in dlopen_object()
3863 ref_dag(obj); in dlopen_object()
3868 if (obj != NULL && ((lo_flags & RTLD_LO_NODELETE) != 0 || in dlopen_object()
3869 obj->z_nodelete) && !obj->ref_nodel) { in dlopen_object()
3870 dbg("obj %s nodelete", obj->path); in dlopen_object()
3871 ref_dag(obj); in dlopen_object()
3872 obj->z_nodelete = obj->ref_nodel = true; in dlopen_object()
3876 LD_UTRACE(UTRACE_DLOPEN_STOP, obj, NULL, 0, obj ? obj->dl_refcount : 0, in dlopen_object()
3878 GDB_STATE(RT_CONSISTENT,obj ? &obj->linkmap : NULL); in dlopen_object()
3882 if (obj != NULL) in dlopen_object()
3890 dlopen_cleanup(obj, lockstate); in dlopen_object()
3903 return (obj); in dlopen_object()
3905 trace_loaded_objects(obj, false); in dlopen_object()
3916 const Obj_Entry *obj, *defobj; in do_dlsym() local
3938 if ((obj = obj_from_addr(retaddr)) == NULL) { in do_dlsym()
3945 res = symlook_obj(&req, obj); in do_dlsym()
3953 obj = globallist_next(obj); in do_dlsym()
3954 for (; obj != NULL; obj = TAILQ_NEXT(obj, next)) { in do_dlsym()
3955 if (obj->marker) in do_dlsym()
3957 res = symlook_obj(&req, obj); in do_dlsym()
3985 res = symlook_default(&req, obj); in do_dlsym()
3992 if ((obj = dlcheck(handle)) == NULL) { in do_dlsym()
3999 if (obj->mainprog) { in do_dlsym()
4021 res = symlook_list(&req, &obj->dagmembers, &donelist); in do_dlsym()
4094 const Obj_Entry *obj; in _rtld_addr_phdr() local
4098 obj = obj_from_addr(addr); in _rtld_addr_phdr()
4099 if (obj == NULL) { in _rtld_addr_phdr()
4104 rtld_fill_dl_phdr_info(obj, phdr_info); in _rtld_addr_phdr()
4112 const Obj_Entry *obj; in dladdr() local
4119 obj = obj_from_addr(addr); in dladdr()
4120 if (obj == NULL) { in dladdr()
4125 info->dli_fname = obj->path; in dladdr()
4126 info->dli_fbase = obj->mapbase; in dladdr()
4134 for (symoffset = 0; symoffset < obj->dynsymcount; symoffset++) { in dladdr()
4135 def = obj->symtab + symoffset; in dladdr()
4149 symbol_addr = obj->relocbase + def->st_value; in dladdr()
4154 info->dli_sname = obj->strtab + def->st_name; in dladdr()
4168 const Obj_Entry *obj; in dlinfo() local
4178 if ((obj = obj_from_addr(retaddr)) == NULL) in dlinfo()
4181 obj = dlcheck(handle); in dlinfo()
4183 if (obj == NULL) { in dlinfo()
4191 *((struct link_map const **)p) = &obj->linkmap; in dlinfo()
4194 error = rtld_dirname(obj->path, p); in dlinfo()
4199 error = do_search_info(obj, request, (struct dl_serinfo *)p); in dlinfo()
4213 rtld_fill_dl_phdr_info(const Obj_Entry *obj, struct dl_phdr_info *phdr_info) in rtld_fill_dl_phdr_info() argument
4217 phdr_info->dlpi_addr = (Elf_Addr)obj->relocbase; in rtld_fill_dl_phdr_info()
4218 phdr_info->dlpi_name = obj->path; in rtld_fill_dl_phdr_info()
4219 phdr_info->dlpi_phdr = obj->phdr; in rtld_fill_dl_phdr_info()
4220 phdr_info->dlpi_phnum = obj->phsize / sizeof(obj->phdr[0]); in rtld_fill_dl_phdr_info()
4221 phdr_info->dlpi_tls_modid = obj->tlsindex; in rtld_fill_dl_phdr_info()
4224 obj->tlsindex, 0, true) + TLS_DTV_OFFSET; in rtld_fill_dl_phdr_info()
4233 Obj_Entry *obj, marker; in dl_iterate_phdr() local
4242 for (obj = globallist_curr(TAILQ_FIRST(&obj_list)); obj != NULL;) { in dl_iterate_phdr()
4243 TAILQ_INSERT_AFTER(&obj_list, obj, &marker, next); in dl_iterate_phdr()
4244 rtld_fill_dl_phdr_info(obj, &phdr_info); in dl_iterate_phdr()
4245 hold_object(obj); in dl_iterate_phdr()
4251 unhold_object(obj); in dl_iterate_phdr()
4252 obj = globallist_next(&marker); in dl_iterate_phdr()
4298 do_search_info(const Obj_Entry *obj, int request, struct dl_serinfo *info) in do_search_info() argument
4309 path_enumerate(obj->rpath, fill_search_info, NULL, &args); in do_search_info()
4311 path_enumerate(obj->runpath, fill_search_info, NULL, &args); in do_search_info()
4312 path_enumerate(gethints(obj->z_nodeflib), fill_search_info, NULL, &args); in do_search_info()
4313 if (!obj->z_nodeflib) in do_search_info()
4334 if (path_enumerate(obj->rpath, fill_search_info, NULL, &args) != NULL) in do_search_info()
4342 if (path_enumerate(obj->runpath, fill_search_info, NULL, &args) != NULL) in do_search_info()
4346 if (path_enumerate(gethints(obj->z_nodeflib), fill_search_info, NULL, &args) in do_search_info()
4351 if (!obj->z_nodeflib && path_enumerate(ld_standard_library_path, in do_search_info()
4422 linkmap_add(Obj_Entry *obj) in linkmap_add() argument
4426 l = &obj->linkmap; in linkmap_add()
4427 l->l_name = obj->path; in linkmap_add()
4428 l->l_base = obj->mapbase; in linkmap_add()
4429 l->l_ld = obj->dynamic; in linkmap_add()
4430 l->l_addr = obj->relocbase; in linkmap_add()
4455 linkmap_delete(Obj_Entry *obj) in linkmap_delete() argument
4459 l = &obj->linkmap; in linkmap_delete()
4510 release_object(Obj_Entry *obj) in release_object() argument
4513 if (obj->holdcount > 0) { in release_object()
4514 obj->unholdfree = true; in release_object()
4517 munmap(obj->mapbase, obj->mapsize); in release_object()
4518 linkmap_delete(obj); in release_object()
4519 obj_free(obj); in release_object()
4593 res = symlook_list(&req1, &elm->obj->dagmembers, donelist); in symlook_global()
4644 res = symlook_list(&req1, &elm->obj->dagmembers, &donelist); in symlook_default()
4686 if (donelist_check(dlp, elm->obj)) in symlook_list()
4689 if ((res = symlook_obj(&req1, elm->obj)) == 0) { in symlook_list()
4726 if (n->obj == NULL || in symlook_needed()
4727 (res = symlook_list(&req1, &n->obj->dagmembers, dlp)) != 0) in symlook_needed()
4746 symlook_obj_load_filtees(SymLook *req, SymLook *req1, const Obj_Entry *obj, in symlook_obj_load_filtees() argument
4753 load_filtees(__DECONST(Obj_Entry *, obj), flags, req->lockstate); in symlook_obj_load_filtees()
4769 symlook_obj(SymLook *req, const Obj_Entry *obj) in symlook_obj() argument
4778 if (obj->valid_hash_gnu) in symlook_obj()
4779 mres = symlook_obj1_gnu(req, obj); in symlook_obj()
4780 else if (obj->valid_hash_sysv) in symlook_obj()
4781 mres = symlook_obj1_sysv(req, obj); in symlook_obj()
4786 if (obj->needed_filtees != NULL) { in symlook_obj()
4787 res = symlook_obj_load_filtees(req, &req1, obj, in symlook_obj()
4788 obj->needed_filtees); in symlook_obj()
4795 if (obj->needed_aux_filtees != NULL) { in symlook_obj()
4796 res = symlook_obj_load_filtees(req, &req1, obj, in symlook_obj()
4797 obj->needed_aux_filtees); in symlook_obj()
4810 matched_symbol(SymLook *req, const Obj_Entry *obj, Sym_Match_Result *result, in matched_symbol() argument
4817 symp = obj->symtab + symnum; in matched_symbol()
4818 strp = obj->strtab + symp->st_name; in matched_symbol()
4843 if (obj->versyms != NULL) { in matched_symbol()
4844 verndx = VER_NDX(obj->versyms[symnum]); in matched_symbol()
4845 if (verndx > obj->vernum) { in matched_symbol()
4848 obj->path, obj->strtab + symnum, verndx); in matched_symbol()
4870 if ((obj->versyms[symnum] & VER_NDX_HIDDEN) in matched_symbol()
4882 if (obj->versyms == NULL) { in matched_symbol()
4883 if (object_match_name(obj, req->ventry->name)) { in matched_symbol()
4885 "for symbol %s", obj_rtld.path, obj->path, in matched_symbol()
4886 req->ventry->name, obj->strtab + symnum); in matched_symbol()
4890 verndx = VER_NDX(obj->versyms[symnum]); in matched_symbol()
4891 if (verndx > obj->vernum) { in matched_symbol()
4893 obj->path, obj->strtab + symnum, verndx); in matched_symbol()
4896 if (obj->vertab[verndx].hash != req->ventry->hash || in matched_symbol()
4897 strcmp(obj->vertab[verndx].name, req->ventry->name)) { in matched_symbol()
4909 (obj->versyms[symnum] & VER_NDX_HIDDEN)) in matched_symbol()
4923 symlook_obj1_sysv(SymLook *req, const Obj_Entry *obj) in symlook_obj1_sysv() argument
4932 for (symnum = obj->buckets[req->hash % obj->nbuckets]; in symlook_obj1_sysv()
4933 symnum != STN_UNDEF; symnum = obj->chains[symnum]) { in symlook_obj1_sysv()
4934 if (symnum >= obj->nchains) in symlook_obj1_sysv()
4937 if (matched_symbol(req, obj, &matchres, symnum)) { in symlook_obj1_sysv()
4939 req->defobj_out = obj; in symlook_obj1_sysv()
4945 req->defobj_out = obj; in symlook_obj1_sysv()
4953 symlook_obj1_gnu(SymLook *req, const Obj_Entry *obj) in symlook_obj1_gnu() argument
4967 bloom_word = obj->bloom_gnu[(req->hash_gnu / __ELF_WORD_SIZE) & in symlook_obj1_gnu()
4968 obj->maskwords_bm_gnu]; in symlook_obj1_gnu()
4972 h2 = ((req->hash_gnu >> obj->shift2_gnu) & (__ELF_WORD_SIZE - 1)); in symlook_obj1_gnu()
4979 bucket = obj->buckets_gnu[req->hash_gnu % obj->nbuckets_gnu]; in symlook_obj1_gnu()
4982 hashval = &obj->chain_zero_gnu[bucket]; in symlook_obj1_gnu()
4985 symnum = hashval - obj->chain_zero_gnu; in symlook_obj1_gnu()
4986 if (matched_symbol(req, obj, &matchres, symnum)) { in symlook_obj1_gnu()
4988 req->defobj_out = obj; in symlook_obj1_gnu()
4995 req->defobj_out = obj; in symlook_obj1_gnu()
5018 trace_print_obj(Obj_Entry *obj, const char *name, const char *path, in trace_print_obj() argument
5068 rtld_printf("%p", obj != NULL ? in trace_print_obj()
5069 obj->mapbase : NULL); in trace_print_obj()
5079 trace_loaded_objects(Obj_Entry *obj, bool show_preload) in trace_loaded_objects() argument
5088 for (; obj != NULL; obj = TAILQ_NEXT(obj, next)) { in trace_loaded_objects()
5091 if (obj->marker) in trace_loaded_objects()
5093 if (list_containers && obj->needed != NULL) in trace_loaded_objects()
5094 rtld_printf("%s:\n", obj->path); in trace_loaded_objects()
5095 for (needed = obj->needed; needed; needed = needed->next) { in trace_loaded_objects()
5096 if (needed->obj != NULL) { in trace_loaded_objects()
5097 if (needed->obj->traced && !list_containers) in trace_loaded_objects()
5099 needed->obj->traced = true; in trace_loaded_objects()
5100 path = needed->obj->path; in trace_loaded_objects()
5104 name = obj->strtab + needed->name; in trace_loaded_objects()
5105 trace_print_obj(needed->obj, name, path, main_local, in trace_loaded_objects()
5115 TAILQ_FOREACH(obj, &obj_list, next) { in trace_loaded_objects()
5116 if (obj->marker || obj == obj_main || obj->traced) in trace_loaded_objects()
5124 Name_Entry *fname = STAILQ_FIRST(&obj->names); in trace_loaded_objects()
5126 trace_print_obj(obj, name, obj->path, main_local, in trace_loaded_objects()
5141 Obj_Entry marker, *obj, *next; in unload_object() local
5152 for (obj = TAILQ_FIRST(&obj_list); obj != NULL; obj = next) { in unload_object()
5153 next = TAILQ_NEXT(obj, next); in unload_object()
5154 if (obj->marker || obj->refcount != 0) in unload_object()
5156 LD_UTRACE(UTRACE_UNLOAD_OBJECT, obj, obj->mapbase, in unload_object()
5157 obj->mapsize, 0, obj->path); in unload_object()
5158 dbg("unloading \"%s\"", obj->path); in unload_object()
5164 TAILQ_REMOVE(&obj_list, obj, next); in unload_object()
5167 if (obj->filtees_loaded) { in unload_object()
5171 unload_filtees(obj, lockstate); in unload_object()
5175 unload_filtees(obj, lockstate); in unload_object()
5177 release_object(obj); in unload_object()
5192 objlist_remove(&elm->obj->dldags, root); in unlink_object()
5193 if (elm->obj != root) in unlink_object()
5194 unlink_object(elm->obj); in unlink_object()
5206 elm->obj->refcount++; in ref_dag()
5216 elm->obj->refcount--; in unref_dag()
5308 Obj_Entry *obj; in allocate_tls() local
5353 for (obj = globallist_curr(objs); obj != NULL; in allocate_tls()
5354 obj = globallist_next(obj)) { in allocate_tls()
5355 if (obj->tlsoffset == 0) in allocate_tls()
5357 tls_init_offset = obj->tlspoffset & (obj->tlsalign - 1); in allocate_tls()
5358 addr = (Elf_Addr)tcb + obj->tlsoffset; in allocate_tls()
5361 if (obj->tlsinitsize > 0) { in allocate_tls()
5362 memcpy((void *)(addr + tls_init_offset), obj->tlsinit, in allocate_tls()
5363 obj->tlsinitsize); in allocate_tls()
5365 if (obj->tlssize > obj->tlsinitsize) { in allocate_tls()
5366 memset((void *)(addr + tls_init_offset + obj->tlsinitsize), in allocate_tls()
5367 0, obj->tlssize - obj->tlsinitsize - tls_init_offset); in allocate_tls()
5369 dtv[obj->tlsindex + 1] = addr; in allocate_tls()
5414 Obj_Entry *obj; in allocate_tls() local
5465 for (obj = objs; obj != NULL; obj = TAILQ_NEXT(obj, next)) { in allocate_tls()
5466 if (obj->marker || obj->tlsoffset == 0) in allocate_tls()
5468 addr = segbase - obj->tlsoffset; in allocate_tls()
5469 memset((void *)(addr + obj->tlsinitsize), in allocate_tls()
5470 0, obj->tlssize - obj->tlsinitsize); in allocate_tls()
5471 if (obj->tlsinit) { in allocate_tls()
5472 memcpy((void *)addr, obj->tlsinit, obj->tlsinitsize); in allocate_tls()
5473 obj->static_tls_copied = true; in allocate_tls()
5475 dtv[obj->tlsindex + 1] = addr; in allocate_tls()
5522 Obj_Entry *obj; in allocate_module_tls() local
5525 TAILQ_FOREACH(obj, &obj_list, next) { in allocate_module_tls()
5526 if (obj->marker) in allocate_module_tls()
5528 if (obj->tlsindex == index) in allocate_module_tls()
5531 if (obj == NULL) { in allocate_module_tls()
5536 if (obj->tls_static) { in allocate_module_tls()
5538 p = (char *)_tcb_get() + obj->tlsoffset + TLS_TCB_SIZE; in allocate_module_tls()
5540 p = (char *)_tcb_get() - obj->tlsoffset; in allocate_module_tls()
5545 obj->tls_dynamic = true; in allocate_module_tls()
5547 p = xmalloc_aligned(obj->tlssize, obj->tlsalign, obj->tlspoffset); in allocate_module_tls()
5548 memcpy(p, obj->tlsinit, obj->tlsinitsize); in allocate_module_tls()
5549 memset(p + obj->tlsinitsize, 0, obj->tlssize - obj->tlsinitsize); in allocate_module_tls()
5554 allocate_tls_offset(Obj_Entry *obj) in allocate_tls_offset() argument
5558 if (obj->tls_dynamic) in allocate_tls_offset()
5561 if (obj->tls_static) in allocate_tls_offset()
5564 if (obj->tlssize == 0) { in allocate_tls_offset()
5565 obj->tls_static = true; in allocate_tls_offset()
5570 off = calculate_first_tls_offset(obj->tlssize, obj->tlsalign, in allocate_tls_offset()
5571 obj->tlspoffset); in allocate_tls_offset()
5574 obj->tlssize, obj->tlsalign, obj->tlspoffset); in allocate_tls_offset()
5576 obj->tlsoffset = off; in allocate_tls_offset()
5578 off += obj->tlssize; in allocate_tls_offset()
5590 } else if (obj->tlsalign > tls_static_max_align) { in allocate_tls_offset()
5591 tls_static_max_align = obj->tlsalign; in allocate_tls_offset()
5595 tls_last_size = obj->tlssize; in allocate_tls_offset()
5596 obj->tls_static = true; in allocate_tls_offset()
5602 free_tls_offset(Obj_Entry *obj) in free_tls_offset() argument
5611 size_t off = obj->tlsoffset; in free_tls_offset()
5613 off += obj->tlssize; in free_tls_offset()
5616 tls_last_offset -= obj->tlssize; in free_tls_offset()
5645 object_add_name(Obj_Entry *obj, const char *name) in object_add_name() argument
5655 STAILQ_INSERT_TAIL(&obj->names, entry, link); in object_add_name()
5660 object_match_name(const Obj_Entry *obj, const char *name) in object_match_name() argument
5664 STAILQ_FOREACH(entry, &obj->names, link) { in object_match_name()
5672 locate_dependency(const Obj_Entry *obj, const char *name) in locate_dependency() argument
5678 if (object_match_name(entry->obj, name)) in locate_dependency()
5679 return (entry->obj); in locate_dependency()
5682 for (needed = obj->needed; needed != NULL; needed = needed->next) { in locate_dependency()
5683 if (strcmp(obj->strtab + needed->name, name) == 0 || in locate_dependency()
5684 (needed->obj != NULL && object_match_name(needed->obj, name))) { in locate_dependency()
5692 return (needed->obj); in locate_dependency()
5696 obj->path, name); in locate_dependency()
5738 rtld_verify_object_versions(Obj_Entry *obj) in rtld_verify_object_versions() argument
5747 if (obj->ver_checked) in rtld_verify_object_versions()
5749 obj->ver_checked = true; in rtld_verify_object_versions()
5757 vn = obj->verneed; in rtld_verify_object_versions()
5761 obj->path, vn->vn_version); in rtld_verify_object_versions()
5778 vd = obj->verdef; in rtld_verify_object_versions()
5782 obj->path, vd->vd_version); in rtld_verify_object_versions()
5801 obj->vernum = maxvernum + 1; in rtld_verify_object_versions()
5802 obj->vertab = xcalloc(obj->vernum, sizeof(Ver_Entry)); in rtld_verify_object_versions()
5804 vd = obj->verdef; in rtld_verify_object_versions()
5810 obj->vertab[vernum].hash = vd->vd_hash; in rtld_verify_object_versions()
5811 obj->vertab[vernum].name = obj->strtab + vda->vda_name; in rtld_verify_object_versions()
5812 obj->vertab[vernum].file = NULL; in rtld_verify_object_versions()
5813 obj->vertab[vernum].flags = 0; in rtld_verify_object_versions()
5820 vn = obj->verneed; in rtld_verify_object_versions()
5822 depobj = locate_dependency(obj, obj->strtab + vn->vn_file); in rtld_verify_object_versions()
5827 if (check_object_provided_version(obj, depobj, vna)) in rtld_verify_object_versions()
5831 obj->vertab[vernum].hash = vna->vna_hash; in rtld_verify_object_versions()
5832 obj->vertab[vernum].name = obj->strtab + vna->vna_name; in rtld_verify_object_versions()
5833 obj->vertab[vernum].file = obj->strtab + vn->vn_file; in rtld_verify_object_versions()
5834 obj->vertab[vernum].flags = (vna->vna_other & VER_NEED_HIDDEN) ? in rtld_verify_object_versions()
5859 if (entry->obj->strtab == NULL || entry->obj->vertab != NULL) in rtld_verify_versions()
5861 if (rtld_verify_object_versions(entry->obj) == -1) { in rtld_verify_versions()
5873 fetch_ventry(const Obj_Entry *obj, unsigned long symnum) in fetch_ventry() argument
5877 if (obj->vertab) { in fetch_ventry()
5878 vernum = VER_NDX(obj->versyms[symnum]); in fetch_ventry()
5879 if (vernum >= obj->vernum) { in fetch_ventry()
5881 obj->path, obj->strtab + symnum, vernum); in fetch_ventry()
5882 } else if (obj->vertab[vernum].hash != 0) { in fetch_ventry()
5883 return (&obj->vertab[vernum]); in fetch_ventry()
5899 Obj_Entry *obj; in _rtld_is_dlopened() local
5904 obj = dlcheck(arg); in _rtld_is_dlopened()
5905 if (obj == NULL) in _rtld_is_dlopened()
5906 obj = obj_from_addr(arg); in _rtld_is_dlopened()
5907 if (obj == NULL) { in _rtld_is_dlopened()
5912 res = obj->dlopened ? 1 : 0; in _rtld_is_dlopened()
5918 obj_remap_relro(Obj_Entry *obj, int prot) in obj_remap_relro() argument
5921 if (obj->relro_size > 0 && mprotect(obj->relro_page, obj->relro_size, in obj_remap_relro()
5924 obj->path, prot, rtld_strerror(errno)); in obj_remap_relro()
5931 obj_disable_relro(Obj_Entry *obj) in obj_disable_relro() argument
5934 return (obj_remap_relro(obj, PROT_READ | PROT_WRITE)); in obj_disable_relro()
5938 obj_enforce_relro(Obj_Entry *obj) in obj_enforce_relro() argument
5941 return (obj_remap_relro(obj, PROT_READ)); in obj_enforce_relro()
5963 Obj_Entry *obj; in distribute_static_tls() local
5971 obj = elm->obj; in distribute_static_tls()
5972 if (obj->marker || !obj->tls_static || obj->static_tls_copied) in distribute_static_tls()
5975 distrib(obj->tlsoffset, obj->tlsinit, obj->tlsinitsize, in distribute_static_tls()
5976 obj->tlssize); in distribute_static_tls()
5978 obj->static_tls_copied = true; in distribute_static_tls()