• Home
  • Raw
  • Download

Lines Matching +full:dlclose +full:- +full:skip

85 #define MAXP2(a,b) (-(-(a)&-(b)))
86 #define ALIGN(x,y) ((x)+(y)-1 & -(y))
89 size_t f = bloomwords[gho & (ght[2] - 1)]; \
94 #define container_of(p,t,m) ((t*)((char *)(p)-offsetof(t,m)))
106 #define INVALID_FD_INHIBIT_FURTHER_SEARCH (-2)
123 /* Used for dlclose */
277 app->namespace = default_ns; in init_default_namespace()
296 ns_set_separated(ns, conf->get_separated(ns->ns_name)); in set_ns_attrs()
298 lib_paths = conf->get_lib_paths(ns->ns_name); in set_ns_attrs()
301 asan_lib_paths = conf->get_asan_lib_paths(ns->ns_name); in set_ns_attrs()
304 permitted_paths = conf->get_permitted_paths(ns->ns_name); in set_ns_attrs()
307 asan_permitted_paths = conf->get_asan_permitted_paths(ns->ns_name); in set_ns_attrs()
310 allowed_libs = conf->get_allowed_libs(ns->ns_name); in set_ns_attrs()
321 ns->ns_name, ns->separated, ns->lib_paths, ns->asan_lib_paths, permitted_paths, in set_ns_attrs()
331 strlist *inherits = conf->get_inherits(ns->ns_name); in set_ns_inherits()
333 for (size_t i = 0; i < inherits->num; i++) { in set_ns_inherits()
334 ns_t *inherited_ns = find_ns_by_name(inherits->strs[i]); in set_ns_inherits()
336 char *shared_libs = conf->get_inherit_shared_libs(ns->ns_name, inherited_ns->ns_name); in set_ns_inherits()
343 inherited_ns->ns_name, inherited_ns->separated, inherited_ns->lib_paths, in set_ns_inherits()
344 inherited_ns->asan_lib_paths); in set_ns_inherits()
357 strcpy(app_path, app->name); in init_namespace()
369 char file_path[sizeof "/etc/ld-musl-namespace-" + sizeof (LDSO_ARCH) + sizeof ".ini" + 1] = {0}; in init_namespace()
370 (void)snprintf(file_path, sizeof file_path, "/etc/ld-musl-namespace-%s.ini", LDSO_ARCH); in init_namespace()
374 int ret = conf->parse(file_path, app_path); in init_namespace()
400 strlist *s_ns = conf->get_namespaces(); in init_namespace()
402 for (size_t i = 0; i < s_ns->num; i++) { in init_namespace()
404 ns_set_name(ns, s_ns->strs[i]); in init_namespace()
413 for (size_t i = 0; i < nsl->num; i++) { in init_namespace()
414 set_ns_inherits(nsl->nss[i], conf); in init_namespace()
426 if (!p->loadmap) return p->base + v; in laddr()
427 for (j=0; v-p->loadmap->segs[j].p_vaddr >= p->loadmap->segs[j].p_memsz; j++); in laddr()
428 return (void *)(v - p->loadmap->segs[j].p_vaddr + p->loadmap->segs[j].addr); in laddr()
434 if (!p->loadmap) return p->base + v; in laddr_pg()
436 size_t a = p->loadmap->segs[j].p_vaddr; in laddr_pg()
437 size_t b = a + p->loadmap->segs[j].p_memsz; in laddr_pg()
438 a &= -pgsz; in laddr_pg()
439 b += pgsz-1; in laddr_pg()
440 b &= -pgsz; in laddr_pg()
441 if (v-a<b-a) break; in laddr_pg()
443 return (void *)(v - p->loadmap->segs[j].p_vaddr + p->loadmap->segs[j].addr); in laddr_pg()
452 laddr(p, v), (p)->got }))
454 #define laddr(p, v) (void *)((p)->base + (v))
463 for (; v[0]; v+=2) if (v[0]-1<cnt-1) { in decode_vec()
486 if ((verdef->vd_ndx & 0x7fff) == vsym) { in check_vna_hash()
487 if (vna_hash == verdef->vd_hash) { in check_vna_hash()
495 if (verdef->vd_next == 0) { in check_vna_hash()
498 verdef = (Verdef *)((char *)verdef + verdef->vd_next); in check_vna_hash()
512 if (strlen(verinfo->v) == 0) { in check_verinfo()
515 LD_LOGD("check_verinfo versym or def is null and verinfo->v exist, s:%{public}s v:%{public}s.", in check_verinfo()
516 verinfo->s, verinfo->v); in check_verinfo()
524 if (verinfo->use_vna_hash) { in check_verinfo()
526 return check_vna_hash(def, vsym, verinfo->vna_hash); in check_verinfo()
531 if (strlen(verinfo->v) == 0) { in check_verinfo()
535 LD_LOGD("check_verinfo not default version. vsym:%{public}d s:%{public}s", vsym, verinfo->s); in check_verinfo()
543 if (!(def->vd_flags & VER_FLG_BASE) && (def->vd_ndx & 0x7fff) == vsym) { in check_verinfo()
546 if (def->vd_next == 0) { in check_verinfo()
549 def = (Verdef *)((char *)def + def->vd_next); in check_verinfo()
552 Verdaux *aux = (Verdaux *)((char *)def + def->vd_aux); in check_verinfo()
554 int ret = !strcmp(verinfo->v, strings + aux->vda_name); in check_verinfo()
558 verinfo->s, verinfo->v, vsym, strings + aux->vda_name); in check_verinfo()
574 s_info_p.sym_l = (char *)s - s0; in sysv_hash()
586 s_info_p.sym_l = (char *)s - s0; in gnu_hash()
594 Sym *syms = dso->syms; in sysv_lookup()
595 Elf_Symndx *hashtab = dso->hashtab; in sysv_lookup()
596 char *strings = dso->strings; in sysv_lookup()
598 if ((!dso->versym || (dso->versym[i] & 0x7fff) >= 0) in sysv_lookup()
599 && (!memcmp(verinfo->s, strings+syms[i].st_name, s_info_p.sym_l))) { in sysv_lookup()
600 if (!check_verinfo(dso->verdef, dso->versym, i, verinfo, dso->strings)) { in sysv_lookup()
610 dso->name, verinfo->s, verinfo->v, verinfo->use_vna_hash, verinfo->vna_hash); in sysv_lookup()
622 …D("gnu_lookup symbol not found (bloom filter), so:%{public}s s:%{public}s", dso->name, verinfo->s); in gnu_lookup()
626 uint32_t *hashval = buckets + nbuckets + (i - hashtab[1]); in gnu_lookup()
630 if ((h1 == (h2|1)) && (!dso->versym || (dso->versym[i] & 0x7fff) >= 0) in gnu_lookup()
631 && !memcmp(verinfo->s, dso->strings + dso->syms[i].st_name, s_info_p.sym_l)) { in gnu_lookup()
632 if (!check_verinfo(dso->verdef, dso->versym, i, verinfo, dso->strings)) { in gnu_lookup()
636 return dso->syms+i; in gnu_lookup()
644 dso->name, verinfo->s, verinfo->v, verinfo->use_vna_hash, verinfo->vna_hash); in gnu_lookup()
650 if (!dso || !dso->namespace || !ns) { in check_sym_accessible()
654 if (dso->namespace == ns) { in check_sym_accessible()
657 for (int i = 0; i < dso->parents_count; i++) { in check_sym_accessible()
658 if (dso->parents[i]->namespace == ns) { in check_sym_accessible()
663 …"check_sym_accessible dso name [%{public}s] ns_name [%{public}s] not accessible!", dso->name, ns->… in check_sym_accessible()
669 if (dso->namespace == ns) { in is_dso_accessible()
672 for (int i = 0; i < dso->parents_count; i++) { in is_dso_accessible()
673 if (dso->parents[i]->namespace == ns) { in is_dso_accessible()
678 …"check_sym_accessible dso name [%{public}s] ns_name [%{public}s] not accessible!", dso->name, ns->… in is_dso_accessible()
684 int index = -1; in find_dso_parent()
685 for (int i = 0; i < p->parents_count; i++) { in find_dso_parent()
686 if (p->parents[i] == target) { in find_dso_parent()
697 if (index != -1) { in add_dso_parent()
700 if (p->parents_count + 1 > p->parents_capacity) { in add_dso_parent()
701 if (p->parents_capacity == 0) { in add_dso_parent()
702 p->parents = (struct dso **)malloc(sizeof(struct dso *) * PARENTS_BASE_CAPACITY); in add_dso_parent()
703 if (!p->parents) { in add_dso_parent()
706 p->parents_capacity = PARENTS_BASE_CAPACITY; in add_dso_parent()
709 p->parents, sizeof(struct dso *) * (p->parents_capacity + PARENTS_BASE_CAPACITY)); in add_dso_parent()
713 p->parents = realloced; in add_dso_parent()
714 p->parents_capacity += PARENTS_BASE_CAPACITY; in add_dso_parent()
717 p->parents[p->parents_count] = parent; in add_dso_parent()
718 p->parents_count++; in add_dso_parent()
724 if (index == -1) { in remove_dso_parent()
729 p->parents[i] = p->parents[i]; in remove_dso_parent()
731 for (i = index; i < p->parents_count - 1; i++) { in remove_dso_parent()
732 p->parents[i] = p->parents[i + 1]; in remove_dso_parent()
734 p->parents_count--; in remove_dso_parent()
739 if (p->reloc_can_search_dso_count + 1 > p->reloc_can_search_dso_capacity) { in add_reloc_can_search_dso()
740 if (p->reloc_can_search_dso_capacity == 0) { in add_reloc_can_search_dso()
741 p->reloc_can_search_dso_list = in add_reloc_can_search_dso()
743 if (!p->reloc_can_search_dso_list) { in add_reloc_can_search_dso()
746 p->reloc_can_search_dso_capacity = RELOC_CAN_SEARCH_DSO_BASE_CAPACITY; in add_reloc_can_search_dso()
749 p->reloc_can_search_dso_list, in add_reloc_can_search_dso()
750 sizeof(struct dso *) * (p->reloc_can_search_dso_capacity + RELOC_CAN_SEARCH_DSO_BASE_CAPACITY)); in add_reloc_can_search_dso()
754 p->reloc_can_search_dso_list = realloced; in add_reloc_can_search_dso()
755 p->reloc_can_search_dso_capacity += RELOC_CAN_SEARCH_DSO_BASE_CAPACITY; in add_reloc_can_search_dso()
758 p->reloc_can_search_dso_list[p->reloc_can_search_dso_count] = can_search_so; in add_reloc_can_search_dso()
759 p->reloc_can_search_dso_count++; in add_reloc_can_search_dso()
764 if (p->reloc_can_search_dso_list) { in free_reloc_can_search_dso()
765 free(p->reloc_can_search_dso_list); in free_reloc_can_search_dso()
766 p->reloc_can_search_dso_list = NULL; in free_reloc_can_search_dso()
767 p->reloc_can_search_dso_count = 0; in free_reloc_can_search_dso()
768 p->reloc_can_search_dso_capacity = 0; in free_reloc_can_search_dso()
773 * - The is_global flag of the so is true which means accessible by default.
775 * - We only check whether ns is accessible for the so if is_reloc_head_so_dep is true.
782 for (; p; p = p->syms_next) { in add_can_search_so_list_in_dso()
783 if (p->is_global) { in add_can_search_so_list_in_dso()
788 if (p->is_reloc_head_so_dep) { in add_can_search_so_list_in_dso()
789 if (dso_relocating->namespace && check_sym_accessible(p, dso_relocating->namespace)) { in add_can_search_so_list_in_dso()
822 if ((ght = dso->ghashtab)) { in find_sym_impl()
824 size_t f = bloomwords[gho & (ght[2] - 1)]; in find_sym_impl()
835 s_info_s = sysv_hash(verinfo->s); in find_sym_impl()
843 if (!sym->st_shndx) in find_sym_impl()
844 if (need_def || (sym->st_info & 0xf) == STT_TLS || ARCH_SYM_REJECT_UND(sym)) in find_sym_impl()
847 if (!sym->st_value) in find_sym_impl()
848 if ((sym->st_info & 0xf) != STT_TLS) in find_sym_impl()
851 if (!(1 << (sym->st_info & 0xf) & OK_TYPES)) in find_sym_impl()
854 if (!(1 << (sym->st_info >> 4) & OK_BINDS)) in find_sym_impl()
864 struct sym_info_pair s_info_g = gnu_hash(verinfo->s); in find_sym2()
869 struct dso **deps = use_deps ? dso->deps : 0; in find_sym2()
870 for (; dso; dso=use_deps ? *deps++ : dso->syms_next) { in find_sym2()
873 if (!dso->is_preload && ns && !check_sym_accessible(dso, ns)) { in find_sym2()
876 if ((ght = dso->ghashtab)) { in find_sym2()
880 if (!s_info_s.sym_h) s_info_s = sysv_hash(verinfo->s); in find_sym2()
885 if (!sym->st_shndx) in find_sym2()
886 if (need_def || (sym->st_info&0xf) == STT_TLS in find_sym2()
889 if (!sym->st_value) in find_sym2()
890 if ((sym->st_info&0xf) != STT_TLS) in find_sym2()
892 if (!(1<<(sym->st_info&0xf) & OK_TYPES)) continue; in find_sym2()
893 if (!(1<<(sym->st_info>>4) & OK_BINDS)) continue; in find_sym2()
903 struct sym_info_pair s_info_g = gnu_hash(verinfo->s); in find_sym_by_deps()
908 struct dso **deps = dso->deps; in find_sym_by_deps()
914 if ((ght = dso->ghashtab)) { in find_sym_by_deps()
918 if (!s_info_s.sym_h) s_info_s = sysv_hash(verinfo->s); in find_sym_by_deps()
923 if (!sym->st_shndx) in find_sym_by_deps()
924 if (need_def || (sym->st_info&0xf) == STT_TLS in find_sym_by_deps()
927 if (!sym->st_value) in find_sym_by_deps()
928 if ((sym->st_info&0xf) != STT_TLS) in find_sym_by_deps()
930 if (!(1<<(sym->st_info&0xf) & OK_TYPES)) continue; in find_sym_by_deps()
931 if (!(1<<(sym->st_info>>4) & OK_BINDS)) continue; in find_sym_by_deps()
942 struct sym_info_pair s_info_g = gnu_hash(verinfo->s); in find_sym_by_saved_so_list()
947 // skip head dso. in find_sym_by_saved_so_list()
950 for (int i = start_search_index; i < dso_relocating->reloc_can_search_dso_count; i++) { in find_sym_by_saved_so_list()
951 dso_searching = dso_relocating->reloc_can_search_dso_list[i]; in find_sym_by_saved_so_list()
953 if ((ght = dso_searching->ghashtab)) { in find_sym_by_saved_so_list()
957 if (!s_info_s.sym_h) s_info_s = sysv_hash(verinfo->s); in find_sym_by_saved_so_list()
961 if (!sym->st_shndx) in find_sym_by_saved_so_list()
962 if (need_def || (sym->st_info&0xf) == STT_TLS in find_sym_by_saved_so_list()
965 if (!sym->st_value) in find_sym_by_saved_so_list()
966 if ((sym->st_info&0xf) != STT_TLS) in find_sym_by_saved_so_list()
968 if (!(1<<(sym->st_info&0xf) & OK_TYPES)) continue; in find_sym_by_saved_so_list()
969 if (!(1<<(sym->st_info>>4) & OK_BINDS)) continue; in find_sym_by_saved_so_list()
985 if (!dso->versym || !dso->verneed) { in get_vna_hash()
989 uint16_t vsym = dso->versym[sym_index]; in get_vna_hash()
995 Verneed *verneed = dso->verneed; in get_vna_hash()
1000 vernaux = (Vernaux *)((char *)verneed + verneed->vn_aux); in get_vna_hash()
1002 for (size_t cnt = 0; cnt < verneed->vn_cnt; cnt++) { in get_vna_hash()
1003 if ((vernaux->vna_other & 0x7fff) == vsym) { in get_vna_hash()
1005 *vna_hash = vernaux->vna_hash; in get_vna_hash()
1009 vernaux = (Vernaux *)((char *)vernaux + vernaux->vna_next); in get_vna_hash()
1016 if (verneed->vn_next == 0) { in get_vna_hash()
1020 verneed = (Verneed *)((char *)verneed + verneed->vn_next); in get_vna_hash()
1027 char *strings = dso->strings; in get_verinfo()
1029 int16_t vsym = dso->versym[sym_index]; in get_verinfo()
1030 Verdef *verdef = dso->verdef; in get_verinfo()
1040 if (!(verdef->vd_flags & VER_FLG_BASE) && (verdef->vd_ndx & 0x7fff) == vsym) { in get_verinfo()
1044 if (verdef->vd_next == 0) { in get_verinfo()
1047 verdef = (Verdef *)((char *)verdef + verdef->vd_next); in get_verinfo()
1050 Verdaux *aux = (Verdaux *)((char *)verdef + verdef->vd_aux); in get_verinfo()
1051 if (aux && aux->vda_name && strings && (dso->strings + aux->vda_name)) { in get_verinfo()
1052 vinfo->v = dso->strings + aux->vda_name; in get_verinfo()
1059 unsigned char *base = dso->base; in do_relocs()
1060 Sym *syms = dso->syms; in do_relocs()
1061 char *strings = dso->strings; in do_relocs()
1081 for (; rel_size; rel+=stride, rel_size-=stride*sizeof(size_t)) { in do_relocs()
1082 if (skip_relative && IS_RELATIVE(rel[1], dso->syms)) continue; in do_relocs()
1105 name = strings + sym->st_name; in do_relocs()
1106 ctx = type==REL_COPY ? head->syms_next : head; in do_relocs()
1110 if (!vinfo.use_vna_hash && dso->versym && (dso->versym[sym_index] & 0x7fff) >= 0) { in do_relocs()
1113 if (dso->cache_sym_index == sym_index) { in do_relocs()
1114 def = (struct symdef){ .dso = dso->cache_dso, .sym = dso->cache_sym }; in do_relocs()
1116 def = (sym->st_info>>4) == STB_LOCAL in do_relocs()
1119 : find_sym2(ctx, &vinfo, type==REL_PLT, 0, dso->namespace); in do_relocs()
1120 dso->cache_sym_index = sym_index; in do_relocs()
1121 dso->cache_dso = def.dso; in do_relocs()
1122 dso->cache_sym = def.sym; in do_relocs()
1125 if (!def.sym && (sym->st_shndx != SHN_UNDEF in do_relocs()
1126 || sym->st_info>>4 != STB_WEAK)) { in do_relocs()
1127 if (dso->lazy && (type==REL_PLT || type==REL_GOT)) { in do_relocs()
1128 dso->lazy[3*dso->lazy_cnt+0] = rel[0]; in do_relocs()
1129 dso->lazy[3*dso->lazy_cnt+1] = rel[1]; in do_relocs()
1130 dso->lazy[3*dso->lazy_cnt+2] = addend; in do_relocs()
1131 dso->lazy_cnt++; in do_relocs()
1136 dso->name, name, vinfo.use_vna_hash, vinfo.vna_hash); in do_relocs()
1138 dso->name, name); in do_relocs()
1148 sym_val = def.sym ? (size_t)laddr(def.dso, def.sym->st_value) : 0; in do_relocs()
1149 tls_val = def.sym ? def.sym->st_value : 0; in do_relocs()
1152 && def.dso->tls_id > static_tls_cnt) { in do_relocs()
1153 error("Error relocating %s: %s: initial-exec TLS " in do_relocs()
1155 dso->name, name, def.dso->name); in do_relocs()
1161 addend -= (size_t)reloc_addr; in do_relocs()
1178 memcpy(reloc_addr, (void *)sym_val, sym->st_size); in do_relocs()
1182 - (size_t)reloc_addr; in do_relocs()
1185 *reloc_addr = def.sym ? (size_t)(def.dso->funcdescs in do_relocs()
1186 + (def.sym - def.dso->syms)) : 0; in do_relocs()
1189 if ((sym->st_info&0xf) == STT_SECTION) *reloc_addr += sym_val; in do_relocs()
1191 reloc_addr[1] = def.sym ? (size_t)def.dso->got : 0; in do_relocs()
1194 *reloc_addr = def.dso->tls_id; in do_relocs()
1197 *reloc_addr = tls_val + addend - DTP_OFFSET; in do_relocs()
1201 *reloc_addr = tls_val + def.dso->tls.offset + TPOFF_K + addend; in do_relocs()
1205 *reloc_addr = tls_val - def.dso->tls.offset + addend; in do_relocs()
1208 *reloc_addr = def.dso->tls.offset - tls_val + addend; in do_relocs()
1213 if (def.dso->tls_id > static_tls_cnt) { in do_relocs()
1218 dso->name, sym ? name : "(local)" ); in do_relocs()
1221 new->next = dso->td_index; in do_relocs()
1222 dso->td_index = new; in do_relocs()
1223 new->args[0] = def.dso->tls_id; in do_relocs()
1224 new->args[1] = tls_val + addend - DTP_OFFSET; in do_relocs()
1230 reloc_addr[1] = tls_val + def.dso->tls.offset in do_relocs()
1233 reloc_addr[1] = tls_val - def.dso->tls.offset in do_relocs()
1237 /* Some archs (32-bit ARM at least) invert the order of in do_relocs()
1247 dso->name, type); in do_relocs()
1259 next = p->lazy_next; in redo_lazy_relocs()
1260 size_t size = p->lazy_cnt*3*sizeof(size_t); in redo_lazy_relocs()
1261 p->lazy_cnt = 0; in redo_lazy_relocs()
1262 do_relocs(p, p->lazy, size, 3); in redo_lazy_relocs()
1263 if (p->lazy_cnt) { in redo_lazy_relocs()
1264 p->lazy_next = lazy_head; in redo_lazy_relocs()
1267 free(p->lazy); in redo_lazy_relocs()
1268 p->lazy = 0; in redo_lazy_relocs()
1269 p->lazy_next = 0; in redo_lazy_relocs()
1281 if (start >= dso->relro_start && start < dso->relro_end) start = dso->relro_end; in reclaim()
1282 if (end >= dso->relro_start && end < dso->relro_end) end = dso->relro_start; in reclaim()
1285 __malloc_donate(base, base+(end-start)); in reclaim()
1290 Phdr *ph = dso->phdr; in reclaim_gaps()
1291 size_t phcnt = dso->phnum; in reclaim_gaps()
1293 for (; phcnt--; ph=(void *)((char *)ph+dso->phentsize)) { in reclaim_gaps()
1294 if (ph->p_type!=PT_LOAD) continue; in reclaim_gaps()
1295 if ((ph->p_flags&(PF_R|PF_W))!=(PF_R|PF_W)) continue; in reclaim_gaps()
1296 reclaim(dso, ph->p_vaddr & -PAGE_SIZE, ph->p_vaddr); in reclaim_gaps()
1297 reclaim(dso, ph->p_vaddr+ph->p_memsz, in reclaim_gaps()
1298 ph->p_vaddr+ph->p_memsz+PAGE_SIZE-1 & -PAGE_SIZE); in reclaim_gaps()
1305 ssize_t l = read(fd, (char *)p+i, n-i); in read_loop()
1308 else return -1; in read_loop()
1334 for (q=p; n; q+=r, off+=r, n-=r) { in mmap_fixed()
1347 if (dso->loadmap) { in unmap_library()
1349 for (i=0; i<dso->loadmap->nsegs; i++) { in unmap_library()
1350 if (!dso->loadmap->segs[i].p_memsz) in unmap_library()
1353 munmap((void *)dso->loadmap->segs[i].addr, in unmap_library()
1354 dso->loadmap->segs[i].p_memsz); in unmap_library()
1356 (void)mprotect((void *)dso->loadmap->segs[i].addr, in unmap_library()
1357 dso->loadmap->segs[i].p_memsz, PROT_NONE); in unmap_library()
1360 free(dso->loadmap); in unmap_library()
1361 } else if (dso->map && dso->map_len) { in unmap_library()
1363 munmap(dso->map, dso->map_len); in unmap_library()
1365 mprotect(dso->map, dso->map_len, PROT_NONE); in unmap_library()
1409 int fd = -1; in get_transparent_hugepages_supported()
1418 read_size = read(fd, buf, HUGEPAGES_SUPPORTED_STR_SIZE - 1); in get_transparent_hugepages_supported()
1422 buf[HUGEPAGES_SUPPORTED_STR_SIZE - 1] = '\0'; in get_transparent_hugepages_supported()
1442 if ((phdr->p_type != PT_LOAD) || ((phdr->p_align & (phdr->p_align - 1)) != 0)) in phdr_table_get_maxinum_alignment()
1445 if (phdr->p_align > maxinum_alignment) in phdr_table_get_maxinum_alignment()
1446 maxinum_alignment = phdr->p_align; in phdr_table_get_maxinum_alignment()
1464 return -1; in do_sync_to_other()
1471 return -1; in do_sync_to_other()
1496 if (eh_buf->e_type != ET_DYN) { in is_section_exist()
1500 shsize = eh_buf->e_shentsize * eh_buf->e_shnum; in is_section_exist()
1501 index = eh_buf->e_shstrndx; in is_section_exist()
1502 if (index >= eh_buf->e_shnum) { in is_section_exist()
1506 if (shsize > en_size - sizeof(Ehdr)) { in is_section_exist()
1511 len = pread(fd, sh_buf, shsize, eh_buf->e_shoff); in is_section_exist()
1517 } else if (eh_buf->e_shoff + shsize > len) { in is_section_exist()
1518 len = pread(fd, eh_buf + 1, shsize, eh_buf->e_shoff); in is_section_exist()
1524 sh = sh0 = (void *)((char *)eh_buf + eh_buf->e_shoff); in is_section_exist()
1538 for (i = eh_buf->e_shnum; i != 0; i--) { in is_section_exist()
1539 char *shname = shstrtab_content + sh0[i - 1].sh_name; // this name is offset in shstrtab in is_section_exist()
1540 if ((shname == NULL) || (sh0[i - 1].sh_name > shstrtab.sh_size)) { in is_section_exist()
1605 if (l<sizeof *eh || (eh->e_type != ET_DYN && eh->e_type != ET_EXEC)) in map_library()
1607 phsize = eh->e_phentsize * eh->e_phnum; in map_library()
1608 if (phsize > sizeof buf - sizeof *eh) { in map_library()
1611 l = pread(fd, allocated_buf, phsize, eh->e_phoff); in map_library()
1615 } else if (eh->e_phoff + phsize > l) { in map_library()
1616 l = pread(fd, buf+1, phsize, eh->e_phoff); in map_library()
1621 ph = ph0 = (void *)((char *)buf + eh->e_phoff); in map_library()
1623 for (i=eh->e_phnum; i; i--, ph=(void *)((char *)ph+eh->e_phentsize)) { in map_library()
1624 if (ph->p_type == PT_DYNAMIC) { in map_library()
1625 dyn = ph->p_vaddr; in map_library()
1626 } else if (ph->p_type == PT_TLS) { in map_library()
1627 tls_image = ph->p_vaddr; in map_library()
1628 dso->tls.align = ph->p_align; in map_library()
1629 dso->tls.len = ph->p_filesz; in map_library()
1630 dso->tls.size = ph->p_memsz; in map_library()
1631 } else if (ph->p_type == PT_GNU_RELRO) { in map_library()
1632 dso->relro_start = ph->p_vaddr & -PAGE_SIZE; in map_library()
1633 dso->relro_end = (ph->p_vaddr + ph->p_memsz) & -PAGE_SIZE; in map_library()
1634 } else if (ph->p_type == PT_GNU_STACK) { in map_library()
1635 if (!runtime && ph->p_memsz > __default_stacksize) { in map_library()
1637 ph->p_memsz < DEFAULT_STACK_MAX ? in map_library()
1638 ph->p_memsz : DEFAULT_STACK_MAX; in map_library()
1641 if (ph->p_type != PT_LOAD) continue; in map_library()
1643 if (ph->p_vaddr < addr_min) { in map_library()
1644 addr_min = ph->p_vaddr; in map_library()
1645 off_start = ph->p_offset; in map_library()
1646 prot = (((ph->p_flags&PF_R) ? PROT_READ : 0) | in map_library()
1647 ((ph->p_flags&PF_W) ? PROT_WRITE: 0) | in map_library()
1648 ((ph->p_flags&PF_X) ? PROT_EXEC : 0)); in map_library()
1650 if (ph->p_vaddr+ph->p_memsz > addr_max) { in map_library()
1651 addr_max = ph->p_vaddr+ph->p_memsz; in map_library()
1655 if (DL_FDPIC && !(eh->e_flags & FDPIC_CONSTDISP_FLAG)) { in map_library()
1656 dso->loadmap = calloc(1, sizeof *dso->loadmap in map_library()
1657 + nsegs * sizeof *dso->loadmap->segs); in map_library()
1658 if (!dso->loadmap) goto error; in map_library()
1659 dso->loadmap->nsegs = nsegs; in map_library()
1660 for (ph=ph0, i=0; i<nsegs; ph=(void *)((char *)ph+eh->e_phentsize)) { in map_library()
1661 if (ph->p_type != PT_LOAD) continue; in map_library()
1662 prot = (((ph->p_flags&PF_R) ? PROT_READ : 0) | in map_library()
1663 ((ph->p_flags&PF_W) ? PROT_WRITE: 0) | in map_library()
1664 ((ph->p_flags&PF_X) ? PROT_EXEC : 0)); in map_library()
1665 map = mmap(0, ph->p_memsz + (ph->p_vaddr & PAGE_SIZE-1), in map_library()
1667 fd, ph->p_offset & -PAGE_SIZE); in map_library()
1672 dso->loadmap->segs[i].addr = (size_t)map + in map_library()
1673 (ph->p_vaddr & PAGE_SIZE-1); in map_library()
1674 dso->loadmap->segs[i].p_vaddr = ph->p_vaddr; in map_library()
1675 dso->loadmap->segs[i].p_memsz = ph->p_memsz; in map_library()
1678 size_t brk = (ph->p_vaddr & PAGE_SIZE-1) in map_library()
1679 + ph->p_filesz; in map_library()
1680 size_t pgbrk = brk + PAGE_SIZE-1 & -PAGE_SIZE; in map_library()
1681 size_t pgend = brk + ph->p_memsz - ph->p_filesz in map_library()
1682 + PAGE_SIZE-1 & -PAGE_SIZE; in map_library()
1684 pgend-pgbrk, prot, in map_library()
1686 -1, off_start) == MAP_FAILED) in map_library()
1688 memset(map + brk, 0, pgbrk-brk); in map_library()
1691 map = (void *)dso->loadmap->segs[0].addr; in map_library()
1695 addr_max += PAGE_SIZE-1; in map_library()
1696 addr_max &= -PAGE_SIZE; in map_library()
1697 addr_min &= -PAGE_SIZE; in map_library()
1698 off_start &= -PAGE_SIZE; in map_library()
1699 map_len = addr_max - addr_min + off_start; in map_library()
1704 size_t maxinum_alignment = phdr_table_get_maxinum_alignment(ph0, eh->e_phnum); in map_library()
1710 if (map_len > reserved_params->reserved_size) { in map_library()
1711 if (reserved_params->must_use_reserved) { in map_library()
1715 start_addr = ((size_t)reserved_params->start_addr - 1 + PAGE_SIZE) & -PAGE_SIZE; in map_library()
1724 size_t tmp_map_len = ALIGN(map_len, mapping_align) + mapping_align - PAGE_SIZE; in map_library()
1729 …void *)start_addr, map_len, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) in map_library()
1734 if (reserved_params && map_len < reserved_params->reserved_size) { in map_library()
1735 reserved_params->reserved_size -= (map_len + (start_addr - (size_t)reserved_params->start_addr)); in map_library()
1736 reserved_params->start_addr = (void *)((uint8_t *)map + map_len); in map_library()
1741 …ed char *temp_map = mmap((void *)NULL, tmp_map_len, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); in map_library()
1749 ? mmap(real_map, map_len, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) in map_library()
1758 * |--------------------------tmp_map_len--------------------------| in map_library()
1760 * |---unused_part_1---|---------map_len-------|---unused_part_2---| in map_library()
1764 size_t unused_part_1 = real_map - temp_map; in map_library()
1765 size_t unused_part_2 = temp_map_end - (real_map + map_len); in map_library()
1768 if (res1 == -1) { in map_library()
1775 if (res2 == -1) { in map_library()
1780 dso->map = map; in map_library()
1781 dso->map_len = map_len; in map_library()
1784 if (eh->e_type != ET_DYN && addr_min && map!=(void *)addr_min) { in map_library()
1788 base = map - addr_min; in map_library()
1789 dso->phdr = 0; in map_library()
1790 dso->phnum = 0; in map_library()
1791 for (ph=ph0, i=eh->e_phnum; i; i--, ph=(void *)((char *)ph+eh->e_phentsize)) { in map_library()
1792 if (ph->p_type == PT_OHOS_RANDOMDATA) { in map_library()
1793 fill_random_data((void *)(ph->p_vaddr + base), ph->p_memsz); in map_library()
1796 if (ph->p_type != PT_LOAD) continue; in map_library()
1799 if (!dso->phdr && eh->e_phoff >= ph->p_offset in map_library()
1800 && eh->e_phoff+phsize <= ph->p_offset+ph->p_filesz) { in map_library()
1801 dso->phdr = (void *)(base + ph->p_vaddr in map_library()
1802 + (eh->e_phoff-ph->p_offset)); in map_library()
1803 dso->phnum = eh->e_phnum; in map_library()
1804 dso->phentsize = eh->e_phentsize; in map_library()
1806 this_min = ph->p_vaddr & -PAGE_SIZE; in map_library()
1807 this_max = ph->p_vaddr+ph->p_memsz+PAGE_SIZE-1 & -PAGE_SIZE; in map_library()
1808 off_start = ph->p_offset & -PAGE_SIZE; in map_library()
1809 prot = (((ph->p_flags&PF_R) ? PROT_READ : 0) | in map_library()
1810 ((ph->p_flags&PF_W) ? PROT_WRITE: 0) | in map_library()
1811 ((ph->p_flags&PF_X) ? PROT_EXEC : 0)); in map_library()
1812 /* Reuse the existing mapping for the lowest-address LOAD */ in map_library()
1813 if ((ph->p_vaddr & -PAGE_SIZE) != addr_min || DL_NOMMU_SUPPORT) in map_library()
1814 …if (mmap_fixed(base+this_min, this_max-this_min, prot, MAP_PRIVATE|MAP_FIXED, fd, off_start) == MA… in map_library()
1816 if ((ph->p_flags & PF_X) && (ph->p_align == KPMD_SIZE) && hugepage_enabled) in map_library()
1817 madvise(base + this_min, this_max - this_min, MADV_HUGEPAGE); in map_library()
1818 if (ph->p_memsz > ph->p_filesz && (ph->p_flags&PF_W)) { in map_library()
1819 size_t brk = (size_t)base+ph->p_vaddr+ph->p_filesz; in map_library()
1820 size_t pgbrk = brk+PAGE_SIZE-1 & -PAGE_SIZE; in map_library()
1821 size_t zeromap_size = (size_t)base + this_max - pgbrk; in map_library()
1822 memset((void *)brk, 0, pgbrk-brk & PAGE_SIZE-1); in map_library()
1823 …if (pgbrk - (size_t)base < this_max && mmap_fixed((void *)pgbrk, zeromap_size, prot, MAP_PRIVATE |… in map_library()
1825 set_bss_vma_name(dso->name, (void *)pgbrk, zeromap_size); in map_library()
1840 encpas_cost_time = (encaps_time_end.tv_sec - encaps_time_start.tv_sec) * CLOCK_SECOND_TO_MILLI in map_library()
1841 + (encaps_time_end.tv_nsec - encaps_time_start.tv_nsec) / CLOCK_NANO_TO_MILLI; in map_library()
1843 dso->base = base; in map_library()
1844 dso->dynv = laddr(dso, dyn); in map_library()
1845 if (dso->tls.size) dso->tls.image = laddr(dso, tls_image); in map_library()
1863 if (l-1 >= INT_MAX) return -1; in path_open()
1873 /* Any negative value but -1 will inhibit in path_open()
1875 return -2; in path_open()
1887 if (p->rpath || !p->rpath_orig) return 0; in fixup_rpath()
1888 if (!strchr(p->rpath_orig, '$')) { in fixup_rpath()
1889 p->rpath = ld_strdup(p->rpath_orig); in fixup_rpath()
1893 s = p->rpath_orig; in fixup_rpath()
1902 if (p->kernel_mapped) { in fixup_rpath()
1912 if (l == -1) switch (errno) { in fixup_rpath()
1918 return -1; in fixup_rpath()
1925 origin = p->name; in fixup_rpath()
1929 l = t-origin; in fixup_rpath()
1931 /* Normally p->name will always be an absolute or relative in fixup_rpath()
1938 /* Disallow non-absolute origins for suid/sgid/AT_SECURE. */ in fixup_rpath()
1941 p->rpath = malloc(strlen(p->rpath_orig) + n*l + 1); in fixup_rpath()
1942 if (!p->rpath) return -1; in fixup_rpath()
1944 d = p->rpath; in fixup_rpath()
1945 s = p->rpath_orig; in fixup_rpath()
1947 memcpy(d, s, t-s); in fixup_rpath()
1948 d += t-s; in fixup_rpath()
1963 decode_vec(p->dynv, dyn, DYN_CNT); in decode_dyn()
1964 search_vec(p->dynv, &flags1, DT_FLAGS_1); in decode_dyn()
1966 LD_LOGI("Add DF_1_GLOBAL for %{public}s", p->name); in decode_dyn()
1967 p->is_global = true; in decode_dyn()
1970 p->flags |= DSO_FLAGS_NODELETE; in decode_dyn()
1972 p->syms = laddr(p, dyn[DT_SYMTAB]); in decode_dyn()
1973 p->strings = laddr(p, dyn[DT_STRTAB]); in decode_dyn()
1975 p->hashtab = laddr(p, dyn[DT_HASH]); in decode_dyn()
1977 p->rpath_orig = p->strings + dyn[DT_RPATH]; in decode_dyn()
1979 p->rpath_orig = p->strings + dyn[DT_RUNPATH]; in decode_dyn()
1981 p->got = laddr(p, dyn[DT_PLTGOT]); in decode_dyn()
1982 if (search_vec(p->dynv, dyn, DT_GNU_HASH)) in decode_dyn()
1983 p->ghashtab = laddr(p, *dyn); in decode_dyn()
1984 if (search_vec(p->dynv, dyn, DT_VERSYM)) in decode_dyn()
1985 p->versym = laddr(p, *dyn); in decode_dyn()
1986 if (search_vec(p->dynv, dyn, DT_VERDEF)) in decode_dyn()
1987 p->verdef = laddr(p, *dyn); in decode_dyn()
1988 if (search_vec(p->dynv, dyn, DT_VERNEED)) in decode_dyn()
1989 p->verneed = laddr(p, *dyn); in decode_dyn()
1994 if (p->hashtab) return p->hashtab[1]; in count_syms()
1997 uint32_t *buckets = p->ghashtab + 4 + (p->ghashtab[2]*sizeof(size_t)/4); in count_syms()
1999 for (i = nsym = 0; i < p->ghashtab[0]; i++) { in count_syms()
2004 hashval = buckets + p->ghashtab[0] + (nsym - p->ghashtab[1]); in count_syms()
2016 p = (void *)__syscall(SYS_mmap2, 0, n, prot, flags, -1, 0); in dl_mmap()
2018 p = (void *)__syscall(SYS_mmap, 0, n, prot, flags, -1, 0); in dl_mmap()
2020 return (unsigned long)p > -4096UL ? 0 : p; in dl_mmap()
2027 size_t i, size = nsym * sizeof(*p->funcdescs); in makefuncdescs()
2030 p->funcdescs = dl_mmap(size); in makefuncdescs()
2033 p->funcdescs = malloc(size); in makefuncdescs()
2035 if (!p->funcdescs) { in makefuncdescs()
2037 error("Error allocating function descriptors for %s", p->name); in makefuncdescs()
2041 if ((p->syms[i].st_info&0xf)==STT_FUNC && p->syms[i].st_shndx) { in makefuncdescs()
2042 p->funcdescs[i].addr = laddr(p, p->syms[i].st_value); in makefuncdescs()
2043 p->funcdescs[i].got = p->got; in makefuncdescs()
2045 p->funcdescs[i].addr = 0; in makefuncdescs()
2046 p->funcdescs[i].got = 0; in makefuncdescs()
2056 sys_path = conf->get_sys_paths(); in get_sys_path()
2060 sys_path = conf->get_asan_sys_paths(); in get_sys_path()
2061 char *sys_path_default = conf->get_sys_paths(); in get_sys_path()
2079 LD_LOGD("search_dso_by_name name:%{public}s, ns_name:%{public}s", name, ns ? ns->ns_name: "NULL"); in search_dso_by_name()
2080 for (size_t i = 0; i < ns->ns_dsos->num; i++) { in search_dso_by_name()
2081 struct dso *p = ns->ns_dsos->dsos[i]; in search_dso_by_name()
2082 if (p->shortname && !strcmp(p->shortname, name)) { in search_dso_by_name()
2083 …LD_LOGD("search_dso_by_name found name:%{public}s, ns_name:%{public}s", name, ns ? ns->ns_name: "N… in search_dso_by_name()
2091 LD_LOGD("search_dso_by_fstat ns_name:%{public}s", ns ? ns->ns_name : "NULL"); in search_dso_by_fstat()
2092 for (size_t i = 0; i < ns->ns_dsos->num; i++) { in search_dso_by_fstat()
2093 struct dso *p = ns->ns_dsos->dsos[i]; in search_dso_by_fstat()
2094 if (p->dev == st->st_dev && p->ino == st->st_ino && p->file_offset == file_offset) { in search_dso_by_fstat()
2096 st->st_dev, st->st_ino, ns ? ns->ns_name : "NULL"); in search_dso_by_fstat()
2105 int fd = -1; in app_has_same_name_so()
2107 if (((ns->flag & LOCAL_NS_PREFERED) != 0) && ns->lib_paths) { in app_has_same_name_so()
2109 fd = path_open(so_name, ns->lib_paths, tmp_buf, sizeof tmp_buf); in app_has_same_name_so()
2119 ns ? ns->ns_name : "NULL", in find_library_by_name()
2123 if (check_inherited && ns->ns_inherits) { in find_library_by_name()
2124 for (size_t i = 0; i < ns->ns_inherits->num; i++) { in find_library_by_name()
2125 ns_inherit * inherit = ns->ns_inherits->inherits[i]; in find_library_by_name()
2126 p = search_dso_by_name(name, inherit->inherited_ns); in find_library_by_name()
2128 if (app_has_same_name_so(name, ns) != -1) { in find_library_by_name()
2140 ns ? ns->ns_name : "NULL", in find_library_by_fstat()
2144 if (check_inherited && ns->ns_inherits) { in find_library_by_fstat()
2145 for (size_t i = 0; i < ns->ns_inherits->num; i++) { in find_library_by_fstat()
2146 ns_inherit *inherit = ns->ns_inherits->inherits[i]; in find_library_by_fstat()
2147 p = search_dso_by_fstat(st, inherit->inherited_ns, file_offset); in find_library_by_fstat()
2148 if (p && is_sharable(inherit, p->shortname)) return p; in find_library_by_fstat()
2181 if (strncmp(name+3, rp, next-rp) == 0) in load_library()
2189 unsigned mask = 1U<<(rp-reserved); in load_library()
2203 tail->next = &ldso; in load_library()
2215 fd = -1; in load_library()
2216 LD_LOGD("load_library is_accessible return false,fd = -1"); in load_library()
2233 fd = -1; in load_library()
2234 if (namespace->env_paths) fd = path_open(name, namespace->env_paths, buf, sizeof buf); in load_library()
2235 for (p = needed_by; fd == -1 && p; p = p->needed_by) { in load_library()
2237 LD_LOGD("load_library Inhibit further search,fd = -2."); in load_library()
2238 fd = -2; /* Inhibit further search. */ in load_library()
2240 if (p->rpath) { in load_library()
2241 fd = path_open(name, p->rpath, buf, sizeof buf); in load_library()
2242 LD_LOGD("load_library p->rpath path_open fd:%{public}d.", fd); in load_library()
2250 if (fd == -1 && namespace->lib_paths) { in load_library()
2251 fd = path_open(name, namespace->lib_paths, buf, sizeof buf); in load_library()
2259 if (!check_inherited || !namespace->ns_inherits) return 0; in load_library()
2261 for (size_t i = 0; i < namespace->ns_inherits->num; i++) { in load_library()
2262 ns_inherit *inherit = namespace->ns_inherits->inherits[i]; in load_library()
2264 p = load_library(name, needed_by, inherit->inherited_ns, false, reserved_params); in load_library()
2267 inherit->inherited_ns->ns_name); in load_library()
2284 if (!p->shortname && pathname != name) in load_library()
2285 p->shortname = strrchr(p->name, '/')+1; in load_library()
2297 * false positives from interposition-hack libraries. */ in load_library()
2310 * storage must include a reservation for all pre-existing in load_library()
2313 * the newly-loaded DSO. */ in load_library()
2328 p->dev = st.st_dev; in load_library()
2329 p->ino = st.st_ino; in load_library()
2330 p->needed_by = needed_by; in load_library()
2331 p->name = p->buf; in load_library()
2332 p->runtime_loaded = runtime; in load_library()
2333 strcpy(p->name, pathname); in load_library()
2335 if (pathname != name) p->shortname = strrchr(p->name, '/')+1; in load_library()
2336 if (p->tls.image) { in load_library()
2337 p->tls_id = ++tls_cnt; in load_library()
2338 tls_align = MAXP2(tls_align, p->tls.align); in load_library()
2340 p->tls.offset = tls_offset + ( (p->tls.align-1) & in load_library()
2341 (-tls_offset + (uintptr_t)p->tls.image) ); in load_library()
2342 tls_offset = p->tls.offset + p->tls.size; in load_library()
2344 tls_offset += p->tls.size + p->tls.align - 1; in load_library()
2345 tls_offset -= (tls_offset + (uintptr_t)p->tls.image) in load_library()
2346 & (p->tls.align-1); in load_library()
2347 p->tls.offset = tls_offset; in load_library()
2349 p->new_dtv = (void *)(-sizeof(size_t) & in load_library()
2350 (uintptr_t)(p->name+strlen(p->name)+sizeof(size_t))); in load_library()
2351 p->new_tls = (void *)(p->new_dtv + n_th*(tls_cnt+1)); in load_library()
2352 if (tls_tail) tls_tail->next = &p->tls; in load_library()
2353 else libc.tls_head = &p->tls; in load_library()
2354 tls_tail = &p->tls; in load_library()
2357 tail->next = p; in load_library()
2358 p->prev = tail; in load_library()
2362 p->namespace = namespace; in load_library()
2365 p->by_dlopen = 1; in load_library()
2369 if (ldd_mode) dprintf(1, "\t%s => %s (%p)\n", name, pathname, p->base); in load_library()
2378 if (p->deps) return; in load_direct_deps()
2379 /* For head, all preloads are direct pseudo-dependencies. in load_direct_deps()
2381 if (p==head) for (struct dso *q=p->next; q; q=q->next) in load_direct_deps()
2383 for (i=0; p->dynv[i]; i+=2) in load_direct_deps()
2384 if (p->dynv[i] == DT_NEEDED) cnt++; in load_direct_deps()
2387 p->deps = (p==head && cnt<2) ? builtin_deps : in load_direct_deps()
2388 calloc(cnt+1, sizeof *p->deps); in load_direct_deps()
2389 if (!p->deps) { in load_direct_deps()
2390 error("Error loading dependencies for %s", p->name); in load_direct_deps()
2394 if (p==head) for (struct dso *q=p->next; q; q=q->next) in load_direct_deps()
2395 p->deps[cnt++] = q; in load_direct_deps()
2396 for (i=0; p->dynv[i]; i+=2) { in load_direct_deps()
2397 if (p->dynv[i] != DT_NEEDED) continue; in load_direct_deps()
2398 struct dso *dep = load_library(p->strings + p->dynv[i + 1], p, namespace, true, reserved_params); in load_direct_deps()
2399 …D("loading shared library %{public}s: (needed by %{public}s)", p->strings + p->dynv[i+1], p->name); in load_direct_deps()
2402 p->strings + p->dynv[i+1], p->name); in load_direct_deps()
2406 p->deps[cnt++] = dep; in load_direct_deps()
2408 p->deps[cnt] = 0; in load_direct_deps()
2409 p->ndeps_direct = cnt; in load_direct_deps()
2410 for (i = 0; i < p->ndeps_direct; i++) { in load_direct_deps()
2411 add_dso_parent(p->deps[i], p); in load_direct_deps()
2417 if (p->deps) return; in load_deps()
2418 for (; p; p = p->next) in load_deps()
2419 load_direct_deps(p, p->namespace, reserved_params); in load_deps()
2428 /* Can't use realloc if the original p->deps was allocated at in extend_bfs_deps()
2430 * the builtin non-allocated trivial main program deps array. */ in extend_bfs_deps()
2431 int no_realloc = (__malloc_replaced && !p->runtime_loaded) in extend_bfs_deps()
2432 || p->deps == builtin_deps; in extend_bfs_deps()
2434 if (p->bfs_built) return; in extend_bfs_deps()
2435 if (to_deps_all && p->deps_all_built) { in extend_bfs_deps()
2439 ndeps_all = p->ndeps_direct; in extend_bfs_deps()
2442 p->deps_all = calloc(ndeps_all + 1, sizeof *p->deps); in extend_bfs_deps()
2446 for (i=0; p->deps[i]; i++) { in extend_bfs_deps()
2448 p->deps_all[i] = p->deps[i]; in extend_bfs_deps()
2450 p->deps[i]->mark = 1; in extend_bfs_deps()
2458 for (i=0; p->deps_all[i]; i++) { in extend_bfs_deps()
2459 struct dso *dep = p->deps_all[i]; in extend_bfs_deps()
2460 for (j=cnt=0; j<dep->ndeps_direct; j++) in extend_bfs_deps()
2461 if (!dep->deps[j]->mark) cnt++; in extend_bfs_deps()
2464 realloc(p->deps_all, sizeof(*tmp) * (ndeps_all+cnt+1)); in extend_bfs_deps()
2466 error("Error recording dependencies for %s", p->name); in extend_bfs_deps()
2471 memcpy(tmp, p->deps_all, sizeof(*tmp) * (ndeps_all+1)); in extend_bfs_deps()
2474 p->deps_all = tmp; in extend_bfs_deps()
2475 for (j=0; j<dep->ndeps_direct; j++) { in extend_bfs_deps()
2476 if (dep->deps[j]->mark) continue; in extend_bfs_deps()
2477 dep->deps[j]->mark = 1; in extend_bfs_deps()
2478 p->deps_all[ndeps_all++] = dep->deps[j]; in extend_bfs_deps()
2480 p->deps_all[ndeps_all] = 0; in extend_bfs_deps()
2482 p->deps_all_built = 1; in extend_bfs_deps()
2484 for (i=0; p->deps[i]; i++) { in extend_bfs_deps()
2485 struct dso *dep = p->deps[i]; in extend_bfs_deps()
2486 for (j=cnt=0; j<dep->ndeps_direct; j++) in extend_bfs_deps()
2487 if (!dep->deps[j]->mark) cnt++; in extend_bfs_deps()
2490 realloc(p->deps, sizeof(*tmp) * (ndeps_all+cnt+1)); in extend_bfs_deps()
2492 error("Error recording dependencies for %s", p->name); in extend_bfs_deps()
2497 memcpy(tmp, p->deps, sizeof(*tmp) * (ndeps_all+1)); in extend_bfs_deps()
2500 p->deps = tmp; in extend_bfs_deps()
2501 for (j=0; j<dep->ndeps_direct; j++) { in extend_bfs_deps()
2502 if (dep->deps[j]->mark) continue; in extend_bfs_deps()
2503 dep->deps[j]->mark = 1; in extend_bfs_deps()
2504 p->deps[ndeps_all++] = dep->deps[j]; in extend_bfs_deps()
2506 p->deps[ndeps_all] = 0; in extend_bfs_deps()
2508 p->bfs_built = 1; in extend_bfs_deps()
2510 for (p=head; p; p=p->next) in extend_bfs_deps()
2511 p->mark = 0; in extend_bfs_deps()
2532 if (!p->syms_next && syms_tail != p) { in add_syms()
2533 syms_tail->syms_next = p; in add_syms()
2544 next = p->syms_next; in revert_syms()
2545 p->syms_next = 0; in revert_syms()
2553 unsigned char *base = p->base; in do_mips_relocs()
2554 i=0; search_vec(p->dynv, &i, DT_MIPS_LOCAL_GOTNO); in do_mips_relocs()
2558 while (i--) *got++ += (size_t)base; in do_mips_relocs()
2560 j=0; search_vec(p->dynv, &j, DT_MIPS_GOTSYM); in do_mips_relocs()
2561 i=0; search_vec(p->dynv, &i, DT_MIPS_SYMTABNO); in do_mips_relocs()
2562 Sym *sym = p->syms + j; in do_mips_relocs()
2563 rel[0] = (unsigned char *)got - base; in do_mips_relocs()
2564 for (i-=j; i; i--, sym++, rel[0]+=sizeof(size_t)) { in do_mips_relocs()
2565 rel[1] = R_INFO(sym-p->syms, R_MIPS_JUMP_SLOT); in do_mips_relocs()
2589 result |= -((size_t)(1) << shift); in sleb128_decoder()
2602 search_vec(p->dynv, &android_rel_addr, dt_name); in do_android_relocs()
2603 search_vec(p->dynv, &android_rel_size, dt_size); in do_android_relocs()
2615 android_rel_size -= ANDROID_REL_SIGN_SIZE; in do_android_relocs()
2686 if (dso == &ldso) return; /* self-relocation was done in _dlstart */ in do_relr_relocs()
2687 unsigned char *base = dso->base; in do_relr_relocs()
2689 for (; relr_size; relr++, relr_size -= sizeof(size_t)) in do_relr_relocs()
2698 reloc_addr += 8 * sizeof(size_t) - 1; in do_relr_relocs()
2706 for (; p; p=p->next) { in reloc_all()
2707 if (p->relocated) continue; in reloc_all()
2711 decode_vec(p->dynv, dyn, DYN_CNT); in reloc_all()
2724 if (head != &ldso && p->relro_start != p->relro_end && in reloc_all()
2725 mprotect(laddr(p, p->relro_start), p->relro_end-p->relro_start, PROT_READ) in reloc_all()
2728 p->name); in reloc_all()
2734 p->relocated = 1; in reloc_all()
2741 size_t min_addr = -1, max_addr = 0, cnt; in kernel_mapped_dso()
2742 Phdr *ph = p->phdr; in kernel_mapped_dso()
2743 for (cnt = p->phnum; cnt--; ph = (void *)((char *)ph + p->phentsize)) { in kernel_mapped_dso()
2744 if (ph->p_type == PT_DYNAMIC) { in kernel_mapped_dso()
2745 p->dynv = laddr(p, ph->p_vaddr); in kernel_mapped_dso()
2746 } else if (ph->p_type == PT_GNU_RELRO) { in kernel_mapped_dso()
2747 p->relro_start = ph->p_vaddr & -PAGE_SIZE; in kernel_mapped_dso()
2748 p->relro_end = (ph->p_vaddr + ph->p_memsz) & -PAGE_SIZE; in kernel_mapped_dso()
2749 } else if (ph->p_type == PT_GNU_STACK) { in kernel_mapped_dso()
2750 if (!runtime && ph->p_memsz > __default_stacksize) { in kernel_mapped_dso()
2752 ph->p_memsz < DEFAULT_STACK_MAX ? in kernel_mapped_dso()
2753 ph->p_memsz : DEFAULT_STACK_MAX; in kernel_mapped_dso()
2756 if (ph->p_type != PT_LOAD) continue; in kernel_mapped_dso()
2757 if (ph->p_vaddr < min_addr) in kernel_mapped_dso()
2758 min_addr = ph->p_vaddr; in kernel_mapped_dso()
2759 if (ph->p_vaddr+ph->p_memsz > max_addr) in kernel_mapped_dso()
2760 max_addr = ph->p_vaddr+ph->p_memsz; in kernel_mapped_dso()
2762 min_addr &= -PAGE_SIZE; in kernel_mapped_dso()
2763 max_addr = (max_addr + PAGE_SIZE-1) & -PAGE_SIZE; in kernel_mapped_dso()
2764 p->map = p->base + min_addr; in kernel_mapped_dso()
2765 p->map_len = max_addr - min_addr; in kernel_mapped_dso()
2766 p->kernel_mapped = 1; in kernel_mapped_dso()
2782 for (p=fini_head; p; p=p->fini_next) { in __libc_exit_fini()
2783 while (p->ctor_visitor && p->ctor_visitor!=self) in __libc_exit_fini()
2785 if (!p->constructed) continue; in __libc_exit_fini()
2786 decode_vec(p->dynv, dyn, DYN_CNT); in __libc_exit_fini()
2790 while (n--) ((void (*)(void))*--fn)(); in __libc_exit_fini()
2804 // so reset dlclose_lock to make sure child process can call dlclose after fork in __pthread_mutex_unlock_atfork()
2831 if (dso->bfs_built) { in queue_ctors()
2832 for (cnt=0; dso->deps[cnt]; cnt++) in queue_ctors()
2833 dso->deps[cnt]->mark = 0; in queue_ctors()
2836 for (cnt=0, p=head; p; cnt++, p=p->next) in queue_ctors()
2837 p->mark = 0; in queue_ctors()
2857 stack[--spos] = dso; in queue_ctors()
2858 dso->next_dep = 0; in queue_ctors()
2859 dso->mark = 1; in queue_ctors()
2861 /* Then perform pseudo-DFS sort, but ignoring circular deps. */ in queue_ctors()
2864 while (p->next_dep < p->ndeps_direct) { in queue_ctors()
2865 if (p->deps[p->next_dep]->mark) { in queue_ctors()
2866 p->next_dep++; in queue_ctors()
2868 stack[--spos] = p; in queue_ctors()
2869 p = p->deps[p->next_dep]; in queue_ctors()
2870 p->next_dep = 0; in queue_ctors()
2871 p->mark = 1; in queue_ctors()
2877 for (i=0; i<qpos; i++) queue[i]->mark = 0; in queue_ctors()
2890 while ((p->ctor_visitor && p->ctor_visitor!=self) || shutting_down) in do_init_fini()
2892 if (p->ctor_visitor || p->constructed) in do_init_fini()
2894 p->ctor_visitor = self; in do_init_fini()
2896 decode_vec(p->dynv, dyn, DYN_CNT); in do_init_fini()
2898 p->fini_next = fini_head; in do_init_fini()
2912 trace_marker_begin(HITRACE_TAG_MUSL, "calling constructors: ", p->name); in do_init_fini()
2914 while (n--) ((void (*)(void))*fn++)(); in do_init_fini()
2921 p->ctor_visitor = 0; in do_init_fini()
2922 p->constructed = 1; in do_init_fini()
2963 uintptr_t (*newdtv)[tls_cnt+1] = (void *)dtv_provider->new_dtv; in install_new_tls()
2966 size_t old_cnt = self->dtv[0]; in install_new_tls()
2971 get_tl_lock_caller_count()->install_new_tls_tl_lock++; in install_new_tls()
2974 for (i=0, td=self; !i || td!=self; i++, td=td->next) { in install_new_tls()
2975 memcpy(newdtv+i, td->dtv, in install_new_tls()
2980 for (p=head; ; p=p->next) { in install_new_tls()
2981 if (p->tls_id <= old_cnt) continue; in install_new_tls()
2982 unsigned char *mem = p->new_tls; in install_new_tls()
2985 new += ((uintptr_t)p->tls.image - (uintptr_t)mem) in install_new_tls()
2986 & (p->tls.align-1); in install_new_tls()
2987 memcpy(new, p->tls.image, p->tls.len); in install_new_tls()
2988 newdtv[j][p->tls_id] = in install_new_tls()
2990 mem += p->tls.size + p->tls.align; in install_new_tls()
2992 if (p->tls_id == tls_cnt) break; in install_new_tls()
3003 for (j=0, td=self; !j || td!=self; j++, td=td->next) { in install_new_tls()
3004 td->dtv = newdtv[j]; in install_new_tls()
3008 get_tl_lock_caller_count()->install_new_tls_tl_lock--; in install_new_tls()
3031 void *p1 = (void *)sp[-2]; in __dls2()
3032 void *p2 = (void *)sp[-1]; in __dls2()
3037 else ldso.base = (void *)(aux[AT_PHDR] & -4096); in __dls2()
3050 ldso.phnum = ehdr->e_phnum; in __dls2()
3051 ldso.phdr = laddr(&ldso, ehdr->e_phoff); in __dls2()
3052 ldso.phentsize = ehdr->e_phentsize; in __dls2()
3070 for (; rel_size; rel+=2, rel_size-=2*sizeof(size_t)) in __dls2()
3081 /* Call dynamic linker stage-2b, __dls2b, looking it up in __dls2()
3085 if (DL_FDPIC) ((stage3_func)&ldso.funcdescs[dls2b_def.sym-ldso.syms])(sp, auxv, aux); in __dls2()
3086 else ((stage3_func)laddr(&ldso, dls2b_def.sym->st_value))(sp, auxv, aux); in __dls2()
3107 __pthread_self()->stack = (void *)(sp + 1); in __dls2b()
3109 if (DL_FDPIC) ((stage3_func)&ldso.funcdescs[dls3_def.sym-ldso.syms])(sp, auxv, aux); in __dls2b()
3110 else ((stage3_func)laddr(&ldso, dls3_def.sym->st_value))(sp, auxv, aux); in __dls2b()
3134 __pthread_self()->sysinfo = __sysinfo; in __dls3()
3166 for (i = aux[AT_PHNUM]; i; i--, phdr = (void *)((char *)phdr + aux[AT_PHENT])) { in __dls3()
3167 if (phdr->p_type == PT_PHDR) in __dls3()
3168 app.base = (void *)(aux[AT_PHDR] - phdr->p_vaddr); in __dls3()
3169 else if (phdr->p_type == PT_INTERP) in __dls3()
3170 interp_off = (size_t)phdr->p_vaddr; in __dls3()
3171 else if (phdr->p_type == PT_TLS) { in __dls3()
3172 tls_image = phdr->p_vaddr; in __dls3()
3173 app.tls.len = phdr->p_filesz; in __dls3()
3174 app.tls.size = phdr->p_memsz; in __dls3()
3175 app.tls.align = phdr->p_align; in __dls3()
3191 if (l >= 3 && !strcmp(ldname+l-3, "ldd")) ldd_mode = 1; in __dls3()
3193 while (argv[0] && argv[0][0]=='-' && argv[0][1]=='-') { in __dls3()
3195 *argv++ = (void *)-1; in __dls3()
3200 } else if (!memcmp(opt, "library-path", 12)) { in __dls3()
3216 argv[-1] = (void *)(argc - (argv-argv_orig)); in __dls3()
3221 "Usage: %s [options] [--] pathname%s\n", in __dls3()
3239 aux[AT_ENTRY] = (size_t)laddr(&app, ehdr->e_entry); in __dls3()
3255 app.tls.offset += (-GAP_ABOVE_TP + (uintptr_t)app.tls.image) in __dls3()
3256 & (app.tls.align-1); in __dls3()
3260 + ( -((uintptr_t)app.tls.image + app.tls.size) in __dls3()
3261 & (app.tls.align-1) ); in __dls3()
3270 app.loadmap->nsegs = 1; in __dls3()
3271 app.loadmap->segs[0].addr = (size_t)app.map; in __dls3()
3272 app.loadmap->segs[0].p_vaddr = (size_t)app.map in __dls3()
3273 - (size_t)app.base; in __dls3()
3274 app.loadmap->segs[0].p_memsz = app.map_len; in __dls3()
3276 argv[-3] = (void *)app.loadmap; in __dls3()
3296 if (strstr(ldso.name, "-asan")) { in __dls3()
3311 for (struct dso *q = head; q; q = q->next) { in __dls3()
3312 q->is_global = true; in __dls3()
3313 q->is_preload = true; in __dls3()
3323 for (struct dso *q = head; q; q = q->next) { in __dls3()
3324 q->is_global = true; in __dls3()
3325 q->is_preload = true; in __dls3()
3331 for (struct dso *p = head; p; p = p->next) { in __dls3()
3332 p->is_reloc_head_so_dep = true; in __dls3()
3340 Phdr *phdr = vdso.phdr = (void *)(vdso_base + ehdr->e_phoff); in __dls3()
3341 vdso.phnum = ehdr->e_phnum; in __dls3()
3342 vdso.phentsize = ehdr->e_phentsize; in __dls3()
3343 for (i=ehdr->e_phnum; i; i--, phdr=(void *)((char *)phdr + ehdr->e_phentsize)) { in __dls3()
3344 if (phdr->p_type == PT_DYNAMIC) in __dls3()
3345 vdso.dynv = (void *)(vdso_base + phdr->p_offset); in __dls3()
3346 if (phdr->p_type == PT_LOAD) in __dls3()
3347 vdso.base = (void *)(vdso_base - phdr->p_vaddr + phdr->p_offset); in __dls3()
3350 vdso.shortname = "linux-gate.so.1"; in __dls3()
3355 tail->next = &vdso; in __dls3()
3378 * are additional relocation-like fixups that only the entry point in __dls3()
3389 dprintf(2, "%s: Error getting %zu bytes thread-local storage: %m\n", in __dls3()
3400 for (struct dso *q = head; q; q = q->next) { in __dls3()
3401 q->is_reloc_head_so_dep = false; in __dls3()
3412 td->tsd = self->tsd; in __dls3()
3454 CRTJMP((void *)aux[AT_ENTRY], argv - 1); in __dls3()
3461 decode_vec(p->dynv, dyn, DYN_CNT); in prepare_lazy()
3462 search_vec(p->dynv, &flags1, DT_FLAGS_1); in prepare_lazy()
3467 size_t j=0; search_vec(p->dynv, &j, DT_MIPS_GOTSYM); in prepare_lazy()
3468 size_t i=0; search_vec(p->dynv, &i, DT_MIPS_SYMTABNO); in prepare_lazy()
3469 n += i-j; in prepare_lazy()
3471 p->lazy = calloc(n, 3*sizeof(size_t)); in prepare_lazy()
3472 if (!p->lazy) { in prepare_lazy()
3473 error("Error preparing lazy relocation for %s: %m", p->name); in prepare_lazy()
3476 p->lazy_next = lazy_head; in prepare_lazy()
3488 p->nr_dlopen++; in dlopen_post()
3490 LD_LOGE("[dlclose]: %{public}s nr_dlopen++ when dlopen %{public}s, nr_dlopen:%{public}d ", in dlopen_post()
3491 p->name, p->name, p->nr_dlopen); in dlopen_post()
3493 if (p->bfs_built) { in dlopen_post()
3494 for (int i = 0; p->deps[i]; i++) { in dlopen_post()
3495 p->deps[i]->nr_dlopen++; in dlopen_post()
3497 LD_LOGE("[dlclose]: %{public}s nr_dlopen++ when dlopen %{public}s, nr_dlopen:%{public}d", in dlopen_post()
3498 p->deps[i]->name, p->name, p->deps[i]->nr_dlopen); in dlopen_post()
3501 p->deps[i]->flags |= DSO_FLAGS_NODELETE; in dlopen_post()
3546 if ((caller == NULL) || (caller->namespace == NULL)) { in is_permitted()
3551 ns = caller->namespace; in is_permitted()
3552 if (in_permitted_list(ns->ns_name, target) == false) { in is_permitted()
3553 LD_LOGE("caller ns: %{public}s have no permission, target is %{public}s", ns->ns_name, target); in is_permitted()
3602 int ret = snprintf(asan_file, sizeof asan_file, "%.*s/asan%s", (int)(place - file), file, place); in dlopen_impl()
3612 reserved_address_recursive = extinfo->flag & DL_EXT_RESERVED_ADDRESS_RECURSIVE; in dlopen_impl()
3613 if (extinfo->flag & DL_EXT_RESERVED_ADDRESS) { in dlopen_impl()
3615 reserved_params.start_addr = extinfo->reserved_addr; in dlopen_impl()
3616 reserved_params.reserved_size = extinfo->reserved_size; in dlopen_impl()
3619 } else if (extinfo->flag & DL_EXT_RESERVED_ADDRESS_HINT) { in dlopen_impl()
3621 reserved_params.start_addr = extinfo->reserved_addr; in dlopen_impl()
3622 reserved_params.reserved_size = extinfo->reserved_size; in dlopen_impl()
3638 if (!ns) ns = ((caller && caller->namespace) ? caller->namespace : get_default_ns()); in dlopen_impl()
3658 for (p = orig_tail->next; p; p = next) { in dlopen_impl()
3659 next = p->next; in dlopen_impl()
3660 while (p->td_index) { in dlopen_impl()
3661 void *tmp = p->td_index->next; in dlopen_impl()
3662 free(p->td_index); in dlopen_impl()
3663 p->td_index = tmp; in dlopen_impl()
3665 free(p->funcdescs); in dlopen_impl()
3666 free(p->rpath); in dlopen_impl()
3667 if (p->deps) { in dlopen_impl()
3668 for (int i = 0; i < p->ndeps_direct; i++) { in dlopen_impl()
3669 remove_dso_parent(p->deps[i], p); in dlopen_impl()
3672 free(p->deps); in dlopen_impl()
3675 if (p->parents) { in dlopen_impl()
3676 free(p->parents); in dlopen_impl()
3680 for (p=orig_tail->next; p; p=next) { in dlopen_impl()
3681 next = p->next; in dlopen_impl()
3688 if (tls_tail) tls_tail->next = 0; in dlopen_impl()
3694 tail->next = 0; in dlopen_impl()
3716 LD_LOGE("dlopen_impl load library header failed for %{public}s", task->name); in dlopen_impl()
3721 reserved_params.target = task->p; in dlopen_impl()
3724 if (!task->p) { in dlopen_impl()
3725 LD_LOGE("dlopen_impl load library failed for %{public}s", task->name); in dlopen_impl()
3734 dlopen_cost.entry_header_time = (time_end.tv_sec - time_start.tv_sec) * CLOCK_SECOND_TO_MILLI in dlopen_impl()
3735 + (time_end.tv_nsec - time_start.tv_nsec) / CLOCK_NANO_TO_MILLI; in dlopen_impl()
3736 if (!task->isloaded) { in dlopen_impl()
3740 preload_deps(task->p, tasks); in dlopen_impl()
3742 dlopen_cost.deps_header_time = (time_end.tv_sec - time_start.tv_sec) * CLOCK_SECOND_TO_MILLI in dlopen_impl()
3743 + (time_end.tv_nsec - time_start.tv_nsec) / CLOCK_NANO_TO_MILLI; in dlopen_impl()
3751 dlopen_cost.map_so_time = (time_end.tv_sec - time_start.tv_sec) * CLOCK_SECOND_TO_MILLI in dlopen_impl()
3752 + (time_end.tv_nsec - time_start.tv_nsec) / CLOCK_NANO_TO_MILLI; in dlopen_impl()
3753 p = task->p; in dlopen_impl()
3754 if (!task->isloaded) { in dlopen_impl()
3782 int constructed = p->constructed;
3785 if (!p->relocated && (mode & RTLD_LAZY)) {
3787 for (i = 0; p->deps[i]; i++)
3788 if (!p->deps[i]->relocated)
3789 prepare_lazy(p->deps[i]);
3791 if (!p->relocated || (mode & RTLD_GLOBAL)) {
3796 p->is_reloc_head_so_dep = true;
3797 for (i = 0; p->deps[i]; i++) {
3798 p->deps[i]->is_reloc_head_so_dep = true;
3799 add_syms(p->deps[i]);
3803 trace_marker_begin(HITRACE_TAG_MUSL, "linking: entry so", p->name);
3805 if (!p->relocated) {
3809 dlopen_cost.reloc_time = (time_end.tv_sec - time_start.tv_sec) * CLOCK_SECOND_TO_MILLI
3810 + (time_end.tv_nsec - time_start.tv_nsec) / CLOCK_NANO_TO_MILLI;
3812 reloc_head_so->is_reloc_head_so_dep = false;
3813 for (size_t i = 0; reloc_head_so->deps[i]; i++) {
3814 reloc_head_so->deps[i]->is_reloc_head_so_dep = false;
3833 dlopen_cost.map_cfi_time = (time_end.tv_sec - time_start.tv_sec) * CLOCK_SECOND_TO_MILLI
3834 + (time_end.tv_nsec - time_start.tv_nsec) / CLOCK_NANO_TO_MILLI;
3837 p->flags |= DSO_FLAGS_NODELETE;
3845 notify_addition_to_debugger(orig_tail->next);
3866 dlopen_cost.init_time = (time_end.tv_sec - time_start.tv_sec) * CLOCK_SECOND_TO_MILLI
3867 + (time_end.tv_nsec - time_start.tv_nsec) / CLOCK_NANO_TO_MILLI;
3876 dlopen_cost.total_time = (total_end.tv_sec - total_start.tv_sec) * CLOCK_SECOND_TO_MILLI
3877 + (total_end.tv_nsec - total_start.tv_nsec) / CLOCK_NANO_TO_MILLI;
3888 current_so->name,
3919 dlns->name[0] = 0; in dlns_init()
3928 snprintf(dlns->name, sizeof dlns->name, name); in dlns_init()
3929 LD_LOGI("dlns_init dlns->name:%{public}s .", dlns->name); in dlns_init()
3945 ns = ((caller && caller->namespace) ? caller->namespace : get_default_ns()); in dlns_get()
3946 (void)snprintf(dlns->name, sizeof dlns->name, ns->ns_name); in dlns_get()
3947 LD_LOGI("dlns_get name is null, current dlns dlns->name:%{public}s.", dlns->name); in dlns_get()
3951 (void)snprintf(dlns->name, sizeof dlns->name, ns->ns_name); in dlns_get()
3952 LD_LOGI("dlns_get found ns, current dlns dlns->name:%{public}s.", dlns->name); in dlns_get()
3965 if (is_permitted(caller_addr, dlns->name) == false) { in dlopen_ns()
3971 …LD_LOGI("dlopen_ns file:%{public}s, mode:%{public}x , caller_addr:%{public}p , dlns->name:%{public… in dlopen_ns()
3975 dlns ? dlns->name : "NULL"); in dlopen_ns()
3976 return dlopen_impl(file, mode, dlns->name, caller_addr, NULL); in dlopen_ns()
3982 if (is_permitted(caller_addr, dlns->name) == false) { in dlopen_ns_ext()
3989 "dlns->name:%{public}s. , extinfo->flag:%{public}x", in dlopen_ns_ext()
3993 dlns->name, in dlopen_ns_ext()
3994 extinfo ? extinfo->flag : 0); in dlopen_ns_ext()
3995 return dlopen_impl(file, mode, dlns->name, caller_addr, extinfo); in dlopen_ns_ext()
4008 if (is_permitted(caller_addr, dlns->name) == false) { in dlns_create2()
4013 ns = find_ns_by_name(dlns->name); in dlns_create2()
4025 ns_set_name(ns, dlns->name); in dlns_create2()
4027 ns_add_dso(ns, get_default_ns()->ns_dsos->dsos[0]); /* add main app to this namespace*/ in dlns_create2()
4039 if (caller && caller->namespace) { in dlns_create2()
4040 ns_add_inherit(ns, caller->namespace, NULL); in dlns_create2()
4048 ns->ns_name, ns->separated, ns->lib_paths); in dlns_create2()
4069 if (is_permitted(caller_addr, dlns->name) == false) { in dlns_inherit()
4074 ns_t* ns = find_ns_by_name(dlns->name); in dlns_inherit()
4075 ns_t* ns_inherited = find_ns_by_name(inherited->name); in dlns_inherit()
4090 ns_t * ns = p->namespace; in dlclose_ns()
4091 if (!ns || !ns->ns_dsos) return; in dlclose_ns()
4092 for (size_t i = 0; i < ns->ns_dsos->num; i++) { in dlclose_ns()
4093 if (p == ns->ns_dsos->dsos[i]) { in dlclose_ns()
4094 for (size_t j = i + 1; j < ns->ns_dsos->num; j++) { in dlclose_ns()
4095 ns->ns_dsos->dsos[j - 1] = ns->ns_dsos->dsos[j]; in dlclose_ns()
4097 ns->ns_dsos->num--; in dlclose_ns()
4106 for (p=head; p; p=p->next) if (h==p) return 0; in __dl_invalid_handle()
4115 for (p=head; p; p=p->next) { in addr2dso()
4116 if (a < p->map || a - (size_t)p->map >= p->map_len) continue; in addr2dso()
4117 Phdr *ph = p->phdr; in addr2dso()
4118 size_t phcnt = p->phnum; in addr2dso()
4119 size_t entsz = p->phentsize; in addr2dso()
4120 size_t base = (size_t)p->base; in addr2dso()
4121 for (; phcnt--; ph=(void *)((char *)ph+entsz)) { in addr2dso()
4122 if (ph->p_type != PT_LOAD) continue; in addr2dso()
4123 if (a-base-ph->p_vaddr < ph->p_memsz) in addr2dso()
4126 if (a-(size_t)p->map < p->map_len) in addr2dso()
4144 p = p->next; in do_dlsym()
4152 ns = p->namespace; in do_dlsym()
4156 if (caller && caller->namespace) { in do_dlsym()
4157 ns = caller->namespace; in do_dlsym()
4167 (p == NULL ? "NULL" : p->name), s, v); in do_dlsym()
4169 s, strlen(v) > 0 ? v : "null", (p == NULL ? "NULL" : p->name)); in do_dlsym()
4172 if ((def.sym->st_info&0xf) == STT_TLS) in do_dlsym()
4173 return __tls_get_addr((tls_mod_off_t []){def.dso->tls_id, def.sym->st_value-DTP_OFFSET}); in do_dlsym()
4174 if (DL_FDPIC && (def.sym->st_info&0xf) == STT_FUNC) in do_dlsym()
4175 return def.dso->funcdescs + (def.sym - def.dso->syms); in do_dlsym()
4176 return laddr(def.dso, def.sym->st_value); in do_dlsym()
4185 LD_LOGE("[dlclose]: invalid handle %{public}p", p); in so_can_unload()
4186 error("[dlclose]: Handle is invalid."); in so_can_unload()
4190 if (!p->by_dlopen) { in so_can_unload()
4191 LD_LOGD("[dlclose]: skip unload %{public}s because it's not loaded by dlopen", p->name); in so_can_unload()
4196 if ((p->flags & DSO_FLAGS_NODELETE) != 0) { in so_can_unload()
4197 LD_LOGD("[dlclose]: skip unload %{public}s because flags is RTLD_NODELETE", p->name); in so_can_unload()
4203 if (p->nr_dlopen > 0) { in so_can_unload()
4204 …LD_LOGD("[dlclose]: skip unload %{public}s because nr_dlopen=%{public}d > 0", p->name, p->nr_dlope… in so_can_unload()
4215 return -1; in dlclose_post()
4219 libc.unload_hook((unsigned long int)p->base, p->phdr, p->phnum); in dlclose_post()
4224 if (p->parents) { in dlclose_post()
4225 free(p->parents); in dlclose_post()
4228 if (p->tls.size == 0) { in dlclose_post()
4241 trace_marker_begin(HITRACE_TAG_MUSL, "dlclose", p->name); in dlclose_impl()
4244 if (p->syms_next) { in dlclose_impl()
4245 for (d = head; d->syms_next != p; d = d->syms_next) in dlclose_impl()
4247 d->syms_next = p->syms_next; in dlclose_impl()
4249 for (d = head; d->syms_next != p; d = d->syms_next) in dlclose_impl()
4251 d->syms_next = NULL; in dlclose_impl()
4257 lazy_head = p->lazy_next; in dlclose_impl()
4258 } else if (p->lazy_next) { in dlclose_impl()
4259 for (d = lazy_head; d->lazy_next != p; d = d->lazy_next) in dlclose_impl()
4261 d->lazy_next = p->lazy_next; in dlclose_impl()
4267 fini_head = p->fini_next; in dlclose_impl()
4268 } else if (p->fini_next) { in dlclose_impl()
4269 for (d = fini_head; d->fini_next != p; d = d->fini_next) in dlclose_impl()
4271 d->fini_next = p->fini_next; in dlclose_impl()
4276 if (p->tls.size != 0) { in dlclose_impl()
4277 p->tls.image = NULL; in dlclose_impl()
4282 tail = p->prev; in dlclose_impl()
4283 tail->next = NULL; in dlclose_impl()
4285 p->next->prev = p->prev; in dlclose_impl()
4286 p->prev->next = p->next; in dlclose_impl()
4305 if (p->lazy != NULL) in dlclose_impl()
4306 free(p->lazy); in dlclose_impl()
4307 if (p->deps != no_deps) in dlclose_impl()
4308 free(p->deps); in dlclose_impl()
4310 if (p->deps_all_built) { in dlclose_impl()
4311 free(p->deps_all); in dlclose_impl()
4332 if (p->nr_dlopen > 0) { in do_dlclose()
4333 --(p->nr_dlopen); in do_dlclose()
4335 …LD_LOGE("[dlclose]: number of dlopen and dlclose of %{public}s doesn't match when dlclose %{public… in do_dlclose()
4336 p->name, p->name); in do_dlclose()
4340 if (p->bfs_built) { in do_dlclose()
4341 for (int i = 0; p->deps[i]; i++) { in do_dlclose()
4342 if (p->deps[i]->nr_dlopen > 0) { in do_dlclose()
4343 p->deps[i]->nr_dlopen--; in do_dlclose()
4345 …LD_LOGE("[dlclose]: number of dlopen and dlclose of %{public}s doesn't match when dlclose %{public… in do_dlclose()
4346 p->deps[i]->name, p->name); in do_dlclose()
4352 … * - nr_dlopen increases for all deps(include self) when a thread local object destructor is added. in do_dlclose()
4353 …* - nr_dlopen decreases for all deps(include self) when a thread local object destructor is called. in do_dlclose()
4355 if (check_deps_all && p->deps_all_built) { in do_dlclose()
4356 for (int i = 0; p->deps_all[i]; i++) { in do_dlclose()
4357 if (p->deps_all[i]->nr_dlopen > 0) { in do_dlclose()
4358 p->deps_all[i]->nr_dlopen--; in do_dlclose()
4360 …LD_LOGE("[dlclose]: number of dlopen and dlclose of %{public}s doesn't match when dlclose %{public… in do_dlclose()
4361 p->deps_all[i]->name, p->name); in do_dlclose()
4375 start_entry->dso = p; in do_dlclose()
4380 struct dso *cur = ecur->dso; in do_dlclose()
4384 if (ef->dso == cur) { in do_dlclose()
4393 for (int i = 0; i < cur->ndeps_direct; i++) { in do_dlclose()
4394 remove_dso_parent(cur->deps[i], cur); in do_dlclose()
4395 if ((cur->deps[i]->parents_count == 0) && (so_can_unload(cur->deps[i], UNLOAD_ALL_CHECK) == 1)) { in do_dlclose()
4398 if (ef->dso == cur->deps[i]) { in do_dlclose()
4408 edeps->dso = cur->deps[i]; in do_dlclose()
4416 LD_LOGE("[dlclose]: unload %{public}s succeed when dlclose %{public}s", ef->dso->name, p->name); in do_dlclose()
4418 for (size_t deps_num = 0; p->deps[deps_num]; deps_num++) { in do_dlclose()
4421 if (ef->dso == p->deps[deps_num]) { in do_dlclose()
4427 LD_LOGE("[dlclose]: unload %{public}s failed when dlclose %{public}s," in do_dlclose()
4429 p->deps[deps_num]->name, p->name, p->deps[deps_num]->nr_dlopen, in do_dlclose()
4430 p->deps[deps_num]->by_dlopen, p->deps[deps_num]->parents_count); in do_dlclose()
4436 dlclose_impl(ef->dso); in do_dlclose()
4442 int constructed = ef->dso->constructed; in do_dlclose()
4447 decode_vec(ef->dso->dynv, dyn, DYN_CNT); in do_dlclose()
4450 size_t *fn = (size_t *)laddr(ef->dso, dyn[DT_FINI_ARRAY]) + n; in do_dlclose()
4451 trace_marker_begin(HITRACE_TAG_MUSL, "calling destructors:", ef->dso->name); in do_dlclose()
4454 while (n--) in do_dlclose()
4455 ((void (*)(void))*--fn)(); in do_dlclose()
4461 ef->dso->constructed = 0; in do_dlclose()
4467 dlclose_post(ef->dso); in do_dlclose()
4485 error("Cannot dlclose while program is exiting."); in __dlclose()
4488 return -1; in __dlclose()
4498 return -1; in __dlclose()
4510 return sym->st_value && in sym_is_matched()
4511 (1<<(sym->st_info&0xf) != STT_TLS) && in sym_is_matched()
4512 (addr_offset_so >= sym->st_value) && in sym_is_matched()
4513 (addr_offset_so < sym->st_value + sym->st_size); in sym_is_matched()
4517 uint32_t nsym = p->hashtab[1]; in find_addr_by_elf()
4518 Sym *sym = p->syms; in find_addr_by_elf()
4519 for (; nsym; nsym--, sym++) { in find_addr_by_elf()
4532 Sym *sym_tab = p->syms; in find_addr_by_gnu()
4533 uint32_t *buckets = p->ghashtab + 4 + (p->ghashtab[2] * sizeof(size_t) / 4); in find_addr_by_gnu()
4539 for (i = nsym = 0; i < p->ghashtab[0]; i++) { in find_addr_by_gnu()
4553 hashval = buckets + p->ghashtab[0] + (nsym - p->ghashtab[1]); in find_addr_by_gnu()
4581 strings = p->strings; in dladdr()
4582 size_t addr_offset_so = addr - (size_t)p->base; in dladdr()
4584 info->dli_fname = p->name; in dladdr()
4585 info->dli_fbase = p->map; in dladdr()
4587 if (p->ghashtab) { in dladdr()
4595 info->dli_sname = 0; in dladdr()
4596 info->dli_saddr = 0; in dladdr()
4599 info->dli_sname = strings + match_sym->st_name; in dladdr()
4600 info->dli_saddr = (void *)laddr(p, match_sym->st_value); in dladdr()
4658 if (s[l-2]=='_' && s[l-1]=='r') { in __dlsym_redir_time64()
4659 l -= 2; in __dlsym_redir_time64()
4663 if (!strcmp(s+l-4, "time")) suffix = "64"; in __dlsym_redir_time64()
4682 info.dlpi_addr = (uintptr_t)current->base; in dl_iterate_phdr()
4683 info.dlpi_name = current->name; in dl_iterate_phdr()
4684 info.dlpi_phdr = current->phdr; in dl_iterate_phdr()
4685 info.dlpi_phnum = current->phnum; in dl_iterate_phdr()
4688 info.dlpi_tls_modid = current->tls_id; in dl_iterate_phdr()
4689 info.dlpi_tls_data = !current->tls_id ? 0 : in dl_iterate_phdr()
4690 __tls_get_addr((tls_mod_off_t[]){current->tls_id,0}); in dl_iterate_phdr()
4699 current = current->next; in dl_iterate_phdr()
4834 namespace ? namespace->ns_name : "NULL"); in handle_asan_path_open()
4836 if (fd == -1 && (namespace->asan_lib_paths || namespace->lib_paths)) { in handle_asan_path_open()
4837 if (namespace->lib_paths && namespace->asan_lib_paths) { in handle_asan_path_open()
4838 size_t newlen = strlen(namespace->asan_lib_paths) + strlen(namespace->lib_paths) + 2; in handle_asan_path_open()
4841 strcpy(new_lib_paths, namespace->asan_lib_paths); in handle_asan_path_open()
4843 strcat(new_lib_paths, namespace->lib_paths); in handle_asan_path_open()
4847 } else if (namespace->asan_lib_paths) { in handle_asan_path_open()
4848 fd_tmp = path_open(name, namespace->asan_lib_paths, buf, buf_size); in handle_asan_path_open()
4850 namespace->asan_lib_paths, in handle_asan_path_open()
4853 fd_tmp = path_open(name, namespace->lib_paths, buf, buf_size); in handle_asan_path_open()
4855 …"handle_asan_path_open path_open lib_paths:%{public}s ,fd: %{public}d.", namespace->lib_paths, fd_… in handle_asan_path_open()
4867 if ((extinfo->flag & ~(DL_EXT_VALID_FLAG_BITS)) != 0) { in dlopen_ext()
4868 LD_LOGE("Error dlopen_ext %{public}s: invalid flag %{public}x", file, extinfo->flag); in dlopen_ext()
4872 …LD_LOGI("dlopen_ext file:%{public}s, mode:%{public}x , caller_addr:%{public}p , extinfo->flag:%{pu… in dlopen_ext()
4876 extinfo ? extinfo->flag : 0); in dlopen_ext()
4883 char *buf = task->buf; in open_library_by_path()
4884 size_t buf_size = sizeof task->buf; in open_library_by_path()
4889 if (l-1 >= INT_MAX) return; in open_library_by_path()
4895 task->fd = z_info->fd; in open_library_by_path()
4896 task->file_offset = z_info->file_offset; in open_library_by_path()
4899 memset(z_info->path_buf, 0, sizeof(z_info->path_buf)); in open_library_by_path()
4902 if ((task->fd = open(buf, O_RDONLY|O_CLOEXEC))>=0) break; in open_library_by_path()
4916 namespace ? namespace->ns_name : "NULL"); in handle_asan_path_open_by_task()
4917 if (fd == -1 && (namespace->asan_lib_paths || namespace->lib_paths)) { in handle_asan_path_open_by_task()
4918 if (namespace->lib_paths && namespace->asan_lib_paths) { in handle_asan_path_open_by_task()
4919 size_t newlen = strlen(namespace->asan_lib_paths) + strlen(namespace->lib_paths) + 2; in handle_asan_path_open_by_task()
4922 strcpy(new_lib_paths, namespace->asan_lib_paths); in handle_asan_path_open_by_task()
4924 strcat(new_lib_paths, namespace->lib_paths); in handle_asan_path_open_by_task()
4928 task->fd); in handle_asan_path_open_by_task()
4930 } else if (namespace->asan_lib_paths) { in handle_asan_path_open_by_task()
4931 open_library_by_path(name, namespace->asan_lib_paths, task, z_info); in handle_asan_path_open_by_task()
4933 namespace->asan_lib_paths, in handle_asan_path_open_by_task()
4934 task->fd); in handle_asan_path_open_by_task()
4936 open_library_by_path(name, namespace->lib_paths, task, z_info); in handle_asan_path_open_by_task()
4938 namespace->lib_paths, in handle_asan_path_open_by_task()
4939 task->fd); in handle_asan_path_open_by_task()
4954 * - path: x/xx/xxx.zip!/x/xx/xxx.so in open_uncompressed_library_in_zipfile()
4955 * - zipfile path: x/xx/xxx.zip in open_uncompressed_library_in_zipfile()
4956 * - library path in zipfile: x/xx/xxx.so */ in open_uncompressed_library_in_zipfile()
4957 if (strlcpy(z_info->path_buf, path, PATH_BUF_SIZE) >= PATH_BUF_SIZE) { in open_uncompressed_library_in_zipfile()
4959 return -1; in open_uncompressed_library_in_zipfile()
4961 z_info->path_buf[separator - path] = '\0'; in open_uncompressed_library_in_zipfile()
4962 z_info->file_path_index = separator - path + 2; in open_uncompressed_library_in_zipfile()
4963 char *zip_file_path = z_info->path_buf; in open_uncompressed_library_in_zipfile()
4964 char *lib_path = &z_info->path_buf[z_info->file_path_index]; in open_uncompressed_library_in_zipfile()
4967 return -1; in open_uncompressed_library_in_zipfile()
4976 return -1; in open_uncompressed_library_in_zipfile()
4981 return -1; in open_uncompressed_library_in_zipfile()
4984 if (zip_file_len == -1) { in open_uncompressed_library_in_zipfile()
4987 return -1; in open_uncompressed_library_in_zipfile()
4992 size_t end_locator_pos = zip_file_len - end_locator_len; in open_uncompressed_library_in_zipfile()
4996 return -1; in open_uncompressed_library_in_zipfile()
5001 return -1; in open_uncompressed_library_in_zipfile()
5011 return -1; in open_uncompressed_library_in_zipfile()
5016 return -1; in open_uncompressed_library_in_zipfile()
5022 return -1; in open_uncompressed_library_in_zipfile()
5029 return -1; in open_uncompressed_library_in_zipfile()
5034 return -1; in open_uncompressed_library_in_zipfile()
5039 return -1; in open_uncompressed_library_in_zipfile()
5042 z_info->file_offset = c_dir_entry.local_header_offset + sizeof(zip_file_header) + in open_uncompressed_library_in_zipfile()
5044 …if (zip_file_header.compression_method != COMPRESS_STORED || z_info->file_offset % PAGE_SIZE != 0)… in open_uncompressed_library_in_zipfile()
5047 lib_path, zip_file_path, zip_file_header.compression_method, z_info->file_offset); in open_uncompressed_library_in_zipfile()
5049 return -2; in open_uncompressed_library_in_zipfile()
5051 z_info->found = true; in open_uncompressed_library_in_zipfile()
5059 if (!z_info->found) { in open_uncompressed_library_in_zipfile()
5062 return -3; in open_uncompressed_library_in_zipfile()
5064 z_info->fd = fileno(zip_file); in open_uncompressed_library_in_zipfile()
5072 void *map = mmap(0, mapLen, PROT_READ, MAP_PRIVATE | MAP_XPM, task->fd, task->file_offset); in task_check_xpm()
5074 LD_LOGE("Xpm check failed for %{public}s, errno for mmap is: %{public}d", task->name, errno); in task_check_xpm()
5092 ssize_t l = pread(task->fd, task->ehdr_buf, sizeof task->ehdr_buf, task->file_offset); in map_library_header()
5093 task->eh = task->ehdr_buf; in map_library_header()
5095 …LD_LOGE("Error mapping header %{public}s: failed to read fd errno: %{public}d", task->name, errno); in map_library_header()
5098 if (l < sizeof(Ehdr) || (task->eh->e_type != ET_DYN && task->eh->e_type != ET_EXEC)) { in map_library_header()
5100 task->name, l, task->eh->e_type); in map_library_header()
5103 task->phsize = task->eh->e_phentsize * task->eh->e_phnum; in map_library_header()
5104 if (task->phsize > sizeof task->ehdr_buf - sizeof(Ehdr)) { in map_library_header()
5105 task->allocated_buf = malloc(task->phsize); in map_library_header()
5106 if (!task->allocated_buf) { in map_library_header()
5107 …LD_LOGE("Error mapping header %{public}s: failed to alloc memory errno: %{public}d", task->name, e… in map_library_header()
5110 l = pread(task->fd, task->allocated_buf, task->phsize, task->eh->e_phoff + task->file_offset); in map_library_header()
5112 LD_LOGE("Error mapping header %{public}s: failed to pread errno: %{public}d", task->name, errno); in map_library_header()
5115 if (l != task->phsize) { in map_library_header()
5116 … LD_LOGE("Error mapping header %{public}s: unmatched phsize errno: %{public}d", task->name, errno); in map_library_header()
5119 ph = task->ph0 = task->allocated_buf; in map_library_header()
5120 } else if (task->eh->e_phoff + task->phsize > l) { in map_library_header()
5121 l = pread(task->fd, task->ehdr_buf + 1, task->phsize, task->eh->e_phoff + task->file_offset); in map_library_header()
5123 LD_LOGE("Error mapping header %{public}s: failed to pread errno: %{public}d", task->name, errno); in map_library_header()
5126 if (l != task->phsize) { in map_library_header()
5127 LD_LOGE("Error mapping header %{public}s: unmatched phsize", task->name); in map_library_header()
5130 ph = task->ph0 = (void *)(task->ehdr_buf + 1); in map_library_header()
5132 ph = task->ph0 = (void *)((char *)task->ehdr_buf + task->eh->e_phoff); in map_library_header()
5135 for (i = task->eh->e_phnum; i; i--, ph = (void *)((char *)ph + task->eh->e_phentsize)) { in map_library_header()
5136 if (ph->p_type == PT_DYNAMIC) { in map_library_header()
5137 task->dyn = ph->p_vaddr; in map_library_header()
5138 } else if (ph->p_type == PT_TLS) { in map_library_header()
5139 task->tls_image = ph->p_vaddr; in map_library_header()
5140 task->tls.align = ph->p_align; in map_library_header()
5141 task->tls.len = ph->p_filesz; in map_library_header()
5142 task->tls.size = ph->p_memsz; in map_library_header()
5145 if (ph->p_type != PT_DYNAMIC) { in map_library_header()
5149 off_start = ph->p_offset; in map_library_header()
5150 off_start &= -PAGE_SIZE; in map_library_header()
5151 task->dyn_map_len = ph->p_memsz + (ph->p_offset - off_start); in map_library_header()
5155 …task->dyn_map = mmap(0, task->dyn_map_len, PROT_READ, MAP_PRIVATE, task->fd, off_start + task->fil… in map_library_header()
5156 if (task->dyn_map == MAP_FAILED) { in map_library_header()
5157 …or mapping header %{public}s: failed to map dynamic section errno: %{public}d", task->name, errno); in map_library_header()
5160 task->dyn_addr = (size_t *)((unsigned char *)task->dyn_map + (ph->p_offset - off_start)); in map_library_header()
5162 if (search_vec(task->dyn_addr, &dyn_tmp, DT_STRTAB)) { in map_library_header()
5165 LD_LOGE("Error mapping header %{public}s: DT_STRTAB not found", task->name); in map_library_header()
5168 if (search_vec(task->dyn_addr, &dyn_tmp, DT_STRSZ)) { in map_library_header()
5171 LD_LOGE("Error mapping header %{public}s: DT_STRSZ not found", task->name); in map_library_header()
5176 task->shsize = task->eh->e_shentsize * task->eh->e_shnum; in map_library_header()
5177 off_start = task->eh->e_shoff; in map_library_header()
5178 off_start &= -PAGE_SIZE; in map_library_header()
5179 task->shsize += task->eh->e_shoff - off_start; in map_library_header()
5180 …task->shdr_allocated_buf = mmap(0, task->shsize, PROT_READ, MAP_PRIVATE, task->fd, off_start + tas… in map_library_header()
5181 if (task->shdr_allocated_buf == MAP_FAILED) { in map_library_header()
5183 task->name, errno); in map_library_header()
5186 Shdr *sh = (char *)task->shdr_allocated_buf + task->eh->e_shoff - off_start; in map_library_header()
5187 for (i = task->eh->e_shnum; i; i--, sh = (void *)((char *)sh + task->eh->e_shentsize)) { in map_library_header()
5188 if (sh->sh_type != SHT_STRTAB || sh->sh_addr != str_table || sh->sh_size != str_size) { in map_library_header()
5191 off_start = sh->sh_offset; in map_library_header()
5192 off_start &= -PAGE_SIZE; in map_library_header()
5193 task->str_map_len = sh->sh_size + (sh->sh_offset - off_start); in map_library_header()
5194 …task->str_map = mmap(0, task->str_map_len, PROT_READ, MAP_PRIVATE, task->fd, off_start + task->fil… in map_library_header()
5195 if (task->str_map == MAP_FAILED) { in map_library_header()
5197 task->name, errno); in map_library_header()
5200 task->str_addr = (char *)task->str_map + sh->sh_offset - off_start; in map_library_header()
5203 if (!task->dyn) { in map_library_header()
5204 LD_LOGE("Error mapping header %{public}s: dynamic section not found", task->name); in map_library_header()
5211 free(task->allocated_buf); in map_library_header()
5212 task->allocated_buf = NULL; in map_library_header()
5213 if (task->shdr_allocated_buf != MAP_FAILED) { in map_library_header()
5214 munmap(task->shdr_allocated_buf, task->shsize); in map_library_header()
5215 task->shdr_allocated_buf = MAP_FAILED; in map_library_header()
5226 Phdr *ph = task->ph0; in task_map_library()
5235 for (i = task->eh->e_phnum; i; i--, ph = (void *)((char *)ph + task->eh->e_phentsize)) { in task_map_library()
5236 if (ph->p_type == PT_GNU_RELRO) { in task_map_library()
5237 task->p->relro_start = ph->p_vaddr & -PAGE_SIZE; in task_map_library()
5238 task->p->relro_end = (ph->p_vaddr + ph->p_memsz) & -PAGE_SIZE; in task_map_library()
5239 } else if (ph->p_type == PT_GNU_STACK) { in task_map_library()
5240 if (!runtime && ph->p_memsz > __default_stacksize) { in task_map_library()
5242 ph->p_memsz < DEFAULT_STACK_MAX ? in task_map_library()
5243 ph->p_memsz : DEFAULT_STACK_MAX; in task_map_library()
5246 if (ph->p_type != PT_LOAD) { in task_map_library()
5250 if (ph->p_vaddr < addr_min) { in task_map_library()
5251 addr_min = ph->p_vaddr; in task_map_library()
5252 off_start = ph->p_offset; in task_map_library()
5253 prot = (((ph->p_flags & PF_R) ? PROT_READ : 0) | in task_map_library()
5254 ((ph->p_flags & PF_W) ? PROT_WRITE : 0) | in task_map_library()
5255 ((ph->p_flags & PF_X) ? PROT_EXEC : 0)); in task_map_library()
5257 if (ph->p_vaddr + ph->p_memsz > addr_max) { in task_map_library()
5258 addr_max = ph->p_vaddr + ph->p_memsz; in task_map_library()
5261 if (!task->dyn) { in task_map_library()
5262 …LD_LOGE("Error mapping library: !task->dyn dynamic section not found task->name=%{public}s", task- in task_map_library()
5265 if (DL_FDPIC && !(task->eh->e_flags & FDPIC_CONSTDISP_FLAG)) { in task_map_library()
5266 task->p->loadmap = calloc(1, sizeof(struct fdpic_loadmap) + nsegs * sizeof(struct fdpic_loadseg)); in task_map_library()
5267 if (!task->p->loadmap) { in task_map_library()
5271 task->p->loadmap->nsegs = nsegs; in task_map_library()
5272 for (ph = task->ph0, i = 0; i < nsegs; ph = (void *)((char *)ph + task->eh->e_phentsize)) { in task_map_library()
5273 if (ph->p_type != PT_LOAD) { in task_map_library()
5276 prot = (((ph->p_flags & PF_R) ? PROT_READ : 0) | in task_map_library()
5277 ((ph->p_flags & PF_W) ? PROT_WRITE : 0) | in task_map_library()
5278 ((ph->p_flags & PF_X) ? PROT_EXEC : 0)); in task_map_library()
5279 map = mmap(0, ph->p_memsz + (ph->p_vaddr & PAGE_SIZE - 1), in task_map_library()
5281 task->fd, ph->p_offset & -PAGE_SIZE + task->file_offset); in task_map_library()
5283 unmap_library(task->p); in task_map_library()
5284 …LD_LOGE("Error mapping library: PT_LOAD mmap failed task->name=%{public}s errno=%{public}d map_len… in task_map_library()
5285 task->name, errno, ph->p_memsz + (ph->p_vaddr & PAGE_SIZE - 1)); in task_map_library()
5288 task->p->loadmap->segs[i].addr = (size_t)map + in task_map_library()
5289 (ph->p_vaddr & PAGE_SIZE - 1); in task_map_library()
5290 task->p->loadmap->segs[i].p_vaddr = ph->p_vaddr; in task_map_library()
5291 task->p->loadmap->segs[i].p_memsz = ph->p_memsz; in task_map_library()
5294 size_t brk = (ph->p_vaddr & PAGE_SIZE - 1) + ph->p_filesz; in task_map_library()
5295 size_t pgbrk = (brk + PAGE_SIZE - 1) & -PAGE_SIZE; in task_map_library()
5296 size_t pgend = (brk + ph->p_memsz - ph->p_filesz + PAGE_SIZE - 1) & -PAGE_SIZE; in task_map_library()
5298 pgend - pgbrk, prot, in task_map_library()
5300 -1, off_start) == MAP_FAILED) in task_map_library()
5303 memset(map + brk, 0, pgbrk - brk); in task_map_library()
5306 map = (void *)task->p->loadmap->segs[0].addr; in task_map_library()
5310 addr_max += PAGE_SIZE - 1; in task_map_library()
5311 addr_max &= -PAGE_SIZE; in task_map_library()
5312 addr_min &= -PAGE_SIZE; in task_map_library()
5313 off_start &= -PAGE_SIZE; in task_map_library()
5314 map_len = addr_max - addr_min + off_start; in task_map_library()
5319 size_t maxinum_alignment = phdr_table_get_maxinum_alignment(task->ph0, task->eh->e_phnum); in task_map_library()
5325 if (map_len > reserved_params->reserved_size) { in task_map_library()
5326 if (reserved_params->must_use_reserved) { in task_map_library()
5327 …Error mapping library: map len is larger than reserved address task->name=%{public}s", task->name); in task_map_library()
5331 start_addr = ((size_t)reserved_params->start_addr - 1 + PAGE_SIZE) & -PAGE_SIZE; in task_map_library()
5340 size_t tmp_map_len = ALIGN(map_len, mapping_align) + mapping_align - PAGE_SIZE; in task_map_library()
5348 …void *)start_addr, map_len, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) in task_map_library()
5349 : mmap((void *)start_addr, map_len, prot, map_flags, task->fd, off_start + task->file_offset); in task_map_library()
5352 " task->fd=%{public}d task->name=%{public}s map_len=%{public}d", in task_map_library()
5353 errno, DL_NOMMU_SUPPORT, task->fd, task->name, map_len); in task_map_library()
5356 if (reserved_params && map_len < reserved_params->reserved_size) { in task_map_library()
5357 reserved_params->reserved_size -= (map_len + (start_addr - (size_t)reserved_params->start_addr)); in task_map_library()
5358 reserved_params->start_addr = (void *)((uint8_t *)map + map_len); in task_map_library()
5363 …ed char *temp_map = mmap((void *)NULL, tmp_map_len, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); in task_map_library()
5374 ? mmap(real_map, map_len, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) in task_map_library()
5376 : mmap(real_map, map_len, prot, map_flags | MAP_FIXED, task->fd, off_start + task->file_offset); in task_map_library()
5379 "task->fd=%{public}d task->name=%{public}s map_len=%{public}d", in task_map_library()
5380 errno, DL_NOMMU_SUPPORT, task->fd, task->name, map_len); in task_map_library()
5385 * |--------------------------tmp_map_len--------------------------| in task_map_library()
5387 * |---unused_part_1---|---------map_len-------|---unused_part_2---| in task_map_library()
5391 size_t unused_part_1 = real_map - temp_map; in task_map_library()
5392 size_t unused_part_2 = temp_map_end - (real_map + map_len); in task_map_library()
5395 if (res1 == -1) { in task_map_library()
5402 if (res2 == -1) { in task_map_library()
5407 task->p->map = map; in task_map_library()
5408 task->p->map_len = map_len; in task_map_library()
5411 if (task->eh->e_type != ET_DYN && addr_min && map != (void *)addr_min) { in task_map_library()
5412 LD_LOGE("Error mapping library: ET_DYN task->name=%{public}s", task->name); in task_map_library()
5416 base = map - addr_min; in task_map_library()
5417 task->p->phdr = 0; in task_map_library()
5418 task->p->phnum = 0; in task_map_library()
5419 …for (ph = task->ph0, i = task->eh->e_phnum; i; i--, ph = (void *)((char *)ph + task->eh->e_phentsi… in task_map_library()
5420 if (ph->p_type == PT_OHOS_RANDOMDATA) { in task_map_library()
5421 fill_random_data((void *)(ph->p_vaddr + base), ph->p_memsz); in task_map_library()
5424 if (ph->p_type != PT_LOAD) { in task_map_library()
5429 if (!task->p->phdr && task->eh->e_phoff >= ph->p_offset in task_map_library()
5430 && task->eh->e_phoff + task->phsize <= ph->p_offset + ph->p_filesz) { in task_map_library()
5431 task->p->phdr = (void *)(base + ph->p_vaddr + (task->eh->e_phoff - ph->p_offset)); in task_map_library()
5432 task->p->phnum = task->eh->e_phnum; in task_map_library()
5433 task->p->phentsize = task->eh->e_phentsize; in task_map_library()
5435 this_min = ph->p_vaddr & -PAGE_SIZE; in task_map_library()
5436 this_max = ph->p_vaddr + ph->p_memsz + PAGE_SIZE - 1 & -PAGE_SIZE; in task_map_library()
5437 off_start = ph->p_offset & -PAGE_SIZE; in task_map_library()
5438 prot = (((ph->p_flags & PF_R) ? PROT_READ : 0) | in task_map_library()
5439 ((ph->p_flags & PF_W) ? PROT_WRITE : 0) | in task_map_library()
5440 ((ph->p_flags & PF_X) ? PROT_EXEC : 0)); in task_map_library()
5441 /* Reuse the existing mapping for the lowest-address LOAD */ in task_map_library()
5444 this_max - this_min, in task_map_library()
5446 task->fd, in task_map_library()
5447 off_start + task->file_offset) == MAP_FAILED) { in task_map_library()
5448 …LD_LOGE("Error mapping library: mmap fix failed task->name=%{public}s errno=%{public}d", task->nam… in task_map_library()
5451 if ((ph->p_flags & PF_X) && (ph->p_align == KPMD_SIZE) && hugepage_enabled) in task_map_library()
5452 madvise(base + this_min, this_max - this_min, MADV_HUGEPAGE); in task_map_library()
5453 if (ph->p_memsz > ph->p_filesz && (ph->p_flags & PF_W)) { in task_map_library()
5454 size_t brk = (size_t)base + ph->p_vaddr + ph->p_filesz; in task_map_library()
5455 size_t pgbrk = brk + PAGE_SIZE - 1 & -PAGE_SIZE; in task_map_library()
5456 size_t zeromap_size = (size_t)base + this_max - pgbrk; in task_map_library()
5457 memset((void *)brk, 0, pgbrk - brk & PAGE_SIZE - 1); in task_map_library()
5458 if (pgbrk - (size_t)base < this_max && mmap_fixed( in task_map_library()
5463 -1, in task_map_library()
5465 …LD_LOGE("Error mapping library: PF_W mmap fix failed errno=%{public}d task->name=%{public}s zeroma… in task_map_library()
5466 errno, task->name, zeromap_size); in task_map_library()
5469 set_bss_vma_name(task->p->name, (void *)pgbrk, zeromap_size); in task_map_library()
5472 for (i = 0; ((size_t *)(base + task->dyn))[i]; i += NEXT_DYNAMIC_INDEX) { in task_map_library()
5473 if (((size_t *)(base + task->dyn))[i] == DT_TEXTREL) { in task_map_library()
5475 …LD_LOGE("Error mapping library: mprotect failed task->name=%{public}s errno=%{public}d", task->nam… in task_map_library()
5484 (void)is_section_exist(task->eh, sizeof(Ehdr), task->fd, ".kernelpermission"); in task_map_library()
5486 encpas_cost_time = (encaps_time_end.tv_sec - encaps_time_start.tv_sec) * CLOCK_SECOND_TO_MILLI in task_map_library()
5487 + (encaps_time_end.tv_nsec - encaps_time_start.tv_nsec) / CLOCK_NANO_TO_MILLI; in task_map_library()
5489 task->p->base = base; in task_map_library()
5490 task->p->dynv = laddr(task->p, task->dyn); in task_map_library()
5491 if (task->p->tls.size) { in task_map_library()
5492 task->p->tls.image = laddr(task->p, task->tls_image); in task_map_library()
5494 free(task->allocated_buf); in task_map_library()
5495 task->allocated_buf = NULL; in task_map_library()
5496 if (task->shdr_allocated_buf != MAP_FAILED) { in task_map_library()
5497 munmap(task->shdr_allocated_buf, task->shsize); in task_map_library()
5498 task->shdr_allocated_buf = MAP_FAILED; in task_map_library()
5505 unmap_library(task->p); in task_map_library()
5507 free(task->allocated_buf); in task_map_library()
5508 task->allocated_buf = NULL; in task_map_library()
5509 if (task->shdr_allocated_buf != MAP_FAILED) { in task_map_library()
5510 munmap(task->shdr_allocated_buf, task->shsize); in task_map_library()
5511 task->shdr_allocated_buf = MAP_FAILED; in task_map_library()
5521 int ret = snprintf(proc_self_fd, sizeof(proc_self_fd), "/proc/self/fd/%d", task->fd); in resolve_fd_to_realpath()
5525 ssize_t len = readlink(proc_self_fd, resolved_path, sizeof(resolved_path) - 1); in resolve_fd_to_realpath()
5530 strncpy(task->buf, resolved_path, PATH_MAX); in resolve_fd_to_realpath()
5537 const char *name = task->name; in load_library_header()
5538 struct dso *needed_by = task->needed_by; in load_library_header()
5539 ns_t *namespace = task->namespace; in load_library_header()
5540 bool check_inherited = task->check_inherited; in load_library_header()
5561 if (strncmp(name + NAME_INDEX_THREE, rp, next - rp) == 0) { in load_library_header()
5570 unsigned mask = 1U << (rp - reserved); in load_library_header()
5586 tail->next = &ldso; in load_library_header()
5592 task->isloaded = true; in load_library_header()
5593 task->p = &ldso; in load_library_header()
5601 task->pathname = name; in load_library_header()
5602 if (!is_accessible(namespace, task->pathname, g_is_asan, check_inherited)) { in load_library_header()
5604 task->pathname, namespace ? namespace->ns_name : "NULL"); in load_library_header()
5605 task->fd = -1; in load_library_header()
5607 task->fd = z_info.fd; in load_library_header()
5608 task->file_offset = z_info.file_offset; in load_library_header()
5615 task->pathname = name; in load_library_header()
5616 if (!is_accessible(namespace, task->pathname, g_is_asan, check_inherited)) { in load_library_header()
5618 task->pathname, namespace ? namespace->ns_name : "NULL"); in load_library_header()
5619 task->fd = -1; in load_library_header()
5621 task->fd = open(name, O_RDONLY | O_CLOEXEC); in load_library_header()
5627 task->p = find_library_by_name(name, namespace, check_inherited); in load_library_header()
5628 if (task->p) { in load_library_header()
5629 task->isloaded = true; in load_library_header()
5631 name, namespace->ns_name, task->p->name, task->p->namespace->ns_name); in load_library_header()
5638 task->fd = -1; in load_library_header()
5639 if (namespace->env_paths) { in load_library_header()
5640 open_library_by_path(name, namespace->env_paths, task, &z_info); in load_library_header()
5642 for (task->p = needed_by; task->fd == -1 && task->p; task->p = task->p->needed_by) { in load_library_header()
5643 if (fixup_rpath(task->p, task->buf, sizeof task->buf) < 0) { in load_library_header()
5644 task->fd = INVALID_FD_INHIBIT_FURTHER_SEARCH; /* Inhibit further search. */ in load_library_header()
5646 if (task->p->rpath) { in load_library_header()
5647 open_library_by_path(name, task->p->rpath, task, &z_info); in load_library_header()
5648 if (task->fd != -1 && resolve_fd_to_realpath(task)) { in load_library_header()
5649 if (!is_accessible(namespace, task->buf, g_is_asan, check_inherited)) { in load_library_header()
5651 name, namespace ? namespace->ns_name : "NULL"); in load_library_header()
5652 close(task->fd); in load_library_header()
5653 task->fd = -1; in load_library_header()
5659 handle_asan_path_open_by_task(task->fd, name, namespace, task, &z_info); in load_library_header()
5660 LD_LOGD("load_library handle_asan_path_open_by_task fd:%{public}d.", task->fd); in load_library_header()
5662 if (task->fd == -1 && namespace->lib_paths) { in load_library_header()
5663 open_library_by_path(name, namespace->lib_paths, task, &z_info); in load_library_header()
5664 LD_LOGD("load_library no asan lib_paths path_open fd:%{public}d.", task->fd); in load_library_header()
5667 task->pathname = task->buf; in load_library_header()
5669 if (task->fd < 0) { in load_library_header()
5670 if (!check_inherited || !namespace->ns_inherits) { in load_library_header()
5672 task->name, namespace->ns_name, errno); in load_library_header()
5676 for (size_t i = 0; i < namespace->ns_inherits->num; i++) { in load_library_header()
5677 ns_inherit *inherit = namespace->ns_inherits->inherits[i]; in load_library_header()
5681 task->namespace = inherit->inherited_ns; in load_library_header()
5682 task->check_inherited = false; in load_library_header()
5688 task->name, namespace->ns_name); in load_library_header()
5692 if (fstat(task->fd, &st) < 0) { in load_library_header()
5693 …LD_LOGE("Error loading header %{public}s: failed to get file state errno=%{public}d", task->name, … in load_library_header()
5694 close(task->fd); in load_library_header()
5695 task->fd = -1; in load_library_header()
5699 task->p = find_library_by_fstat(&st, namespace, check_inherited, task->file_offset); in load_library_header()
5700 if (task->p) { in load_library_header()
5704 if (!task->p->shortname && task->pathname != name) { in load_library_header()
5705 task->p->shortname = strrchr(task->p->name, '/') + 1; in load_library_header()
5707 close(task->fd); in load_library_header()
5708 task->fd = -1; in load_library_header()
5709 task->isloaded = true; in load_library_header()
5711 name, namespace->ns_name, task->p->name, task->p->namespace->ns_name); in load_library_header()
5717 LD_LOGE("Error loading header %{public}s: failed to map header", task->name); in load_library_header()
5718 close(task->fd); in load_library_header()
5719 task->fd = -1; in load_library_header()
5724 * storage must include a reservation for all pre-existing in load_library_header()
5727 * the newly-loaded DSO. */ in load_library_header()
5728 alloc_size = sizeof(struct dso) + strlen(task->pathname) + 1; in load_library_header()
5729 if (runtime && task->tls.size) { in load_library_header()
5730 size_t per_th = task->tls.size + task->tls.align + sizeof(void *) * (tls_cnt + TLS_CNT_INCREASE); in load_library_header()
5738 task->p = calloc(1, alloc_size); in load_library_header()
5739 if (!task->p) { in load_library_header()
5740 LD_LOGE("Error loading header %{public}s: failed to allocate dso", task->name); in load_library_header()
5741 close(task->fd); in load_library_header()
5742 task->fd = -1; in load_library_header()
5745 task->p->dev = st.st_dev; in load_library_header()
5746 task->p->ino = st.st_ino; in load_library_header()
5747 task->p->file_offset = task->file_offset; in load_library_header()
5748 task->p->needed_by = needed_by; in load_library_header()
5749 task->p->name = task->p->buf; in load_library_header()
5750 strcpy(task->p->name, task->pathname); in load_library_header()
5751 task->p->tls = task->tls; in load_library_header()
5752 task->p->dynv = task->dyn_addr; in load_library_header()
5753 task->p->strings = task->str_addr; in load_library_header()
5756 if (search_vec(task->p->dynv, &rpath_offset, DT_RPATH)) in load_library_header()
5757 task->p->rpath_orig = task->p->strings + rpath_offset; in load_library_header()
5758 if (search_vec(task->p->dynv, &runpath_offset, DT_RUNPATH)) in load_library_header()
5759 task->p->rpath_orig = task->p->strings + runpath_offset; in load_library_header()
5762 if (task->pathname != name) { in load_library_header()
5763 task->p->shortname = strrchr(task->p->name, '/') + 1; in load_library_header()
5766 if (task->p->tls.size) { in load_library_header()
5767 task->p->tls_id = ++tls_cnt; in load_library_header()
5768 task->p->new_dtv = (void *)(-sizeof(size_t) & in load_library_header()
5769 (uintptr_t)(task->p->name + strlen(task->p->name) + sizeof(size_t))); in load_library_header()
5770 task->p->new_tls = (void *)(task->p->new_dtv + n_th * (tls_cnt + 1)); in load_library_header()
5773 tail->next = task->p; in load_library_header()
5774 task->p->prev = tail; in load_library_header()
5775 tail = task->p; in load_library_header()
5778 task->p->namespace = namespace; in load_library_header()
5779 ns_add_dso(namespace, task->p); in load_library_header()
5785 …ing ns=%{public}s name=%{public}s by_dlopen=%{public}d", task->namespace->ns_name, task->p->name, … in task_load_library()
5787 __close(task->fd); in task_load_library()
5788 task->fd = -1; in task_load_library()
5791 task->name, noload, errno); in task_load_library()
5792 …error("Error loading library %s: failed to map library noload=%d errno=%d", task->name, noload, er… in task_load_library()
5802 * false positives from interposition-hack libraries. */ in task_load_library()
5803 decode_dyn(task->p); in task_load_library()
5804 if (find_sym(task->p, "__libc_start_main", 1).sym && in task_load_library()
5805 find_sym(task->p, "stdin", 1).sym) { in task_load_library()
5806 do_dlclose(task->p, 0); in task_load_library()
5807 task->p = NULL; in task_load_library()
5808 free((void*)task->name); in task_load_library()
5809 task->name = ld_strdup("libc.so"); in task_load_library()
5810 task->check_inherited = true; in task_load_library()
5812 LD_LOGE("Error loading library %{public}s: failed to load libc.so", task->name); in task_load_library()
5813 error("Error loading library %s: failed to load libc.so", task->name); in task_load_library()
5824 reclaim_gaps(task->p); in task_load_library()
5826 task->p->runtime_loaded = runtime; in task_load_library()
5828 task->p->by_dlopen = 1; in task_load_library()
5833 makefuncdescs(task->p); in task_load_library()
5837 dprintf(1, "\t%s => %s (%p)\n", task->name, task->pathname, task->p->base); in task_load_library()
5842 libc.load_hook((long unsigned int)task->p->base, task->p->phdr, task->p->phnum); in task_load_library()
5850 if (p->deps) { in preload_direct_deps()
5853 /* For head, all preloads are direct pseudo-dependencies. in preload_direct_deps()
5856 for (struct dso *q = p->next; q; q = q->next) { in preload_direct_deps()
5860 for (i = 0; p->dynv[i]; i += NEXT_DYNAMIC_INDEX) { in preload_direct_deps()
5861 if (p->dynv[i] == DT_NEEDED) { in preload_direct_deps()
5867 p->deps = (p == head && cnt < MIN_DEPS_COUNT) ? builtin_deps : in preload_direct_deps()
5868 calloc(cnt + 1, sizeof *p->deps); in preload_direct_deps()
5869 if (!p->deps) { in preload_direct_deps()
5870 LD_LOGE("Error loading dependencies for %{public}s", p->name); in preload_direct_deps()
5871 error("Error loading dependencies for %s", p->name); in preload_direct_deps()
5878 for (struct dso *q = p->next; q; q = q->next) { in preload_direct_deps()
5879 p->deps[cnt++] = q; in preload_direct_deps()
5882 for (i = 0; p->dynv[i]; i += NEXT_DYNAMIC_INDEX) { in preload_direct_deps()
5883 if (p->dynv[i] != DT_NEEDED) { in preload_direct_deps()
5886 const char* dtneed_name = p->strings + p->dynv[i + 1]; in preload_direct_deps()
5887 …}s adding DT_NEEDED task %{public}s namespace(%{public}s)", p->name, dtneed_name, namespace->ns_na… in preload_direct_deps()
5890 LD_LOGE("Error loading dependencies %{public}s : create load task failed", p->name); in preload_direct_deps()
5891 error("Error loading dependencies for %s : create load task failed", p->name); in preload_direct_deps()
5897 …D("loading shared library %{public}s: (needed by %{public}s)", p->strings + p->dynv[i+1], p->name); in preload_direct_deps()
5902 p->strings + p->dynv[i + 1], in preload_direct_deps()
5903 p->name); in preload_direct_deps()
5905 p->strings + p->dynv[i + 1], p->name); in preload_direct_deps()
5911 p->deps[cnt++] = task->p; in preload_direct_deps()
5912 if (task->isloaded) { in preload_direct_deps()
5919 p->deps[cnt] = 0; in preload_direct_deps()
5920 p->ndeps_direct = cnt; in preload_direct_deps()
5921 for (i = 0; i < p->ndeps_direct; i++) { in preload_direct_deps()
5922 add_dso_parent(p->deps[i], p); in preload_direct_deps()
5929 for (size_t i = 0; i < tasks->length; i++) { in unmap_preloaded_sections()
5934 if (task->dyn_map_len) { in unmap_preloaded_sections()
5935 munmap(task->dyn_map, task->dyn_map_len); in unmap_preloaded_sections()
5936 task->dyn_map = NULL; in unmap_preloaded_sections()
5937 task->dyn_map_len = 0; in unmap_preloaded_sections()
5938 if (task->p) { in unmap_preloaded_sections()
5939 task->p->dynv = NULL; in unmap_preloaded_sections()
5942 if (task->str_map_len) { in unmap_preloaded_sections()
5943 munmap(task->str_map, task->str_map_len); in unmap_preloaded_sections()
5944 task->str_map = NULL; in unmap_preloaded_sections()
5945 task->str_map_len = 0; in unmap_preloaded_sections()
5946 if (task->p) { in unmap_preloaded_sections()
5947 task->p->strings = NULL; in unmap_preloaded_sections()
5955 if (p->deps) { in preload_deps()
5958 for (; p; p = p->next) { in preload_deps()
5959 preload_direct_deps(p, p->namespace, tasks); in preload_deps()
5967 for (size_t i = 0; i < tasks->length; i++) { in run_loadtasks()
5971 …reserved_address = reserved_params->reserved_address_recursive || (reserved_params->target == task in run_loadtasks()
5981 if (p->tls.image) { in assign_tls()
5982 tls_align = MAXP2(tls_align, p->tls.align); in assign_tls()
5984 p->tls.offset = tls_offset + ((p->tls.align - 1) & in assign_tls()
5985 (-tls_offset + (uintptr_t)p->tls.image)); in assign_tls()
5986 tls_offset = p->tls.offset + p->tls.size; in assign_tls()
5988 tls_offset += p->tls.size + p->tls.align - 1; in assign_tls()
5989 tls_offset -= (tls_offset + (uintptr_t)p->tls.image) in assign_tls()
5990 & (p->tls.align - 1); in assign_tls()
5991 p->tls.offset = tls_offset; in assign_tls()
5994 tls_tail->next = &p->tls; in assign_tls()
5996 libc.tls_head = &p->tls; in assign_tls()
5998 tls_tail = &p->tls; in assign_tls()
6001 p = p->next; in assign_tls()
6025 if (!task->isloaded) { in load_preload()
6040 ssize_t count = dso->relro_end - dso->relro_start; in serialize_gnu_relro()
6043 ssize_t write_size = TEMP_FAILURE_RETRY(write(fd, laddr(dso, dso->relro_start + offset), count)); in serialize_gnu_relro()
6044 if (-1 == write_size) { in serialize_gnu_relro()
6045 LD_LOGE("Error serializing relro %{public}s: failed to write GNU_RELRO", dso->name); in serialize_gnu_relro()
6046 return -1; in serialize_gnu_relro()
6049 count -= write_size; in serialize_gnu_relro()
6052 ssize_t size = dso->relro_end - dso->relro_start; in serialize_gnu_relro()
6054 laddr(dso, dso->relro_start), in serialize_gnu_relro()
6061 LD_LOGE("Error serializing relro %{public}s: failed to map GNU_RELRO", dso->name); in serialize_gnu_relro()
6062 return -1; in serialize_gnu_relro()
6073 LD_LOGE("Error mapping relro %{public}s: failed to get file state", dso->name); in map_gnu_relro()
6074 return -1; in map_gnu_relro()
6081 LD_LOGE("Error mapping relro %{public}s: failed to map fd", dso->name); in map_gnu_relro()
6082 return -1; in map_gnu_relro()
6086 char *mem_base = (char *)(laddr(dso, dso->relro_start)); in map_gnu_relro()
6088 ssize_t size = dso->relro_end - dso->relro_start; in map_gnu_relro()
6090 if (size > ext_fd_file_size - *file_offset) { in map_gnu_relro()
6091 LD_LOGE("Error mapping relro %{public}s: invalid file size", dso->name); in map_gnu_relro()
6092 return -1; in map_gnu_relro()
6113 ssize_t map_length = end_offset - start_offset; in map_gnu_relro()
6119 LD_LOGE("Error mapping relro %{public}s: failed to map GNU_RELRO", dso->name); in map_gnu_relro()
6121 return -1; in map_gnu_relro()
6137 if (extinfo->flag & DL_EXT_WRITE_RELRO) { in handle_relro_sharing()
6138 LD_LOGD("Serializing GNU_RELRO %{public}s", p->name); in handle_relro_sharing()
6139 if (serialize_gnu_relro(extinfo->relro_fd, p, relro_fd_offset) < 0) { in handle_relro_sharing()
6140 LD_LOGE("Error serializing GNU_RELRO %{public}s", p->name); in handle_relro_sharing()
6144 } else if (extinfo->flag & DL_EXT_USE_RELRO) { in handle_relro_sharing()
6145 LD_LOGD("Mapping GNU_RELRO %{public}s", p->name); in handle_relro_sharing()
6146 if (map_gnu_relro(extinfo->relro_fd, p, relro_fd_offset) < 0) { in handle_relro_sharing()
6147 LD_LOGE("Error mapping GNU_RELRO %{public}s", p->name); in handle_relro_sharing()
6174 Phdr *ph = p->phdr; in find_and_set_bss_name()
6175 for (cnt = p->phnum; cnt--; ph = (void *)((char *)ph + p->phentsize)) { in find_and_set_bss_name()
6176 if (ph->p_type != PT_LOAD) continue; in find_and_set_bss_name()
6177 size_t seg_start = p->base + ph->p_vaddr; in find_and_set_bss_name()
6178 size_t seg_file_end = seg_start + ph->p_filesz + PAGE_SIZE - 1 & -PAGE_SIZE; in find_and_set_bss_name()
6179 size_t seg_max_addr = seg_start + ph->p_memsz + PAGE_SIZE - 1 & -PAGE_SIZE; in find_and_set_bss_name()
6180 size_t zeromap_size = seg_max_addr - seg_file_end; in find_and_set_bss_name()
6181 if (zeromap_size > 0 && (ph->p_flags & PF_W)) { in find_and_set_bss_name()
6182 set_bss_vma_name(p->name, (void *)seg_file_end, zeromap_size); in find_and_set_bss_name()
6224 for (struct dso *so = p; so != NULL; so = so->next) { in add_dso_info_to_debug_map()
6227 LD_LOGE("malloc error! dso name: %{public}s.", so->name); in add_dso_info_to_debug_map()
6231 debug_info->loadmap = so->loadmap; in add_dso_info_to_debug_map()
6233 debug_info->base = so->base; in add_dso_info_to_debug_map()
6235 debug_info->name = so->name; in add_dso_info_to_debug_map()
6236 debug_info->dynv = so->dynv; in add_dso_info_to_debug_map()
6238 debug_info->prev = NULL; in add_dso_info_to_debug_map()
6239 debug_info->next = NULL; in add_dso_info_to_debug_map()
6242 debug_info->prev = debug_tail; in add_dso_info_to_debug_map()
6243 debug_info->next = NULL; in add_dso_info_to_debug_map()
6244 debug_tail->next = debug_info; in add_dso_info_to_debug_map()
6247 so->debug_info = debug_info; in add_dso_info_to_debug_map()
6253 struct dso_debug_info *debug_info = p->debug_info; in remove_dso_info_from_debug_map()
6255 debug_tail = debug_tail->prev; in remove_dso_info_from_debug_map()
6256 debug_tail->next = NULL; in remove_dso_info_from_debug_map()
6258 debug_info->next->prev = debug_info->prev; in remove_dso_info_from_debug_map()
6259 debug_info->prev->next = debug_info->next; in remove_dso_info_from_debug_map()
6277 if (cur->dso_handle == dso_handle) { in find_dso_handle_node()
6280 cur =cur->next; in find_dso_handle_node()
6296 node->count++; in add_dso_handle_node()
6297 …a_thread] increase dso node count of %{public}s, count:%{public}d ", node->dso->name, node->count); in add_dso_handle_node()
6318 if (p->by_dlopen) { in add_dso_handle_node()
6319 p->nr_dlopen++; in add_dso_handle_node()
6321 p->name, p->name, p->nr_dlopen); in add_dso_handle_node()
6322 if (p->bfs_built) { in add_dso_handle_node()
6323 for (size_t i = 0; p->deps[i]; i++) { in add_dso_handle_node()
6324 p->deps[i]->nr_dlopen++; in add_dso_handle_node()
6326 p->deps[i]->name, p->name, p->deps[i]->nr_dlopen); in add_dso_handle_node()
6331 for (size_t i = 0; p->deps_all[i]; i++) { in add_dso_handle_node()
6332 p->deps_all[i]->nr_dlopen++; in add_dso_handle_node()
6334 p->deps_all[i]->name, p->name, p->deps_all[i]->nr_dlopen); in add_dso_handle_node()
6338 cur->dso = p; in add_dso_handle_node()
6339 cur->dso_handle = dso_handle; in add_dso_handle_node()
6340 cur->count = 1; in add_dso_handle_node()
6341 cur->next = dso_handle_list; in add_dso_handle_node()
6358 if (node && node->count) { in remove_dso_handle_node()
6359 …read] decrease dso node count of %{public}s, count:%{public}d ", node->dso->name, node->count - 1); in remove_dso_handle_node()
6360 if ((--node->count) == 0) { in remove_dso_handle_node()
6361 LD_LOGD("[cxa_thread] call do_dlclose(%{public}s) when count is 0", node->dso->name); in remove_dso_handle_node()
6362 do_dlclose(node->dso, 1); in remove_dso_handle_node()
6364 node->dso_handle = NULL; in remove_dso_handle_node()
6369 …ead] can't find matched dso handle node by %{public}p, count:%{public}d", dso_handle, node->count); in remove_dso_handle_node()
6370 error("[cxa_thread] can't find matched dso handle node by %p, count:%d", dso_handle, node->count); in remove_dso_handle_node()