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