Lines Matching refs:obj
101 static int do_search_info(const Obj_Entry *obj, int, struct dl_serinfo *);
145 static int relocate_object(Obj_Entry *obj, bool bind_now, Obj_Entry *rtldobj,
175 static bool obj_resolve_origin(Obj_Entry *obj);
182 static void rtld_fill_dl_phdr_info(const Obj_Entry *obj,
255 Elf_Addr _rtld_bind(Obj_Entry *obj, Elf_Size reloff);
375 Obj_Entry *last_interposer, *obj, *preload_tail; in _rtld() local
660 TAILQ_FOREACH(obj, &obj_list, next) { in _rtld()
661 if (obj->marker) in _rtld()
663 if (obj->z_interpose && obj != obj_main) { in _rtld()
664 objlist_put_after(&list_main, last_interposer, obj); in _rtld()
665 last_interposer = obj; in _rtld()
667 objlist_push_tail(&list_main, obj); in _rtld()
669 obj->refcount++; in _rtld()
697 allocate_tls_offset(entry->obj); in _rtld()
769 TAILQ_FOREACH(obj, &obj_list, next) { in _rtld()
770 if (obj->marker) in _rtld()
772 if (ld_loadfltr || obj->z_loadfltr) in _rtld()
773 load_filtees(obj, 0, &lockstate); in _rtld()
791 rtld_resolve_ifunc(const Obj_Entry *obj, const Elf_Sym *def) in rtld_resolve_ifunc() argument
796 ptr = (void *)make_function_pointer(def, obj); in rtld_resolve_ifunc()
806 _rtld_bind(Obj_Entry *obj, Elf_Size reloff) in _rtld_bind() argument
818 if (obj->pltrel) in _rtld_bind()
819 rel = (const Elf_Rel *)((const char *)obj->pltrel + reloff); in _rtld_bind()
821 rel = (const Elf_Rel *)((const char *)obj->pltrela + reloff); in _rtld_bind()
823 where = (Elf_Addr *)(obj->relocbase + rel->r_offset); in _rtld_bind()
824 def = find_symdef(ELF_R_SYM(rel->r_info), obj, &defobj, SYMLOOK_IN_PLT, in _rtld_bind()
834 defobj->strtab + def->st_name, basename(obj->path), in _rtld_bind()
844 target = reloc_jmpslot(where, target, defobj, obj, rel); in _rtld_bind()
901 origin_subst_one(Obj_Entry *obj, char *real, const char *kw, in origin_subst_one() argument
926 if (subst_count == 0 || (obj != NULL && !obj_resolve_origin(obj))) in origin_subst_one()
928 if (obj != NULL) in origin_subst_one()
929 subst = obj->origin_path; in origin_subst_one()
966 origin_subst(Obj_Entry *obj, const char *real) in origin_subst() argument
970 if (obj == NULL || !trust) in origin_subst()
979 res1 = origin_subst_one(obj, __DECONST(char *, real), "$ORIGIN", NULL, in origin_subst()
1005 digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath, in digest_dynamic1() argument
1009 Needed_Entry **needed_tail = &obj->needed; in digest_dynamic1()
1010 Needed_Entry **needed_filtees_tail = &obj->needed_filtees; in digest_dynamic1()
1011 Needed_Entry **needed_aux_filtees_tail = &obj->needed_aux_filtees; in digest_dynamic1()
1022 obj->bind_now = false; in digest_dynamic1()
1023 for (dynp = obj->dynamic; dynp->d_tag != DT_NULL; dynp++) { in digest_dynamic1()
1027 obj->rel = (const Elf_Rel *)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1031 obj->relsize = dynp->d_un.d_val; in digest_dynamic1()
1039 obj->pltrel = (const Elf_Rel *) in digest_dynamic1()
1040 (obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1044 obj->pltrelsize = dynp->d_un.d_val; in digest_dynamic1()
1048 obj->rela = (const Elf_Rela *)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1052 obj->relasize = dynp->d_un.d_val; in digest_dynamic1()
1065 obj->symtab = (const Elf_Sym *) in digest_dynamic1()
1066 (obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1074 obj->strtab = (const char *)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1078 obj->strsize = dynp->d_un.d_val; in digest_dynamic1()
1082 obj->verneed = (const Elf_Verneed *)(obj->relocbase + in digest_dynamic1()
1087 obj->verneednum = dynp->d_un.d_val; in digest_dynamic1()
1091 obj->verdef = (const Elf_Verdef *)(obj->relocbase + in digest_dynamic1()
1096 obj->verdefnum = dynp->d_un.d_val; in digest_dynamic1()
1100 obj->versyms = (const Elf_Versym *)(obj->relocbase + in digest_dynamic1()
1106 hashtab = (const Elf_Hashelt *)(obj->relocbase + in digest_dynamic1()
1108 obj->nbuckets = hashtab[0]; in digest_dynamic1()
1109 obj->nchains = hashtab[1]; in digest_dynamic1()
1110 obj->buckets = hashtab + 2; in digest_dynamic1()
1111 obj->chains = obj->buckets + obj->nbuckets; in digest_dynamic1()
1112 obj->valid_hash_sysv = obj->nbuckets > 0 && obj->nchains > 0 && in digest_dynamic1()
1113 obj->buckets != NULL; in digest_dynamic1()
1119 hashtab = (const Elf_Hashelt *)(obj->relocbase + in digest_dynamic1()
1121 obj->nbuckets_gnu = hashtab[0]; in digest_dynamic1()
1122 obj->symndx_gnu = hashtab[1]; in digest_dynamic1()
1125 obj->maskwords_bm_gnu = nmaskwords - 1; in digest_dynamic1()
1126 obj->shift2_gnu = hashtab[3]; in digest_dynamic1()
1127 obj->bloom_gnu = (const Elf_Addr *)(hashtab + 4); in digest_dynamic1()
1128 obj->buckets_gnu = hashtab + 4 + bloom_size32; in digest_dynamic1()
1129 obj->chain_zero_gnu = obj->buckets_gnu + obj->nbuckets_gnu - in digest_dynamic1()
1130 obj->symndx_gnu; in digest_dynamic1()
1132 obj->valid_hash_gnu = powerof2(nmaskwords) && in digest_dynamic1()
1133 obj->nbuckets_gnu > 0 && obj->buckets_gnu != NULL; in digest_dynamic1()
1138 if (!obj->rtld) { in digest_dynamic1()
1141 nep->obj = NULL; in digest_dynamic1()
1150 if (!obj->rtld) { in digest_dynamic1()
1153 nep->obj = NULL; in digest_dynamic1()
1162 if (!obj->rtld) { in digest_dynamic1()
1165 nep->obj = NULL; in digest_dynamic1()
1174 obj->pltgot = (Elf_Addr *)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1178 obj->textrel = true; in digest_dynamic1()
1182 obj->symbolic = true; in digest_dynamic1()
1202 obj->init = (Elf_Addr)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1206 obj->preinit_array = (Elf_Addr)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1210 obj->preinit_array_num = dynp->d_un.d_val / sizeof(Elf_Addr); in digest_dynamic1()
1214 obj->init_array = (Elf_Addr)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1218 obj->init_array_num = dynp->d_un.d_val / sizeof(Elf_Addr); in digest_dynamic1()
1222 obj->fini = (Elf_Addr)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1226 obj->fini_array = (Elf_Addr)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1230 obj->fini_array_num = dynp->d_un.d_val / sizeof(Elf_Addr); in digest_dynamic1()
1248 obj->z_origin = true; in digest_dynamic1()
1250 obj->symbolic = true; in digest_dynamic1()
1252 obj->textrel = true; in digest_dynamic1()
1254 obj->bind_now = true; in digest_dynamic1()
1256 obj->static_tls = true; in digest_dynamic1()
1260 obj->local_gotno = dynp->d_un.d_val; in digest_dynamic1()
1264 obj->symtabno = dynp->d_un.d_val; in digest_dynamic1()
1268 obj->gotsym = dynp->d_un.d_val; in digest_dynamic1()
1276 obj->mips_pltgot = (Elf_Addr *)(obj->relocbase + in digest_dynamic1()
1284 obj->glink = (Elf_Addr)(obj->relocbase + dynp->d_un.d_ptr); in digest_dynamic1()
1290 obj->z_noopen = true; in digest_dynamic1()
1292 obj->z_origin = true; in digest_dynamic1()
1294 obj->z_global = true; in digest_dynamic1()
1296 obj->bind_now = true; in digest_dynamic1()
1298 obj->z_nodelete = true; in digest_dynamic1()
1300 obj->z_loadfltr = true; in digest_dynamic1()
1302 obj->z_interpose = true; in digest_dynamic1()
1304 obj->z_nodeflib = true; in digest_dynamic1()
1316 obj->traced = false; in digest_dynamic1()
1319 obj->pltrela = (const Elf_Rela *) obj->pltrel; in digest_dynamic1()
1320 obj->pltrel = NULL; in digest_dynamic1()
1321 obj->pltrelasize = obj->pltrelsize; in digest_dynamic1()
1322 obj->pltrelsize = 0; in digest_dynamic1()
1326 if (obj->valid_hash_sysv) in digest_dynamic1()
1327 obj->dynsymcount = obj->nchains; in digest_dynamic1()
1328 else if (obj->valid_hash_gnu) { in digest_dynamic1()
1329 obj->dynsymcount = 0; in digest_dynamic1()
1330 for (bkt = 0; bkt < obj->nbuckets_gnu; bkt++) { in digest_dynamic1()
1331 if (obj->buckets_gnu[bkt] == 0) in digest_dynamic1()
1333 hashval = &obj->chain_zero_gnu[obj->buckets_gnu[bkt]]; in digest_dynamic1()
1335 obj->dynsymcount++; in digest_dynamic1()
1338 obj->dynsymcount += obj->symndx_gnu; in digest_dynamic1()
1343 obj_resolve_origin(Obj_Entry *obj) in obj_resolve_origin() argument
1346 if (obj->origin_path != NULL) in obj_resolve_origin()
1348 obj->origin_path = xmalloc(PATH_MAX); in obj_resolve_origin()
1349 return (rtld_dirname_abs(obj->path, obj->origin_path) != -1); in obj_resolve_origin()
1353 digest_dynamic2(Obj_Entry *obj, const Elf_Dyn *dyn_rpath, in digest_dynamic2() argument
1357 if (obj->z_origin && !obj_resolve_origin(obj)) in digest_dynamic2()
1361 obj->runpath = (const char *)obj->strtab + dyn_runpath->d_un.d_val; in digest_dynamic2()
1362 obj->runpath = origin_subst(obj, obj->runpath); in digest_dynamic2()
1364 obj->rpath = (const char *)obj->strtab + dyn_rpath->d_un.d_val; in digest_dynamic2()
1365 obj->rpath = origin_subst(obj, obj->rpath); in digest_dynamic2()
1368 object_add_name(obj, obj->strtab + dyn_soname->d_un.d_val); in digest_dynamic2()
1372 digest_dynamic(Obj_Entry *obj, int early) in digest_dynamic() argument
1378 digest_dynamic1(obj, early, &dyn_rpath, &dyn_soname, &dyn_runpath); in digest_dynamic()
1379 digest_dynamic2(obj, dyn_rpath, dyn_soname, dyn_runpath); in digest_dynamic()
1391 Obj_Entry *obj; in digest_phdr() local
1397 obj = obj_new(); in digest_phdr()
1402 obj->phdr = phdr; in digest_phdr()
1403 obj->phsize = ph->p_memsz; in digest_phdr()
1404 obj->relocbase = __DECONST(char *, phdr) - ph->p_vaddr; in digest_phdr()
1408 obj->stack_flags = PF_X | PF_R | PF_W; in digest_phdr()
1414 obj->interp = (const char *)(ph->p_vaddr + obj->relocbase); in digest_phdr()
1419 obj->vaddrbase = trunc_page(ph->p_vaddr); in digest_phdr()
1420 obj->mapbase = obj->vaddrbase + obj->relocbase; in digest_phdr()
1421 obj->textsize = round_page(ph->p_vaddr + ph->p_memsz) - in digest_phdr()
1422 obj->vaddrbase; in digest_phdr()
1424 obj->mapsize = round_page(ph->p_vaddr + ph->p_memsz) - in digest_phdr()
1425 obj->vaddrbase; in digest_phdr()
1431 obj->dynamic = (const Elf_Dyn *)(ph->p_vaddr + obj->relocbase); in digest_phdr()
1435 obj->tlsindex = 1; in digest_phdr()
1436 obj->tlssize = ph->p_memsz; in digest_phdr()
1437 obj->tlsalign = ph->p_align; in digest_phdr()
1438 obj->tlsinitsize = ph->p_filesz; in digest_phdr()
1439 obj->tlsinit = (void*)(ph->p_vaddr + obj->relocbase); in digest_phdr()
1443 obj->stack_flags = ph->p_flags; in digest_phdr()
1447 obj->relro_page = obj->relocbase + trunc_page(ph->p_vaddr); in digest_phdr()
1448 obj->relro_size = round_page(ph->p_memsz); in digest_phdr()
1452 note_start = (Elf_Addr)obj->relocbase + ph->p_vaddr; in digest_phdr()
1454 digest_notes(obj, note_start, note_end); in digest_phdr()
1463 obj->entry = entry; in digest_phdr()
1464 return obj; in digest_phdr()
1468 digest_notes(Obj_Entry *obj, Elf_Addr note_start, Elf_Addr note_end) in digest_notes() argument
1494 obj->osrel = *(const int32_t *)(p); in digest_notes()
1495 dbg("note osrel %d", obj->osrel); in digest_notes()
1501 obj->fctl0 = *(const uint32_t *)(p); in digest_notes()
1502 dbg("note fctl0 %#x", obj->fctl0); in digest_notes()
1506 obj->crt_no_init = true; in digest_notes()
1516 Obj_Entry *obj; in dlcheck() local
1518 TAILQ_FOREACH(obj, &obj_list, next) { in dlcheck()
1519 if (obj == (Obj_Entry *) handle) in dlcheck()
1523 if (obj == NULL || obj->refcount == 0 || obj->dl_refcount == 0) { in dlcheck()
1527 return obj; in dlcheck()
1535 donelist_check(DoneList *dlp, const Obj_Entry *obj) in donelist_check() argument
1540 if (dlp->objs[i] == obj) in donelist_check()
1549 dlp->objs[dlp->num_used++] = obj; in donelist_check()
1741 *defobj_out = cache[symnum].obj; in find_symdef()
1792 cache[symnum].obj = defobj; in find_symdef()
1987 for (needed = elm->obj->needed; needed != NULL; needed = needed->next) { in init_dag()
1988 if (needed->obj == NULL || donelist_check(&donelist, needed->obj)) in init_dag()
1990 objlist_push_tail(&needed->obj->dldags, root); in init_dag()
1991 objlist_push_tail(&root->dagmembers, needed->obj); in init_dag()
2006 globallist_curr(const Obj_Entry *obj) in globallist_curr() argument
2010 if (obj == NULL) in globallist_curr()
2012 if (!obj->marker) in globallist_curr()
2013 return (__DECONST(Obj_Entry *, obj)); in globallist_curr()
2014 obj = TAILQ_PREV(obj, obj_entry_q, next); in globallist_curr()
2019 globallist_next(const Obj_Entry *obj) in globallist_next() argument
2023 obj = TAILQ_NEXT(obj, next); in globallist_next()
2024 if (obj == NULL) in globallist_next()
2026 if (!obj->marker) in globallist_next()
2027 return (__DECONST(Obj_Entry *, obj)); in globallist_next()
2033 hold_object(Obj_Entry *obj) in hold_object() argument
2036 obj->holdcount++; in hold_object()
2040 unhold_object(Obj_Entry *obj) in unhold_object() argument
2043 assert(obj->holdcount > 0); in unhold_object()
2044 if (--obj->holdcount == 0 && obj->unholdfree) in unhold_object()
2045 release_object(obj); in unhold_object()
2052 Obj_Entry *obj; in process_z() local
2065 obj = elm->obj; in process_z()
2066 if (obj == NULL) in process_z()
2068 if (obj->z_nodelete && !obj->ref_nodel) { in process_z()
2069 dbg("obj %s -z nodelete", obj->path); in process_z()
2070 init_dag(obj); in process_z()
2071 ref_dag(obj); in process_z()
2072 obj->ref_nodel = true; in process_z()
2074 if (obj->z_global && objlist_find(&list_global, obj) == NULL) { in process_z()
2075 dbg("obj %s -z global", obj->path); in process_z()
2076 objlist_push_tail(&list_global, obj); in process_z()
2077 init_dag(obj); in process_z()
2212 if (needed->obj != NULL) in initlist_add_neededs()
2213 initlist_add_objects(needed->obj, needed->obj, list); in initlist_add_neededs()
2226 initlist_add_objects(Obj_Entry *obj, Obj_Entry *tail, Objlist *list) in initlist_add_objects() argument
2230 if (obj->init_scanned || obj->init_done) in initlist_add_objects()
2232 obj->init_scanned = true; in initlist_add_objects()
2235 nobj = globallist_next(obj); in initlist_add_objects()
2236 if (nobj != NULL && obj != tail) in initlist_add_objects()
2240 if (obj->needed != NULL) in initlist_add_objects()
2241 initlist_add_neededs(obj->needed, list); in initlist_add_objects()
2242 if (obj->needed_filtees != NULL) in initlist_add_objects()
2243 initlist_add_neededs(obj->needed_filtees, list); in initlist_add_objects()
2244 if (obj->needed_aux_filtees != NULL) in initlist_add_objects()
2245 initlist_add_neededs(obj->needed_aux_filtees, list); in initlist_add_objects()
2248 objlist_push_tail(list, obj); in initlist_add_objects()
2251 if ((obj->fini != (Elf_Addr)NULL || obj->fini_array != (Elf_Addr)NULL) in initlist_add_objects()
2252 && !obj->on_fini_list) { in initlist_add_objects()
2253 objlist_push_head(&list_fini, obj); in initlist_add_objects()
2254 obj->on_fini_list = true; in initlist_add_objects()
2268 if (needed->obj != NULL) { in free_needed_filtees()
2269 dlclose_locked(needed->obj, lockstate); in free_needed_filtees()
2270 needed->obj = NULL; in free_needed_filtees()
2280 unload_filtees(Obj_Entry *obj, RtldLockState *lockstate) in unload_filtees() argument
2283 free_needed_filtees(obj->needed_filtees, lockstate); in unload_filtees()
2284 obj->needed_filtees = NULL; in unload_filtees()
2285 free_needed_filtees(obj->needed_aux_filtees, lockstate); in unload_filtees()
2286 obj->needed_aux_filtees = NULL; in unload_filtees()
2287 obj->filtees_loaded = false; in unload_filtees()
2291 load_filtee1(Obj_Entry *obj, Needed_Entry *needed, int flags, in load_filtee1() argument
2296 needed->obj = dlopen_object(obj->strtab + needed->name, -1, obj, in load_filtee1()
2297 flags, ((ld_loadfltr || obj->z_loadfltr) ? RTLD_NOW : RTLD_LAZY) | in load_filtee1()
2303 load_filtees(Obj_Entry *obj, int flags, RtldLockState *lockstate) in load_filtees() argument
2307 if (!obj->filtees_loaded) { in load_filtees()
2308 load_filtee1(obj, obj->needed_filtees, flags, lockstate); in load_filtees()
2309 load_filtee1(obj, obj->needed_aux_filtees, flags, lockstate); in load_filtees()
2310 obj->filtees_loaded = true; in load_filtees()
2315 process_needed(Obj_Entry *obj, Needed_Entry *needed, int flags) in process_needed() argument
2320 obj1 = needed->obj = load_object(obj->strtab + needed->name, -1, obj, in process_needed()
2336 Obj_Entry *obj; in load_needed_objects() local
2338 for (obj = first; obj != NULL; obj = TAILQ_NEXT(obj, next)) { in load_needed_objects()
2339 if (obj->marker) in load_needed_objects()
2341 if (process_needed(obj, obj->needed, flags) == -1) in load_needed_objects()
2351 Obj_Entry *obj; in load_preload_objects() local
2364 obj = load_object(p, -1, NULL, 0); in load_preload_objects()
2365 if (obj == NULL) in load_preload_objects()
2367 obj->z_interpose = true; in load_preload_objects()
2395 Obj_Entry *obj; in load_object() local
2402 TAILQ_FOREACH(obj, &obj_list, next) { in load_object()
2403 if (obj->marker || obj->doomed) in load_object()
2405 if (object_match_name(obj, name)) in load_object()
2406 return (obj); in load_object()
2449 TAILQ_FOREACH(obj, &obj_list, next) { in load_object()
2450 if (obj->marker || obj->doomed) in load_object()
2452 if (obj->ino == sb.st_ino && obj->dev == sb.st_dev) in load_object()
2455 if (obj != NULL && name != NULL) { in load_object()
2456 object_add_name(obj, name); in load_object()
2459 return obj; in load_object()
2468 obj = do_load_object(fd, name, path, &sb, flags); in load_object()
2469 if (obj == NULL) in load_object()
2473 return obj; in load_object()
2480 Obj_Entry *obj; in do_load_object() local
2498 obj = map_object(fd, printable_path(path), sbp); in do_load_object()
2499 if (obj == NULL) in do_load_object()
2507 object_add_name(obj, name); in do_load_object()
2508 obj->path = path; in do_load_object()
2509 digest_dynamic(obj, 0); in do_load_object()
2510 dbg("%s valid_hash_sysv %d valid_hash_gnu %d dynsymcount %d", obj->path, in do_load_object()
2511 obj->valid_hash_sysv, obj->valid_hash_gnu, obj->dynsymcount); in do_load_object()
2512 if (obj->z_noopen && (flags & (RTLD_LO_DLOPEN | RTLD_LO_TRACE)) == in do_load_object()
2514 dbg("refusing to load non-loadable \"%s\"", obj->path); in do_load_object()
2515 _rtld_error("Cannot dlopen non-loadable %s", obj->path); in do_load_object()
2516 munmap(obj->mapbase, obj->mapsize); in do_load_object()
2517 obj_free(obj); in do_load_object()
2521 obj->dlopened = (flags & RTLD_LO_DLOPEN) != 0; in do_load_object()
2522 TAILQ_INSERT_TAIL(&obj_list, obj, next); in do_load_object()
2525 linkmap_add(obj); /* for GDB & dlinfo() */ in do_load_object()
2526 max_stack_flags |= obj->stack_flags; in do_load_object()
2528 dbg(" %p .. %p: %s", obj->mapbase, in do_load_object()
2529 obj->mapbase + obj->mapsize - 1, obj->path); in do_load_object()
2530 if (obj->textrel) in do_load_object()
2531 dbg(" WARNING: %s has impure text", obj->path); in do_load_object()
2532 LD_UTRACE(UTRACE_LOAD_OBJECT, obj, obj->mapbase, obj->mapsize, 0, in do_load_object()
2533 obj->path); in do_load_object()
2535 return obj; in do_load_object()
2541 Obj_Entry *obj; in obj_from_addr() local
2543 TAILQ_FOREACH(obj, &obj_list, next) { in obj_from_addr()
2544 if (obj->marker) in obj_from_addr()
2546 if (addr < (void *) obj->mapbase) in obj_from_addr()
2548 if (addr < (void *)(obj->mapbase + obj->mapsize)) in obj_from_addr()
2549 return obj; in obj_from_addr()
2602 if (root != NULL && (elm->obj->refcount != 1 || in objlist_call_fini()
2603 objlist_find(&root->dagmembers, elm->obj) == NULL)) in objlist_call_fini()
2608 elm->obj->doomed = true; in objlist_call_fini()
2610 hold_object(elm->obj); in objlist_call_fini()
2616 fini_addr = (Elf_Addr *)elm->obj->fini_array; in objlist_call_fini()
2617 if (fini_addr != NULL && elm->obj->fini_array_num > 0) { in objlist_call_fini()
2618 for (index = elm->obj->fini_array_num - 1; index >= 0; in objlist_call_fini()
2622 elm->obj->path, (void *)fini_addr[index]); in objlist_call_fini()
2623 LD_UTRACE(UTRACE_FINI_CALL, elm->obj, in objlist_call_fini()
2624 (void *)fini_addr[index], 0, 0, elm->obj->path); in objlist_call_fini()
2625 call_initfini_pointer(elm->obj, fini_addr[index]); in objlist_call_fini()
2629 if (elm->obj->fini != (Elf_Addr)NULL) { in objlist_call_fini()
2630 dbg("calling fini function for %s at %p", elm->obj->path, in objlist_call_fini()
2631 (void *)elm->obj->fini); in objlist_call_fini()
2632 LD_UTRACE(UTRACE_FINI_CALL, elm->obj, (void *)elm->obj->fini, in objlist_call_fini()
2633 0, 0, elm->obj->path); in objlist_call_fini()
2634 call_initfini_pointer(elm->obj, elm->obj->fini); in objlist_call_fini()
2637 unhold_object(elm->obj); in objlist_call_fini()
2661 Obj_Entry *obj; in objlist_call_init() local
2672 TAILQ_FOREACH(obj, &obj_list, next) { in objlist_call_init()
2673 if (obj->marker) in objlist_call_init()
2675 obj->init_scanned = false; in objlist_call_init()
2684 if (elm->obj->init_done) /* Initialized early. */ in objlist_call_init()
2691 elm->obj->init_done = true; in objlist_call_init()
2692 hold_object(elm->obj); in objlist_call_init()
2694 if (elm->obj == obj_main && obj_main->crt_no_init) { in objlist_call_init()
2708 if (elm->obj->init != (Elf_Addr)NULL) { in objlist_call_init()
2709 dbg("calling init function for %s at %p", elm->obj->path, in objlist_call_init()
2710 (void *)elm->obj->init); in objlist_call_init()
2711 LD_UTRACE(UTRACE_INIT_CALL, elm->obj, (void *)elm->obj->init, in objlist_call_init()
2712 0, 0, elm->obj->path); in objlist_call_init()
2713 call_initfini_pointer(elm->obj, elm->obj->init); in objlist_call_init()
2715 init_addr = (Elf_Addr *)elm->obj->init_array; in objlist_call_init()
2717 for (index = 0; index < elm->obj->init_array_num; index++) { in objlist_call_init()
2719 dbg("calling init function for %s at %p", elm->obj->path, in objlist_call_init()
2721 LD_UTRACE(UTRACE_INIT_CALL, elm->obj, in objlist_call_init()
2722 (void *)init_addr[index], 0, 0, elm->obj->path); in objlist_call_init()
2723 call_init_pointer(elm->obj, init_addr[index]); in objlist_call_init()
2728 unhold_object(elm->obj); in objlist_call_init()
2746 objlist_find(Objlist *list, const Obj_Entry *obj) in objlist_find() argument
2751 if (elm->obj == obj) in objlist_find()
2763 objlist_push_head(Objlist *list, Obj_Entry *obj) in objlist_push_head() argument
2768 elm->obj = obj; in objlist_push_head()
2773 objlist_push_tail(Objlist *list, Obj_Entry *obj) in objlist_push_tail() argument
2778 elm->obj = obj; in objlist_push_tail()
2783 objlist_put_after(Objlist *list, Obj_Entry *listobj, Obj_Entry *obj) in objlist_put_after() argument
2788 if (listelm->obj == listobj) in objlist_put_after()
2792 elm->obj = obj; in objlist_put_after()
2800 objlist_remove(Objlist *list, Obj_Entry *obj) in objlist_remove() argument
2804 if ((elm = objlist_find(list, obj)) != NULL) { in objlist_remove()
2824 error = relocate_object(elm->obj, bind_now, rtldobj, flags, in relocate_object_dag()
2841 reloc_textrel_prot(Obj_Entry *obj, bool before) in reloc_textrel_prot() argument
2848 for (l = obj->phsize / sizeof(*ph), ph = obj->phdr; l > 0; in reloc_textrel_prot()
2852 base = obj->relocbase + trunc_page(ph->p_vaddr); in reloc_textrel_prot()
2858 obj->path, before ? "en" : "dis", in reloc_textrel_prot()
2871 relocate_object(Obj_Entry *obj, bool bind_now, Obj_Entry *rtldobj, in relocate_object() argument
2875 if (obj->relocated) in relocate_object()
2877 obj->relocated = true; in relocate_object()
2878 if (obj != rtldobj) in relocate_object()
2879 dbg("relocating \"%s\"", obj->path); in relocate_object()
2881 if (obj->symtab == NULL || obj->strtab == NULL || in relocate_object()
2882 !(obj->valid_hash_sysv || obj->valid_hash_gnu)) { in relocate_object()
2884 obj->path); in relocate_object()
2889 if (obj->textrel && reloc_textrel_prot(obj, true) != 0) in relocate_object()
2893 if (reloc_non_plt(obj, rtldobj, flags, lockstate)) in relocate_object()
2897 if (obj->textrel && reloc_textrel_prot(obj, false) != 0) in relocate_object()
2901 init_pltgot(obj); in relocate_object()
2904 if (reloc_plt(obj, flags, lockstate) == -1) in relocate_object()
2907 if ((obj->bind_now || bind_now) && reloc_jmpslots(obj, flags, in relocate_object()
2911 if (!obj->mainprog && obj_enforce_relro(obj) == -1) in relocate_object()
2919 obj->magic = RTLD_MAGIC; in relocate_object()
2920 obj->version = RTLD_VERSION; in relocate_object()
2935 Obj_Entry *obj; in relocate_objects() local
2938 for (error = 0, obj = first; obj != NULL; in relocate_objects()
2939 obj = TAILQ_NEXT(obj, next)) { in relocate_objects()
2940 if (obj->marker) in relocate_objects()
2942 error = relocate_object(obj, bind_now, rtldobj, flags, in relocate_objects()
2962 resolve_object_ifunc(Obj_Entry *obj, bool bind_now, int flags, in resolve_object_ifunc() argument
2966 if (obj->ifuncs_resolved) in resolve_object_ifunc()
2968 obj->ifuncs_resolved = true; in resolve_object_ifunc()
2969 if (!obj->irelative && !((obj->bind_now || bind_now) && obj->gnu_ifunc)) in resolve_object_ifunc()
2971 if (obj_disable_relro(obj) == -1 || in resolve_object_ifunc()
2972 (obj->irelative && reloc_iresolve(obj, lockstate) == -1) || in resolve_object_ifunc()
2973 ((obj->bind_now || bind_now) && obj->gnu_ifunc && in resolve_object_ifunc()
2974 reloc_gnu_ifunc(obj, flags, lockstate) == -1) || in resolve_object_ifunc()
2975 obj_enforce_relro(obj) == -1) in resolve_object_ifunc()
2985 Obj_Entry *obj; in initlist_objects_ifunc() local
2988 obj = elm->obj; in initlist_objects_ifunc()
2989 if (obj->marker) in initlist_objects_ifunc()
2991 if (resolve_object_ifunc(obj, bind_now, flags, in initlist_objects_ifunc()
3305 dlopen_cleanup(Obj_Entry *obj, RtldLockState *lockstate) in dlopen_cleanup() argument
3308 obj->dl_refcount--; in dlopen_cleanup()
3309 unref_dag(obj); in dlopen_cleanup()
3310 if (obj->refcount == 0) in dlopen_cleanup()
3311 unload_object(obj, lockstate); in dlopen_cleanup()
3319 Obj_Entry *obj; in dlopen_object() local
3333 obj = NULL; in dlopen_object()
3335 obj = obj_main; in dlopen_object()
3336 obj->refcount++; in dlopen_object()
3338 obj = load_object(name, fd, refobj, lo_flags); in dlopen_object()
3341 if (obj) { in dlopen_object()
3342 obj->dl_refcount++; in dlopen_object()
3343 if (mode & RTLD_GLOBAL && objlist_find(&list_global, obj) == NULL) in dlopen_object()
3344 objlist_push_tail(&list_global, obj); in dlopen_object()
3347 assert(globallist_next(old_obj_tail) == obj); in dlopen_object()
3349 if ((lo_flags & RTLD_LO_EARLY) == 0 && obj->static_tls && in dlopen_object()
3350 !allocate_tls_offset(obj)) { in dlopen_object()
3352 "for static Thread Local Storage", obj->path); in dlopen_object()
3356 result = load_needed_objects(obj, lo_flags & (RTLD_LO_DLOPEN | in dlopen_object()
3358 init_dag(obj); in dlopen_object()
3359 ref_dag(obj); in dlopen_object()
3361 result = rtld_verify_versions(&obj->dagmembers); in dlopen_object()
3364 if (result == -1 || relocate_object_dag(obj, in dlopen_object()
3368 dlopen_cleanup(obj, lockstate); in dlopen_object()
3369 obj = NULL; in dlopen_object()
3382 initlist_add_objects(obj, obj, &initlist); in dlopen_object()
3390 if (obj != NULL) in dlopen_object()
3391 process_z(obj); in dlopen_object()
3399 init_dag(obj); in dlopen_object()
3400 ref_dag(obj); in dlopen_object()
3405 if (obj != NULL && ((lo_flags & RTLD_LO_NODELETE) != 0 || in dlopen_object()
3406 obj->z_nodelete) && !obj->ref_nodel) { in dlopen_object()
3407 dbg("obj %s nodelete", obj->path); in dlopen_object()
3408 ref_dag(obj); in dlopen_object()
3409 obj->z_nodelete = obj->ref_nodel = true; in dlopen_object()
3413 LD_UTRACE(UTRACE_DLOPEN_STOP, obj, NULL, 0, obj ? obj->dl_refcount : 0, in dlopen_object()
3415 GDB_STATE(RT_CONSISTENT,obj ? &obj->linkmap : NULL); in dlopen_object()
3419 if (obj != NULL) in dlopen_object()
3427 dlopen_cleanup(obj, lockstate); in dlopen_object()
3440 return obj; in dlopen_object()
3442 trace_loaded_objects(obj); in dlopen_object()
3453 const Obj_Entry *obj, *defobj; in do_dlsym() local
3475 if ((obj = obj_from_addr(retaddr)) == NULL) { in do_dlsym()
3482 res = symlook_obj(&req, obj); in do_dlsym()
3490 obj = globallist_next(obj); in do_dlsym()
3491 for (; obj != NULL; obj = TAILQ_NEXT(obj, next)) { in do_dlsym()
3492 if (obj->marker) in do_dlsym()
3494 res = symlook_obj(&req, obj); in do_dlsym()
3519 res = symlook_default(&req, obj); in do_dlsym()
3526 if ((obj = dlcheck(handle)) == NULL) { in do_dlsym()
3533 if (obj->mainprog) { in do_dlsym()
3555 res = symlook_list(&req, &obj->dagmembers, &donelist); in do_dlsym()
3628 const Obj_Entry *obj; in _rtld_addr_phdr() local
3632 obj = obj_from_addr(addr); in _rtld_addr_phdr()
3633 if (obj == NULL) { in _rtld_addr_phdr()
3638 rtld_fill_dl_phdr_info(obj, phdr_info); in _rtld_addr_phdr()
3646 const Obj_Entry *obj; in dladdr() local
3653 obj = obj_from_addr(addr); in dladdr()
3654 if (obj == NULL) { in dladdr()
3659 info->dli_fname = obj->path; in dladdr()
3660 info->dli_fbase = obj->mapbase; in dladdr()
3668 for (symoffset = 0; symoffset < obj->dynsymcount; symoffset++) { in dladdr()
3669 def = obj->symtab + symoffset; in dladdr()
3683 symbol_addr = obj->relocbase + def->st_value; in dladdr()
3688 info->dli_sname = obj->strtab + def->st_name; in dladdr()
3702 const Obj_Entry *obj; in dlinfo() local
3712 if ((obj = obj_from_addr(retaddr)) == NULL) in dlinfo()
3715 obj = dlcheck(handle); in dlinfo()
3717 if (obj == NULL) { in dlinfo()
3725 *((struct link_map const **)p) = &obj->linkmap; in dlinfo()
3728 error = rtld_dirname(obj->path, p); in dlinfo()
3733 error = do_search_info(obj, request, (struct dl_serinfo *)p); in dlinfo()
3747 rtld_fill_dl_phdr_info(const Obj_Entry *obj, struct dl_phdr_info *phdr_info) in rtld_fill_dl_phdr_info() argument
3750 phdr_info->dlpi_addr = (Elf_Addr)obj->relocbase; in rtld_fill_dl_phdr_info()
3751 phdr_info->dlpi_name = obj->path; in rtld_fill_dl_phdr_info()
3752 phdr_info->dlpi_phdr = obj->phdr; in rtld_fill_dl_phdr_info()
3753 phdr_info->dlpi_phnum = obj->phsize / sizeof(obj->phdr[0]); in rtld_fill_dl_phdr_info()
3754 phdr_info->dlpi_tls_modid = obj->tlsindex; in rtld_fill_dl_phdr_info()
3755 phdr_info->dlpi_tls_data = obj->tlsinit; in rtld_fill_dl_phdr_info()
3764 Obj_Entry *obj, marker; in dl_iterate_phdr() local
3773 for (obj = globallist_curr(TAILQ_FIRST(&obj_list)); obj != NULL;) { in dl_iterate_phdr()
3774 TAILQ_INSERT_AFTER(&obj_list, obj, &marker, next); in dl_iterate_phdr()
3775 rtld_fill_dl_phdr_info(obj, &phdr_info); in dl_iterate_phdr()
3776 hold_object(obj); in dl_iterate_phdr()
3782 unhold_object(obj); in dl_iterate_phdr()
3783 obj = globallist_next(&marker); in dl_iterate_phdr()
3829 do_search_info(const Obj_Entry *obj, int request, struct dl_serinfo *info) in do_search_info() argument
3840 path_enumerate(obj->rpath, fill_search_info, NULL, &args); in do_search_info()
3842 path_enumerate(obj->runpath, fill_search_info, NULL, &args); in do_search_info()
3843 path_enumerate(gethints(obj->z_nodeflib), fill_search_info, NULL, &args); in do_search_info()
3844 if (!obj->z_nodeflib) in do_search_info()
3865 if (path_enumerate(obj->rpath, fill_search_info, NULL, &args) != NULL) in do_search_info()
3873 if (path_enumerate(obj->runpath, fill_search_info, NULL, &args) != NULL) in do_search_info()
3877 if (path_enumerate(gethints(obj->z_nodeflib), fill_search_info, NULL, &args) in do_search_info()
3882 if (!obj->z_nodeflib && path_enumerate(ld_standard_library_path, in do_search_info()
3948 linkmap_add(Obj_Entry *obj) in linkmap_add() argument
3950 struct link_map *l = &obj->linkmap; in linkmap_add()
3953 obj->linkmap.l_name = obj->path; in linkmap_add()
3954 obj->linkmap.l_addr = obj->mapbase; in linkmap_add()
3955 obj->linkmap.l_ld = obj->dynamic; in linkmap_add()
3958 obj->linkmap.l_offs = obj->relocbase; in linkmap_add()
3984 linkmap_delete(Obj_Entry *obj) in linkmap_delete() argument
3986 struct link_map *l = &obj->linkmap; in linkmap_delete()
4038 release_object(Obj_Entry *obj) in release_object() argument
4041 if (obj->holdcount > 0) { in release_object()
4042 obj->unholdfree = true; in release_object()
4045 munmap(obj->mapbase, obj->mapsize); in release_object()
4046 linkmap_delete(obj); in release_object()
4047 obj_free(obj); in release_object()
4121 res = symlook_list(&req1, &elm->obj->dagmembers, donelist); in symlook_global()
4171 res = symlook_list(&req1, &elm->obj->dagmembers, &donelist); in symlook_default()
4210 if (donelist_check(dlp, elm->obj)) in symlook_list()
4213 if ((res = symlook_obj(&req1, elm->obj)) == 0) { in symlook_list()
4249 if (n->obj == NULL || in symlook_needed()
4250 (res = symlook_list(&req1, &n->obj->dagmembers, dlp)) != 0) in symlook_needed()
4277 symlook_obj(SymLook *req, const Obj_Entry *obj) in symlook_obj() argument
4287 if (obj->valid_hash_gnu) in symlook_obj()
4288 mres = symlook_obj1_gnu(req, obj); in symlook_obj()
4289 else if (obj->valid_hash_sysv) in symlook_obj()
4290 mres = symlook_obj1_sysv(req, obj); in symlook_obj()
4295 if (obj->needed_filtees != NULL) { in symlook_obj()
4297 load_filtees(__DECONST(Obj_Entry *, obj), flags, req->lockstate); in symlook_obj()
4300 res = symlook_needed(&req1, obj->needed_filtees, &donelist); in symlook_obj()
4307 if (obj->needed_aux_filtees != NULL) { in symlook_obj()
4309 load_filtees(__DECONST(Obj_Entry *, obj), flags, req->lockstate); in symlook_obj()
4312 res = symlook_needed(&req1, obj->needed_aux_filtees, &donelist); in symlook_obj()
4325 matched_symbol(SymLook *req, const Obj_Entry *obj, Sym_Match_Result *result, in matched_symbol() argument
4332 symp = obj->symtab + symnum; in matched_symbol()
4333 strp = obj->strtab + symp->st_name; in matched_symbol()
4360 if (obj->versyms != NULL) { in matched_symbol()
4361 verndx = VER_NDX(obj->versyms[symnum]); in matched_symbol()
4362 if (verndx > obj->vernum) { in matched_symbol()
4365 obj->path, obj->strtab + symnum, verndx); in matched_symbol()
4387 if ((obj->versyms[symnum] & VER_NDX_HIDDEN) in matched_symbol()
4399 if (obj->versyms == NULL) { in matched_symbol()
4400 if (object_match_name(obj, req->ventry->name)) { in matched_symbol()
4402 "for symbol %s", obj_rtld.path, obj->path, in matched_symbol()
4403 req->ventry->name, obj->strtab + symnum); in matched_symbol()
4407 verndx = VER_NDX(obj->versyms[symnum]); in matched_symbol()
4408 if (verndx > obj->vernum) { in matched_symbol()
4410 obj->path, obj->strtab + symnum, verndx); in matched_symbol()
4413 if (obj->vertab[verndx].hash != req->ventry->hash || in matched_symbol()
4414 strcmp(obj->vertab[verndx].name, req->ventry->name)) { in matched_symbol()
4426 (obj->versyms[symnum] & VER_NDX_HIDDEN)) in matched_symbol()
4440 symlook_obj1_sysv(SymLook *req, const Obj_Entry *obj) in symlook_obj1_sysv() argument
4449 for (symnum = obj->buckets[req->hash % obj->nbuckets]; in symlook_obj1_sysv()
4450 symnum != STN_UNDEF; symnum = obj->chains[symnum]) { in symlook_obj1_sysv()
4451 if (symnum >= obj->nchains) in symlook_obj1_sysv()
4454 if (matched_symbol(req, obj, &matchres, symnum)) { in symlook_obj1_sysv()
4456 req->defobj_out = obj; in symlook_obj1_sysv()
4462 req->defobj_out = obj; in symlook_obj1_sysv()
4470 symlook_obj1_gnu(SymLook *req, const Obj_Entry *obj) in symlook_obj1_gnu() argument
4484 bloom_word = obj->bloom_gnu[(req->hash_gnu / __ELF_WORD_SIZE) & in symlook_obj1_gnu()
4485 obj->maskwords_bm_gnu]; in symlook_obj1_gnu()
4489 h2 = ((req->hash_gnu >> obj->shift2_gnu) & (__ELF_WORD_SIZE - 1)); in symlook_obj1_gnu()
4496 bucket = obj->buckets_gnu[req->hash_gnu % obj->nbuckets_gnu]; in symlook_obj1_gnu()
4499 hashval = &obj->chain_zero_gnu[bucket]; in symlook_obj1_gnu()
4502 symnum = hashval - obj->chain_zero_gnu; in symlook_obj1_gnu()
4503 if (matched_symbol(req, obj, &matchres, symnum)) { in symlook_obj1_gnu()
4505 req->defobj_out = obj; in symlook_obj1_gnu()
4512 req->defobj_out = obj; in symlook_obj1_gnu()
4519 trace_loaded_objects(Obj_Entry *obj) in trace_loaded_objects() argument
4535 for (; obj != NULL; obj = TAILQ_NEXT(obj, next)) { in trace_loaded_objects()
4540 if (obj->marker) in trace_loaded_objects()
4542 if (list_containers && obj->needed != NULL) in trace_loaded_objects()
4543 rtld_printf("%s:\n", obj->path); in trace_loaded_objects()
4544 for (needed = obj->needed; needed; needed = needed->next) { in trace_loaded_objects()
4545 if (needed->obj != NULL) { in trace_loaded_objects()
4546 if (needed->obj->traced && !list_containers) in trace_loaded_objects()
4548 needed->obj->traced = true; in trace_loaded_objects()
4549 path = needed->obj->path; in trace_loaded_objects()
4553 name = obj->strtab + needed->name; in trace_loaded_objects()
4603 rtld_printf("%p", needed->obj ? needed->obj->mapbase : in trace_loaded_objects()
4624 Obj_Entry marker, *obj, *next; in unload_object() local
4635 for (obj = TAILQ_FIRST(&obj_list); obj != NULL; obj = next) { in unload_object()
4636 next = TAILQ_NEXT(obj, next); in unload_object()
4637 if (obj->marker || obj->refcount != 0) in unload_object()
4639 LD_UTRACE(UTRACE_UNLOAD_OBJECT, obj, obj->mapbase, in unload_object()
4640 obj->mapsize, 0, obj->path); in unload_object()
4641 dbg("unloading \"%s\"", obj->path); in unload_object()
4647 TAILQ_REMOVE(&obj_list, obj, next); in unload_object()
4650 if (obj->filtees_loaded) { in unload_object()
4654 unload_filtees(obj, lockstate); in unload_object()
4658 unload_filtees(obj, lockstate); in unload_object()
4660 release_object(obj); in unload_object()
4675 objlist_remove(&elm->obj->dldags, root); in unlink_object()
4676 if (elm->obj != root) in unlink_object()
4677 unlink_object(elm->obj); in unlink_object()
4689 elm->obj->refcount++; in ref_dag()
4699 elm->obj->refcount--; in unref_dag()
4789 Obj_Entry *obj; in allocate_tls() local
4834 for (obj = globallist_curr(objs); obj != NULL; in allocate_tls()
4835 obj = globallist_next(obj)) { in allocate_tls()
4836 if (obj->tlsoffset > 0) { in allocate_tls()
4837 addr = (Elf_Addr)tcb + obj->tlsoffset; in allocate_tls()
4838 if (obj->tlsinitsize > 0) in allocate_tls()
4839 memcpy((void*) addr, obj->tlsinit, obj->tlsinitsize); in allocate_tls()
4840 if (obj->tlssize > obj->tlsinitsize) in allocate_tls()
4841 memset((void*)(addr + obj->tlsinitsize), 0, in allocate_tls()
4842 obj->tlssize - obj->tlsinitsize); in allocate_tls()
4843 dtv[obj->tlsindex + 1] = addr; in allocate_tls()
4889 Obj_Entry *obj; in allocate_tls() local
4939 for (obj = objs; obj != NULL; obj = TAILQ_NEXT(obj, next)) { in allocate_tls()
4940 if (obj->marker || obj->tlsoffset == 0) in allocate_tls()
4942 addr = segbase - obj->tlsoffset; in allocate_tls()
4943 memset((void*)(addr + obj->tlsinitsize), in allocate_tls()
4944 0, obj->tlssize - obj->tlsinitsize); in allocate_tls()
4945 if (obj->tlsinit) { in allocate_tls()
4946 memcpy((void*) addr, obj->tlsinit, obj->tlsinitsize); in allocate_tls()
4947 obj->static_tls_copied = true; in allocate_tls()
4949 dtv[obj->tlsindex + 1] = addr; in allocate_tls()
4995 Obj_Entry* obj; in allocate_module_tls() local
4998 TAILQ_FOREACH(obj, &obj_list, next) { in allocate_module_tls()
4999 if (obj->marker) in allocate_module_tls()
5001 if (obj->tlsindex == index) in allocate_module_tls()
5004 if (!obj) { in allocate_module_tls()
5009 p = malloc_aligned(obj->tlssize, obj->tlsalign); in allocate_module_tls()
5010 memcpy(p, obj->tlsinit, obj->tlsinitsize); in allocate_module_tls()
5011 memset(p + obj->tlsinitsize, 0, obj->tlssize - obj->tlsinitsize); in allocate_module_tls()
5017 allocate_tls_offset(Obj_Entry *obj) in allocate_tls_offset() argument
5021 if (obj->tls_done) in allocate_tls_offset()
5024 if (obj->tlssize == 0) { in allocate_tls_offset()
5025 obj->tls_done = true; in allocate_tls_offset()
5030 off = calculate_first_tls_offset(obj->tlssize, obj->tlsalign); in allocate_tls_offset()
5033 obj->tlssize, obj->tlsalign); in allocate_tls_offset()
5042 if (calculate_tls_end(off, obj->tlssize) > tls_static_space) in allocate_tls_offset()
5044 } else if (obj->tlsalign > tls_static_max_align) { in allocate_tls_offset()
5045 tls_static_max_align = obj->tlsalign; in allocate_tls_offset()
5048 tls_last_offset = obj->tlsoffset = off; in allocate_tls_offset()
5049 tls_last_size = obj->tlssize; in allocate_tls_offset()
5050 obj->tls_done = true; in allocate_tls_offset()
5056 free_tls_offset(Obj_Entry *obj) in free_tls_offset() argument
5065 if (calculate_tls_end(obj->tlsoffset, obj->tlssize) in free_tls_offset()
5067 tls_last_offset -= obj->tlssize; in free_tls_offset()
5096 object_add_name(Obj_Entry *obj, const char *name) in object_add_name() argument
5106 STAILQ_INSERT_TAIL(&obj->names, entry, link); in object_add_name()
5111 object_match_name(const Obj_Entry *obj, const char *name) in object_match_name() argument
5115 STAILQ_FOREACH(entry, &obj->names, link) { in object_match_name()
5123 locate_dependency(const Obj_Entry *obj, const char *name) in locate_dependency() argument
5129 if (object_match_name(entry->obj, name)) in locate_dependency()
5130 return entry->obj; in locate_dependency()
5133 for (needed = obj->needed; needed != NULL; needed = needed->next) { in locate_dependency()
5134 if (strcmp(obj->strtab + needed->name, name) == 0 || in locate_dependency()
5135 (needed->obj != NULL && object_match_name(needed->obj, name))) { in locate_dependency()
5143 return (needed->obj); in locate_dependency()
5147 obj->path, name); in locate_dependency()
5189 rtld_verify_object_versions(Obj_Entry *obj) in rtld_verify_object_versions() argument
5198 if (obj->ver_checked) in rtld_verify_object_versions()
5200 obj->ver_checked = true; in rtld_verify_object_versions()
5208 vn = obj->verneed; in rtld_verify_object_versions()
5212 obj->path, vn->vn_version); in rtld_verify_object_versions()
5229 vd = obj->verdef; in rtld_verify_object_versions()
5233 obj->path, vd->vd_version); in rtld_verify_object_versions()
5252 obj->vernum = maxvernum + 1; in rtld_verify_object_versions()
5253 obj->vertab = xcalloc(obj->vernum, sizeof(Ver_Entry)); in rtld_verify_object_versions()
5255 vd = obj->verdef; in rtld_verify_object_versions()
5261 obj->vertab[vernum].hash = vd->vd_hash; in rtld_verify_object_versions()
5262 obj->vertab[vernum].name = obj->strtab + vda->vda_name; in rtld_verify_object_versions()
5263 obj->vertab[vernum].file = NULL; in rtld_verify_object_versions()
5264 obj->vertab[vernum].flags = 0; in rtld_verify_object_versions()
5271 vn = obj->verneed; in rtld_verify_object_versions()
5273 depobj = locate_dependency(obj, obj->strtab + vn->vn_file); in rtld_verify_object_versions()
5278 if (check_object_provided_version(obj, depobj, vna)) in rtld_verify_object_versions()
5282 obj->vertab[vernum].hash = vna->vna_hash; in rtld_verify_object_versions()
5283 obj->vertab[vernum].name = obj->strtab + vna->vna_name; in rtld_verify_object_versions()
5284 obj->vertab[vernum].file = obj->strtab + vn->vn_file; in rtld_verify_object_versions()
5285 obj->vertab[vernum].flags = (vna->vna_other & VER_NEED_HIDDEN) ? in rtld_verify_object_versions()
5310 if (entry->obj->strtab == NULL || entry->obj->vertab != NULL) in rtld_verify_versions()
5312 if (rtld_verify_object_versions(entry->obj) == -1) { in rtld_verify_versions()
5324 fetch_ventry(const Obj_Entry *obj, unsigned long symnum) in fetch_ventry() argument
5328 if (obj->vertab) { in fetch_ventry()
5329 vernum = VER_NDX(obj->versyms[symnum]); in fetch_ventry()
5330 if (vernum >= obj->vernum) { in fetch_ventry()
5332 obj->path, obj->strtab + symnum, vernum); in fetch_ventry()
5333 } else if (obj->vertab[vernum].hash != 0) { in fetch_ventry()
5334 return &obj->vertab[vernum]; in fetch_ventry()
5350 Obj_Entry *obj; in _rtld_is_dlopened() local
5355 obj = dlcheck(arg); in _rtld_is_dlopened()
5356 if (obj == NULL) in _rtld_is_dlopened()
5357 obj = obj_from_addr(arg); in _rtld_is_dlopened()
5358 if (obj == NULL) { in _rtld_is_dlopened()
5363 res = obj->dlopened ? 1 : 0; in _rtld_is_dlopened()
5369 obj_remap_relro(Obj_Entry *obj, int prot) in obj_remap_relro() argument
5372 if (obj->relro_size > 0 && mprotect(obj->relro_page, obj->relro_size, in obj_remap_relro()
5375 obj->path, prot, rtld_strerror(errno)); in obj_remap_relro()
5382 obj_disable_relro(Obj_Entry *obj) in obj_disable_relro() argument
5385 return (obj_remap_relro(obj, PROT_READ | PROT_WRITE)); in obj_disable_relro()
5389 obj_enforce_relro(Obj_Entry *obj) in obj_enforce_relro() argument
5392 return (obj_remap_relro(obj, PROT_READ)); in obj_enforce_relro()
5414 Obj_Entry *obj; in distribute_static_tls() local
5422 obj = elm->obj; in distribute_static_tls()
5423 if (obj->marker || !obj->tls_done || obj->static_tls_copied) in distribute_static_tls()
5425 distrib(obj->tlsoffset, obj->tlsinit, obj->tlsinitsize, in distribute_static_tls()
5426 obj->tlssize); in distribute_static_tls()
5427 obj->static_tls_copied = true; in distribute_static_tls()