Lines Matching refs:dso
128 struct dso *dso;
146 struct dso *target;
162 static struct dso ldso;
163 static struct dso *head, *tail, *fini_head, *syms_tail, *lazy_head;
183 static struct dso *builtin_deps[2];
184 static struct dso *const no_deps[1];
185 static struct dso *builtin_ctor_queue[4];
186 static struct dso **main_ctor_queue;
214 static int do_dlclose(struct dso *p, bool check_deps_all);
224 static void preload_direct_deps(struct dso *p, ns_t *namespace, struct loadtasks *tasks);
226 static void preload_deps(struct dso *p, struct loadtasks *tasks);
228 UT_STATIC void assign_tls(struct dso *p);
237 static void handle_relro_sharing(struct dso *p, const dl_extinfo *extinfo, ssize_t *relro_fd_offset);
244 static void find_and_set_bss_name(struct dso *p);
248 static void notify_addition_to_debugger(struct dso *p);
249 static void notify_remove_to_debugger(struct dso *p);
250 static void add_dso_info_to_debug_map(struct dso *p);
251 static void remove_dso_info_from_debug_map(struct dso *p);
255 static void dlclose_ns(struct dso *p);
269 static void init_default_namespace(struct dso *app)
353 static void init_namespace(struct dso *app)
421 /* Compute load address for a virtual address in a given dso. */
423 void *laddr(const struct dso *p, size_t v)
430 static void *laddr_pg(const struct dso *p, size_t v)
590 static Sym *sysv_lookup(struct verinfo *verinfo, struct sym_info_pair s_info_p, struct dso *dso)
594 Sym *syms = dso->syms;
595 Elf_Symndx *hashtab = dso->hashtab;
596 char *strings = dso->strings;
598 if ((!dso->versym || (dso->versym[i] & 0x7fff) >= 0)
600 if (!check_verinfo(dso->verdef, dso->versym, i, verinfo, dso->strings)) {
610 dso->name, verinfo->s, verinfo->v, verinfo->use_vna_hash, verinfo->vna_hash);
614 static Sym *gnu_lookup(struct sym_info_pair s_info_p, uint32_t *hashtab, struct dso *dso, struct verinfo *verinfo)
622 LD_LOGD("gnu_lookup symbol not found (bloom filter), so:%{public}s s:%{public}s", dso->name, verinfo->s);
630 if ((h1 == (h2|1)) && (!dso->versym || (dso->versym[i] & 0x7fff) >= 0)
631 && !memcmp(verinfo->s, dso->strings + dso->syms[i].st_name, s_info_p.sym_l)) {
632 if (!check_verinfo(dso->verdef, dso->versym, i, verinfo, dso->strings)) {
636 return dso->syms+i;
644 dso->name, verinfo->s, verinfo->v, verinfo->use_vna_hash, verinfo->vna_hash);
648 static bool check_sym_accessible(struct dso *dso, ns_t *ns)
650 if (!dso || !dso->namespace || !ns) {
654 if (dso->namespace == ns) {
657 for (int i = 0; i < dso->parents_count; i++) {
658 if (dso->parents[i]->namespace == ns) {
663 "check_sym_accessible dso name [%{public}s] ns_name [%{public}s] not accessible!", dso->name, ns->ns_name);
667 static inline bool is_dso_accessible(struct dso *dso, ns_t *ns)
669 if (dso->namespace == ns) {
672 for (int i = 0; i < dso->parents_count; i++) {
673 if (dso->parents[i]->namespace == ns) {
678 "check_sym_accessible dso name [%{public}s] ns_name [%{public}s] not accessible!", dso->name, ns->ns_name);
682 static int find_dso_parent(struct dso *p, struct dso *target)
694 static void add_dso_parent(struct dso *p, struct dso *parent)
702 p->parents = (struct dso **)malloc(sizeof(struct dso *) * PARENTS_BASE_CAPACITY);
708 struct dso ** realloced = (struct dso **)realloc(
709 p->parents, sizeof(struct dso *) * (p->parents_capacity + PARENTS_BASE_CAPACITY));
721 static void remove_dso_parent(struct dso *p, struct dso *parent)
737 static void add_reloc_can_search_dso(struct dso *p, struct dso *can_search_so)
742 (struct dso **)malloc(sizeof(struct dso *) * RELOC_CAN_SEARCH_DSO_BASE_CAPACITY);
748 struct dso ** realloced = (struct dso **)realloc(
750 sizeof(struct dso *) * (p->reloc_can_search_dso_capacity + RELOC_CAN_SEARCH_DSO_BASE_CAPACITY));
762 static void free_reloc_can_search_dso(struct dso *p)
780 static void add_can_search_so_list_in_dso(struct dso *dso_relocating, struct dso *start_check_dso) {
781 struct dso *p = start_check_dso;
810 struct dso *dso, struct verinfo *verinfo, struct sym_info_pair s_info_g, int need_def, ns_t *ns)
819 if (ns && !check_sym_accessible(dso, ns))
822 if ((ght = dso->ghashtab)) {
832 sym = gnu_lookup(s_info_g, ght, dso, verinfo);
837 sym = sysv_lookup(verinfo, s_info_s, dso);
858 def.dso = dso;
862 static inline struct symdef find_sym2(struct dso *dso, struct verinfo *verinfo, int need_def, int use_deps, ns_t *ns)
869 struct dso **deps = use_deps ? dso->deps : 0;
870 for (; dso; dso=use_deps ? *deps++ : dso->syms_next) {
873 if (!dso->is_preload && ns && !check_sym_accessible(dso, ns)) {
876 if ((ght = dso->ghashtab)) {
878 sym = gnu_lookup(s_info_g, ght, dso, verinfo);
881 sym = sysv_lookup(verinfo, s_info_s, dso);
895 def.dso = dso;
901 static inline struct symdef find_sym_by_deps(struct dso *dso, struct verinfo *verinfo, int need_def, ns_t *ns)
908 struct dso **deps = dso->deps;
909 for (; dso; dso = *deps++) {
911 if (!is_dso_accessible(dso, ns)) {
914 if ((ght = dso->ghashtab)) {
916 sym = gnu_lookup(s_info_g, ght, dso, verinfo);
919 sym = sysv_lookup(verinfo, s_info_s, dso);
933 def.dso = dso;
940 int sym_type, struct dso *dso, struct verinfo *verinfo, int need_def, struct dso *dso_relocating)
947 // skip head dso.
949 struct dso *dso_searching = 0;
971 def.dso = dso_searching;
977 static struct symdef find_sym(struct dso *dso, const char *s, int need_def)
980 return find_sym2(dso, &verinfo, need_def, 0, NULL);
983 static bool get_vna_hash(struct dso *dso, int sym_index, uint32_t *vna_hash)
985 if (!dso->versym || !dso->verneed) {
989 uint16_t vsym = dso->versym[sym_index];
995 Verneed *verneed = dso->verneed;
1025 static void get_verinfo(struct dso *dso, int sym_index, struct verinfo *vinfo)
1027 char *strings = dso->strings;
1029 int16_t vsym = dso->versym[sym_index];
1030 Verdef *verdef = dso->verdef;
1051 if (aux && aux->vda_name && strings && (dso->strings + aux->vda_name)) {
1052 vinfo->v = dso->strings + aux->vda_name;
1057 static void do_relocs(struct dso *dso, size_t *rel, size_t rel_size, size_t stride)
1059 unsigned char *base = dso->base;
1060 Sym *syms = dso->syms;
1061 char *strings = dso->strings;
1074 if (dso == &ldso) {
1082 if (skip_relative && IS_RELATIVE(rel[1], dso->syms)) continue;
1085 reloc_addr = laddr(dso, rel[0]);
1092 /* Save original addend in stage 2 where the dso
1109 vinfo.use_vna_hash = get_vna_hash(dso, sym_index, &vinfo.vna_hash);
1110 if (!vinfo.use_vna_hash && dso->versym && (dso->versym[sym_index] & 0x7fff) >= 0) {
1111 get_verinfo(dso, sym_index, &vinfo);
1113 if (dso->cache_sym_index == sym_index) {
1114 def = (struct symdef){ .dso = dso->cache_dso, .sym = dso->cache_sym };
1117 ? (struct symdef){ .dso = dso, .sym = sym }
1118 : dso != &ldso ? find_sym_by_saved_so_list(type, ctx, &vinfo, type==REL_PLT, dso)
1119 : find_sym2(ctx, &vinfo, type==REL_PLT, 0, dso->namespace);
1120 dso->cache_sym_index = sym_index;
1121 dso->cache_dso = def.dso;
1122 dso->cache_sym = def.sym;
1127 if (dso->lazy && (type==REL_PLT || type==REL_GOT)) {
1128 dso->lazy[3*dso->lazy_cnt+0] = rel[0];
1129 dso->lazy[3*dso->lazy_cnt+1] = rel[1];
1130 dso->lazy[3*dso->lazy_cnt+2] = addend;
1131 dso->lazy_cnt++;
1135 "dso=%{public}s s=%{public}s use_vna_hash=%{public}d van_hash=%{public}x",
1136 dso->name, name, vinfo.use_vna_hash, vinfo.vna_hash);
1138 dso->name, name);
1145 def.dso = dso;
1148 sym_val = def.sym ? (size_t)laddr(def.dso, def.sym->st_value) : 0;
1152 && def.dso->tls_id > static_tls_cnt) {
1155 dso->name, name, def.dso->name);
1185 *reloc_addr = def.sym ? (size_t)(def.dso->funcdescs
1186 + (def.sym - def.dso->syms)) : 0;
1191 reloc_addr[1] = def.sym ? (size_t)def.dso->got : 0;
1194 *reloc_addr = def.dso->tls_id;
1201 *reloc_addr = tls_val + def.dso->tls.offset + TPOFF_K + addend;
1205 *reloc_addr = tls_val - def.dso->tls.offset + addend;
1208 *reloc_addr = def.dso->tls.offset - tls_val + addend;
1213 if (def.dso->tls_id > static_tls_cnt) {
1218 dso->name, sym ? name : "(local)" );
1221 new->next = dso->td_index;
1222 dso->td_index = new;
1223 new->args[0] = def.dso->tls_id;
1230 reloc_addr[1] = tls_val + def.dso->tls.offset
1233 reloc_addr[1] = tls_val - def.dso->tls.offset
1247 dso->name, type);
1256 struct dso *p = lazy_head, *next;
1279 static void reclaim(struct dso *dso, size_t start, size_t end)
1281 if (start >= dso->relro_start && start < dso->relro_end) start = dso->relro_end;
1282 if (end >= dso->relro_start && end < dso->relro_end) end = dso->relro_start;
1284 char *base = laddr_pg(dso, start);
1288 static void reclaim_gaps(struct dso *dso)
1290 Phdr *ph = dso->phdr;
1291 size_t phcnt = dso->phnum;
1293 for (; phcnt--; ph=(void *)((char *)ph+dso->phentsize)) {
1296 reclaim(dso, ph->p_vaddr & -PAGE_SIZE, ph->p_vaddr);
1297 reclaim(dso, ph->p_vaddr+ph->p_memsz,
1345 UT_STATIC void unmap_library(struct dso *dso)
1347 if (dso->loadmap) {
1349 for (i=0; i<dso->loadmap->nsegs; i++) {
1350 if (!dso->loadmap->segs[i].p_memsz)
1353 munmap((void *)dso->loadmap->segs[i].addr,
1354 dso->loadmap->segs[i].p_memsz);
1356 (void)mprotect((void *)dso->loadmap->segs[i].addr,
1357 dso->loadmap->segs[i].p_memsz, PROT_NONE);
1360 free(dso->loadmap);
1361 } else if (dso->map && dso->map_len) {
1363 munmap(dso->map, dso->map_len);
1365 mprotect(dso->map, dso->map_len, PROT_NONE);
1569 UT_STATIC void *map_library(int fd, struct dso *dso, struct reserved_address_params *reserved_params)
1619 dso->tls.align = ph->p_align;
1620 dso->tls.len = ph->p_filesz;
1621 dso->tls.size = ph->p_memsz;
1623 dso->relro_start = ph->p_vaddr & -PAGE_SIZE;
1624 dso->relro_end = (ph->p_vaddr + ph->p_memsz) & -PAGE_SIZE;
1647 dso->loadmap = calloc(1, sizeof *dso->loadmap
1648 + nsegs * sizeof *dso->loadmap->segs);
1649 if (!dso->loadmap) goto error;
1650 dso->loadmap->nsegs = nsegs;
1660 unmap_library(dso);
1663 dso->loadmap->segs[i].addr = (size_t)map +
1665 dso->loadmap->segs[i].p_vaddr = ph->p_vaddr;
1666 dso->loadmap->segs[i].p_memsz = ph->p_memsz;
1682 map = (void *)dso->loadmap->segs[0].addr;
1711 /* we will find a mapping_align aligned address as the start of dso
1713 * we have enough space to shift the dso to the correct location. */
1734 /* use tmp_map_len to mmap enough space for the dso with anonymous mapping */
1744 /* use map_len to mmap correct space for the dso with file mapping */
1774 dso->map = map;
1775 dso->map_len = map_len;
1783 dso->phdr = 0;
1784 dso->phnum = 0;
1793 if (!dso->phdr && eh->e_phoff >= ph->p_offset
1795 dso->phdr = (void *)(base + ph->p_vaddr
1797 dso->phnum = eh->e_phnum;
1798 dso->phentsize = eh->e_phentsize;
1825 set_bss_vma_name(dso->name, (void *)pgbrk, zeromap_size);
1843 dso->base = base;
1844 dso->dynv = laddr(dso, dyn);
1845 if (dso->tls.size) dso->tls.image = laddr(dso, tls_image);
1851 if (map!=MAP_FAILED) unmap_library(dso);
1882 UT_STATIC int fixup_rpath(struct dso *p, char *buf, size_t buf_size)
1959 static void decode_dyn(struct dso *p)
1992 UT_STATIC size_t count_syms(struct dso *p)
2023 static void makefuncdescs(struct dso *p)
2078 static struct dso *search_dso_by_name(const char *name, const ns_t *ns) {
2081 struct dso *p = ns->ns_dsos->dsos[i];
2090 static struct dso *search_dso_by_fstat(const struct stat *st, const ns_t *ns, uint64_t file_offset) {
2093 struct dso *p = ns->ns_dsos->dsos[i];
2115 static struct dso *find_library_by_name(const char *name, const ns_t *ns, bool check_inherited)
2121 struct dso *p = search_dso_by_name(name, ns);
2138 UT_STATIC struct dso *find_library_by_fstat(const struct stat *st, const ns_t *ns, bool check_inherited, uint64_t file_offset) {
2142 struct dso *p = search_dso_by_fstat(st, ns, file_offset);
2156 struct dso *load_library(
2157 const char *name, struct dso *needed_by, ns_t *namespace, bool check_inherited, struct reserved_address_params *reserved_params)
2162 struct dso *p, temp_dso = {0};
2361 /* Add dso to namespace */
2374 static void load_direct_deps(struct dso *p, ns_t *namespace, struct reserved_address_params *reserved_params)
2381 if (p==head) for (struct dso *q=p->next; q; q=q->next)
2394 if (p==head) for (struct dso *q=p->next; q; q=q->next)
2398 struct dso *dep = load_library(p->strings + p->dynv[i + 1], p, namespace, true, reserved_params);
2415 static void load_deps(struct dso *p, struct reserved_address_params *reserved_params)
2423 static void extend_bfs_deps(struct dso *p, bool to_deps_all)
2426 struct dso **tmp;
2459 struct dso *dep = p->deps_all[i];
2485 struct dso *dep = p->deps[i];
2530 static void add_syms(struct dso *p)
2538 static void revert_syms(struct dso *old_tail)
2540 struct dso *p, *next;
2550 static void do_mips_relocs(struct dso *p, size_t *got)
2597 static void do_android_relocs(struct dso *p, size_t dt_name, size_t dt_size)
2684 static void do_relr_relocs(struct dso *dso, size_t *relr, size_t relr_size)
2686 if (dso == &ldso) return; /* self-relocation was done in _dlstart */
2687 unsigned char *base = dso->base;
2691 reloc_addr = laddr(dso, relr[0]);
2702 static void reloc_all(struct dso *p, const dl_extinfo *extinfo)
2739 static void kernel_mapped_dso(struct dso *p)
2771 struct dso *p;
2810 static struct dso **queue_ctors(struct dso *dso)
2813 struct dso *p, **queue, **stack;
2821 if (dso->bfs_built) {
2822 for (cnt=0; dso->deps[cnt]; cnt++)
2823 dso->deps[cnt]->mark = 0;
2830 if (dso==head && cnt <= countof(builtin_ctor_queue))
2843 * dso and initial queue empty... */
2847 stack[--spos] = dso;
2848 dso->next_dep = 0;
2849 dso->mark = 1;
2872 static void do_init_fini(struct dso **queue)
2874 struct dso *p;
2952 struct dso *dtv_provider = container_of(tls_tail, struct dso, tls);
2954 struct dso *p;
3104 static struct dso app, vdso;
3264 /* Initial dso chain consists only of the app. */
3275 ldso.deps = (struct dso **)no_deps;
3297 for (struct dso *q = head; q; q = q->next) {
3310 for (struct dso *q = head; q; q = q->next) {
3318 for (struct dso *p = head; p; p = p->next) {
3339 vdso.deps = (struct dso **)no_deps;
3387 for (struct dso *q = head; q; q = q->next) {
3421 if (find_sym(head, "malloc", 1).dso != &ldso)
3423 if (find_sym(head, "aligned_alloc", 1).dso != &ldso)
3445 static void prepare_lazy(struct dso *p)
3467 static void *dlopen_post(struct dso* p, int mode) {
3530 struct dso *caller;
3532 caller = (struct dso *)addr2dso((size_t)caller_addr);
3555 struct dso *volatile p, *orig_tail, *orig_syms_tail, *orig_lazy_head, *next;
3561 struct dso **volatile ctor_queue = 0;
3563 struct dso *caller;
3569 struct dso *current_so = NULL;
3624 caller = (struct dso *)addr2dso((size_t)caller_addr);
3790 struct dso *reloc_head_so = p;
3930 struct dso *caller;
3932 caller = (struct dso *)addr2dso((size_t)caller_addr);
4024 struct dso *caller;
4026 caller = (struct dso *)addr2dso((size_t)caller_addr);
4075 static void dlclose_ns(struct dso *p)
4093 struct dso *p;
4101 struct dso *p;
4120 static void *do_dlsym(struct dso *p, const char *s, const char *v, void *ra)
4125 struct dso *caller = NULL;
4143 caller = (struct dso *)addr2dso((size_t)ra);
4161 return __tls_get_addr((tls_mod_off_t []){def.dso->tls_id, def.sym->st_value-DTP_OFFSET});
4163 return def.dso->funcdescs + (def.sym - def.dso->syms);
4164 return laddr(def.dso, def.sym->st_value);
4167 extern int invalidate_exit_funcs(struct dso *p);
4169 static int so_can_unload(struct dso *p, int check_flag)
4183 /* dso is marked as RTLD_NODELETE library, do nothing here. */
4200 static int dlclose_post(struct dso *p)
4224 static int dlclose_impl(struct dso *p)
4226 struct dso *d;
4231 /* remove dso symbols from global list */
4243 /* remove dso from lazy list if needed */
4253 /* remove dso from fini list */
4268 /* remove dso from global dso list */
4277 /* remove dso from namespace */
4286 /* after destruct, invalidate atexit funcs which belong to this dso */
4307 static int do_dlclose(struct dso *p, bool check_deps_all)
4363 start_entry->dso = p;
4368 struct dso *cur = ecur->dso;
4372 if (ef->dso == cur) {
4386 if (ef->dso == cur->deps[i]) {
4396 edeps->dso = cur->deps[i];
4404 LD_LOGE("[dlclose]: unload %{public}s succeed when dlclose %{public}s", ef->dso->name, p->name);
4409 if (ef->dso == p->deps[deps_num]) {
4424 dlclose_impl(ef->dso);
4430 int constructed = ef->dso->constructed;
4435 decode_vec(ef->dso->dynv, dyn, DYN_CNT);
4438 size_t *fn = (size_t *)laddr(ef->dso, dyn[DT_FINI_ARRAY]) + n;
4439 trace_marker_begin(HITRACE_TAG_MUSL, "calling destructors:", ef->dso->name);
4449 ef->dso->constructed = 0;
4455 dlclose_post(ef->dso);
4479 struct dso *dso = find_dso_by_handle(p);
4480 if (dso == NULL) {
4488 rc = do_dlclose(dso, 0);
4504 static inline Sym* find_addr_by_elf(size_t addr_offset_so, struct dso *p) {
4516 static inline Sym* find_addr_by_gnu(size_t addr_offset_so, struct dso *p) {
4559 struct dso *p;
4598 struct dso *dso = find_dso_by_handle(p);
4599 if (dso == NULL) {
4603 res = do_dlsym(dso, s, "", ra);
4620 struct dso *dso = find_dso_by_handle(p);
4621 if (dso == NULL) {
4625 res = do_dlsym(dso, s, v, ra);
4666 struct dso *current;
5328 /* we will find a mapping_align aligned address as the start of dso
5330 * we have enough space to shift the dso to the correct location. */
5354 /* use tmp_map_len to mmap enough space for the dso with anonymous mapping */
5367 /* use map_len to mmap correct space for the dso with file mapping */
5522 struct dso *needed_by = task->needed_by;
5712 alloc_size = sizeof(struct dso) + strlen(task->pathname) + 1;
5724 LD_LOGE("Error loading header %{public}s: failed to allocate dso", task->name);
5761 /* Add dso to namespace */
5831 static void preload_direct_deps(struct dso *p, ns_t *namespace, struct loadtasks *tasks)
5840 for (struct dso *q = p->next; q; q = q->next) {
5862 for (struct dso *q = p->next; q; q = q->next) {
5937 static void preload_deps(struct dso *p, struct loadtasks *tasks)
5962 UT_STATIC void assign_tls(struct dso *p)
6022 static int serialize_gnu_relro(int fd, struct dso *dso, ssize_t *file_offset)
6024 ssize_t count = dso->relro_end - dso->relro_start;
6027 ssize_t write_size = TEMP_FAILURE_RETRY(write(fd, laddr(dso, dso->relro_start + offset), count));
6029 LD_LOGE("Error serializing relro %{public}s: failed to write GNU_RELRO", dso->name);
6036 ssize_t size = dso->relro_end - dso->relro_start;
6038 laddr(dso, dso->relro_start),
6045 LD_LOGE("Error serializing relro %{public}s: failed to map GNU_RELRO", dso->name);
6052 static int map_gnu_relro(int fd, struct dso *dso, ssize_t *file_offset)
6057 LD_LOGE("Error mapping relro %{public}s: failed to get file state", dso->name);
6065 LD_LOGE("Error mapping relro %{public}s: failed to map fd", dso->name);
6070 char *mem_base = (char *)(laddr(dso, dso->relro_start));
6072 ssize_t size = dso->relro_end - dso->relro_start;
6075 LD_LOGE("Error mapping relro %{public}s: invalid file size", dso->name);
6103 LD_LOGE("Error mapping relro %{public}s: failed to map GNU_RELRO", dso->name);
6116 static void handle_relro_sharing(struct dso *p, const dl_extinfo *extinfo, ssize_t *relro_fd_offset)
6155 static void find_and_set_bss_name(struct dso *p)
6184 static void notify_addition_to_debugger(struct dso *p)
6195 static void notify_remove_to_debugger(struct dso *p)
6206 static void add_dso_info_to_debug_map(struct dso *p)
6208 for (struct dso *so = p; so != NULL; so = so->next) {
6211 LD_LOGE("malloc error! dso name: %{public}s.", so->name);
6235 static void remove_dso_info_from_debug_map(struct dso *p)
6249 void *dso_handle; // Used to located dso.
6251 struct dso* dso;
6281 LD_LOGD("[cxa_thread] increase dso node count of %{public}s, count:%{public}d ", node->dso->name, node->count);
6293 struct dso* p = addr2dso(dso_handle);
6296 LD_LOGE("[cxa_thread] can't find dso by dso_handle(%{public}p)", dso_handle);
6297 error("[cxa_thread] can't find dso by dso_handle(%p)", dso_handle);
6322 cur->dso = p;
6343 LD_LOGD("[cxa_thread] decrease dso node count of %{public}s, count:%{public}d ", node->dso->name, node->count - 1);
6345 LD_LOGD("[cxa_thread] call do_dlclose(%{public}s) when count is 0", node->dso->name);
6346 do_dlclose(node->dso, 1);
6353 LD_LOGE("[cxa_thread] can't find matched dso handle node by %{public}p, count:%{public}d", dso_handle, node->count);
6354 error("[cxa_thread] can't find matched dso handle node by %p, count:%d", dso_handle, node->count);