xref: /linux/tools/perf/util/symbol.c (revision f8324e20f8289dffc646d64366332e05eaacab25)
1 #define _GNU_SOURCE
2 #include <ctype.h>
3 #include <dirent.h>
4 #include <errno.h>
5 #include <libgen.h>
6 #include <stdlib.h>
7 #include <stdio.h>
8 #include <string.h>
9 #include <sys/types.h>
10 #include <sys/stat.h>
11 #include <sys/param.h>
12 #include <fcntl.h>
13 #include <unistd.h>
14 #include "build-id.h"
15 #include "symbol.h"
16 #include "strlist.h"
17 
18 #include <libelf.h>
19 #include <gelf.h>
20 #include <elf.h>
21 #include <limits.h>
22 #include <sys/utsname.h>
23 
24 #ifndef NT_GNU_BUILD_ID
25 #define NT_GNU_BUILD_ID 3
26 #endif
27 
28 static void dsos__add(struct list_head *head, struct dso *dso);
29 static struct map *map__new2(u64 start, struct dso *dso, enum map_type type);
30 static int dso__load_kernel_sym(struct dso *self, struct map *map,
31 				symbol_filter_t filter);
32 static int dso__load_guest_kernel_sym(struct dso *self, struct map *map,
33 			symbol_filter_t filter);
34 static int vmlinux_path__nr_entries;
35 static char **vmlinux_path;
36 
37 struct symbol_conf symbol_conf = {
38 	.exclude_other	  = true,
39 	.use_modules	  = true,
40 	.try_vmlinux_path = true,
41 };
42 
43 bool dso__loaded(const struct dso *self, enum map_type type)
44 {
45 	return self->loaded & (1 << type);
46 }
47 
48 bool dso__sorted_by_name(const struct dso *self, enum map_type type)
49 {
50 	return self->sorted_by_name & (1 << type);
51 }
52 
53 static void dso__set_sorted_by_name(struct dso *self, enum map_type type)
54 {
55 	self->sorted_by_name |= (1 << type);
56 }
57 
58 bool symbol_type__is_a(char symbol_type, enum map_type map_type)
59 {
60 	switch (map_type) {
61 	case MAP__FUNCTION:
62 		return symbol_type == 'T' || symbol_type == 'W';
63 	case MAP__VARIABLE:
64 		return symbol_type == 'D' || symbol_type == 'd';
65 	default:
66 		return false;
67 	}
68 }
69 
70 static void symbols__fixup_end(struct rb_root *self)
71 {
72 	struct rb_node *nd, *prevnd = rb_first(self);
73 	struct symbol *curr, *prev;
74 
75 	if (prevnd == NULL)
76 		return;
77 
78 	curr = rb_entry(prevnd, struct symbol, rb_node);
79 
80 	for (nd = rb_next(prevnd); nd; nd = rb_next(nd)) {
81 		prev = curr;
82 		curr = rb_entry(nd, struct symbol, rb_node);
83 
84 		if (prev->end == prev->start)
85 			prev->end = curr->start - 1;
86 	}
87 
88 	/* Last entry */
89 	if (curr->end == curr->start)
90 		curr->end = roundup(curr->start, 4096);
91 }
92 
93 static void __map_groups__fixup_end(struct map_groups *self, enum map_type type)
94 {
95 	struct map *prev, *curr;
96 	struct rb_node *nd, *prevnd = rb_first(&self->maps[type]);
97 
98 	if (prevnd == NULL)
99 		return;
100 
101 	curr = rb_entry(prevnd, struct map, rb_node);
102 
103 	for (nd = rb_next(prevnd); nd; nd = rb_next(nd)) {
104 		prev = curr;
105 		curr = rb_entry(nd, struct map, rb_node);
106 		prev->end = curr->start - 1;
107 	}
108 
109 	/*
110 	 * We still haven't the actual symbols, so guess the
111 	 * last map final address.
112 	 */
113 	curr->end = ~0UL;
114 }
115 
116 static void map_groups__fixup_end(struct map_groups *self)
117 {
118 	int i;
119 	for (i = 0; i < MAP__NR_TYPES; ++i)
120 		__map_groups__fixup_end(self, i);
121 }
122 
123 static struct symbol *symbol__new(u64 start, u64 len, const char *name)
124 {
125 	size_t namelen = strlen(name) + 1;
126 	struct symbol *self = calloc(1, (symbol_conf.priv_size +
127 					 sizeof(*self) + namelen));
128 	if (self == NULL)
129 		return NULL;
130 
131 	if (symbol_conf.priv_size)
132 		self = ((void *)self) + symbol_conf.priv_size;
133 
134 	self->start   = start;
135 	self->end     = len ? start + len - 1 : start;
136 	self->namelen = namelen - 1;
137 
138 	pr_debug4("%s: %s %#Lx-%#Lx\n", __func__, name, start, self->end);
139 
140 	memcpy(self->name, name, namelen);
141 
142 	return self;
143 }
144 
145 void symbol__delete(struct symbol *self)
146 {
147 	free(((void *)self) - symbol_conf.priv_size);
148 }
149 
150 static size_t symbol__fprintf(struct symbol *self, FILE *fp)
151 {
152 	return fprintf(fp, " %llx-%llx %s\n",
153 		       self->start, self->end, self->name);
154 }
155 
156 void dso__set_long_name(struct dso *self, char *name)
157 {
158 	if (name == NULL)
159 		return;
160 	self->long_name = name;
161 	self->long_name_len = strlen(name);
162 }
163 
164 static void dso__set_short_name(struct dso *self, const char *name)
165 {
166 	if (name == NULL)
167 		return;
168 	self->short_name = name;
169 	self->short_name_len = strlen(name);
170 }
171 
172 static void dso__set_basename(struct dso *self)
173 {
174 	dso__set_short_name(self, basename(self->long_name));
175 }
176 
177 struct dso *dso__new(const char *name)
178 {
179 	struct dso *self = calloc(1, sizeof(*self) + strlen(name) + 1);
180 
181 	if (self != NULL) {
182 		int i;
183 		strcpy(self->name, name);
184 		dso__set_long_name(self, self->name);
185 		dso__set_short_name(self, self->name);
186 		for (i = 0; i < MAP__NR_TYPES; ++i)
187 			self->symbols[i] = self->symbol_names[i] = RB_ROOT;
188 		self->slen_calculated = 0;
189 		self->origin = DSO__ORIG_NOT_FOUND;
190 		self->loaded = 0;
191 		self->sorted_by_name = 0;
192 		self->has_build_id = 0;
193 		self->kernel = DSO_TYPE_USER;
194 		INIT_LIST_HEAD(&self->node);
195 	}
196 
197 	return self;
198 }
199 
200 static void symbols__delete(struct rb_root *self)
201 {
202 	struct symbol *pos;
203 	struct rb_node *next = rb_first(self);
204 
205 	while (next) {
206 		pos = rb_entry(next, struct symbol, rb_node);
207 		next = rb_next(&pos->rb_node);
208 		rb_erase(&pos->rb_node, self);
209 		symbol__delete(pos);
210 	}
211 }
212 
213 void dso__delete(struct dso *self)
214 {
215 	int i;
216 	for (i = 0; i < MAP__NR_TYPES; ++i)
217 		symbols__delete(&self->symbols[i]);
218 	if (self->long_name != self->name)
219 		free(self->long_name);
220 	free(self);
221 }
222 
223 void dso__set_build_id(struct dso *self, void *build_id)
224 {
225 	memcpy(self->build_id, build_id, sizeof(self->build_id));
226 	self->has_build_id = 1;
227 }
228 
229 static void symbols__insert(struct rb_root *self, struct symbol *sym)
230 {
231 	struct rb_node **p = &self->rb_node;
232 	struct rb_node *parent = NULL;
233 	const u64 ip = sym->start;
234 	struct symbol *s;
235 
236 	while (*p != NULL) {
237 		parent = *p;
238 		s = rb_entry(parent, struct symbol, rb_node);
239 		if (ip < s->start)
240 			p = &(*p)->rb_left;
241 		else
242 			p = &(*p)->rb_right;
243 	}
244 	rb_link_node(&sym->rb_node, parent, p);
245 	rb_insert_color(&sym->rb_node, self);
246 }
247 
248 static struct symbol *symbols__find(struct rb_root *self, u64 ip)
249 {
250 	struct rb_node *n;
251 
252 	if (self == NULL)
253 		return NULL;
254 
255 	n = self->rb_node;
256 
257 	while (n) {
258 		struct symbol *s = rb_entry(n, struct symbol, rb_node);
259 
260 		if (ip < s->start)
261 			n = n->rb_left;
262 		else if (ip > s->end)
263 			n = n->rb_right;
264 		else
265 			return s;
266 	}
267 
268 	return NULL;
269 }
270 
271 struct symbol_name_rb_node {
272 	struct rb_node	rb_node;
273 	struct symbol	sym;
274 };
275 
276 static void symbols__insert_by_name(struct rb_root *self, struct symbol *sym)
277 {
278 	struct rb_node **p = &self->rb_node;
279 	struct rb_node *parent = NULL;
280 	struct symbol_name_rb_node *symn = ((void *)sym) - sizeof(*parent), *s;
281 
282 	while (*p != NULL) {
283 		parent = *p;
284 		s = rb_entry(parent, struct symbol_name_rb_node, rb_node);
285 		if (strcmp(sym->name, s->sym.name) < 0)
286 			p = &(*p)->rb_left;
287 		else
288 			p = &(*p)->rb_right;
289 	}
290 	rb_link_node(&symn->rb_node, parent, p);
291 	rb_insert_color(&symn->rb_node, self);
292 }
293 
294 static void symbols__sort_by_name(struct rb_root *self, struct rb_root *source)
295 {
296 	struct rb_node *nd;
297 
298 	for (nd = rb_first(source); nd; nd = rb_next(nd)) {
299 		struct symbol *pos = rb_entry(nd, struct symbol, rb_node);
300 		symbols__insert_by_name(self, pos);
301 	}
302 }
303 
304 static struct symbol *symbols__find_by_name(struct rb_root *self, const char *name)
305 {
306 	struct rb_node *n;
307 
308 	if (self == NULL)
309 		return NULL;
310 
311 	n = self->rb_node;
312 
313 	while (n) {
314 		struct symbol_name_rb_node *s;
315 		int cmp;
316 
317 		s = rb_entry(n, struct symbol_name_rb_node, rb_node);
318 		cmp = strcmp(name, s->sym.name);
319 
320 		if (cmp < 0)
321 			n = n->rb_left;
322 		else if (cmp > 0)
323 			n = n->rb_right;
324 		else
325 			return &s->sym;
326 	}
327 
328 	return NULL;
329 }
330 
331 struct symbol *dso__find_symbol(struct dso *self,
332 				enum map_type type, u64 addr)
333 {
334 	return symbols__find(&self->symbols[type], addr);
335 }
336 
337 struct symbol *dso__find_symbol_by_name(struct dso *self, enum map_type type,
338 					const char *name)
339 {
340 	return symbols__find_by_name(&self->symbol_names[type], name);
341 }
342 
343 void dso__sort_by_name(struct dso *self, enum map_type type)
344 {
345 	dso__set_sorted_by_name(self, type);
346 	return symbols__sort_by_name(&self->symbol_names[type],
347 				     &self->symbols[type]);
348 }
349 
350 int build_id__sprintf(const u8 *self, int len, char *bf)
351 {
352 	char *bid = bf;
353 	const u8 *raw = self;
354 	int i;
355 
356 	for (i = 0; i < len; ++i) {
357 		sprintf(bid, "%02x", *raw);
358 		++raw;
359 		bid += 2;
360 	}
361 
362 	return raw - self;
363 }
364 
365 size_t dso__fprintf_buildid(struct dso *self, FILE *fp)
366 {
367 	char sbuild_id[BUILD_ID_SIZE * 2 + 1];
368 
369 	build_id__sprintf(self->build_id, sizeof(self->build_id), sbuild_id);
370 	return fprintf(fp, "%s", sbuild_id);
371 }
372 
373 size_t dso__fprintf(struct dso *self, enum map_type type, FILE *fp)
374 {
375 	struct rb_node *nd;
376 	size_t ret = fprintf(fp, "dso: %s (", self->short_name);
377 
378 	if (self->short_name != self->long_name)
379 		ret += fprintf(fp, "%s, ", self->long_name);
380 	ret += fprintf(fp, "%s, %sloaded, ", map_type__name[type],
381 		       self->loaded ? "" : "NOT ");
382 	ret += dso__fprintf_buildid(self, fp);
383 	ret += fprintf(fp, ")\n");
384 	for (nd = rb_first(&self->symbols[type]); nd; nd = rb_next(nd)) {
385 		struct symbol *pos = rb_entry(nd, struct symbol, rb_node);
386 		ret += symbol__fprintf(pos, fp);
387 	}
388 
389 	return ret;
390 }
391 
392 int kallsyms__parse(const char *filename, void *arg,
393 		    int (*process_symbol)(void *arg, const char *name,
394 						     char type, u64 start))
395 {
396 	char *line = NULL;
397 	size_t n;
398 	int err = 0;
399 	FILE *file = fopen(filename, "r");
400 
401 	if (file == NULL)
402 		goto out_failure;
403 
404 	while (!feof(file)) {
405 		u64 start;
406 		int line_len, len;
407 		char symbol_type;
408 		char *symbol_name;
409 
410 		line_len = getline(&line, &n, file);
411 		if (line_len < 0 || !line)
412 			break;
413 
414 		line[--line_len] = '\0'; /* \n */
415 
416 		len = hex2u64(line, &start);
417 
418 		len++;
419 		if (len + 2 >= line_len)
420 			continue;
421 
422 		symbol_type = toupper(line[len]);
423 		symbol_name = line + len + 2;
424 
425 		err = process_symbol(arg, symbol_name, symbol_type, start);
426 		if (err)
427 			break;
428 	}
429 
430 	free(line);
431 	fclose(file);
432 	return err;
433 
434 out_failure:
435 	return -1;
436 }
437 
438 struct process_kallsyms_args {
439 	struct map *map;
440 	struct dso *dso;
441 };
442 
443 static int map__process_kallsym_symbol(void *arg, const char *name,
444 				       char type, u64 start)
445 {
446 	struct symbol *sym;
447 	struct process_kallsyms_args *a = arg;
448 	struct rb_root *root = &a->dso->symbols[a->map->type];
449 
450 	if (!symbol_type__is_a(type, a->map->type))
451 		return 0;
452 
453 	/*
454 	 * Will fix up the end later, when we have all symbols sorted.
455 	 */
456 	sym = symbol__new(start, 0, name);
457 
458 	if (sym == NULL)
459 		return -ENOMEM;
460 	/*
461 	 * We will pass the symbols to the filter later, in
462 	 * map__split_kallsyms, when we have split the maps per module
463 	 */
464 	symbols__insert(root, sym);
465 
466 	return 0;
467 }
468 
469 /*
470  * Loads the function entries in /proc/kallsyms into kernel_map->dso,
471  * so that we can in the next step set the symbol ->end address and then
472  * call kernel_maps__split_kallsyms.
473  */
474 static int dso__load_all_kallsyms(struct dso *self, const char *filename,
475 				  struct map *map)
476 {
477 	struct process_kallsyms_args args = { .map = map, .dso = self, };
478 	return kallsyms__parse(filename, &args, map__process_kallsym_symbol);
479 }
480 
481 /*
482  * Split the symbols into maps, making sure there are no overlaps, i.e. the
483  * kernel range is broken in several maps, named [kernel].N, as we don't have
484  * the original ELF section names vmlinux have.
485  */
486 static int dso__split_kallsyms(struct dso *self, struct map *map,
487 			       symbol_filter_t filter)
488 {
489 	struct map_groups *kmaps = map__kmap(map)->kmaps;
490 	struct machine *machine = kmaps->machine;
491 	struct map *curr_map = map;
492 	struct symbol *pos;
493 	int count = 0;
494 	struct rb_root *root = &self->symbols[map->type];
495 	struct rb_node *next = rb_first(root);
496 	int kernel_range = 0;
497 
498 	while (next) {
499 		char *module;
500 
501 		pos = rb_entry(next, struct symbol, rb_node);
502 		next = rb_next(&pos->rb_node);
503 
504 		module = strchr(pos->name, '\t');
505 		if (module) {
506 			if (!symbol_conf.use_modules)
507 				goto discard_symbol;
508 
509 			*module++ = '\0';
510 
511 			if (strcmp(curr_map->dso->short_name, module)) {
512 				if (curr_map != map &&
513 				    self->kernel == DSO_TYPE_GUEST_KERNEL &&
514 				    machine__is_default_guest(machine)) {
515 					/*
516 					 * We assume all symbols of a module are
517 					 * continuous in * kallsyms, so curr_map
518 					 * points to a module and all its
519 					 * symbols are in its kmap. Mark it as
520 					 * loaded.
521 					 */
522 					dso__set_loaded(curr_map->dso,
523 							curr_map->type);
524 				}
525 
526 				curr_map = map_groups__find_by_name(kmaps,
527 							map->type, module);
528 				if (curr_map == NULL) {
529 					pr_debug("%s/proc/{kallsyms,modules} "
530 					         "inconsistency while looking "
531 						 "for \"%s\" module!\n",
532 						 machine->root_dir, module);
533 					curr_map = map;
534 					goto discard_symbol;
535 				}
536 
537 				if (curr_map->dso->loaded &&
538 				    !machine__is_default_guest(machine))
539 					goto discard_symbol;
540 			}
541 			/*
542 			 * So that we look just like we get from .ko files,
543 			 * i.e. not prelinked, relative to map->start.
544 			 */
545 			pos->start = curr_map->map_ip(curr_map, pos->start);
546 			pos->end   = curr_map->map_ip(curr_map, pos->end);
547 		} else if (curr_map != map) {
548 			char dso_name[PATH_MAX];
549 			struct dso *dso;
550 
551 			if (self->kernel == DSO_TYPE_GUEST_KERNEL)
552 				snprintf(dso_name, sizeof(dso_name),
553 					"[guest.kernel].%d",
554 					kernel_range++);
555 			else
556 				snprintf(dso_name, sizeof(dso_name),
557 					"[kernel].%d",
558 					kernel_range++);
559 
560 			dso = dso__new(dso_name);
561 			if (dso == NULL)
562 				return -1;
563 
564 			dso->kernel = self->kernel;
565 
566 			curr_map = map__new2(pos->start, dso, map->type);
567 			if (curr_map == NULL) {
568 				dso__delete(dso);
569 				return -1;
570 			}
571 
572 			curr_map->map_ip = curr_map->unmap_ip = identity__map_ip;
573 			map_groups__insert(kmaps, curr_map);
574 			++kernel_range;
575 		}
576 
577 		if (filter && filter(curr_map, pos)) {
578 discard_symbol:		rb_erase(&pos->rb_node, root);
579 			symbol__delete(pos);
580 		} else {
581 			if (curr_map != map) {
582 				rb_erase(&pos->rb_node, root);
583 				symbols__insert(&curr_map->dso->symbols[curr_map->type], pos);
584 			}
585 			count++;
586 		}
587 	}
588 
589 	if (curr_map != map &&
590 	    self->kernel == DSO_TYPE_GUEST_KERNEL &&
591 	    machine__is_default_guest(kmaps->machine)) {
592 		dso__set_loaded(curr_map->dso, curr_map->type);
593 	}
594 
595 	return count;
596 }
597 
598 int dso__load_kallsyms(struct dso *self, const char *filename,
599 		       struct map *map, symbol_filter_t filter)
600 {
601 	if (dso__load_all_kallsyms(self, filename, map) < 0)
602 		return -1;
603 
604 	symbols__fixup_end(&self->symbols[map->type]);
605 	if (self->kernel == DSO_TYPE_GUEST_KERNEL)
606 		self->origin = DSO__ORIG_GUEST_KERNEL;
607 	else
608 		self->origin = DSO__ORIG_KERNEL;
609 
610 	return dso__split_kallsyms(self, map, filter);
611 }
612 
613 static int dso__load_perf_map(struct dso *self, struct map *map,
614 			      symbol_filter_t filter)
615 {
616 	char *line = NULL;
617 	size_t n;
618 	FILE *file;
619 	int nr_syms = 0;
620 
621 	file = fopen(self->long_name, "r");
622 	if (file == NULL)
623 		goto out_failure;
624 
625 	while (!feof(file)) {
626 		u64 start, size;
627 		struct symbol *sym;
628 		int line_len, len;
629 
630 		line_len = getline(&line, &n, file);
631 		if (line_len < 0)
632 			break;
633 
634 		if (!line)
635 			goto out_failure;
636 
637 		line[--line_len] = '\0'; /* \n */
638 
639 		len = hex2u64(line, &start);
640 
641 		len++;
642 		if (len + 2 >= line_len)
643 			continue;
644 
645 		len += hex2u64(line + len, &size);
646 
647 		len++;
648 		if (len + 2 >= line_len)
649 			continue;
650 
651 		sym = symbol__new(start, size, line + len);
652 
653 		if (sym == NULL)
654 			goto out_delete_line;
655 
656 		if (filter && filter(map, sym))
657 			symbol__delete(sym);
658 		else {
659 			symbols__insert(&self->symbols[map->type], sym);
660 			nr_syms++;
661 		}
662 	}
663 
664 	free(line);
665 	fclose(file);
666 
667 	return nr_syms;
668 
669 out_delete_line:
670 	free(line);
671 out_failure:
672 	return -1;
673 }
674 
675 /**
676  * elf_symtab__for_each_symbol - iterate thru all the symbols
677  *
678  * @self: struct elf_symtab instance to iterate
679  * @idx: uint32_t idx
680  * @sym: GElf_Sym iterator
681  */
682 #define elf_symtab__for_each_symbol(syms, nr_syms, idx, sym) \
683 	for (idx = 0, gelf_getsym(syms, idx, &sym);\
684 	     idx < nr_syms; \
685 	     idx++, gelf_getsym(syms, idx, &sym))
686 
687 static inline uint8_t elf_sym__type(const GElf_Sym *sym)
688 {
689 	return GELF_ST_TYPE(sym->st_info);
690 }
691 
692 static inline int elf_sym__is_function(const GElf_Sym *sym)
693 {
694 	return elf_sym__type(sym) == STT_FUNC &&
695 	       sym->st_name != 0 &&
696 	       sym->st_shndx != SHN_UNDEF;
697 }
698 
699 static inline bool elf_sym__is_object(const GElf_Sym *sym)
700 {
701 	return elf_sym__type(sym) == STT_OBJECT &&
702 		sym->st_name != 0 &&
703 		sym->st_shndx != SHN_UNDEF;
704 }
705 
706 static inline int elf_sym__is_label(const GElf_Sym *sym)
707 {
708 	return elf_sym__type(sym) == STT_NOTYPE &&
709 		sym->st_name != 0 &&
710 		sym->st_shndx != SHN_UNDEF &&
711 		sym->st_shndx != SHN_ABS;
712 }
713 
714 static inline const char *elf_sec__name(const GElf_Shdr *shdr,
715 					const Elf_Data *secstrs)
716 {
717 	return secstrs->d_buf + shdr->sh_name;
718 }
719 
720 static inline int elf_sec__is_text(const GElf_Shdr *shdr,
721 					const Elf_Data *secstrs)
722 {
723 	return strstr(elf_sec__name(shdr, secstrs), "text") != NULL;
724 }
725 
726 static inline bool elf_sec__is_data(const GElf_Shdr *shdr,
727 				    const Elf_Data *secstrs)
728 {
729 	return strstr(elf_sec__name(shdr, secstrs), "data") != NULL;
730 }
731 
732 static inline const char *elf_sym__name(const GElf_Sym *sym,
733 					const Elf_Data *symstrs)
734 {
735 	return symstrs->d_buf + sym->st_name;
736 }
737 
738 static Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep,
739 				    GElf_Shdr *shp, const char *name,
740 				    size_t *idx)
741 {
742 	Elf_Scn *sec = NULL;
743 	size_t cnt = 1;
744 
745 	while ((sec = elf_nextscn(elf, sec)) != NULL) {
746 		char *str;
747 
748 		gelf_getshdr(sec, shp);
749 		str = elf_strptr(elf, ep->e_shstrndx, shp->sh_name);
750 		if (!strcmp(name, str)) {
751 			if (idx)
752 				*idx = cnt;
753 			break;
754 		}
755 		++cnt;
756 	}
757 
758 	return sec;
759 }
760 
761 #define elf_section__for_each_rel(reldata, pos, pos_mem, idx, nr_entries) \
762 	for (idx = 0, pos = gelf_getrel(reldata, 0, &pos_mem); \
763 	     idx < nr_entries; \
764 	     ++idx, pos = gelf_getrel(reldata, idx, &pos_mem))
765 
766 #define elf_section__for_each_rela(reldata, pos, pos_mem, idx, nr_entries) \
767 	for (idx = 0, pos = gelf_getrela(reldata, 0, &pos_mem); \
768 	     idx < nr_entries; \
769 	     ++idx, pos = gelf_getrela(reldata, idx, &pos_mem))
770 
771 /*
772  * We need to check if we have a .dynsym, so that we can handle the
773  * .plt, synthesizing its symbols, that aren't on the symtabs (be it
774  * .dynsym or .symtab).
775  * And always look at the original dso, not at debuginfo packages, that
776  * have the PLT data stripped out (shdr_rel_plt.sh_type == SHT_NOBITS).
777  */
778 static int dso__synthesize_plt_symbols(struct  dso *self, struct map *map,
779 				       symbol_filter_t filter)
780 {
781 	uint32_t nr_rel_entries, idx;
782 	GElf_Sym sym;
783 	u64 plt_offset;
784 	GElf_Shdr shdr_plt;
785 	struct symbol *f;
786 	GElf_Shdr shdr_rel_plt, shdr_dynsym;
787 	Elf_Data *reldata, *syms, *symstrs;
788 	Elf_Scn *scn_plt_rel, *scn_symstrs, *scn_dynsym;
789 	size_t dynsym_idx;
790 	GElf_Ehdr ehdr;
791 	char sympltname[1024];
792 	Elf *elf;
793 	int nr = 0, symidx, fd, err = 0;
794 
795 	fd = open(self->long_name, O_RDONLY);
796 	if (fd < 0)
797 		goto out;
798 
799 	elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
800 	if (elf == NULL)
801 		goto out_close;
802 
803 	if (gelf_getehdr(elf, &ehdr) == NULL)
804 		goto out_elf_end;
805 
806 	scn_dynsym = elf_section_by_name(elf, &ehdr, &shdr_dynsym,
807 					 ".dynsym", &dynsym_idx);
808 	if (scn_dynsym == NULL)
809 		goto out_elf_end;
810 
811 	scn_plt_rel = elf_section_by_name(elf, &ehdr, &shdr_rel_plt,
812 					  ".rela.plt", NULL);
813 	if (scn_plt_rel == NULL) {
814 		scn_plt_rel = elf_section_by_name(elf, &ehdr, &shdr_rel_plt,
815 						  ".rel.plt", NULL);
816 		if (scn_plt_rel == NULL)
817 			goto out_elf_end;
818 	}
819 
820 	err = -1;
821 
822 	if (shdr_rel_plt.sh_link != dynsym_idx)
823 		goto out_elf_end;
824 
825 	if (elf_section_by_name(elf, &ehdr, &shdr_plt, ".plt", NULL) == NULL)
826 		goto out_elf_end;
827 
828 	/*
829 	 * Fetch the relocation section to find the idxes to the GOT
830 	 * and the symbols in the .dynsym they refer to.
831 	 */
832 	reldata = elf_getdata(scn_plt_rel, NULL);
833 	if (reldata == NULL)
834 		goto out_elf_end;
835 
836 	syms = elf_getdata(scn_dynsym, NULL);
837 	if (syms == NULL)
838 		goto out_elf_end;
839 
840 	scn_symstrs = elf_getscn(elf, shdr_dynsym.sh_link);
841 	if (scn_symstrs == NULL)
842 		goto out_elf_end;
843 
844 	symstrs = elf_getdata(scn_symstrs, NULL);
845 	if (symstrs == NULL)
846 		goto out_elf_end;
847 
848 	nr_rel_entries = shdr_rel_plt.sh_size / shdr_rel_plt.sh_entsize;
849 	plt_offset = shdr_plt.sh_offset;
850 
851 	if (shdr_rel_plt.sh_type == SHT_RELA) {
852 		GElf_Rela pos_mem, *pos;
853 
854 		elf_section__for_each_rela(reldata, pos, pos_mem, idx,
855 					   nr_rel_entries) {
856 			symidx = GELF_R_SYM(pos->r_info);
857 			plt_offset += shdr_plt.sh_entsize;
858 			gelf_getsym(syms, symidx, &sym);
859 			snprintf(sympltname, sizeof(sympltname),
860 				 "%s@plt", elf_sym__name(&sym, symstrs));
861 
862 			f = symbol__new(plt_offset, shdr_plt.sh_entsize,
863 					sympltname);
864 			if (!f)
865 				goto out_elf_end;
866 
867 			if (filter && filter(map, f))
868 				symbol__delete(f);
869 			else {
870 				symbols__insert(&self->symbols[map->type], f);
871 				++nr;
872 			}
873 		}
874 	} else if (shdr_rel_plt.sh_type == SHT_REL) {
875 		GElf_Rel pos_mem, *pos;
876 		elf_section__for_each_rel(reldata, pos, pos_mem, idx,
877 					  nr_rel_entries) {
878 			symidx = GELF_R_SYM(pos->r_info);
879 			plt_offset += shdr_plt.sh_entsize;
880 			gelf_getsym(syms, symidx, &sym);
881 			snprintf(sympltname, sizeof(sympltname),
882 				 "%s@plt", elf_sym__name(&sym, symstrs));
883 
884 			f = symbol__new(plt_offset, shdr_plt.sh_entsize,
885 					sympltname);
886 			if (!f)
887 				goto out_elf_end;
888 
889 			if (filter && filter(map, f))
890 				symbol__delete(f);
891 			else {
892 				symbols__insert(&self->symbols[map->type], f);
893 				++nr;
894 			}
895 		}
896 	}
897 
898 	err = 0;
899 out_elf_end:
900 	elf_end(elf);
901 out_close:
902 	close(fd);
903 
904 	if (err == 0)
905 		return nr;
906 out:
907 	pr_debug("%s: problems reading %s PLT info.\n",
908 		 __func__, self->long_name);
909 	return 0;
910 }
911 
912 static bool elf_sym__is_a(GElf_Sym *self, enum map_type type)
913 {
914 	switch (type) {
915 	case MAP__FUNCTION:
916 		return elf_sym__is_function(self);
917 	case MAP__VARIABLE:
918 		return elf_sym__is_object(self);
919 	default:
920 		return false;
921 	}
922 }
923 
924 static bool elf_sec__is_a(GElf_Shdr *self, Elf_Data *secstrs, enum map_type type)
925 {
926 	switch (type) {
927 	case MAP__FUNCTION:
928 		return elf_sec__is_text(self, secstrs);
929 	case MAP__VARIABLE:
930 		return elf_sec__is_data(self, secstrs);
931 	default:
932 		return false;
933 	}
934 }
935 
936 static int dso__load_sym(struct dso *self, struct map *map, const char *name,
937 			 int fd, symbol_filter_t filter, int kmodule)
938 {
939 	struct kmap *kmap = self->kernel ? map__kmap(map) : NULL;
940 	struct map *curr_map = map;
941 	struct dso *curr_dso = self;
942 	Elf_Data *symstrs, *secstrs;
943 	uint32_t nr_syms;
944 	int err = -1;
945 	uint32_t idx;
946 	GElf_Ehdr ehdr;
947 	GElf_Shdr shdr;
948 	Elf_Data *syms;
949 	GElf_Sym sym;
950 	Elf_Scn *sec, *sec_strndx;
951 	Elf *elf;
952 	int nr = 0;
953 
954 	elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
955 	if (elf == NULL) {
956 		pr_err("%s: cannot read %s ELF file.\n", __func__, name);
957 		goto out_close;
958 	}
959 
960 	if (gelf_getehdr(elf, &ehdr) == NULL) {
961 		pr_err("%s: cannot get elf header.\n", __func__);
962 		goto out_elf_end;
963 	}
964 
965 	sec = elf_section_by_name(elf, &ehdr, &shdr, ".symtab", NULL);
966 	if (sec == NULL) {
967 		sec = elf_section_by_name(elf, &ehdr, &shdr, ".dynsym", NULL);
968 		if (sec == NULL)
969 			goto out_elf_end;
970 	}
971 
972 	syms = elf_getdata(sec, NULL);
973 	if (syms == NULL)
974 		goto out_elf_end;
975 
976 	sec = elf_getscn(elf, shdr.sh_link);
977 	if (sec == NULL)
978 		goto out_elf_end;
979 
980 	symstrs = elf_getdata(sec, NULL);
981 	if (symstrs == NULL)
982 		goto out_elf_end;
983 
984 	sec_strndx = elf_getscn(elf, ehdr.e_shstrndx);
985 	if (sec_strndx == NULL)
986 		goto out_elf_end;
987 
988 	secstrs = elf_getdata(sec_strndx, NULL);
989 	if (secstrs == NULL)
990 		goto out_elf_end;
991 
992 	nr_syms = shdr.sh_size / shdr.sh_entsize;
993 
994 	memset(&sym, 0, sizeof(sym));
995 	if (self->kernel == DSO_TYPE_USER) {
996 		self->adjust_symbols = (ehdr.e_type == ET_EXEC ||
997 				elf_section_by_name(elf, &ehdr, &shdr,
998 						     ".gnu.prelink_undo",
999 						     NULL) != NULL);
1000 	} else self->adjust_symbols = 0;
1001 
1002 	elf_symtab__for_each_symbol(syms, nr_syms, idx, sym) {
1003 		struct symbol *f;
1004 		const char *elf_name = elf_sym__name(&sym, symstrs);
1005 		char *demangled = NULL;
1006 		int is_label = elf_sym__is_label(&sym);
1007 		const char *section_name;
1008 
1009 		if (kmap && kmap->ref_reloc_sym && kmap->ref_reloc_sym->name &&
1010 		    strcmp(elf_name, kmap->ref_reloc_sym->name) == 0)
1011 			kmap->ref_reloc_sym->unrelocated_addr = sym.st_value;
1012 
1013 		if (!is_label && !elf_sym__is_a(&sym, map->type))
1014 			continue;
1015 
1016 		sec = elf_getscn(elf, sym.st_shndx);
1017 		if (!sec)
1018 			goto out_elf_end;
1019 
1020 		gelf_getshdr(sec, &shdr);
1021 
1022 		if (is_label && !elf_sec__is_a(&shdr, secstrs, map->type))
1023 			continue;
1024 
1025 		section_name = elf_sec__name(&shdr, secstrs);
1026 
1027 		if (self->kernel != DSO_TYPE_USER || kmodule) {
1028 			char dso_name[PATH_MAX];
1029 
1030 			if (strcmp(section_name,
1031 				   (curr_dso->short_name +
1032 				    self->short_name_len)) == 0)
1033 				goto new_symbol;
1034 
1035 			if (strcmp(section_name, ".text") == 0) {
1036 				curr_map = map;
1037 				curr_dso = self;
1038 				goto new_symbol;
1039 			}
1040 
1041 			snprintf(dso_name, sizeof(dso_name),
1042 				 "%s%s", self->short_name, section_name);
1043 
1044 			curr_map = map_groups__find_by_name(kmap->kmaps, map->type, dso_name);
1045 			if (curr_map == NULL) {
1046 				u64 start = sym.st_value;
1047 
1048 				if (kmodule)
1049 					start += map->start + shdr.sh_offset;
1050 
1051 				curr_dso = dso__new(dso_name);
1052 				if (curr_dso == NULL)
1053 					goto out_elf_end;
1054 				curr_dso->kernel = self->kernel;
1055 				curr_map = map__new2(start, curr_dso,
1056 						     map->type);
1057 				if (curr_map == NULL) {
1058 					dso__delete(curr_dso);
1059 					goto out_elf_end;
1060 				}
1061 				curr_map->map_ip = identity__map_ip;
1062 				curr_map->unmap_ip = identity__map_ip;
1063 				curr_dso->origin = self->origin;
1064 				map_groups__insert(kmap->kmaps, curr_map);
1065 				dsos__add(&self->node, curr_dso);
1066 				dso__set_loaded(curr_dso, map->type);
1067 			} else
1068 				curr_dso = curr_map->dso;
1069 
1070 			goto new_symbol;
1071 		}
1072 
1073 		if (curr_dso->adjust_symbols) {
1074 			pr_debug4("%s: adjusting symbol: st_value: %#Lx "
1075 				  "sh_addr: %#Lx sh_offset: %#Lx\n", __func__,
1076 				  (u64)sym.st_value, (u64)shdr.sh_addr,
1077 				  (u64)shdr.sh_offset);
1078 			sym.st_value -= shdr.sh_addr - shdr.sh_offset;
1079 		}
1080 		/*
1081 		 * We need to figure out if the object was created from C++ sources
1082 		 * DWARF DW_compile_unit has this, but we don't always have access
1083 		 * to it...
1084 		 */
1085 		demangled = bfd_demangle(NULL, elf_name, DMGL_PARAMS | DMGL_ANSI);
1086 		if (demangled != NULL)
1087 			elf_name = demangled;
1088 new_symbol:
1089 		f = symbol__new(sym.st_value, sym.st_size, elf_name);
1090 		free(demangled);
1091 		if (!f)
1092 			goto out_elf_end;
1093 
1094 		if (filter && filter(curr_map, f))
1095 			symbol__delete(f);
1096 		else {
1097 			symbols__insert(&curr_dso->symbols[curr_map->type], f);
1098 			nr++;
1099 		}
1100 	}
1101 
1102 	/*
1103 	 * For misannotated, zeroed, ASM function sizes.
1104 	 */
1105 	if (nr > 0) {
1106 		symbols__fixup_end(&self->symbols[map->type]);
1107 		if (kmap) {
1108 			/*
1109 			 * We need to fixup this here too because we create new
1110 			 * maps here, for things like vsyscall sections.
1111 			 */
1112 			__map_groups__fixup_end(kmap->kmaps, map->type);
1113 		}
1114 	}
1115 	err = nr;
1116 out_elf_end:
1117 	elf_end(elf);
1118 out_close:
1119 	return err;
1120 }
1121 
1122 static bool dso__build_id_equal(const struct dso *self, u8 *build_id)
1123 {
1124 	return memcmp(self->build_id, build_id, sizeof(self->build_id)) == 0;
1125 }
1126 
1127 bool __dsos__read_build_ids(struct list_head *head, bool with_hits)
1128 {
1129 	bool have_build_id = false;
1130 	struct dso *pos;
1131 
1132 	list_for_each_entry(pos, head, node) {
1133 		if (with_hits && !pos->hit)
1134 			continue;
1135 		if (pos->has_build_id) {
1136 			have_build_id = true;
1137 			continue;
1138 		}
1139 		if (filename__read_build_id(pos->long_name, pos->build_id,
1140 					    sizeof(pos->build_id)) > 0) {
1141 			have_build_id	  = true;
1142 			pos->has_build_id = true;
1143 		}
1144 	}
1145 
1146 	return have_build_id;
1147 }
1148 
1149 /*
1150  * Align offset to 4 bytes as needed for note name and descriptor data.
1151  */
1152 #define NOTE_ALIGN(n) (((n) + 3) & -4U)
1153 
1154 int filename__read_build_id(const char *filename, void *bf, size_t size)
1155 {
1156 	int fd, err = -1;
1157 	GElf_Ehdr ehdr;
1158 	GElf_Shdr shdr;
1159 	Elf_Data *data;
1160 	Elf_Scn *sec;
1161 	Elf_Kind ek;
1162 	void *ptr;
1163 	Elf *elf;
1164 
1165 	if (size < BUILD_ID_SIZE)
1166 		goto out;
1167 
1168 	fd = open(filename, O_RDONLY);
1169 	if (fd < 0)
1170 		goto out;
1171 
1172 	elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
1173 	if (elf == NULL) {
1174 		pr_debug2("%s: cannot read %s ELF file.\n", __func__, filename);
1175 		goto out_close;
1176 	}
1177 
1178 	ek = elf_kind(elf);
1179 	if (ek != ELF_K_ELF)
1180 		goto out_elf_end;
1181 
1182 	if (gelf_getehdr(elf, &ehdr) == NULL) {
1183 		pr_err("%s: cannot get elf header.\n", __func__);
1184 		goto out_elf_end;
1185 	}
1186 
1187 	sec = elf_section_by_name(elf, &ehdr, &shdr,
1188 				  ".note.gnu.build-id", NULL);
1189 	if (sec == NULL) {
1190 		sec = elf_section_by_name(elf, &ehdr, &shdr,
1191 					  ".notes", NULL);
1192 		if (sec == NULL)
1193 			goto out_elf_end;
1194 	}
1195 
1196 	data = elf_getdata(sec, NULL);
1197 	if (data == NULL)
1198 		goto out_elf_end;
1199 
1200 	ptr = data->d_buf;
1201 	while (ptr < (data->d_buf + data->d_size)) {
1202 		GElf_Nhdr *nhdr = ptr;
1203 		int namesz = NOTE_ALIGN(nhdr->n_namesz),
1204 		    descsz = NOTE_ALIGN(nhdr->n_descsz);
1205 		const char *name;
1206 
1207 		ptr += sizeof(*nhdr);
1208 		name = ptr;
1209 		ptr += namesz;
1210 		if (nhdr->n_type == NT_GNU_BUILD_ID &&
1211 		    nhdr->n_namesz == sizeof("GNU")) {
1212 			if (memcmp(name, "GNU", sizeof("GNU")) == 0) {
1213 				memcpy(bf, ptr, BUILD_ID_SIZE);
1214 				err = BUILD_ID_SIZE;
1215 				break;
1216 			}
1217 		}
1218 		ptr += descsz;
1219 	}
1220 out_elf_end:
1221 	elf_end(elf);
1222 out_close:
1223 	close(fd);
1224 out:
1225 	return err;
1226 }
1227 
1228 int sysfs__read_build_id(const char *filename, void *build_id, size_t size)
1229 {
1230 	int fd, err = -1;
1231 
1232 	if (size < BUILD_ID_SIZE)
1233 		goto out;
1234 
1235 	fd = open(filename, O_RDONLY);
1236 	if (fd < 0)
1237 		goto out;
1238 
1239 	while (1) {
1240 		char bf[BUFSIZ];
1241 		GElf_Nhdr nhdr;
1242 		int namesz, descsz;
1243 
1244 		if (read(fd, &nhdr, sizeof(nhdr)) != sizeof(nhdr))
1245 			break;
1246 
1247 		namesz = NOTE_ALIGN(nhdr.n_namesz);
1248 		descsz = NOTE_ALIGN(nhdr.n_descsz);
1249 		if (nhdr.n_type == NT_GNU_BUILD_ID &&
1250 		    nhdr.n_namesz == sizeof("GNU")) {
1251 			if (read(fd, bf, namesz) != namesz)
1252 				break;
1253 			if (memcmp(bf, "GNU", sizeof("GNU")) == 0) {
1254 				if (read(fd, build_id,
1255 				    BUILD_ID_SIZE) == BUILD_ID_SIZE) {
1256 					err = 0;
1257 					break;
1258 				}
1259 			} else if (read(fd, bf, descsz) != descsz)
1260 				break;
1261 		} else {
1262 			int n = namesz + descsz;
1263 			if (read(fd, bf, n) != n)
1264 				break;
1265 		}
1266 	}
1267 	close(fd);
1268 out:
1269 	return err;
1270 }
1271 
1272 char dso__symtab_origin(const struct dso *self)
1273 {
1274 	static const char origin[] = {
1275 		[DSO__ORIG_KERNEL] =   'k',
1276 		[DSO__ORIG_JAVA_JIT] = 'j',
1277 		[DSO__ORIG_BUILD_ID_CACHE] = 'B',
1278 		[DSO__ORIG_FEDORA] =   'f',
1279 		[DSO__ORIG_UBUNTU] =   'u',
1280 		[DSO__ORIG_BUILDID] =  'b',
1281 		[DSO__ORIG_DSO] =      'd',
1282 		[DSO__ORIG_KMODULE] =  'K',
1283 		[DSO__ORIG_GUEST_KERNEL] =  'g',
1284 		[DSO__ORIG_GUEST_KMODULE] =  'G',
1285 	};
1286 
1287 	if (self == NULL || self->origin == DSO__ORIG_NOT_FOUND)
1288 		return '!';
1289 	return origin[self->origin];
1290 }
1291 
1292 int dso__load(struct dso *self, struct map *map, symbol_filter_t filter)
1293 {
1294 	int size = PATH_MAX;
1295 	char *name;
1296 	u8 build_id[BUILD_ID_SIZE];
1297 	int ret = -1;
1298 	int fd;
1299 	struct machine *machine;
1300 	const char *root_dir;
1301 
1302 	dso__set_loaded(self, map->type);
1303 
1304 	if (self->kernel == DSO_TYPE_KERNEL)
1305 		return dso__load_kernel_sym(self, map, filter);
1306 	else if (self->kernel == DSO_TYPE_GUEST_KERNEL)
1307 		return dso__load_guest_kernel_sym(self, map, filter);
1308 
1309 	if (map->groups && map->groups->machine)
1310 		machine = map->groups->machine;
1311 	else
1312 		machine = NULL;
1313 
1314 	name = malloc(size);
1315 	if (!name)
1316 		return -1;
1317 
1318 	self->adjust_symbols = 0;
1319 
1320 	if (strncmp(self->name, "/tmp/perf-", 10) == 0) {
1321 		ret = dso__load_perf_map(self, map, filter);
1322 		self->origin = ret > 0 ? DSO__ORIG_JAVA_JIT :
1323 					 DSO__ORIG_NOT_FOUND;
1324 		return ret;
1325 	}
1326 
1327 	self->origin = DSO__ORIG_BUILD_ID_CACHE;
1328 	if (dso__build_id_filename(self, name, size) != NULL)
1329 		goto open_file;
1330 more:
1331 	do {
1332 		self->origin++;
1333 		switch (self->origin) {
1334 		case DSO__ORIG_FEDORA:
1335 			snprintf(name, size, "/usr/lib/debug%s.debug",
1336 				 self->long_name);
1337 			break;
1338 		case DSO__ORIG_UBUNTU:
1339 			snprintf(name, size, "/usr/lib/debug%s",
1340 				 self->long_name);
1341 			break;
1342 		case DSO__ORIG_BUILDID:
1343 			if (filename__read_build_id(self->long_name, build_id,
1344 						    sizeof(build_id))) {
1345 				char build_id_hex[BUILD_ID_SIZE * 2 + 1];
1346 				build_id__sprintf(build_id, sizeof(build_id),
1347 						  build_id_hex);
1348 				snprintf(name, size,
1349 					 "/usr/lib/debug/.build-id/%.2s/%s.debug",
1350 					build_id_hex, build_id_hex + 2);
1351 				if (self->has_build_id)
1352 					goto compare_build_id;
1353 				break;
1354 			}
1355 			self->origin++;
1356 			/* Fall thru */
1357 		case DSO__ORIG_DSO:
1358 			snprintf(name, size, "%s", self->long_name);
1359 			break;
1360 		case DSO__ORIG_GUEST_KMODULE:
1361 			if (map->groups && map->groups->machine)
1362 				root_dir = map->groups->machine->root_dir;
1363 			else
1364 				root_dir = "";
1365 			snprintf(name, size, "%s%s", root_dir, self->long_name);
1366 			break;
1367 
1368 		default:
1369 			goto out;
1370 		}
1371 
1372 		if (self->has_build_id) {
1373 			if (filename__read_build_id(name, build_id,
1374 						    sizeof(build_id)) < 0)
1375 				goto more;
1376 compare_build_id:
1377 			if (!dso__build_id_equal(self, build_id))
1378 				goto more;
1379 		}
1380 open_file:
1381 		fd = open(name, O_RDONLY);
1382 	} while (fd < 0);
1383 
1384 	ret = dso__load_sym(self, map, name, fd, filter, 0);
1385 	close(fd);
1386 
1387 	/*
1388 	 * Some people seem to have debuginfo files _WITHOUT_ debug info!?!?
1389 	 */
1390 	if (!ret)
1391 		goto more;
1392 
1393 	if (ret > 0) {
1394 		int nr_plt = dso__synthesize_plt_symbols(self, map, filter);
1395 		if (nr_plt > 0)
1396 			ret += nr_plt;
1397 	}
1398 out:
1399 	free(name);
1400 	if (ret < 0 && strstr(self->name, " (deleted)") != NULL)
1401 		return 0;
1402 	return ret;
1403 }
1404 
1405 struct map *map_groups__find_by_name(struct map_groups *self,
1406 				     enum map_type type, const char *name)
1407 {
1408 	struct rb_node *nd;
1409 
1410 	for (nd = rb_first(&self->maps[type]); nd; nd = rb_next(nd)) {
1411 		struct map *map = rb_entry(nd, struct map, rb_node);
1412 
1413 		if (map->dso && strcmp(map->dso->short_name, name) == 0)
1414 			return map;
1415 	}
1416 
1417 	return NULL;
1418 }
1419 
1420 static int dso__kernel_module_get_build_id(struct dso *self,
1421 				const char *root_dir)
1422 {
1423 	char filename[PATH_MAX];
1424 	/*
1425 	 * kernel module short names are of the form "[module]" and
1426 	 * we need just "module" here.
1427 	 */
1428 	const char *name = self->short_name + 1;
1429 
1430 	snprintf(filename, sizeof(filename),
1431 		 "%s/sys/module/%.*s/notes/.note.gnu.build-id",
1432 		 root_dir, (int)strlen(name) - 1, name);
1433 
1434 	if (sysfs__read_build_id(filename, self->build_id,
1435 				 sizeof(self->build_id)) == 0)
1436 		self->has_build_id = true;
1437 
1438 	return 0;
1439 }
1440 
1441 static int map_groups__set_modules_path_dir(struct map_groups *self,
1442 				const char *dir_name)
1443 {
1444 	struct dirent *dent;
1445 	DIR *dir = opendir(dir_name);
1446 
1447 	if (!dir) {
1448 		pr_debug("%s: cannot open %s dir\n", __func__, dir_name);
1449 		return -1;
1450 	}
1451 
1452 	while ((dent = readdir(dir)) != NULL) {
1453 		char path[PATH_MAX];
1454 		struct stat st;
1455 
1456 		/*sshfs might return bad dent->d_type, so we have to stat*/
1457 		sprintf(path, "%s/%s", dir_name, dent->d_name);
1458 		if (stat(path, &st))
1459 			continue;
1460 
1461 		if (S_ISDIR(st.st_mode)) {
1462 			if (!strcmp(dent->d_name, ".") ||
1463 			    !strcmp(dent->d_name, ".."))
1464 				continue;
1465 
1466 			snprintf(path, sizeof(path), "%s/%s",
1467 				 dir_name, dent->d_name);
1468 			if (map_groups__set_modules_path_dir(self, path) < 0)
1469 				goto failure;
1470 		} else {
1471 			char *dot = strrchr(dent->d_name, '.'),
1472 			     dso_name[PATH_MAX];
1473 			struct map *map;
1474 			char *long_name;
1475 
1476 			if (dot == NULL || strcmp(dot, ".ko"))
1477 				continue;
1478 			snprintf(dso_name, sizeof(dso_name), "[%.*s]",
1479 				 (int)(dot - dent->d_name), dent->d_name);
1480 
1481 			strxfrchar(dso_name, '-', '_');
1482 			map = map_groups__find_by_name(self, MAP__FUNCTION, dso_name);
1483 			if (map == NULL)
1484 				continue;
1485 
1486 			snprintf(path, sizeof(path), "%s/%s",
1487 				 dir_name, dent->d_name);
1488 
1489 			long_name = strdup(path);
1490 			if (long_name == NULL)
1491 				goto failure;
1492 			dso__set_long_name(map->dso, long_name);
1493 			dso__kernel_module_get_build_id(map->dso, "");
1494 		}
1495 	}
1496 
1497 	return 0;
1498 failure:
1499 	closedir(dir);
1500 	return -1;
1501 }
1502 
1503 static char *get_kernel_version(const char *root_dir)
1504 {
1505 	char version[PATH_MAX];
1506 	FILE *file;
1507 	char *name, *tmp;
1508 	const char *prefix = "Linux version ";
1509 
1510 	sprintf(version, "%s/proc/version", root_dir);
1511 	file = fopen(version, "r");
1512 	if (!file)
1513 		return NULL;
1514 
1515 	version[0] = '\0';
1516 	tmp = fgets(version, sizeof(version), file);
1517 	fclose(file);
1518 
1519 	name = strstr(version, prefix);
1520 	if (!name)
1521 		return NULL;
1522 	name += strlen(prefix);
1523 	tmp = strchr(name, ' ');
1524 	if (tmp)
1525 		*tmp = '\0';
1526 
1527 	return strdup(name);
1528 }
1529 
1530 static int machine__set_modules_path(struct machine *self)
1531 {
1532 	char *version;
1533 	char modules_path[PATH_MAX];
1534 
1535 	version = get_kernel_version(self->root_dir);
1536 	if (!version)
1537 		return -1;
1538 
1539 	snprintf(modules_path, sizeof(modules_path), "%s/lib/modules/%s/kernel",
1540 		 self->root_dir, version);
1541 	free(version);
1542 
1543 	return map_groups__set_modules_path_dir(&self->kmaps, modules_path);
1544 }
1545 
1546 /*
1547  * Constructor variant for modules (where we know from /proc/modules where
1548  * they are loaded) and for vmlinux, where only after we load all the
1549  * symbols we'll know where it starts and ends.
1550  */
1551 static struct map *map__new2(u64 start, struct dso *dso, enum map_type type)
1552 {
1553 	struct map *self = calloc(1, (sizeof(*self) +
1554 				      (dso->kernel ? sizeof(struct kmap) : 0)));
1555 	if (self != NULL) {
1556 		/*
1557 		 * ->end will be filled after we load all the symbols
1558 		 */
1559 		map__init(self, type, start, 0, 0, dso);
1560 	}
1561 
1562 	return self;
1563 }
1564 
1565 struct map *machine__new_module(struct machine *self, u64 start,
1566 				const char *filename)
1567 {
1568 	struct map *map;
1569 	struct dso *dso = __dsos__findnew(&self->kernel_dsos, filename);
1570 
1571 	if (dso == NULL)
1572 		return NULL;
1573 
1574 	map = map__new2(start, dso, MAP__FUNCTION);
1575 	if (map == NULL)
1576 		return NULL;
1577 
1578 	if (machine__is_host(self))
1579 		dso->origin = DSO__ORIG_KMODULE;
1580 	else
1581 		dso->origin = DSO__ORIG_GUEST_KMODULE;
1582 	map_groups__insert(&self->kmaps, map);
1583 	return map;
1584 }
1585 
1586 static int machine__create_modules(struct machine *self)
1587 {
1588 	char *line = NULL;
1589 	size_t n;
1590 	FILE *file;
1591 	struct map *map;
1592 	const char *modules;
1593 	char path[PATH_MAX];
1594 
1595 	if (machine__is_default_guest(self))
1596 		modules = symbol_conf.default_guest_modules;
1597 	else {
1598 		sprintf(path, "%s/proc/modules", self->root_dir);
1599 		modules = path;
1600 	}
1601 
1602 	file = fopen(modules, "r");
1603 	if (file == NULL)
1604 		return -1;
1605 
1606 	while (!feof(file)) {
1607 		char name[PATH_MAX];
1608 		u64 start;
1609 		char *sep;
1610 		int line_len;
1611 
1612 		line_len = getline(&line, &n, file);
1613 		if (line_len < 0)
1614 			break;
1615 
1616 		if (!line)
1617 			goto out_failure;
1618 
1619 		line[--line_len] = '\0'; /* \n */
1620 
1621 		sep = strrchr(line, 'x');
1622 		if (sep == NULL)
1623 			continue;
1624 
1625 		hex2u64(sep + 1, &start);
1626 
1627 		sep = strchr(line, ' ');
1628 		if (sep == NULL)
1629 			continue;
1630 
1631 		*sep = '\0';
1632 
1633 		snprintf(name, sizeof(name), "[%s]", line);
1634 		map = machine__new_module(self, start, name);
1635 		if (map == NULL)
1636 			goto out_delete_line;
1637 		dso__kernel_module_get_build_id(map->dso, self->root_dir);
1638 	}
1639 
1640 	free(line);
1641 	fclose(file);
1642 
1643 	return machine__set_modules_path(self);
1644 
1645 out_delete_line:
1646 	free(line);
1647 out_failure:
1648 	return -1;
1649 }
1650 
1651 static int dso__load_vmlinux(struct dso *self, struct map *map,
1652 			     const char *vmlinux, symbol_filter_t filter)
1653 {
1654 	int err = -1, fd;
1655 
1656 	if (self->has_build_id) {
1657 		u8 build_id[BUILD_ID_SIZE];
1658 
1659 		if (filename__read_build_id(vmlinux, build_id,
1660 					    sizeof(build_id)) < 0) {
1661 			pr_debug("No build_id in %s, ignoring it\n", vmlinux);
1662 			return -1;
1663 		}
1664 		if (!dso__build_id_equal(self, build_id)) {
1665 			char expected_build_id[BUILD_ID_SIZE * 2 + 1],
1666 			     vmlinux_build_id[BUILD_ID_SIZE * 2 + 1];
1667 
1668 			build_id__sprintf(self->build_id,
1669 					  sizeof(self->build_id),
1670 					  expected_build_id);
1671 			build_id__sprintf(build_id, sizeof(build_id),
1672 					  vmlinux_build_id);
1673 			pr_debug("build_id in %s is %s while expected is %s, "
1674 				 "ignoring it\n", vmlinux, vmlinux_build_id,
1675 				 expected_build_id);
1676 			return -1;
1677 		}
1678 	}
1679 
1680 	fd = open(vmlinux, O_RDONLY);
1681 	if (fd < 0)
1682 		return -1;
1683 
1684 	dso__set_loaded(self, map->type);
1685 	err = dso__load_sym(self, map, vmlinux, fd, filter, 0);
1686 	close(fd);
1687 
1688 	if (err > 0)
1689 		pr_debug("Using %s for symbols\n", vmlinux);
1690 
1691 	return err;
1692 }
1693 
1694 int dso__load_vmlinux_path(struct dso *self, struct map *map,
1695 			   symbol_filter_t filter)
1696 {
1697 	int i, err = 0;
1698 	char *filename;
1699 
1700 	pr_debug("Looking at the vmlinux_path (%d entries long)\n",
1701 		 vmlinux_path__nr_entries + 1);
1702 
1703 	filename = dso__build_id_filename(self, NULL, 0);
1704 	if (filename != NULL) {
1705 		err = dso__load_vmlinux(self, map, filename, filter);
1706 		if (err > 0) {
1707 			dso__set_long_name(self, filename);
1708 			goto out;
1709 		}
1710 		free(filename);
1711 	}
1712 
1713 	for (i = 0; i < vmlinux_path__nr_entries; ++i) {
1714 		err = dso__load_vmlinux(self, map, vmlinux_path[i], filter);
1715 		if (err > 0) {
1716 			dso__set_long_name(self, strdup(vmlinux_path[i]));
1717 			break;
1718 		}
1719 	}
1720 out:
1721 	return err;
1722 }
1723 
1724 static int dso__load_kernel_sym(struct dso *self, struct map *map,
1725 				symbol_filter_t filter)
1726 {
1727 	int err;
1728 	const char *kallsyms_filename = NULL;
1729 	char *kallsyms_allocated_filename = NULL;
1730 	/*
1731 	 * Step 1: if the user specified a vmlinux filename, use it and only
1732 	 * it, reporting errors to the user if it cannot be used.
1733 	 *
1734 	 * For instance, try to analyse an ARM perf.data file _without_ a
1735 	 * build-id, or if the user specifies the wrong path to the right
1736 	 * vmlinux file, obviously we can't fallback to another vmlinux (a
1737 	 * x86_86 one, on the machine where analysis is being performed, say),
1738 	 * or worse, /proc/kallsyms.
1739 	 *
1740 	 * If the specified file _has_ a build-id and there is a build-id
1741 	 * section in the perf.data file, we will still do the expected
1742 	 * validation in dso__load_vmlinux and will bail out if they don't
1743 	 * match.
1744 	 */
1745 	if (symbol_conf.vmlinux_name != NULL) {
1746 		err = dso__load_vmlinux(self, map,
1747 					symbol_conf.vmlinux_name, filter);
1748 		if (err > 0) {
1749 			dso__set_long_name(self,
1750 					   strdup(symbol_conf.vmlinux_name));
1751 			goto out_fixup;
1752 		}
1753 		return err;
1754 	}
1755 
1756 	if (vmlinux_path != NULL) {
1757 		err = dso__load_vmlinux_path(self, map, filter);
1758 		if (err > 0)
1759 			goto out_fixup;
1760 	}
1761 
1762 	/*
1763 	 * Say the kernel DSO was created when processing the build-id header table,
1764 	 * we have a build-id, so check if it is the same as the running kernel,
1765 	 * using it if it is.
1766 	 */
1767 	if (self->has_build_id) {
1768 		u8 kallsyms_build_id[BUILD_ID_SIZE];
1769 		char sbuild_id[BUILD_ID_SIZE * 2 + 1];
1770 
1771 		if (sysfs__read_build_id("/sys/kernel/notes", kallsyms_build_id,
1772 					 sizeof(kallsyms_build_id)) == 0) {
1773 			if (dso__build_id_equal(self, kallsyms_build_id)) {
1774 				kallsyms_filename = "/proc/kallsyms";
1775 				goto do_kallsyms;
1776 			}
1777 		}
1778 		/*
1779 		 * Now look if we have it on the build-id cache in
1780 		 * $HOME/.debug/[kernel.kallsyms].
1781 		 */
1782 		build_id__sprintf(self->build_id, sizeof(self->build_id),
1783 				  sbuild_id);
1784 
1785 		if (asprintf(&kallsyms_allocated_filename,
1786 			     "%s/.debug/[kernel.kallsyms]/%s",
1787 			     getenv("HOME"), sbuild_id) == -1) {
1788 			pr_err("Not enough memory for kallsyms file lookup\n");
1789 			return -1;
1790 		}
1791 
1792 		kallsyms_filename = kallsyms_allocated_filename;
1793 
1794 		if (access(kallsyms_filename, F_OK)) {
1795 			pr_err("No kallsyms or vmlinux with build-id %s "
1796 			       "was found\n", sbuild_id);
1797 			free(kallsyms_allocated_filename);
1798 			return -1;
1799 		}
1800 	} else {
1801 		/*
1802 		 * Last resort, if we don't have a build-id and couldn't find
1803 		 * any vmlinux file, try the running kernel kallsyms table.
1804 		 */
1805 		kallsyms_filename = "/proc/kallsyms";
1806 	}
1807 
1808 do_kallsyms:
1809 	err = dso__load_kallsyms(self, kallsyms_filename, map, filter);
1810 	if (err > 0)
1811 		pr_debug("Using %s for symbols\n", kallsyms_filename);
1812 	free(kallsyms_allocated_filename);
1813 
1814 	if (err > 0) {
1815 out_fixup:
1816 		if (kallsyms_filename != NULL)
1817 			dso__set_long_name(self, strdup("[kernel.kallsyms]"));
1818 		map__fixup_start(map);
1819 		map__fixup_end(map);
1820 	}
1821 
1822 	return err;
1823 }
1824 
1825 static int dso__load_guest_kernel_sym(struct dso *self, struct map *map,
1826 				symbol_filter_t filter)
1827 {
1828 	int err;
1829 	const char *kallsyms_filename = NULL;
1830 	struct machine *machine;
1831 	char path[PATH_MAX];
1832 
1833 	if (!map->groups) {
1834 		pr_debug("Guest kernel map hasn't the point to groups\n");
1835 		return -1;
1836 	}
1837 	machine = map->groups->machine;
1838 
1839 	if (machine__is_default_guest(machine)) {
1840 		/*
1841 		 * if the user specified a vmlinux filename, use it and only
1842 		 * it, reporting errors to the user if it cannot be used.
1843 		 * Or use file guest_kallsyms inputted by user on commandline
1844 		 */
1845 		if (symbol_conf.default_guest_vmlinux_name != NULL) {
1846 			err = dso__load_vmlinux(self, map,
1847 				symbol_conf.default_guest_vmlinux_name, filter);
1848 			goto out_try_fixup;
1849 		}
1850 
1851 		kallsyms_filename = symbol_conf.default_guest_kallsyms;
1852 		if (!kallsyms_filename)
1853 			return -1;
1854 	} else {
1855 		sprintf(path, "%s/proc/kallsyms", machine->root_dir);
1856 		kallsyms_filename = path;
1857 	}
1858 
1859 	err = dso__load_kallsyms(self, kallsyms_filename, map, filter);
1860 	if (err > 0)
1861 		pr_debug("Using %s for symbols\n", kallsyms_filename);
1862 
1863 out_try_fixup:
1864 	if (err > 0) {
1865 		if (kallsyms_filename != NULL) {
1866 			machine__mmap_name(machine, path, sizeof(path));
1867 			dso__set_long_name(self, strdup(path));
1868 		}
1869 		map__fixup_start(map);
1870 		map__fixup_end(map);
1871 	}
1872 
1873 	return err;
1874 }
1875 
1876 static void dsos__add(struct list_head *head, struct dso *dso)
1877 {
1878 	list_add_tail(&dso->node, head);
1879 }
1880 
1881 static struct dso *dsos__find(struct list_head *head, const char *name)
1882 {
1883 	struct dso *pos;
1884 
1885 	list_for_each_entry(pos, head, node)
1886 		if (strcmp(pos->long_name, name) == 0)
1887 			return pos;
1888 	return NULL;
1889 }
1890 
1891 struct dso *__dsos__findnew(struct list_head *head, const char *name)
1892 {
1893 	struct dso *dso = dsos__find(head, name);
1894 
1895 	if (!dso) {
1896 		dso = dso__new(name);
1897 		if (dso != NULL) {
1898 			dsos__add(head, dso);
1899 			dso__set_basename(dso);
1900 		}
1901 	}
1902 
1903 	return dso;
1904 }
1905 
1906 size_t __dsos__fprintf(struct list_head *head, FILE *fp)
1907 {
1908 	struct dso *pos;
1909 	size_t ret = 0;
1910 
1911 	list_for_each_entry(pos, head, node) {
1912 		int i;
1913 		for (i = 0; i < MAP__NR_TYPES; ++i)
1914 			ret += dso__fprintf(pos, i, fp);
1915 	}
1916 
1917 	return ret;
1918 }
1919 
1920 size_t machines__fprintf_dsos(struct rb_root *self, FILE *fp)
1921 {
1922 	struct rb_node *nd;
1923 	size_t ret = 0;
1924 
1925 	for (nd = rb_first(self); nd; nd = rb_next(nd)) {
1926 		struct machine *pos = rb_entry(nd, struct machine, rb_node);
1927 		ret += __dsos__fprintf(&pos->kernel_dsos, fp);
1928 		ret += __dsos__fprintf(&pos->user_dsos, fp);
1929 	}
1930 
1931 	return ret;
1932 }
1933 
1934 static size_t __dsos__fprintf_buildid(struct list_head *head, FILE *fp,
1935 				      bool with_hits)
1936 {
1937 	struct dso *pos;
1938 	size_t ret = 0;
1939 
1940 	list_for_each_entry(pos, head, node) {
1941 		if (with_hits && !pos->hit)
1942 			continue;
1943 		ret += dso__fprintf_buildid(pos, fp);
1944 		ret += fprintf(fp, " %s\n", pos->long_name);
1945 	}
1946 	return ret;
1947 }
1948 
1949 size_t machine__fprintf_dsos_buildid(struct machine *self, FILE *fp, bool with_hits)
1950 {
1951 	return __dsos__fprintf_buildid(&self->kernel_dsos, fp, with_hits) +
1952 	       __dsos__fprintf_buildid(&self->user_dsos, fp, with_hits);
1953 }
1954 
1955 size_t machines__fprintf_dsos_buildid(struct rb_root *self, FILE *fp, bool with_hits)
1956 {
1957 	struct rb_node *nd;
1958 	size_t ret = 0;
1959 
1960 	for (nd = rb_first(self); nd; nd = rb_next(nd)) {
1961 		struct machine *pos = rb_entry(nd, struct machine, rb_node);
1962 		ret += machine__fprintf_dsos_buildid(pos, fp, with_hits);
1963 	}
1964 	return ret;
1965 }
1966 
1967 struct dso *dso__new_kernel(const char *name)
1968 {
1969 	struct dso *self = dso__new(name ?: "[kernel.kallsyms]");
1970 
1971 	if (self != NULL) {
1972 		dso__set_short_name(self, "[kernel]");
1973 		self->kernel = DSO_TYPE_KERNEL;
1974 	}
1975 
1976 	return self;
1977 }
1978 
1979 static struct dso *dso__new_guest_kernel(struct machine *machine,
1980 					const char *name)
1981 {
1982 	char bf[PATH_MAX];
1983 	struct dso *self = dso__new(name ?: machine__mmap_name(machine, bf, sizeof(bf)));
1984 
1985 	if (self != NULL) {
1986 		dso__set_short_name(self, "[guest.kernel]");
1987 		self->kernel = DSO_TYPE_GUEST_KERNEL;
1988 	}
1989 
1990 	return self;
1991 }
1992 
1993 void dso__read_running_kernel_build_id(struct dso *self, struct machine *machine)
1994 {
1995 	char path[PATH_MAX];
1996 
1997 	if (machine__is_default_guest(machine))
1998 		return;
1999 	sprintf(path, "%s/sys/kernel/notes", machine->root_dir);
2000 	if (sysfs__read_build_id(path, self->build_id,
2001 				 sizeof(self->build_id)) == 0)
2002 		self->has_build_id = true;
2003 }
2004 
2005 static struct dso *machine__create_kernel(struct machine *self)
2006 {
2007 	const char *vmlinux_name = NULL;
2008 	struct dso *kernel;
2009 
2010 	if (machine__is_host(self)) {
2011 		vmlinux_name = symbol_conf.vmlinux_name;
2012 		kernel = dso__new_kernel(vmlinux_name);
2013 	} else {
2014 		if (machine__is_default_guest(self))
2015 			vmlinux_name = symbol_conf.default_guest_vmlinux_name;
2016 		kernel = dso__new_guest_kernel(self, vmlinux_name);
2017 	}
2018 
2019 	if (kernel != NULL) {
2020 		dso__read_running_kernel_build_id(kernel, self);
2021 		dsos__add(&self->kernel_dsos, kernel);
2022 	}
2023 	return kernel;
2024 }
2025 
2026 int __machine__create_kernel_maps(struct machine *self, struct dso *kernel)
2027 {
2028 	enum map_type type;
2029 
2030 	for (type = 0; type < MAP__NR_TYPES; ++type) {
2031 		struct kmap *kmap;
2032 
2033 		self->vmlinux_maps[type] = map__new2(0, kernel, type);
2034 		if (self->vmlinux_maps[type] == NULL)
2035 			return -1;
2036 
2037 		self->vmlinux_maps[type]->map_ip =
2038 			self->vmlinux_maps[type]->unmap_ip = identity__map_ip;
2039 
2040 		kmap = map__kmap(self->vmlinux_maps[type]);
2041 		kmap->kmaps = &self->kmaps;
2042 		map_groups__insert(&self->kmaps, self->vmlinux_maps[type]);
2043 	}
2044 
2045 	return 0;
2046 }
2047 
2048 int machine__create_kernel_maps(struct machine *self)
2049 {
2050 	struct dso *kernel = machine__create_kernel(self);
2051 
2052 	if (kernel == NULL ||
2053 	    __machine__create_kernel_maps(self, kernel) < 0)
2054 		return -1;
2055 
2056 	if (symbol_conf.use_modules && machine__create_modules(self) < 0)
2057 		pr_debug("Problems creating module maps, continuing anyway...\n");
2058 	/*
2059 	 * Now that we have all the maps created, just set the ->end of them:
2060 	 */
2061 	map_groups__fixup_end(&self->kmaps);
2062 	return 0;
2063 }
2064 
2065 static void vmlinux_path__exit(void)
2066 {
2067 	while (--vmlinux_path__nr_entries >= 0) {
2068 		free(vmlinux_path[vmlinux_path__nr_entries]);
2069 		vmlinux_path[vmlinux_path__nr_entries] = NULL;
2070 	}
2071 
2072 	free(vmlinux_path);
2073 	vmlinux_path = NULL;
2074 }
2075 
2076 static int vmlinux_path__init(void)
2077 {
2078 	struct utsname uts;
2079 	char bf[PATH_MAX];
2080 
2081 	if (uname(&uts) < 0)
2082 		return -1;
2083 
2084 	vmlinux_path = malloc(sizeof(char *) * 5);
2085 	if (vmlinux_path == NULL)
2086 		return -1;
2087 
2088 	vmlinux_path[vmlinux_path__nr_entries] = strdup("vmlinux");
2089 	if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
2090 		goto out_fail;
2091 	++vmlinux_path__nr_entries;
2092 	vmlinux_path[vmlinux_path__nr_entries] = strdup("/boot/vmlinux");
2093 	if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
2094 		goto out_fail;
2095 	++vmlinux_path__nr_entries;
2096 	snprintf(bf, sizeof(bf), "/boot/vmlinux-%s", uts.release);
2097 	vmlinux_path[vmlinux_path__nr_entries] = strdup(bf);
2098 	if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
2099 		goto out_fail;
2100 	++vmlinux_path__nr_entries;
2101 	snprintf(bf, sizeof(bf), "/lib/modules/%s/build/vmlinux", uts.release);
2102 	vmlinux_path[vmlinux_path__nr_entries] = strdup(bf);
2103 	if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
2104 		goto out_fail;
2105 	++vmlinux_path__nr_entries;
2106 	snprintf(bf, sizeof(bf), "/usr/lib/debug/lib/modules/%s/vmlinux",
2107 		 uts.release);
2108 	vmlinux_path[vmlinux_path__nr_entries] = strdup(bf);
2109 	if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
2110 		goto out_fail;
2111 	++vmlinux_path__nr_entries;
2112 
2113 	return 0;
2114 
2115 out_fail:
2116 	vmlinux_path__exit();
2117 	return -1;
2118 }
2119 
2120 size_t machine__fprintf_vmlinux_path(struct machine *self, FILE *fp)
2121 {
2122 	int i;
2123 	size_t printed = 0;
2124 	struct dso *kdso = self->vmlinux_maps[MAP__FUNCTION]->dso;
2125 
2126 	if (kdso->has_build_id) {
2127 		char filename[PATH_MAX];
2128 		if (dso__build_id_filename(kdso, filename, sizeof(filename)))
2129 			printed += fprintf(fp, "[0] %s\n", filename);
2130 	}
2131 
2132 	for (i = 0; i < vmlinux_path__nr_entries; ++i)
2133 		printed += fprintf(fp, "[%d] %s\n",
2134 				   i + kdso->has_build_id, vmlinux_path[i]);
2135 
2136 	return printed;
2137 }
2138 
2139 static int setup_list(struct strlist **list, const char *list_str,
2140 		      const char *list_name)
2141 {
2142 	if (list_str == NULL)
2143 		return 0;
2144 
2145 	*list = strlist__new(true, list_str);
2146 	if (!*list) {
2147 		pr_err("problems parsing %s list\n", list_name);
2148 		return -1;
2149 	}
2150 	return 0;
2151 }
2152 
2153 int symbol__init(void)
2154 {
2155 	elf_version(EV_CURRENT);
2156 	if (symbol_conf.sort_by_name)
2157 		symbol_conf.priv_size += (sizeof(struct symbol_name_rb_node) -
2158 					  sizeof(struct symbol));
2159 
2160 	if (symbol_conf.try_vmlinux_path && vmlinux_path__init() < 0)
2161 		return -1;
2162 
2163 	if (symbol_conf.field_sep && *symbol_conf.field_sep == '.') {
2164 		pr_err("'.' is the only non valid --field-separator argument\n");
2165 		return -1;
2166 	}
2167 
2168 	if (setup_list(&symbol_conf.dso_list,
2169 		       symbol_conf.dso_list_str, "dso") < 0)
2170 		return -1;
2171 
2172 	if (setup_list(&symbol_conf.comm_list,
2173 		       symbol_conf.comm_list_str, "comm") < 0)
2174 		goto out_free_dso_list;
2175 
2176 	if (setup_list(&symbol_conf.sym_list,
2177 		       symbol_conf.sym_list_str, "symbol") < 0)
2178 		goto out_free_comm_list;
2179 
2180 	return 0;
2181 
2182 out_free_dso_list:
2183 	strlist__delete(symbol_conf.dso_list);
2184 out_free_comm_list:
2185 	strlist__delete(symbol_conf.comm_list);
2186 	return -1;
2187 }
2188 
2189 int machines__create_kernel_maps(struct rb_root *self, pid_t pid)
2190 {
2191 	struct machine *machine = machines__findnew(self, pid);
2192 
2193 	if (machine == NULL)
2194 		return -1;
2195 
2196 	return machine__create_kernel_maps(machine);
2197 }
2198 
2199 static int hex(char ch)
2200 {
2201 	if ((ch >= '0') && (ch <= '9'))
2202 		return ch - '0';
2203 	if ((ch >= 'a') && (ch <= 'f'))
2204 		return ch - 'a' + 10;
2205 	if ((ch >= 'A') && (ch <= 'F'))
2206 		return ch - 'A' + 10;
2207 	return -1;
2208 }
2209 
2210 /*
2211  * While we find nice hex chars, build a long_val.
2212  * Return number of chars processed.
2213  */
2214 int hex2u64(const char *ptr, u64 *long_val)
2215 {
2216 	const char *p = ptr;
2217 	*long_val = 0;
2218 
2219 	while (*p) {
2220 		const int hex_val = hex(*p);
2221 
2222 		if (hex_val < 0)
2223 			break;
2224 
2225 		*long_val = (*long_val << 4) | hex_val;
2226 		p++;
2227 	}
2228 
2229 	return p - ptr;
2230 }
2231 
2232 char *strxfrchar(char *s, char from, char to)
2233 {
2234 	char *p = s;
2235 
2236 	while ((p = strchr(p, from)) != NULL)
2237 		*p++ = to;
2238 
2239 	return s;
2240 }
2241 
2242 int machines__create_guest_kernel_maps(struct rb_root *self)
2243 {
2244 	int ret = 0;
2245 	struct dirent **namelist = NULL;
2246 	int i, items = 0;
2247 	char path[PATH_MAX];
2248 	pid_t pid;
2249 
2250 	if (symbol_conf.default_guest_vmlinux_name ||
2251 	    symbol_conf.default_guest_modules ||
2252 	    symbol_conf.default_guest_kallsyms) {
2253 		machines__create_kernel_maps(self, DEFAULT_GUEST_KERNEL_ID);
2254 	}
2255 
2256 	if (symbol_conf.guestmount) {
2257 		items = scandir(symbol_conf.guestmount, &namelist, NULL, NULL);
2258 		if (items <= 0)
2259 			return -ENOENT;
2260 		for (i = 0; i < items; i++) {
2261 			if (!isdigit(namelist[i]->d_name[0])) {
2262 				/* Filter out . and .. */
2263 				continue;
2264 			}
2265 			pid = atoi(namelist[i]->d_name);
2266 			sprintf(path, "%s/%s/proc/kallsyms",
2267 				symbol_conf.guestmount,
2268 				namelist[i]->d_name);
2269 			ret = access(path, R_OK);
2270 			if (ret) {
2271 				pr_debug("Can't access file %s\n", path);
2272 				goto failure;
2273 			}
2274 			machines__create_kernel_maps(self, pid);
2275 		}
2276 failure:
2277 		free(namelist);
2278 	}
2279 
2280 	return ret;
2281 }
2282 
2283 int machine__load_kallsyms(struct machine *self, const char *filename,
2284 			   enum map_type type, symbol_filter_t filter)
2285 {
2286 	struct map *map = self->vmlinux_maps[type];
2287 	int ret = dso__load_kallsyms(map->dso, filename, map, filter);
2288 
2289 	if (ret > 0) {
2290 		dso__set_loaded(map->dso, type);
2291 		/*
2292 		 * Since /proc/kallsyms will have multiple sessions for the
2293 		 * kernel, with modules between them, fixup the end of all
2294 		 * sections.
2295 		 */
2296 		__map_groups__fixup_end(&self->kmaps, type);
2297 	}
2298 
2299 	return ret;
2300 }
2301 
2302 int machine__load_vmlinux_path(struct machine *self, enum map_type type,
2303 			       symbol_filter_t filter)
2304 {
2305 	struct map *map = self->vmlinux_maps[type];
2306 	int ret = dso__load_vmlinux_path(map->dso, map, filter);
2307 
2308 	if (ret > 0) {
2309 		dso__set_loaded(map->dso, type);
2310 		map__reloc_vmlinux(map);
2311 	}
2312 
2313 	return ret;
2314 }
2315