• Home
  • Raw
  • Download

Lines Matching refs:task

184 static bool map_library_header(struct loadtask *task);
185 static bool task_map_library(struct loadtask *task, struct reserved_address_params *reserved_params…
186 static bool resolve_fd_to_realpath(struct loadtask *task);
187 static bool load_library_header(struct loadtask *task);
188 static void task_load_library(struct loadtask *task, struct reserved_address_params *reserved_param…
195 static void open_library_by_path(const char *name, const char *s, struct loadtask *task, struct zip…
196 …_open_by_task(int fd, const char *name, ns_t *namespace, struct loadtask *task, struct zip_info *z…
3321 struct loadtask *task = NULL; in dlopen_impl() local
3424 task = create_loadtask(file, head, ns, true); in dlopen_impl()
3425 if (!task) { in dlopen_impl()
3430 if (!load_library_header(task)) { in dlopen_impl()
3435 LD_LOGE("dlopen_impl load library header failed for %{public}s", task->name); in dlopen_impl()
3440 reserved_params.target = task->p; in dlopen_impl()
3443 if (!task->p) { in dlopen_impl()
3444 LD_LOGE("dlopen_impl load library failed for %{public}s", task->name); in dlopen_impl()
3452 if (!task->isloaded) { in dlopen_impl()
3453 is_task_appended = append_loadtasks(tasks, task); in dlopen_impl()
3455 preload_deps(task->p, tasks); in dlopen_impl()
3461 p = task->p; in dlopen_impl()
3462 if (!task->isloaded) { in dlopen_impl()
3466 free_task(task); in dlopen_impl()
3467 task = NULL; in dlopen_impl()
3555 free_task(task);
4508 static void open_library_by_path(const char *name, const char *s, struct loadtask *task, struct zip… in open_library_by_path() argument
4510 char *buf = task->buf; in open_library_by_path()
4511 size_t buf_size = sizeof task->buf; in open_library_by_path()
4522 task->fd = z_info->fd; in open_library_by_path()
4523 task->file_offset = z_info->file_offset; in open_library_by_path()
4529 if ((task->fd = open(buf, O_RDONLY|O_CLOEXEC))>=0) break; in open_library_by_path()
4537 …oid handle_asan_path_open_by_task(int fd, const char *name, ns_t *namespace, struct loadtask *task, in handle_asan_path_open_by_task() argument
4552 open_library_by_path(name, new_lib_paths, task, z_info); in handle_asan_path_open_by_task()
4555 task->fd); in handle_asan_path_open_by_task()
4558 open_library_by_path(name, namespace->asan_lib_paths, task, z_info); in handle_asan_path_open_by_task()
4561 task->fd); in handle_asan_path_open_by_task()
4563 open_library_by_path(name, namespace->lib_paths, task, z_info); in handle_asan_path_open_by_task()
4566 task->fd); in handle_asan_path_open_by_task()
4696 static bool map_library_header(struct loadtask *task) in map_library_header() argument
4704 ssize_t l = pread(task->fd, task->ehdr_buf, sizeof task->ehdr_buf, task->file_offset); in map_library_header()
4705 task->eh = task->ehdr_buf; in map_library_header()
4707 LD_LOGE("Error mapping header %{public}s: failed to read fd", task->name); in map_library_header()
4710 if (l < sizeof(Ehdr) || (task->eh->e_type != ET_DYN && task->eh->e_type != ET_EXEC)) { in map_library_header()
4711 LD_LOGE("Error mapping header %{public}s: invaliled Ehdr", task->name); in map_library_header()
4714 task->phsize = task->eh->e_phentsize * task->eh->e_phnum; in map_library_header()
4715 if (task->phsize > sizeof task->ehdr_buf - sizeof(Ehdr)) { in map_library_header()
4716 task->allocated_buf = malloc(task->phsize); in map_library_header()
4717 if (!task->allocated_buf) { in map_library_header()
4718 LD_LOGE("Error mapping header %{public}s: failed to alloc memory", task->name); in map_library_header()
4721 l = pread(task->fd, task->allocated_buf, task->phsize, task->eh->e_phoff + task->file_offset); in map_library_header()
4723 LD_LOGE("Error mapping header %{public}s: failed to pread", task->name); in map_library_header()
4726 if (l != task->phsize) { in map_library_header()
4727 LD_LOGE("Error mapping header %{public}s: unmatched phsize", task->name); in map_library_header()
4730 ph = task->ph0 = task->allocated_buf; in map_library_header()
4731 } else if (task->eh->e_phoff + task->phsize > l) { in map_library_header()
4732 l = pread(task->fd, task->ehdr_buf + 1, task->phsize, task->eh->e_phoff + task->file_offset); in map_library_header()
4734 LD_LOGE("Error mapping header %{public}s: failed to pread", task->name); in map_library_header()
4737 if (l != task->phsize) { in map_library_header()
4738 LD_LOGE("Error mapping header %{public}s: unmatched phsize", task->name); in map_library_header()
4741 ph = task->ph0 = (void *)(task->ehdr_buf + 1); in map_library_header()
4743 ph = task->ph0 = (void *)((char *)task->ehdr_buf + task->eh->e_phoff); in map_library_header()
4746 for (i = task->eh->e_phnum; i; i--, ph = (void *)((char *)ph + task->eh->e_phentsize)) { in map_library_header()
4748 task->dyn = ph->p_vaddr; in map_library_header()
4750 task->tls_image = ph->p_vaddr; in map_library_header()
4751 task->tls.align = ph->p_align; in map_library_header()
4752 task->tls.len = ph->p_filesz; in map_library_header()
4753 task->tls.size = ph->p_memsz; in map_library_header()
4762 task->dyn_map_len = ph->p_memsz + (ph->p_offset - off_start); in map_library_header()
4766task->dyn_map = mmap(0, task->dyn_map_len, PROT_READ, MAP_PRIVATE, task->fd, off_start + task->fil… in map_library_header()
4767 if (task->dyn_map == MAP_FAILED) { in map_library_header()
4768 LD_LOGE("Error mapping header %{public}s: failed to map dynamic section", task->name); in map_library_header()
4771 task->dyn_addr = (size_t *)((unsigned char *)task->dyn_map + (ph->p_offset - off_start)); in map_library_header()
4773 if (search_vec(task->dyn_addr, &dyn_tmp, DT_STRTAB)) { in map_library_header()
4776 LD_LOGE("Error mapping header %{public}s: DT_STRTAB not found", task->name); in map_library_header()
4779 if (search_vec(task->dyn_addr, &dyn_tmp, DT_STRSZ)) { in map_library_header()
4782 LD_LOGE("Error mapping header %{public}s: DT_STRSZ not found", task->name); in map_library_header()
4787 task->shsize = task->eh->e_shentsize * task->eh->e_shnum; in map_library_header()
4788 off_start = task->eh->e_shoff; in map_library_header()
4790 task->shsize += task->eh->e_shoff - off_start; in map_library_header()
4791task->shdr_allocated_buf = mmap(0, task->shsize, PROT_READ, MAP_PRIVATE, task->fd, off_start + tas… in map_library_header()
4792 Shdr *sh = (char *)task->shdr_allocated_buf + task->eh->e_shoff - off_start; in map_library_header()
4793 for (i = task->eh->e_shnum; i; i--, sh = (void *)((char *)sh + task->eh->e_shentsize)) { in map_library_header()
4799 task->str_map_len = sh->sh_size + (sh->sh_offset - off_start); in map_library_header()
4800task->str_map = mmap(0, task->str_map_len, PROT_READ, MAP_PRIVATE, task->fd, off_start + task->fil… in map_library_header()
4801 if (task->str_map == MAP_FAILED) { in map_library_header()
4802 LD_LOGE("Error mapping section header %{public}s: failed to map string section", task->name); in map_library_header()
4805 task->str_addr = (char *)task->str_map + sh->sh_offset - off_start; in map_library_header()
4808 if (!task->dyn) { in map_library_header()
4809 LD_LOGE("Error mapping header %{public}s: dynamic section not found", task->name); in map_library_header()
4816 free(task->allocated_buf); in map_library_header()
4817 task->allocated_buf = NULL; in map_library_header()
4818 munmap(task->shdr_allocated_buf, task->shsize); in map_library_header()
4819 task->shdr_allocated_buf = NULL; in map_library_header()
4823 static bool task_map_library(struct loadtask *task, struct reserved_address_params *reserved_params) in task_map_library() argument
4829 Phdr *ph = task->ph0; in task_map_library()
4838 for (i = task->eh->e_phnum; i; i--, ph = (void *)((char *)ph + task->eh->e_phentsize)) { in task_map_library()
4840 task->p->relro_start = ph->p_vaddr & -PAGE_SIZE; in task_map_library()
4841 task->p->relro_end = (ph->p_vaddr + ph->p_memsz) & -PAGE_SIZE; in task_map_library()
4864 if (!task->dyn) { in task_map_library()
4865 LD_LOGE("Error mapping library %{public}s: dynamic section not found", task->name); in task_map_library()
4868 if (DL_FDPIC && !(task->eh->e_flags & FDPIC_CONSTDISP_FLAG)) { in task_map_library()
4869 task->p->loadmap = calloc(1, sizeof(struct fdpic_loadmap) + nsegs * sizeof(struct fdpic_loadseg)); in task_map_library()
4870 if (!task->p->loadmap) { in task_map_library()
4873 task->p->loadmap->nsegs = nsegs; in task_map_library()
4874 for (ph = task->ph0, i = 0; i < nsegs; ph = (void *)((char *)ph + task->eh->e_phentsize)) { in task_map_library()
4883 task->fd, ph->p_offset & -PAGE_SIZE + task->file_offset); in task_map_library()
4885 unmap_library(task->p); in task_map_library()
4888 task->p->loadmap->segs[i].addr = (size_t)map + in task_map_library()
4890 task->p->loadmap->segs[i].p_vaddr = ph->p_vaddr; in task_map_library()
4891 task->p->loadmap->segs[i].p_memsz = ph->p_memsz; in task_map_library()
4905 map = (void *)task->p->loadmap->segs[0].addr; in task_map_library()
4918 size_t maxinum_alignment = phdr_table_get_maxinum_alignment(task->ph0, task->eh->e_phnum); in task_map_library()
4926 … LD_LOGE("Error mapping library %{public}s: map len is larger than reserved address", task->name); in task_map_library()
4948 : mmap((void *)start_addr, map_len, prot, map_flags, task->fd, off_start + task->file_offset); in task_map_library()
4973 : mmap(real_map, map_len, prot, map_flags, task->fd, off_start + task->file_offset); in task_map_library()
4978 task->p->map = map; in task_map_library()
4979 task->p->map_len = map_len; in task_map_library()
4982 if (task->eh->e_type != ET_DYN && addr_min && map != (void *)addr_min) { in task_map_library()
4983 LD_LOGE("Error mapping library %{public}s: device or resource busy", task->name); in task_map_library()
4988 task->p->phdr = 0; in task_map_library()
4989 task->p->phnum = 0; in task_map_library()
4990 …for (ph = task->ph0, i = task->eh->e_phnum; i; i--, ph = (void *)((char *)ph + task->eh->e_phentsi… in task_map_library()
5000 if (!task->p->phdr && task->eh->e_phoff >= ph->p_offset in task_map_library()
5001 && task->eh->e_phoff + task->phsize <= ph->p_offset + ph->p_filesz) { in task_map_library()
5002 task->p->phdr = (void *)(base + ph->p_vaddr + (task->eh->e_phoff - ph->p_offset)); in task_map_library()
5003 task->p->phnum = task->eh->e_phnum; in task_map_library()
5004 task->p->phentsize = task->eh->e_phentsize; in task_map_library()
5017 task->fd, in task_map_library()
5018 off_start + task->file_offset) == MAP_FAILED) { in task_map_library()
5019 …LD_LOGE("Error mapping library %{public}s: mmap fix failed, errno: %{public}d", task->name, errno); in task_map_library()
5039 set_bss_vma_name(task->p->name, (void *)pgbrk, zeromap_size); in task_map_library()
5042 for (i = 0; ((size_t *)(base + task->dyn))[i]; i += NEXT_DYNAMIC_INDEX) { in task_map_library()
5043 if (((size_t *)(base + task->dyn))[i] == DT_TEXTREL) { in task_map_library()
5045 LD_LOGE("Error mapping library %{public}s: mprotect failed", task->name); in task_map_library()
5052 task->p->base = base; in task_map_library()
5053 task->p->dynv = laddr(task->p, task->dyn); in task_map_library()
5054 if (task->p->tls.size) { in task_map_library()
5055 task->p->tls.image = laddr(task->p, task->tls_image); in task_map_library()
5057 free(task->allocated_buf); in task_map_library()
5058 task->allocated_buf = NULL; in task_map_library()
5059 munmap(task->shdr_allocated_buf, task->shsize); in task_map_library()
5060 task->shdr_allocated_buf = NULL; in task_map_library()
5066 unmap_library(task->p); in task_map_library()
5068 free(task->allocated_buf); in task_map_library()
5069 task->allocated_buf = NULL; in task_map_library()
5070 munmap(task->shdr_allocated_buf, task->shsize); in task_map_library()
5071 task->shdr_allocated_buf = NULL; in task_map_library()
5075 static bool resolve_fd_to_realpath(struct loadtask *task) in resolve_fd_to_realpath() argument
5080 int ret = snprintf(proc_self_fd, sizeof(proc_self_fd), "/proc/self/fd/%d", task->fd); in resolve_fd_to_realpath()
5089 strncpy(task->buf, resolved_path, PATH_MAX); in resolve_fd_to_realpath()
5094 static bool load_library_header(struct loadtask *task) in load_library_header() argument
5096 const char *name = task->name; in load_library_header()
5097 struct dso *needed_by = task->needed_by; in load_library_header()
5098 ns_t *namespace = task->namespace; in load_library_header()
5099 bool check_inherited = task->check_inherited; in load_library_header()
5151 task->isloaded = true; in load_library_header()
5152 task->p = &ldso; in load_library_header()
5160 task->pathname = name; in load_library_header()
5161 if (!is_accessible(namespace, task->pathname, g_is_asan, check_inherited)) { in load_library_header()
5163 task->pathname, namespace ? namespace->ns_name : "NULL"); in load_library_header()
5164 task->fd = -1; in load_library_header()
5166 task->fd = z_info.fd; in load_library_header()
5167 task->file_offset = z_info.file_offset; in load_library_header()
5174 task->pathname = name; in load_library_header()
5175 if (!is_accessible(namespace, task->pathname, g_is_asan, check_inherited)) { in load_library_header()
5176 task->fd = -1; in load_library_header()
5178 task->fd = open(name, O_RDONLY | O_CLOEXEC); in load_library_header()
5184 task->p = find_library_by_name(name, namespace, check_inherited); in load_library_header()
5185 if (task->p) { in load_library_header()
5186 task->isloaded = true; in load_library_header()
5188 name, namespace->ns_name, task->p->name, task->p->namespace->ns_name); in load_library_header()
5195 task->fd = -1; in load_library_header()
5197 open_library_by_path(name, namespace->env_paths, task, &z_info); in load_library_header()
5199 for (task->p = needed_by; task->fd == -1 && task->p; task->p = task->p->needed_by) { in load_library_header()
5200 if (fixup_rpath(task->p, task->buf, sizeof task->buf) < 0) { in load_library_header()
5201 task->fd = INVALID_FD_INHIBIT_FURTHER_SEARCH; /* Inhibit further search. */ in load_library_header()
5203 if (task->p->rpath) { in load_library_header()
5204 open_library_by_path(name, task->p->rpath, task, &z_info); in load_library_header()
5205 if (task->fd != -1 && resolve_fd_to_realpath(task)) { in load_library_header()
5206 if (!is_accessible(namespace, task->buf, g_is_asan, check_inherited)) { in load_library_header()
5207 close(task->fd); in load_library_header()
5208 task->fd = -1; in load_library_header()
5214 handle_asan_path_open_by_task(task->fd, name, namespace, task, &z_info); in load_library_header()
5215 LD_LOGD("load_library handle_asan_path_open_by_task fd:%{public}d.", task->fd); in load_library_header()
5217 if (task->fd == -1 && namespace->lib_paths) { in load_library_header()
5218 open_library_by_path(name, namespace->lib_paths, task, &z_info); in load_library_header()
5219 LD_LOGD("load_library no asan lib_paths path_open fd:%{public}d.", task->fd); in load_library_header()
5222 task->pathname = task->buf; in load_library_header()
5224 if (task->fd < 0) { in load_library_header()
5234 task->namespace = inherit->inherited_ns; in load_library_header()
5235 task->check_inherited = false; in load_library_header()
5236 if (load_library_header(task)) { in load_library_header()
5243 if (fstat(task->fd, &st) < 0) { in load_library_header()
5244 LD_LOGE("Error loading header %{public}s: failed to get file state", task->name); in load_library_header()
5245 close(task->fd); in load_library_header()
5246 task->fd = -1; in load_library_header()
5250 task->p = find_library_by_fstat(&st, namespace, check_inherited, task->file_offset); in load_library_header()
5251 if (task->p) { in load_library_header()
5255 if (!task->p->shortname && task->pathname != name) { in load_library_header()
5256 task->p->shortname = strrchr(task->p->name, '/') + 1; in load_library_header()
5258 close(task->fd); in load_library_header()
5259 task->fd = -1; in load_library_header()
5260 task->isloaded = true; in load_library_header()
5262 name, namespace->ns_name, task->p->name, task->p->namespace->ns_name); in load_library_header()
5266 map = noload ? 0 : map_library_header(task); in load_library_header()
5268 LD_LOGE("Error loading header %{public}s: failed to map header", task->name); in load_library_header()
5269 close(task->fd); in load_library_header()
5270 task->fd = -1; in load_library_header()
5279 alloc_size = sizeof(struct dso) + strlen(task->pathname) + 1; in load_library_header()
5280 if (runtime && task->tls.size) { in load_library_header()
5281 size_t per_th = task->tls.size + task->tls.align + sizeof(void *) * (tls_cnt + TLS_CNT_INCREASE); in load_library_header()
5289 task->p = calloc(1, alloc_size); in load_library_header()
5290 if (!task->p) { in load_library_header()
5291 LD_LOGE("Error loading header %{public}s: failed to allocate dso", task->name); in load_library_header()
5292 close(task->fd); in load_library_header()
5293 task->fd = -1; in load_library_header()
5296 task->p->dev = st.st_dev; in load_library_header()
5297 task->p->ino = st.st_ino; in load_library_header()
5298 task->p->file_offset = task->file_offset; in load_library_header()
5299 task->p->needed_by = needed_by; in load_library_header()
5300 task->p->name = task->p->buf; in load_library_header()
5301 strcpy(task->p->name, task->pathname); in load_library_header()
5302 task->p->tls = task->tls; in load_library_header()
5303 task->p->dynv = task->dyn_addr; in load_library_header()
5304 task->p->strings = task->str_addr; in load_library_header()
5307 if (search_vec(task->p->dynv, &rpath_offset, DT_RPATH)) in load_library_header()
5308 task->p->rpath_orig = task->p->strings + rpath_offset; in load_library_header()
5309 if (search_vec(task->p->dynv, &runpath_offset, DT_RUNPATH)) in load_library_header()
5310 task->p->rpath_orig = task->p->strings + runpath_offset; in load_library_header()
5313 if (task->pathname != name) { in load_library_header()
5314 task->p->shortname = strrchr(task->p->name, '/') + 1; in load_library_header()
5317 if (task->p->tls.size) { in load_library_header()
5318 task->p->tls_id = ++tls_cnt; in load_library_header()
5319 task->p->new_dtv = (void *)(-sizeof(size_t) & in load_library_header()
5320 (uintptr_t)(task->p->name + strlen(task->p->name) + sizeof(size_t))); in load_library_header()
5321 task->p->new_tls = (void *)(task->p->new_dtv + n_th * (tls_cnt + 1)); in load_library_header()
5324 tail->next = task->p; in load_library_header()
5325 task->p->prev = tail; in load_library_header()
5326 tail = task->p; in load_library_header()
5329 task->p->namespace = namespace; in load_library_header()
5330 ns_add_dso(namespace, task->p); in load_library_header()
5334 static void task_load_library(struct loadtask *task, struct reserved_address_params *reserved_param… in task_load_library() argument
5336 …loading ns=%{public}s name=%{public}s by_dlopen=%{public}d", task->namespace->ns_name, task->p->na… in task_load_library()
5337 bool map = noload ? 0 : task_map_library(task, reserved_params); in task_load_library()
5338 close(task->fd); in task_load_library()
5339 task->fd = -1; in task_load_library()
5341 LD_LOGE("Error loading library %{public}s: failed to map library", task->name); in task_load_library()
5342 error("Error loading library %s: failed to map library", task->name); in task_load_library()
5353 decode_dyn(task->p); in task_load_library()
5354 if (find_sym(task->p, "__libc_start_main", 1).sym && in task_load_library()
5355 find_sym(task->p, "stdin", 1).sym) { in task_load_library()
5356 do_dlclose(task->p); in task_load_library()
5357 task->p = NULL; in task_load_library()
5358 free((void*)task->name); in task_load_library()
5359 task->name = ld_strdup("libc.so"); in task_load_library()
5360 task->check_inherited = true; in task_load_library()
5361 if (!load_library_header(task)) { in task_load_library()
5362 LD_LOGE("Error loading library %{public}s: failed to load libc.so", task->name); in task_load_library()
5363 error("Error loading library %s: failed to load libc.so", task->name); in task_load_library()
5374 reclaim_gaps(task->p); in task_load_library()
5376 task->p->runtime_loaded = runtime; in task_load_library()
5378 task->p->by_dlopen = 1; in task_load_library()
5381 makefuncdescs(task->p); in task_load_library()
5385 dprintf(1, "\t%s => %s (%p)\n", task->name, task->pathname, task->p->base); in task_load_library()
5390 libc.load_hook((long unsigned int)task->p->base, task->p->phdr, task->p->phnum); in task_load_library()
5436 struct loadtask *task = create_loadtask(dtneed_name, p, namespace, true); in preload_direct_deps() local
5437 if (!task) { in preload_direct_deps()
5446 if (!load_library_header(task)) { in preload_direct_deps()
5447 free_task(task); in preload_direct_deps()
5448 task = NULL; in preload_direct_deps()
5459 p->deps[cnt++] = task->p; in preload_direct_deps()
5460 if (task->isloaded) { in preload_direct_deps()
5461 free_task(task); in preload_direct_deps()
5462 task = NULL; in preload_direct_deps()
5464 append_loadtasks(tasks, task); in preload_direct_deps()
5476 struct loadtask *task = NULL; in unmap_preloaded_sections() local
5478 task = get_loadtask(tasks, i); in unmap_preloaded_sections()
5479 if (!task) { in unmap_preloaded_sections()
5482 if (task->dyn_map_len) { in unmap_preloaded_sections()
5483 munmap(task->dyn_map, task->dyn_map_len); in unmap_preloaded_sections()
5484 task->dyn_map = NULL; in unmap_preloaded_sections()
5485 task->dyn_map_len = 0; in unmap_preloaded_sections()
5486 if (task->p) { in unmap_preloaded_sections()
5487 task->p->dynv = NULL; in unmap_preloaded_sections()
5490 if (task->str_map_len) { in unmap_preloaded_sections()
5491 munmap(task->str_map, task->str_map_len); in unmap_preloaded_sections()
5492 task->str_map = NULL; in unmap_preloaded_sections()
5493 task->str_map_len = 0; in unmap_preloaded_sections()
5494 if (task->p) { in unmap_preloaded_sections()
5495 task->p->strings = NULL; in unmap_preloaded_sections()
5513 struct loadtask *task = NULL; in run_loadtasks() local
5516 task = get_loadtask(tasks, i); in run_loadtasks()
5517 if (task) { in run_loadtasks()
5519 …rved_address = reserved_params->reserved_address_recursive || (reserved_params->target == task->p); in run_loadtasks()
5521 task_load_library(task, reserved_address ? reserved_params : NULL); in run_loadtasks()
5558 struct loadtask *task = NULL; in load_preload() local
5568 task = create_loadtask(s, NULL, ns, true); in load_preload()
5569 if (!task) { in load_preload()
5572 if (load_library_header(task)) { in load_preload()
5573 if (!task->isloaded) { in load_preload()
5574 append_loadtasks(tasks, task); in load_preload()
5575 task = NULL; in load_preload()
5578 if (task) { in load_preload()
5579 free_task(task); in load_preload()