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