7 #include <linux/kernel.h> 8 #include <linux/mman.h> 11 #include <sys/param.h> 30 #include <symbol/kallsyms.h> 31 #include <sys/utsname.h> 42 .try_vmlinux_path =
true,
44 .demangle_kernel =
false,
45 .cumulate_callchain =
true,
46 .show_hist_headers =
true,
71 #define DSO_BINARY_TYPE__SYMTAB_CNT ARRAY_SIZE(binary_type_symtab) 75 symbol_type =
toupper(symbol_type);
76 return symbol_type ==
'T' || symbol_type ==
'W' || symbol_type ==
'D' || symbol_type ==
'B';
81 const char *tail =
str;
96 return strcmp(namea, nameb);
102 return strncmp(namea, nameb, n);
106 struct symbol *symb __maybe_unused)
109 if (strlen(syma->
name) >= 3 && !strncmp(syma->
name,
"SyS", 3))
111 if (strlen(syma->
name) >= 10 && !strncmp(syma->
name,
"compat_SyS", 10))
126 if ((b == 0) && (a > 0))
128 else if ((a == 0) && (b > 0))
140 a = syma->
binding == STB_GLOBAL;
141 b = symb->
binding == STB_GLOBAL;
156 na = strlen(syma->
name);
157 nb = strlen(symb->
name);
169 struct symbol *curr, *next;
174 nd = rb_first(symbols);
189 rb_erase(&next->
rb_node, symbols);
194 rb_erase(&curr->
rb_node, symbols);
202 struct rb_node *nd, *prevnd = rb_first(symbols);
203 struct symbol *curr, *prev;
210 for (nd = rb_next(prevnd); nd; nd = rb_next(nd)) {
226 struct map *next, *curr;
253 size_t namelen = strlen(name) + 1;
255 sizeof(*sym) + namelen));
262 pthread_mutex_init(¬es->
lock, NULL);
264 sym = ((
void *)sym) + symbol_conf.
priv_size;
268 sym->
end = len ? start + len :
start;
273 pr_debug4(
"%s: %s %#" PRIx64
"-%#" PRIx64
"\n",
274 __func__, name, start, sym->
end);
288 struct rb_node *next = rb_first(symbols);
291 pos = rb_entry(next,
struct symbol, rb_node);
293 rb_erase(&pos->
rb_node, symbols);
300 struct rb_node **p = &symbols->rb_node;
301 struct rb_node *parent = NULL;
302 const u64 ip = sym->
start;
324 rb_link_node(&sym->
rb_node, parent, p);
325 rb_insert_color(&sym->
rb_node, symbols);
347 else if (ip > s->
end || (ip == s->
end && ip != s->
start))
358 struct rb_node *n = rb_first(symbols);
361 return rb_entry(n,
struct symbol, rb_node);
368 struct rb_node *n = rb_last(symbols);
371 return rb_entry(n,
struct symbol, rb_node);
378 struct rb_node *n = rb_next(&sym->
rb_node);
381 return rb_entry(n,
struct symbol, rb_node);
388 struct rb_node **p = &symbols->rb_node;
389 struct rb_node *parent = NULL;
402 rb_link_node(&symn->
rb_node, parent, p);
403 rb_insert_color(&symn->
rb_node, symbols);
411 for (nd = rb_first(source); nd; nd = rb_next(nd)) {
420 const char *versioning;
423 (versioning = strstr(name,
"@@"))) {
424 int len = strlen(str);
426 if (len < versioning - name)
427 len = versioning -
name;
465 for (n = rb_prev(n); n; n = rb_prev(n)) {
524 struct rb_node *n = rb_next(&s->
rb_node);
549 int (*process_module)(
void *arg,
const char *
name,
557 file = fopen(filename,
"r");
567 line_len = getline(&line, &n, file);
580 line[--line_len] =
'\0';
582 sep = strrchr(line,
'x');
588 sep = strchr(line,
' ');
594 scnprintf(name,
sizeof(name),
"[%s]", line);
596 size = strtoul(sep + 1, &endptr, 0);
597 if (*endptr !=
' ' && *endptr !=
'\t')
600 err = process_module(arg, name, start, size);
616 const char *
const idle_symbols[] = {
625 "mwait_idle_with_hints",
627 "ppc64_runlatch_off",
628 "pseries_dedicated_idle_sleep",
633 for (i = 0; idle_symbols[i]; i++) {
634 if (!strcmp(idle_symbols[i], name))
656 sym =
symbol__new(start, 0, kallsyms2elf_binding(type), kallsyms2elf_type(type), name);
680 struct map *curr_map;
683 struct rb_root old_root = dso->
symbols;
685 struct rb_node *next = rb_first(root);
695 pos = rb_entry(next,
struct symbol, rb_node);
698 rb_erase_init(&pos->
rb_node, &old_root);
700 module = strchr(pos->
name,
'\t');
730 struct map *initial_map)
733 struct map *curr_map = initial_map;
735 int count = 0, moved = 0;
737 struct rb_node *next = rb_first(root);
738 int kernel_range = 0;
751 pos = rb_entry(next,
struct symbol, rb_node);
754 module = strchr(pos->
name,
'\t');
762 if (curr_map != initial_map &&
776 if (curr_map == NULL) {
777 pr_debug(
"%s/proc/{kallsyms,modules} " 778 "inconsistency while looking " 779 "for \"%s\" module!\n",
781 curr_map = initial_map;
805 }
else if (curr_map != initial_map) {
816 curr_map = initial_map;
821 snprintf(dso_name,
sizeof(dso_name),
825 snprintf(dso_name,
sizeof(dso_name),
836 if (curr_map == NULL) {
850 if (curr_map != initial_map) {
863 if (curr_map != initial_map &&
869 return count + moved;
873 const char *restricted_filename)
875 bool restricted =
false;
878 char *r = realpath(filename, NULL);
881 restricted = strcmp(r, restricted_filename) == 0;
898 struct rb_node **p = &modules->rb_node;
910 rb_link_node(&mi->
rb_node, parent, p);
911 rb_insert_color(&mi->
rb_node, modules);
917 struct rb_node *next = rb_first(modules);
922 rb_erase(&mi->
rb_node, modules);
929 struct rb_root *modules)
931 struct rb_node *n = modules->rb_node;
938 cmp = strcmp(name, m->
name);
951 u64
size __maybe_unused)
953 struct rb_root *modules = arg;
960 mi->
name = strdup(name);
988 struct rb_root from_modules = RB_ROOT;
989 struct rb_root to_modules = RB_ROOT;
990 struct rb_node *from_node, *to_node;
998 goto out_delete_from;
1000 from_node = rb_first(&from_modules);
1001 to_node = rb_first(&to_modules);
1013 from_node = rb_next(from_node);
1014 to_node = rb_next(to_node);
1017 if (!from_node && !to_node)
1035 struct rb_root modules = RB_ROOT;
1036 struct map *old_map;
1072 const char *base_name,
1073 const char *kallsyms_filename)
1077 strcpy(filename, kallsyms_filename);
1078 name = strrchr(filename,
'/');
1084 if (!strcmp(name,
"kallsyms")) {
1085 strcpy(name, base_name);
1155 const char *kallsyms_filename)
1159 struct map *old_map, *new_map, *replacement_map = NULL;
1184 INIT_LIST_HEAD(&md.
maps);
1186 fd = open(kcore_filename, O_RDONLY);
1188 pr_debug(
"Failed to open %s. Note /proc/kcore requires CAP_SYS_RAWIO capability to access.\n",
1200 if (list_empty(&md.
maps)) {
1218 list_for_each_entry(new_map, &md.
maps,
node) {
1219 if (stext >= new_map->
start && stext < new_map->
end) {
1220 replacement_map = new_map;
1226 if (!replacement_map)
1227 replacement_map = list_entry(md.
maps.next,
struct map,
node);
1230 while (!list_empty(&md.
maps)) {
1231 new_map = list_entry(md.
maps.next,
struct map,
node);
1232 list_del_init(&new_map->
node);
1233 if (new_map == replacement_map) {
1276 if (map->
prot & PROT_EXEC)
1277 pr_debug(
"Using %s for kernel object code\n", kcore_filename);
1279 pr_debug(
"Using %s for kernel data\n", kcore_filename);
1284 while (!list_empty(&md.
maps)) {
1285 map = list_entry(md.
maps.next,
struct map,
node);
1286 list_del_init(&map->
node);
1312 struct map *
map,
bool no_kcore)
1320 if (!kmap || !kmap->
kmaps)
1356 file = fopen(map_path,
"r");
1360 while (!feof(file)) {
1365 line_len = getline(&line, &n, file);
1372 line[--line_len] =
'\0';
1377 if (len + 2 >= line_len)
1380 len +=
hex2u64(line + len, &size);
1383 if (len + 2 >= line_len)
1386 sym =
symbol__new(start, size, STB_GLOBAL, STT_FUNC, line + len);
1389 goto out_delete_line;
1466 snprintf(filebuf, bufsz,
"/tmp/perf-%d.map", nsi->
nstgid);
1468 rc = access(filebuf, R_OK);
1479 snprintf(filebuf, bufsz,
"/tmp/perf-%d.map", nnsi->
tgid);
1496 struct symsrc *syms_ss = NULL, *runtime_ss = NULL;
1504 perfmap = strncmp(dso->
name,
"/tmp/perf-", 10) == 0;
1507 sizeof(newmapname), &dso->
nsinfo) == 0)) {
1508 map_path = newmapname;
1513 pthread_mutex_lock(&dso->
lock);
1542 if (lstat(map_path, &st) < 0)
1545 if (!symbol_conf.
force && st.st_uid && (st.st_uid != geteuid())) {
1546 pr_warning(
"File %s not owned by current user or root, " 1547 "ignoring it (use -f to override).\n", map_path);
1587 struct symsrc *ss = &ss_[ss_pos];
1588 bool next_slot =
false;
1615 if (!is_reg || sirc < 0)
1633 if (syms_ss && runtime_ss)
1641 if (!runtime_ss && !syms_ss)
1644 if (runtime_ss && !syms_ss) {
1645 syms_ss = runtime_ss;
1649 if (!runtime_ss && syms_ss)
1650 runtime_ss = syms_ss;
1665 for (; ss_pos > 0; ss_pos--)
1669 if (ret < 0 && strstr(dso->
name,
" (deleted)") != NULL)
1673 pthread_mutex_unlock(&dso->
lock);
1681 struct maps *maps = &mg->
maps;
1699 const char *vmlinux,
bool vmlinux_allocated)
1706 if (vmlinux[0] ==
'/')
1707 snprintf(symfs_vmlinux,
sizeof(symfs_vmlinux),
"%s", vmlinux);
1716 if (
symsrc__init(&ss, dso, symfs_vmlinux, symtab_type))
1729 pr_debug(
"Using %s for symbols\n", symfs_vmlinux);
1738 char *filename = NULL;
1740 pr_debug(
"Looking at the vmlinux_path (%d entries long)\n",
1751 if (filename != NULL) {
1763 if (d->d_type != DT_DIR)
1780 scnprintf(kallsyms_filename,
sizeof(kallsyms_filename),
1781 "%s/%s/kallsyms", dir, nd->
s);
1783 strlcpy(dir, kallsyms_filename, dir_sz);
1801 int fd = open(file, O_RDONLY);
1812 bool is_host =
false;
1824 sizeof(host_build_id)) == 0)
1844 scnprintf(path,
sizeof(path),
"%s/%s/%s",
1848 return strdup(path);
1853 return strdup(
"/proc/kallsyms");
1858 pr_err(
"No kallsyms or vmlinux with build-id %s was found\n",
1863 return strdup(path);
1869 const char *kallsyms_filename = NULL;
1870 char *kallsyms_allocated_filename = NULL;
1902 if (symbol_conf.
symfs[0] != 0)
1906 if (!kallsyms_allocated_filename)
1909 kallsyms_filename = kallsyms_allocated_filename;
1914 pr_debug(
"Using %s for symbols\n", kallsyms_filename);
1915 free(kallsyms_allocated_filename);
1930 const char *kallsyms_filename = NULL;
1935 pr_debug(
"Guest kernel map hasn't the point to groups\n");
1954 if (!kallsyms_filename)
1957 sprintf(path,
"%s/proc/kallsyms", machine->
root_dir);
1958 kallsyms_filename = path;
1963 pr_debug(
"Using %s for symbols\n", kallsyms_filename);
1978 vmlinux_path__nr_entries = 0;
1990 "/usr/lib/debug/boot/vmlinux-%s",
1991 "/lib/modules/%s/build/vmlinux",
1992 "/usr/lib/debug/lib/modules/%s/vmlinux",
1993 "/usr/lib/debug/boot/vmlinux-%s.debug" 2010 char *kernel_version;
2014 ARRAY_SIZE(vmlinux_paths_upd)));
2018 for (i = 0; i < ARRAY_SIZE(vmlinux_paths); i++)
2023 if (symbol_conf.
symfs[0] != 0)
2029 if (uname(&uts) < 0)
2032 kernel_version = uts.release;
2035 for (i = 0; i < ARRAY_SIZE(vmlinux_paths_upd); i++) {
2036 snprintf(bf,
sizeof(bf), vmlinux_paths_upd[i], kernel_version);
2049 const char *list_name)
2051 if (list_str == NULL)
2056 pr_err(
"problems parsing %s list\n", list_name);
2065 const char *list_name)
2067 if (list_str == NULL)
2072 pr_err(
"problems parsing %s list\n", list_name);
2081 FILE *fp = fopen(
"/proc/sys/kernel/kptr_restrict",
"r");
2086 if (fgets(line,
sizeof(line), fp) != NULL)
2087 value = ((geteuid() != 0) || (getuid() != 0)) ?
2103 pr_err(
"Annotation needs to be init before symbol__init()\n");
2125 sizeof(struct symbol));
2131 pr_err(
"'.' is the only non valid --field-separator argument\n");
2141 goto out_free_dso_list;
2145 goto out_free_comm_list;
2149 goto out_free_pid_list;
2153 goto out_free_tid_list;
2157 goto out_free_sym_list;
2163 symfs = realpath(symbol_conf.
symfs, NULL);
2165 symfs = symbol_conf.
symfs;
2166 if (strcmp(symfs,
"/") == 0)
2167 symbol_conf.
symfs =
"";
2168 if (symfs != symbol_conf.
symfs)
2169 free((
void *)symfs);
2206 const char *
dir,
int unset __maybe_unused)
2211 symbol_conf.
symfs = strdup(dir);
2212 if (symbol_conf.
symfs == NULL)
2218 ret = asprintf(&bf,
"%s/%s", dir,
".debug");
2231 refcount_inc(&mi->
refcnt);
2237 if (mi && refcount_dec_and_test(&mi->
refcnt))
2246 refcount_set(&mi->
refcnt, 1);
static int validate_kcore_modules(const char *kallsyms_filename, struct map *map)
bool symsrc__possibly_runtime(struct symsrc *ss)
const char * comm_list_str
u64(* map_ip)(struct map *, u64)
static const char *const vmlinux_paths[]
void dso__insert_symbol(struct dso *dso, struct symbol *sym)
void nsinfo__mountns_enter(struct nsinfo *nsi, struct nscookie *nc)
static void symbols__insert_by_name(struct rb_root *symbols, struct symbol *sym)
static int dso__find_perf_map(char *filebuf, size_t bufsz, struct nsinfo **nsip)
static int dso__load_kcore(struct dso *dso, struct map *map, const char *kallsyms_filename)
struct strlist * comm_list
static void dso__set_loaded(struct dso *dso)
static struct module_info * find_module(const char *name, struct rb_root *modules)
const char *__weak arch__normalize_symbol_name(const char *name)
static struct symbol * symbols__find(struct rb_root *symbols, u64 ip)
static void delete_modules(struct rb_root *modules)
const char * vmlinux_name
static bool symbol_type__filter(char symbol_type)
static bool dso__is_compatible_symtab_type(struct dso *dso, bool kmod, enum dso_binary_type type)
struct kmap * map__kmap(struct map *map)
int hex2u64(const char *ptr, u64 *long_val)
struct intlist * pid_list
int setup_list(struct strlist **list, const char *list_str, const char *list_name)
static int dso__load_perf_map(const char *map_path, struct dso *dso)
void intlist__delete(struct intlist *ilist)
static u64 identity__map_ip(struct map *map __maybe_unused, u64 ip)
static int __symbol__join_symfs(char *bf, size_t size, const char *path)
int setup_intlist(struct intlist **list, const char *list_str, const char *list_name)
static bool symbol__is_idle(const char *name)
static int dso__load_guest_kernel_sym(struct dso *dso, struct map *map)
const char * bt_stop_list_str
struct rb_root symbol_names
void map__fixup_start(struct map *map)
int filename__read_build_id(const char *filename, void *bf, size_t size)
static int prefix_underscores_count(const char *str)
#define ENTRY_TRAMPOLINE_NAME
const char * tid_list_str
static bool is_entry_trampoline(const char *name)
char * build_id_cache__kallsyms_path(const char *sbuild_id, char *bf, size_t size)
void dso__set_long_name(struct dso *dso, const char *name, bool name_allocated)
static int read_proc_modules(const char *filename, struct rb_root *modules)
static int map_groups__split_kallsyms(struct map_groups *kmaps, struct dso *dso, u64 delta, struct map *initial_map)
void dso__reset_find_symbol_cache(struct dso *dso)
bool is_regular_file(const char *file)
static struct symbol * symbols__find_by_name(struct rb_root *symbols, const char *name, enum symbol_tag_include includes)
void set_buildid_dir(const char *dir)
int up_write(struct rw_semaphore *sem)
static struct symbol * symbols__next(struct symbol *sym)
void map__put(struct map *map)
struct map * map_groups__first(struct map_groups *mg)
void dso__put(struct dso *dso)
void symbols__insert(struct rb_root *symbols, struct symbol *sym)
void symbol__elf_init(void)
static bool __map__is_kmodule(const struct map *map)
static bool filename__readable(const char *file)
static int vmlinux_path__add(const char *new_entry)
bool symbol__restricted_filename(const char *filename, const char *restricted_filename)
void dso__sort_by_name(struct dso *dso)
#define pr_debug4(fmt,...)
int down_read(struct rw_semaphore *sem)
const char * default_guest_vmlinux_name
static int map_groups__split_kallsyms_for_kcore(struct map_groups *kmaps, struct dso *dso)
int compare_proc_modules(const char *from, const char *to)
struct symbol * symbol__new(u64 start, u64 len, u8 binding, u8 type, const char *name)
static int find_matching_kcore(struct map *map, char *dir, size_t dir_sz)
struct map * maps__first(struct maps *maps)
static const char *const vmlinux_paths_upd[]
int symbol__config_symfs(const struct option *opt __maybe_unused, const char *dir, int unset __maybe_unused)
struct map_groups * groups
void nsinfo__mountns_exit(struct nscookie *nc)
int file__read_maps(int fd, bool exe, mapfn_t mapfn, void *data, bool *is_64_bit)
#define pr_debug(fmt,...)
static int validate_kcore_addresses(const char *kallsyms_filename, struct map *map)
int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss)
void __symbols__insert(struct rb_root *symbols, struct symbol *sym, bool kernel)
static struct symbol * symbols__first(struct rb_root *symbols)
struct map * map__next(struct map *map)
static int __read_proc_modules(void *arg, const char *name, u64 start, u64 size __maybe_unused)
int dso__read_binary_type_filename(const struct dso *dso, enum dso_binary_type type, char *root_dir, char *filename, size_t size)
int machine__map_x86_64_entry_trampolines(struct machine *machine, struct dso *kernel)
int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *syms_ss, struct symsrc *runtime_ss, int kmodule)
int __weak arch__choose_best_symbol(struct symbol *syma, struct symbol *symb __maybe_unused)
static int str(yyscan_t scanner, int token)
#define strlist__for_each_entry(pos, slist)
int symbol__annotation_init(void)
void symbols__delete(struct rb_root *symbols)
struct symbol * dso__last_symbol(struct dso *dso)
int __dso__load_kallsyms(struct dso *dso, const char *filename, struct map *map, bool no_kcore)
const char * pid_list_str
static bool dso__is_kcore(struct dso *dso)
void symbols__fixup_end(struct rb_root *symbols)
static void vmlinux_path__exit(void)
static int choose_best_symbol(struct symbol *syma, struct symbol *symb)
static int map__process_kallsym_symbol(void *arg, const char *name, char type, u64 start)
#define DSO_BINARY_TYPE__SYMTAB_CNT
void map_groups__fixup_end(struct map_groups *mg)
enum dso_kernel_type kernel
struct map_groups * kmaps
struct ref_reloc_sym * ref_reloc_sym
#define DSO__NAME_KALLSYMS
x86 movsq based memcpy() in arch/x86/lib/memcpy_64.S") MEMCPY_FN(memcpy_erms
static int vmlinux_path__init(struct perf_env *env)
struct strlist * sym_list
bool ignore_vmlinux_buildid
const char * dso_list_str
struct nsinfo * nsinfo__copy(struct nsinfo *nsi)
int __weak arch__compare_symbol_names(const char *namea, const char *nameb)
static int dso__load_kernel_sym(struct dso *dso, struct map *map)
int dso__load(struct dso *dso, struct map *map)
bool dso__loaded(const struct dso *dso)
static void map_groups__remove(struct map_groups *mg, struct map *map)
static int dso__load_all_kallsyms(struct dso *dso, const char *filename)
struct symbol * dso__find_symbol(struct dso *dso, u64 addr)
static struct map * map_groups__next(struct map *map)
static int do_validate_kcore_modules(const char *filename, struct map_groups *kmaps)
static struct map * map__get(struct map *map)
void map__fixup_end(struct map *map)
static struct map * map_groups__find(struct map_groups *mg, u64 addr)
struct intlist * intlist__new(const char *slist)
struct symbol * symbol__next_by_name(struct symbol *sym)
struct mem_info * mem_info__get(struct mem_info *mi)
const char * kallsyms_name
struct dso * dso__new(const char *name)
static void add_module(struct module_info *mi, struct rb_root *modules)
struct mem_info * mem_info__new(void)
static int kcore_mapfn(u64 start, u64 len, u64 pgoff, void *data)
struct symbol * dso__find_symbol_by_name(struct dso *dso, const char *name)
u8 build_id[BUILD_ID_SIZE]
static int sym(yyscan_t scanner, int type, int config)
bool __map__is_kernel(const struct map *map)
static bool filename_from_kallsyms_filename(char *filename, const char *base_name, const char *kallsyms_filename)
const char * default_guest_kallsyms
static char * dso__find_kallsyms(struct dso *dso, struct map *map)
static int kallsyms__delta(struct kmap *kmap, const char *filename, u64 *delta)
void strlist__delete(struct strlist *slist)
struct map * map_groups__find_by_name(struct map_groups *mg, const char *name)
int build_id__sprintf(const u8 *build_id, int len, char *bf)
struct dso::@69 last_find_result
void dso__set_build_id(struct dso *dso, void *build_id)
enum dso_binary_type symtab_type
int symbol__init(struct perf_env *env)
static enum dso_binary_type binary_type_symtab[]
const char * sym_list_str
int kallsyms__get_function_start(const char *kallsyms_filename, const char *symbol_name, u64 *addr)
bool lsdir_no_dot_filter(const char *name __maybe_unused, struct dirent *d)
void symbol__delete(struct symbol *sym)
static struct symbol * symbols__last(struct rb_root *symbols)
void symsrc__destroy(struct symsrc *ss)
int modules__parse(const char *filename, void *arg, int(*process_module)(void *arg, const char *name, u64 start, u64 size))
int dso__load_vmlinux_path(struct dso *dso, struct map *map)
void dso__set_sorted_by_name(struct dso *dso)
int __weak arch__compare_symbol_names_n(const char *namea, const char *nameb, unsigned int n)
int symsrc__init(struct symsrc *ss, struct dso *dso, const char *name, enum dso_binary_type type)
int down_write(struct rw_semaphore *sem)
u64(* unmap_ip)(struct map *, u64)
char * dso__build_id_filename(const struct dso *dso, char *bf, size_t size, bool is_debug)
void mem_info__put(struct mem_info *mi)
int sysfs__read_build_id(const char *filename, void *build_id, size_t size)
struct strlist * lsdir(const char *name, bool(*filter)(const char *, struct dirent *))
#define pr_warning(fmt,...)
struct symbol * dso__next_symbol(struct symbol *sym)
struct intlist * tid_list
int vmlinux_path__nr_entries
static bool visible_dir_filter(const char *name, struct dirent *d)
static void map_groups__insert(struct map_groups *mg, struct map *map)
enum dso_binary_type binary_type
void nsinfo__put(struct nsinfo *nsi)
int up_read(struct rw_semaphore *sem)
struct strlist * bt_stop_list
bool symsrc__has_symtab(struct symsrc *ss)
void symbols__fixup_duplicate(struct rb_root *symbols)
struct strlist * strlist__new(const char *list, const struct strlist_config *config)
struct symbol * dso__first_symbol(struct dso *dso)
struct map_groups * map__kmaps(struct map *map)
struct strlist * dso_list
static void symbols__sort_by_name(struct rb_root *symbols, struct rb_root *source)
int symbol__match_symbol_name(const char *name, const char *str, enum symbol_tag_include includes)
#define symbol__join_symfs(bf, path)
bool dso__build_id_equal(const struct dso *dso, u8 *build_id)
int dso__load_vmlinux(struct dso *dso, struct map *map, const char *vmlinux, bool vmlinux_allocated)
int dso__load_kallsyms(struct dso *dso, const char *filename, struct map *map)
struct map * map__new2(u64 start, struct dso *dso)
bool machine__is(struct machine *machine, const char *arch)
static bool symbol__read_kptr_restrict(void)
void static void * zalloc(size_t size)
static bool machine__is_default_guest(struct machine *machine)