Lines Matching refs:dso
21 #include "dso.h"
44 static int dso__load_kernel_sym(struct dso *dso, struct map *map);
45 static int dso__load_guest_kernel_sym(struct dso *dso, struct map *map);
250 * not assign it to the kernel dso map (kallsyms).
540 void dso__reset_find_symbol_cache(struct dso *dso)
542 dso->last_find_result.addr = 0;
543 dso->last_find_result.symbol = NULL;
546 void dso__insert_symbol(struct dso *dso, struct symbol *sym)
548 __symbols__insert(&dso->symbols, sym, dso->kernel);
551 if (dso->last_find_result.addr >= sym->start &&
552 (dso->last_find_result.addr < sym->end ||
554 dso->last_find_result.symbol = sym;
558 void dso__delete_symbol(struct dso *dso, struct symbol *sym)
560 rb_erase_cached(&sym->rb_node, &dso->symbols);
562 dso__reset_find_symbol_cache(dso);
565 struct symbol *dso__find_symbol(struct dso *dso, u64 addr)
567 if (dso->last_find_result.addr != addr || dso->last_find_result.symbol == NULL) {
568 dso->last_find_result.addr = addr;
569 dso->last_find_result.symbol = symbols__find(&dso->symbols, addr);
572 return dso->last_find_result.symbol;
575 struct symbol *dso__find_symbol_nocache(struct dso *dso, u64 addr)
577 return symbols__find(&dso->symbols, addr);
580 struct symbol *dso__first_symbol(struct dso *dso)
582 return symbols__first(&dso->symbols);
585 struct symbol *dso__last_symbol(struct dso *dso)
587 return symbols__last(&dso->symbols);
595 struct symbol *dso__next_symbol_by_name(struct dso *dso, size_t *idx)
597 if (*idx + 1 >= dso->symbol_names_len)
601 return dso->symbol_names[*idx];
607 struct symbol *dso__find_symbol_by_name(struct dso *dso, const char *name, size_t *idx)
609 struct symbol *s = symbols__find_by_name(dso->symbol_names, dso->symbol_names_len,
612 s = symbols__find_by_name(dso->symbol_names, dso->symbol_names_len,
617 void dso__sort_by_name(struct dso *dso)
619 mutex_lock(&dso->lock);
620 if (!dso__sorted_by_name(dso)) {
623 dso->symbol_names = symbols__sort_by_name(&dso->symbols, &len);
624 if (dso->symbol_names) {
625 dso->symbol_names_len = len;
626 dso__set_sorted_by_name(dso);
629 mutex_unlock(&dso->lock);
754 struct dso *dso = arg;
755 struct rb_root_cached *root = &dso->symbols;
782 * Loads the function entries in /proc/kallsyms into kernel_map->dso,
786 static int dso__load_all_kallsyms(struct dso *dso, const char *filename)
788 return kallsyms__parse(filename, dso, map__process_kallsym_symbol);
791 static int maps__split_kallsyms_for_kcore(struct maps *kmaps, struct dso *dso)
796 struct rb_root_cached old_root = dso->symbols;
797 struct rb_root_cached *root = &dso->symbols;
806 struct dso *curr_map_dso;
835 dso->adjust_symbols = 1;
845 static int maps__split_kallsyms(struct maps *kmaps, struct dso *dso, u64 delta,
852 struct rb_root_cached *root = &dso->symbols;
872 struct dso *curr_map_dso;
881 dso->kernel == DSO_SPACE__KERNEL_GUEST &&
925 struct dso *ndso;
938 if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
951 ndso->kernel = dso->kernel;
973 struct dso *curr_map_dso = map__dso(curr_map);
988 dso->kernel == DSO_SPACE__KERNEL_GUEST &&
1164 struct dso *dso;
1169 dso = map__dso(old_map);
1171 mi = find_module(dso->short_name, &modules);
1248 struct dso *dso;
1260 list_node->map = map__new2(start, md->dso);
1371 static int dso__load_kcore(struct dso *dso, struct map *map,
1401 md.dso = dso;
1416 dso->is_64_bit = is_64_bit;
1430 * eBPF dso for source data.
1519 if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
1520 dso->binary_type = DSO_BINARY_TYPE__GUEST_KCORE;
1522 dso->binary_type = DSO_BINARY_TYPE__KCORE;
1523 dso__set_long_name(dso, strdup(kcore_filename), true);
1565 int __dso__load_kallsyms(struct dso *dso, const char *filename,
1577 if (dso__load_all_kallsyms(dso, filename) < 0)
1583 symbols__fixup_end(&dso->symbols, true);
1584 symbols__fixup_duplicate(&dso->symbols);
1586 if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
1587 dso->symtab_type = DSO_BINARY_TYPE__GUEST_KALLSYMS;
1589 dso->symtab_type = DSO_BINARY_TYPE__KALLSYMS;
1591 if (!no_kcore && !dso__load_kcore(dso, map, filename))
1592 return maps__split_kallsyms_for_kcore(kmap->kmaps, dso);
1594 return maps__split_kallsyms(kmap->kmaps, dso, delta, map);
1597 int dso__load_kallsyms(struct dso *dso, const char *filename,
1600 return __dso__load_kallsyms(dso, filename, map, false);
1603 static int dso__load_perf_map(const char *map_path, struct dso *dso)
1645 symbols__insert(&dso->symbols, sym);
1685 int dso__load_bfd_symbols(struct dso *dso, const char *debugfile)
1701 dso->long_name);
1734 dso->text_offset = section->vma - (u32)section->vma;
1735 dso->text_offset += (u32)bfd_asymbol_value(symbols[i]);
1737 dso->text_offset = section->vma - section->filepos;
1763 start = bfd_asymbol_value(sym) - dso->text_offset;
1769 symbols__insert(&dso->symbols, symbol);
1775 symbols__fixup_end(&dso->symbols, false);
1776 symbols__fixup_duplicate(&dso->symbols);
1777 dso->adjust_symbols = 1;
1788 static bool dso__is_compatible_symtab_type(struct dso *dso, bool kmod,
1800 return !kmod && dso->kernel == DSO_SPACE__USER;
1805 return dso->kernel == DSO_SPACE__KERNEL;
1810 return dso->kernel == DSO_SPACE__KERNEL_GUEST;
1818 * creating a module dso in machine__addnew_module_map().
1820 return kmod && dso->symtab_type == type;
1873 int dso__load(struct dso *dso, struct map *map)
1888 const char *map_path = dso->long_name;
1890 mutex_lock(&dso->lock);
1891 perfmap = strncmp(dso->name, "/tmp/perf-", 10) == 0;
1893 if (dso->nsinfo && (dso__find_perf_map(newmapname,
1894 sizeof(newmapname), &dso->nsinfo) == 0)) {
1899 nsinfo__mountns_enter(dso->nsinfo, &nsc);
1901 /* check again under the dso->lock */
1902 if (dso__loaded(dso)) {
1907 kmod = dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE ||
1908 dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP ||
1909 dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE ||
1910 dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE_COMP;
1912 if (dso->kernel && !kmod) {
1913 if (dso->kernel == DSO_SPACE__KERNEL)
1914 ret = dso__load_kernel_sym(dso, map);
1915 else if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
1916 ret = dso__load_guest_kernel_sym(dso, map);
1920 machine__map_x86_64_entry_trampolines(machine, dso);
1924 dso->adjust_symbols = 0;
1927 ret = dso__load_perf_map(map_path, dso);
1928 dso->symtab_type = ret > 0 ? DSO_BINARY_TYPE__JAVA_JIT :
1944 if (!dso->has_build_id &&
1945 is_regular_file(dso->long_name)) {
1946 __symbol__join_symfs(name, PATH_MAX, dso->long_name);
1948 dso__set_build_id(dso, &bid);
1969 if (!dso__is_compatible_symtab_type(dso, kmod, symtab_type))
1972 if (dso__read_binary_type_filename(dso, symtab_type,
1980 if (!is_reg && errno == ENOENT && dso->nsinfo) {
1981 char *new_name = dso__filename_with_chroot(dso, name);
1991 bfdrc = dso__load_bfd_symbols(dso, name);
1994 sirc = symsrc__init(ss, dso, name, symtab_type);
1997 nsinfo__mountns_enter(dso->nsinfo, &nsc);
2010 if (!dso->symsrc_filename)
2011 dso->symsrc_filename = strdup(name);
2042 ret = dso__load_sym(dso, map, syms_ss, runtime_ss, kmod);
2049 nr_plt = dso__synthesize_plt_symbols(dso, runtime_ss);
2058 if (ret < 0 && strstr(dso->name, " (deleted)") != NULL)
2061 dso__set_loaded(dso);
2062 mutex_unlock(&dso->lock);
2072 const struct dso *dso_a = map__dso(map_a);
2073 const struct dso *dso_b = map__dso(map_b);
2091 const struct dso *dso = map__dso(*(const struct map **)b);
2093 return strcmp(name, dso->short_name);
2152 const struct dso *dso = map__dso(RC_CHK_ACCESS(maps)->last_search_by_name);
2154 if (strcmp(dso->short_name, name) == 0) {
2170 struct dso *dso;
2173 dso = map__dso(map);
2174 if (strcmp(dso->short_name, name) == 0) {
2186 int dso__load_vmlinux(struct dso *dso, struct map *map,
2199 if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
2204 if (symsrc__init(&ss, dso, symfs_vmlinux, symtab_type))
2208 * dso__load_sym() may copy 'dso' which will result in the copies having
2211 dso__set_long_name(dso, vmlinux, vmlinux_allocated);
2212 if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
2213 dso->binary_type = DSO_BINARY_TYPE__GUEST_VMLINUX;
2215 dso->binary_type = DSO_BINARY_TYPE__VMLINUX;
2217 err = dso__load_sym(dso, map, &ss, &ss, 0);
2221 dso__set_loaded(dso);
2228 int dso__load_vmlinux_path(struct dso *dso, struct map *map)
2237 err = dso__load_vmlinux(dso, map, vmlinux_path[i], false);
2243 filename = dso__build_id_filename(dso, NULL, 0, false);
2245 err = dso__load_vmlinux(dso, map, filename, true);
2301 static char *dso__find_kallsyms(struct dso *dso, struct map *map)
2308 if (!dso->has_build_id) {
2317 is_host = dso__build_id_equal(dso, &bid);
2333 build_id__sprintf(&dso->bid, sbuild_id);
2358 static int dso__load_kernel_sym(struct dso *dso, struct map *map)
2386 return dso__load_vmlinux(dso, map, symbol_conf.vmlinux_name, false);
2395 filename = __dso__build_id_filename(dso, NULL, 0, false, false);
2397 err = dso__load_vmlinux(dso, map, filename, true);
2404 err = dso__load_vmlinux_path(dso, map);
2413 kallsyms_allocated_filename = dso__find_kallsyms(dso, map);
2420 err = dso__load_kallsyms(dso, kallsyms_filename, map);
2425 if (err > 0 && !dso__is_kcore(dso)) {
2426 dso->binary_type = DSO_BINARY_TYPE__KALLSYMS;
2427 dso__set_long_name(dso, DSO__NAME_KALLSYMS, false);
2435 static int dso__load_guest_kernel_sym(struct dso *dso, struct map *map)
2451 err = dso__load_vmlinux(dso, map,
2465 err = dso__load_kallsyms(dso, kallsyms_filename, map);
2468 if (err > 0 && !dso__is_kcore(dso)) {
2469 dso->binary_type = DSO_BINARY_TYPE__GUEST_KALLSYMS;
2470 dso__set_long_name(dso, machine->mmap_name, false);
2685 symbol_conf.dso_list_str, "dso") < 0)