• Home
  • Raw
  • Download

Lines Matching refs:si

287   soinfo* si = new (g_soinfo_allocator.alloc()) soinfo(ns, name, file_stat,  in soinfo_alloc()  local
290 solist_add_soinfo(si); in soinfo_alloc()
292 si->generate_handle(); in soinfo_alloc()
293 ns->add_soinfo(si); in soinfo_alloc()
295 TRACE("name %s: allocated soinfo @ %p", name, si); in soinfo_alloc()
296 return si; in soinfo_alloc()
299 static void soinfo_free(soinfo* si) { in soinfo_free() argument
300 if (si == nullptr) { in soinfo_free()
304 if (si->base != 0 && si->size != 0) { in soinfo_free()
305 if (!si->is_mapped_by_caller()) { in soinfo_free()
306 munmap(reinterpret_cast<void*>(si->base), si->size); in soinfo_free()
309 mmap(reinterpret_cast<void*>(si->base), si->size, PROT_NONE, in soinfo_free()
314 TRACE("name %s: freeing soinfo @ %p", si->get_realpath(), si); in soinfo_free()
316 if (!solist_remove_soinfo(si)) { in soinfo_free()
317 async_safe_fatal("soinfo=%p is not in soinfo_list (double unload?)", si); in soinfo_free()
321 si->remove_all_links(); in soinfo_free()
323 si->~soinfo(); in soinfo_free()
324 g_soinfo_allocator.free(si); in soinfo_free()
388 if (soinfo* si = find_containing_library(reinterpret_cast<void*>(pc))) { in do_dl_unwind_find_exidx() local
389 *pcount = si->ARM_exidx_count; in do_dl_unwind_find_exidx()
390 return reinterpret_cast<_Unwind_Ptr>(si->ARM_exidx); in do_dl_unwind_find_exidx()
402 for (soinfo* si = solist_get_head(); si != nullptr; si = si->next) { in do_dl_iterate_phdr() local
404 dl_info.dlpi_addr = si->link_map_head.l_addr; in do_dl_iterate_phdr()
405 dl_info.dlpi_name = si->link_map_head.l_name; in do_dl_iterate_phdr()
406 dl_info.dlpi_phdr = si->phdr; in do_dl_iterate_phdr()
407 dl_info.dlpi_phnum = si->phnum; in do_dl_iterate_phdr()
410 if (soinfo_tls* tls_module = si->get_tls()) { in do_dl_iterate_phdr()
521 void set_soinfo(soinfo* si) { in set_soinfo() argument
522 si_ = si; in set_soinfo()
663 soinfo* si; in walk_dependencies_tree() local
664 while ((si = visit_list.pop_front()) != nullptr) { in walk_dependencies_tree()
665 if (visited.contains(si)) { in walk_dependencies_tree()
669 walk_action_result_t result = action(si); in walk_dependencies_tree()
675 visited.push_back(si); in walk_dependencies_tree()
678 si->get_children().for_each([&](soinfo* child) { in walk_dependencies_tree()
747 soinfo* si = *it; in ElfW() local
751 if ((si->get_rtld_flags() & RTLD_GLOBAL) == 0 && si->get_target_sdk_version() >= 23) { in ElfW()
755 s = si->find_symbol_by_name(symbol_name, vi); in ElfW()
757 *found = si; in ElfW()
784 static const ElfW(Sym)* dlsym_handle_lookup(soinfo* si, in ElfW()
795 if (si == solist_get_somain()) { in ElfW()
804 return dlsym_handle_lookup_impl(si->get_primary_namespace(), si, nullptr, found, symbol_name, vi); in ElfW()
811 for (soinfo* si = solist_get_head(); si != nullptr; si = si->next) { in find_containing_library() local
812 if (address < si->base || address - si->base >= si->size) { in find_containing_library()
815 ElfW(Addr) vaddr = address - si->load_bias; in find_containing_library()
816 for (size_t i = 0; i != si->phnum; ++i) { in find_containing_library()
817 const ElfW(Phdr)* phdr = &si->phdr[i]; in find_containing_library()
822 return si; in find_containing_library()
1096 auto predicate = [&](soinfo* si) { in find_loaded_library_by_inode() argument
1097 return si->get_st_ino() == file_stat.st_ino && in find_loaded_library_by_inode()
1098 si->get_st_dev() == file_stat.st_dev && in find_loaded_library_by_inode()
1099 si->get_file_offset() == file_offset; in find_loaded_library_by_inode()
1107 soinfo* si = linked_ns->soinfo_list().find_if(predicate); in find_loaded_library_by_inode() local
1109 if (si != nullptr && link.is_accessible(si->get_soname())) { in find_loaded_library_by_inode()
1110 *candidate = si; in find_loaded_library_by_inode()
1121 auto predicate = [&](soinfo* si) { return strcmp(realpath, si->get_realpath()) == 0; }; in find_loaded_library_by_realpath() argument
1128 soinfo* si = linked_ns->soinfo_list().find_if(predicate); in find_loaded_library_by_realpath() local
1130 if (si != nullptr && link.is_accessible(si->get_soname())) { in find_loaded_library_by_realpath()
1131 *candidate = si; in find_loaded_library_by_realpath()
1177 soinfo* si = nullptr; in load_library() local
1178 if (find_loaded_library_by_inode(ns, file_stat, file_offset, search_linked_namespaces, &si)) { in load_library()
1182 ns->get_name(), name, si->get_realpath()); in load_library()
1183 task->set_soinfo(si); in load_library()
1245 soinfo* si = soinfo_alloc(ns, realpath.c_str(), &file_stat, file_offset, rtld_flags); in load_library() local
1246 if (si == nullptr) { in load_library()
1250 task->set_soinfo(si); in load_library()
1254 soinfo_free(si); in load_library()
1266 si->set_dt_runpath(elf_reader.get_string(d->d_un.d_val)); in load_library()
1269 si->set_soname(elf_reader.get_string(d->d_un.d_val)); in load_library()
1277 if (si->get_dt_runpath().empty()) { in load_library()
1278 si->set_dt_runpath("$ORIGIN/../lib64:$ORIGIN/lib64"); in load_library()
1285 load_tasks->push_back(LoadTask::create(name, si, ns, task->get_readers_map())); in load_library()
1354 return !ns->soinfo_list().visit([&](soinfo* si) { in find_loaded_library_by_soname() argument
1355 const char* soname = si->get_soname(); in find_loaded_library_by_soname()
1357 *candidate = si; in find_loaded_library_by_soname()
1512 static void soinfo_unload(soinfo* si);
1602 soinfo* si = task->get_soinfo(); in find_libraries() local
1605 needed_by->add_child(si); in find_libraries()
1611 ld_preloads->push_back(si); in find_libraries()
1615 soinfos[soinfos_count++] = si; in find_libraries()
1622 soinfo* si = task->get_soinfo(); in find_libraries() local
1624 return t->get_soinfo() == si; in find_libraries()
1627 if (!si->is_linked() && in find_libraries()
1666 soinfo* si = task->get_soinfo(); in find_libraries() local
1667 if (!si->is_linked() && !si->prelink_image()) { in find_libraries()
1670 register_soinfo_tls(si); in find_libraries()
1679 for (auto&& si : *ld_preloads) { in find_libraries()
1680 si->set_dt_flags_1(si->get_dt_flags_1() | DF_1_GLOBAL); in find_libraries()
1688 soinfo* si = task->get_soinfo(); in find_libraries() local
1689 if (!si->is_linked() && (si->get_dt_flags_1() & DF_1_GLOBAL) != 0) { in find_libraries()
1690 new_global_group_members.push_back(si); in find_libraries()
1697 for (auto si : new_global_group_members) { in find_libraries() local
1698 if (si->get_primary_namespace() != linked_ns) { in find_libraries()
1699 linked_ns->add_soinfo(si); in find_libraries()
1700 si->add_secondary_namespace(linked_ns); in find_libraries()
1720 soinfo* si = task->get_soinfo(); in find_libraries() local
1726 if (!si->is_linked() && si->get_primary_namespace() != needed_by_ns) { in find_libraries()
1727 auto it = std::find(local_group_roots.begin(), local_group_roots.end(), si); in find_libraries()
1730 si->get_realpath(), in find_libraries()
1731 si, in find_libraries()
1732 si->get_primary_namespace()->get_name(), in find_libraries()
1733 si->get_primary_namespace(), in find_libraries()
1743 local_group_roots.push_back(si); in find_libraries()
1754 [&] (soinfo* si) { in find_libraries() argument
1755 if (local_group_ns->is_accessible(si)) { in find_libraries()
1756 local_group.push_back(si); in find_libraries()
1767 bool linked = local_group.visit([&](soinfo* si) { in find_libraries() argument
1771 if (!si->is_linked() && si->get_primary_namespace() == local_group_ns) { in find_libraries()
1773 if (si == soinfos[0] || reserved_address_recursive) { in find_libraries()
1779 __libc_shared_globals()->load_hook(si->load_bias, si->phdr, si->phnum); in find_libraries()
1781 lookup_list.set_dt_symbolic_lib(si->has_DT_SYMBOLIC ? si : nullptr); in find_libraries()
1782 if (!si->link_image(lookup_list, local_group_root, link_extinfo, &relro_fd_offset) || in find_libraries()
1783 !get_cfi_shadow()->AfterLoad(si, solist_get_head())) { in find_libraries()
1805 soinfo* si = task->get_soinfo(); in find_libraries() local
1806 si->set_linked(); in find_libraries()
1810 soinfo* si = task->get_soinfo(); in find_libraries() local
1814 needed_by->get_local_group_root() != si->get_local_group_root()) { in find_libraries()
1815 si->increment_ref_count(); in find_libraries()
1827 soinfo* si = nullptr; in find_library() local
1830 si = solist_get_somain(); in find_library()
1835 &si, in find_library()
1842 if (si != nullptr) { in find_library()
1843 soinfo_unload(si); in find_library()
1848 si->increment_ref_count(); in find_library()
1850 return si; in find_library()
1871 soinfo* si = nullptr; in soinfo_unload_impl() local
1873 while ((si = unload_list.pop_front()) != nullptr) { in soinfo_unload_impl()
1874 if (local_unload_list.contains(si)) { in soinfo_unload_impl()
1878 local_unload_list.push_back(si); in soinfo_unload_impl()
1880 if (si->has_min_version(0)) { in soinfo_unload_impl()
1882 while ((child = si->get_children().pop_front()) != nullptr) { in soinfo_unload_impl()
1883 TRACE("%s@%p needs to unload %s@%p", si->get_realpath(), si, in soinfo_unload_impl()
1886 child->get_parents().remove(si); in soinfo_unload_impl()
1897 async_safe_fatal("soinfo for \"%s\"@%p has no version", si->get_realpath(), si); in soinfo_unload_impl()
1901 local_unload_list.for_each([](soinfo* si) { in soinfo_unload_impl() argument
1904 si->get_realpath(), in soinfo_unload_impl()
1905 si); in soinfo_unload_impl()
1906 si->call_destructors(); in soinfo_unload_impl()
1909 si->get_realpath(), in soinfo_unload_impl()
1910 si); in soinfo_unload_impl()
1913 while ((si = local_unload_list.pop_front()) != nullptr) { in soinfo_unload_impl()
1916 si->get_realpath(), in soinfo_unload_impl()
1917 si); in soinfo_unload_impl()
1919 notify_gdb_of_unload(si); in soinfo_unload_impl()
1920 unregister_soinfo_tls(si); in soinfo_unload_impl()
1922 __libc_shared_globals()->unload_hook(si->load_bias, si->phdr, si->phnum); in soinfo_unload_impl()
1924 get_cfi_shadow()->BeforeUnload(si); in soinfo_unload_impl()
1925 soinfo_free(si); in soinfo_unload_impl()
1929 while ((si = external_unload_list.pop_front()) != nullptr) { in soinfo_unload_impl()
1932 si->get_realpath(), in soinfo_unload_impl()
1933 si); in soinfo_unload_impl()
1934 soinfo_unload(si); in soinfo_unload_impl()
1982 soinfo* si = find_containing_library(dso_handle); in increment_dso_handle_reference_counter() local
1983 if (si != nullptr) { in increment_dso_handle_reference_counter()
1985 si->increment_ref_count(); in increment_dso_handle_reference_counter()
2005 soinfo* si = find_containing_library(dso_handle); in decrement_dso_handle_reference_counter() local
2006 if (si != nullptr) { in decrement_dso_handle_reference_counter()
2008 soinfo_unload(si); in decrement_dso_handle_reference_counter()
2171 soinfo* si = nullptr; in do_dlopen() local
2172 if (find_loaded_library_by_realpath(ns, original_path, true, &si)) { in do_dlopen()
2184 soinfo* si = find_library(ns, translated_name, flags, extinfo, caller); in do_dlopen() local
2187 if (si != nullptr) { in do_dlopen()
2188 void* handle = si->to_handle(); in do_dlopen()
2191 si->get_realpath(), si->get_soname(), handle); in do_dlopen()
2192 si->call_constructors(); in do_dlopen()
2196 si->get_realpath(), si->get_soname(), handle); in do_dlopen()
2205 soinfo* si = find_containing_library(addr); in do_dladdr() local
2206 if (si == nullptr) { in do_dladdr()
2212 info->dli_fname = si->get_realpath(); in do_dladdr()
2214 info->dli_fbase = reinterpret_cast<void*>(si->base); in do_dladdr()
2217 ElfW(Sym)* sym = si->find_symbol_by_address(addr); in do_dladdr()
2219 info->dli_sname = si->get_string(sym->st_name); in do_dladdr()
2220 info->dli_saddr = reinterpret_cast<void*>(si->resolve_symbol_address(sym)); in do_dladdr()
2256 soinfo* si = nullptr; in do_dlsym() local
2258 si = soinfo_from_handle(handle); in do_dlsym()
2264 si != nullptr ? si->get_realpath() : "n/a", in do_dlsym()
2291 if (si == nullptr) { in do_dlsym()
2295 sym = dlsym_handle_lookup(si, &found, sym_name, vi); in do_dlsym()
2335 soinfo* si = soinfo_from_handle(handle); in do_dlclose() local
2336 if (si == nullptr) { in do_dlclose()
2344 si->get_realpath(), in do_dlclose()
2345 si); in do_dlclose()
2346 soinfo_unload(si); in do_dlclose()
2402 for (auto si : soinfos) { in add_soinfos_to_namespace() local
2403 si->add_secondary_namespace(ns); in add_soinfos_to_namespace()
2580 soinfo* target_si = si_from->get_children().find_if([&](const soinfo* si) { in init_verneed() argument
2581 return si->get_soname() != nullptr && strcmp(si->get_soname(), target_soname) == 0; in init_verneed()
2606 static bool for_each_verdef(const soinfo* si, F functor) { in for_each_verdef() argument
2607 if (!si->has_min_version(2)) { in for_each_verdef()
2611 uintptr_t verdef_ptr = si->get_verdef_ptr(); in for_each_verdef()
2618 size_t verdef_cnt = si->get_verdef_cnt(); in for_each_verdef()
2626 i, verdef->vd_version, si->get_realpath()); in for_each_verdef()
2653 ElfW(Versym) find_verdef_version_index(const soinfo* si, const version_info* vi) { in find_verdef_version_index() argument
2660 if (!for_each_verdef(si, in find_verdef_version_index()
2663 strcmp(vi->name, si->get_string(verdaux->vda_name)) == 0) { in find_verdef_version_index()
2673 si->get_realpath(), linker_get_error_buffer()); in find_verdef_version_index()
2680 bool validate_verdef_section(const soinfo* si) { in validate_verdef_section() argument
2681 return for_each_verdef(si, in validate_verdef_section()