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