symbol.c 62.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
#include <ctype.h>
#include <dirent.h>
#include <errno.h>
#include <libgen.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/param.h>
#include <fcntl.h>
#include <unistd.h>
13
#include <inttypes.h>
14
#include "build-id.h"
15
#include "debug.h"
16
#include "symbol.h"
17
#include "strlist.h"
18 19 20 21

#include <libelf.h>
#include <gelf.h>
#include <elf.h>
22
#include <limits.h>
23
#include <sys/utsname.h>
P
Peter Zijlstra 已提交
24

25
#ifndef KSYM_NAME_LEN
26
#define KSYM_NAME_LEN 256
27 28
#endif

29 30 31 32
#ifndef NT_GNU_BUILD_ID
#define NT_GNU_BUILD_ID 3
#endif

33
static bool dso__build_id_equal(const struct dso *dso, u8 *build_id);
34
static int elf_read_build_id(Elf *elf, void *bf, size_t size);
35
static void dsos__add(struct list_head *head, struct dso *dso);
36
static struct map *map__new2(u64 start, struct dso *dso, enum map_type type);
37
static int dso__load_kernel_sym(struct dso *dso, struct map *map,
38
				symbol_filter_t filter);
39
static int dso__load_guest_kernel_sym(struct dso *dso, struct map *map,
40
			symbol_filter_t filter);
41 42
static int vmlinux_path__nr_entries;
static char **vmlinux_path;
43

44
struct symbol_conf symbol_conf = {
45
	.exclude_other	  = true,
46 47
	.use_modules	  = true,
	.try_vmlinux_path = true,
48
	.annotate_src	  = 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 78
	symbol_type = toupper(symbol_type);

79 80 81
	switch (map_type) {
	case MAP__FUNCTION:
		return symbol_type == 'T' || symbol_type == 'W';
82
	case MAP__VARIABLE:
83
		return symbol_type == 'D';
84 85 86 87 88
	default:
		return false;
	}
}

89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
static int prefix_underscores_count(const char *str)
{
	const char *tail = str;

	while (*tail == '_')
		tail++;

	return tail - str;
}

#define SYMBOL_A 0
#define SYMBOL_B 1

static int choose_best_symbol(struct symbol *syma, struct symbol *symb)
{
	s64 a;
	s64 b;

	/* Prefer a symbol with non zero length */
	a = syma->end - syma->start;
	b = symb->end - symb->start;
	if ((b == 0) && (a > 0))
		return SYMBOL_A;
	else if ((a == 0) && (b > 0))
		return SYMBOL_B;

	/* Prefer a non weak symbol over a weak one */
	a = syma->binding == STB_WEAK;
	b = symb->binding == STB_WEAK;
	if (b && !a)
		return SYMBOL_A;
	if (a && !b)
		return SYMBOL_B;

	/* Prefer a global symbol over a non global one */
	a = syma->binding == STB_GLOBAL;
	b = symb->binding == STB_GLOBAL;
	if (a && !b)
		return SYMBOL_A;
	if (b && !a)
		return SYMBOL_B;

	/* Prefer a symbol with less underscores */
	a = prefix_underscores_count(syma->name);
	b = prefix_underscores_count(symb->name);
	if (b > a)
		return SYMBOL_A;
	else if (a > b)
		return SYMBOL_B;

	/* If all else fails, choose the symbol with the longest name */
	if (strlen(syma->name) >= strlen(symb->name))
		return SYMBOL_A;
	else
		return SYMBOL_B;
}

static void symbols__fixup_duplicate(struct rb_root *symbols)
{
	struct rb_node *nd;
	struct symbol *curr, *next;

	nd = rb_first(symbols);

	while (nd) {
		curr = rb_entry(nd, struct symbol, rb_node);
again:
		nd = rb_next(&curr->rb_node);
		next = rb_entry(nd, struct symbol, rb_node);

		if (!nd)
			break;

		if (curr->start != next->start)
			continue;

		if (choose_best_symbol(curr, next) == SYMBOL_A) {
			rb_erase(&next->rb_node, symbols);
			goto again;
		} else {
			nd = rb_next(&curr->rb_node);
			rb_erase(&curr->rb_node, symbols);
		}
	}
}

175
static void symbols__fixup_end(struct rb_root *symbols)
176
{
177
	struct rb_node *nd, *prevnd = rb_first(symbols);
178
	struct symbol *curr, *prev;
179 180 181 182

	if (prevnd == NULL)
		return;

183 184
	curr = rb_entry(prevnd, struct symbol, rb_node);

185
	for (nd = rb_next(prevnd); nd; nd = rb_next(nd)) {
186 187
		prev = curr;
		curr = rb_entry(nd, struct symbol, rb_node);
188

189
		if (prev->end == prev->start && prev->end != curr->start)
190 191
			prev->end = curr->start - 1;
	}
192 193 194 195

	/* Last entry */
	if (curr->end == curr->start)
		curr->end = roundup(curr->start, 4096);
196 197
}

198
static void __map_groups__fixup_end(struct map_groups *mg, enum map_type type)
199 200
{
	struct map *prev, *curr;
201
	struct rb_node *nd, *prevnd = rb_first(&mg->maps[type]);
202 203 204 205 206 207 208 209 210 211

	if (prevnd == NULL)
		return;

	curr = rb_entry(prevnd, struct map, rb_node);

	for (nd = rb_next(prevnd); nd; nd = rb_next(nd)) {
		prev = curr;
		curr = rb_entry(nd, struct map, rb_node);
		prev->end = curr->start - 1;
212
	}
213 214 215 216 217

	/*
	 * We still haven't the actual symbols, so guess the
	 * last map final address.
	 */
218
	curr->end = ~0ULL;
219 220
}

221
static void map_groups__fixup_end(struct map_groups *mg)
222 223 224
{
	int i;
	for (i = 0; i < MAP__NR_TYPES; ++i)
225
		__map_groups__fixup_end(mg, i);
226 227
}

228 229
static struct symbol *symbol__new(u64 start, u64 len, u8 binding,
				  const char *name)
230
{
231
	size_t namelen = strlen(name) + 1;
232 233 234
	struct symbol *sym = calloc(1, (symbol_conf.priv_size +
					sizeof(*sym) + namelen));
	if (sym == NULL)
235 236
		return NULL;

237
	if (symbol_conf.priv_size)
238
		sym = ((void *)sym) + symbol_conf.priv_size;
239

240 241 242 243
	sym->start   = start;
	sym->end     = len ? start + len - 1 : start;
	sym->binding = binding;
	sym->namelen = namelen - 1;
244

245 246 247
	pr_debug4("%s: %s %#" PRIx64 "-%#" PRIx64 "\n",
		  __func__, name, start, sym->end);
	memcpy(sym->name, name, namelen);
248

249
	return sym;
250 251
}

252
void symbol__delete(struct symbol *sym)
253
{
254
	free(((void *)sym) - symbol_conf.priv_size);
255 256
}

257
static size_t symbol__fprintf(struct symbol *sym, FILE *fp)
258
{
259
	return fprintf(fp, " %" PRIx64 "-%" PRIx64 " %c %s\n",
260 261 262 263
		       sym->start, sym->end,
		       sym->binding == STB_GLOBAL ? 'g' :
		       sym->binding == STB_LOCAL  ? 'l' : 'w',
		       sym->name);
264 265
}

266
void dso__set_long_name(struct dso *dso, char *name)
267
{
268 269
	if (name == NULL)
		return;
270 271
	dso->long_name = name;
	dso->long_name_len = strlen(name);
272 273
}

274
static void dso__set_short_name(struct dso *dso, const char *name)
275 276 277
{
	if (name == NULL)
		return;
278 279
	dso->short_name = name;
	dso->short_name_len = strlen(name);
280 281
}

282
static void dso__set_basename(struct dso *dso)
283
{
284
	dso__set_short_name(dso, basename(dso->long_name));
285 286
}

287
struct dso *dso__new(const char *name)
288
{
289
	struct dso *dso = calloc(1, sizeof(*dso) + strlen(name) + 1);
290

291
	if (dso != NULL) {
292
		int i;
293 294 295
		strcpy(dso->name, name);
		dso__set_long_name(dso, dso->name);
		dso__set_short_name(dso, dso->name);
296
		for (i = 0; i < MAP__NR_TYPES; ++i)
297 298 299 300 301 302 303
			dso->symbols[i] = dso->symbol_names[i] = RB_ROOT;
		dso->symtab_type = SYMTAB__NOT_FOUND;
		dso->loaded = 0;
		dso->sorted_by_name = 0;
		dso->has_build_id = 0;
		dso->kernel = DSO_TYPE_USER;
		INIT_LIST_HEAD(&dso->node);
304 305
	}

306
	return dso;
307 308
}

309
static void symbols__delete(struct rb_root *symbols)
310 311
{
	struct symbol *pos;
312
	struct rb_node *next = rb_first(symbols);
313 314 315 316

	while (next) {
		pos = rb_entry(next, struct symbol, rb_node);
		next = rb_next(&pos->rb_node);
317
		rb_erase(&pos->rb_node, symbols);
318
		symbol__delete(pos);
319 320 321
	}
}

322
void dso__delete(struct dso *dso)
323
{
324 325
	int i;
	for (i = 0; i < MAP__NR_TYPES; ++i)
326 327 328 329 330 331
		symbols__delete(&dso->symbols[i]);
	if (dso->sname_alloc)
		free((char *)dso->short_name);
	if (dso->lname_alloc)
		free(dso->long_name);
	free(dso);
332 333
}

334
void dso__set_build_id(struct dso *dso, void *build_id)
335
{
336 337
	memcpy(dso->build_id, build_id, sizeof(dso->build_id));
	dso->has_build_id = 1;
338 339
}

340
static void symbols__insert(struct rb_root *symbols, struct symbol *sym)
341
{
342
	struct rb_node **p = &symbols->rb_node;
343
	struct rb_node *parent = NULL;
344
	const u64 ip = sym->start;
345 346 347 348 349 350 351 352 353 354 355
	struct symbol *s;

	while (*p != NULL) {
		parent = *p;
		s = rb_entry(parent, struct symbol, rb_node);
		if (ip < s->start)
			p = &(*p)->rb_left;
		else
			p = &(*p)->rb_right;
	}
	rb_link_node(&sym->rb_node, parent, p);
356
	rb_insert_color(&sym->rb_node, symbols);
357 358
}

359
static struct symbol *symbols__find(struct rb_root *symbols, u64 ip)
360 361 362
{
	struct rb_node *n;

363
	if (symbols == NULL)
364 365
		return NULL;

366
	n = symbols->rb_node;
367 368 369 370 371 372 373 374 375 376 377 378 379 380 381

	while (n) {
		struct symbol *s = rb_entry(n, struct symbol, rb_node);

		if (ip < s->start)
			n = n->rb_left;
		else if (ip > s->end)
			n = n->rb_right;
		else
			return s;
	}

	return NULL;
}

382 383 384 385 386
struct symbol_name_rb_node {
	struct rb_node	rb_node;
	struct symbol	sym;
};

387
static void symbols__insert_by_name(struct rb_root *symbols, struct symbol *sym)
388
{
389
	struct rb_node **p = &symbols->rb_node;
390
	struct rb_node *parent = NULL;
391 392 393
	struct symbol_name_rb_node *symn, *s;

	symn = container_of(sym, struct symbol_name_rb_node, sym);
394 395 396 397 398 399 400 401 402 403

	while (*p != NULL) {
		parent = *p;
		s = rb_entry(parent, struct symbol_name_rb_node, rb_node);
		if (strcmp(sym->name, s->sym.name) < 0)
			p = &(*p)->rb_left;
		else
			p = &(*p)->rb_right;
	}
	rb_link_node(&symn->rb_node, parent, p);
404
	rb_insert_color(&symn->rb_node, symbols);
405 406
}

407 408
static void symbols__sort_by_name(struct rb_root *symbols,
				  struct rb_root *source)
409 410 411 412 413
{
	struct rb_node *nd;

	for (nd = rb_first(source); nd; nd = rb_next(nd)) {
		struct symbol *pos = rb_entry(nd, struct symbol, rb_node);
414
		symbols__insert_by_name(symbols, pos);
415 416 417
	}
}

418 419
static struct symbol *symbols__find_by_name(struct rb_root *symbols,
					    const char *name)
420 421 422
{
	struct rb_node *n;

423
	if (symbols == NULL)
424 425
		return NULL;

426
	n = symbols->rb_node;
427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445

	while (n) {
		struct symbol_name_rb_node *s;
		int cmp;

		s = rb_entry(n, struct symbol_name_rb_node, rb_node);
		cmp = strcmp(name, s->sym.name);

		if (cmp < 0)
			n = n->rb_left;
		else if (cmp > 0)
			n = n->rb_right;
		else
			return &s->sym;
	}

	return NULL;
}

446
struct symbol *dso__find_symbol(struct dso *dso,
447
				enum map_type type, u64 addr)
448
{
449
	return symbols__find(&dso->symbols[type], addr);
450 451
}

452
struct symbol *dso__find_symbol_by_name(struct dso *dso, enum map_type type,
453 454
					const char *name)
{
455
	return symbols__find_by_name(&dso->symbol_names[type], name);
456 457
}

458
void dso__sort_by_name(struct dso *dso, enum map_type type)
459
{
460 461 462
	dso__set_sorted_by_name(dso, type);
	return symbols__sort_by_name(&dso->symbol_names[type],
				     &dso->symbols[type]);
463 464
}

465
int build_id__sprintf(const u8 *build_id, int len, char *bf)
466
{
467
	char *bid = bf;
468
	const u8 *raw = build_id;
469
	int i;
470

471 472 473 474 475 476
	for (i = 0; i < len; ++i) {
		sprintf(bid, "%02x", *raw);
		++raw;
		bid += 2;
	}

477
	return raw - build_id;
478 479
}

480
size_t dso__fprintf_buildid(struct dso *dso, FILE *fp)
481 482 483
{
	char sbuild_id[BUILD_ID_SIZE * 2 + 1];

484
	build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id);
485 486 487
	return fprintf(fp, "%s", sbuild_id);
}

488 489
size_t dso__fprintf_symbols_by_name(struct dso *dso,
				    enum map_type type, FILE *fp)
490 491 492 493 494
{
	size_t ret = 0;
	struct rb_node *nd;
	struct symbol_name_rb_node *pos;

495
	for (nd = rb_first(&dso->symbol_names[type]); nd; nd = rb_next(nd)) {
496 497 498 499 500 501 502
		pos = rb_entry(nd, struct symbol_name_rb_node, rb_node);
		fprintf(fp, "%s\n", pos->sym.name);
	}

	return ret;
}

503
size_t dso__fprintf(struct dso *dso, enum map_type type, FILE *fp)
504 505
{
	struct rb_node *nd;
506
	size_t ret = fprintf(fp, "dso: %s (", dso->short_name);
507

508 509
	if (dso->short_name != dso->long_name)
		ret += fprintf(fp, "%s, ", dso->long_name);
510
	ret += fprintf(fp, "%s, %sloaded, ", map_type__name[type],
511 512
		       dso->loaded ? "" : "NOT ");
	ret += dso__fprintf_buildid(dso, fp);
513
	ret += fprintf(fp, ")\n");
514
	for (nd = rb_first(&dso->symbols[type]); nd; nd = rb_next(nd)) {
515 516
		struct symbol *pos = rb_entry(nd, struct symbol, rb_node);
		ret += symbol__fprintf(pos, fp);
517 518 519 520 521
	}

	return ret;
}

522 523
int kallsyms__parse(const char *filename, void *arg,
		    int (*process_symbol)(void *arg, const char *name,
524
					  char type, u64 start, u64 end))
525 526 527
{
	char *line = NULL;
	size_t n;
528
	int err = -1;
529
	FILE *file = fopen(filename, "r");
530 531 532 533

	if (file == NULL)
		goto out_failure;

534 535
	err = 0;

536
	while (!feof(file)) {
537
		u64 start;
538 539
		int line_len, len;
		char symbol_type;
540
		char *symbol_name;
541 542

		line_len = getline(&line, &n, file);
543
		if (line_len < 0 || !line)
544 545 546 547
			break;

		line[--line_len] = '\0'; /* \n */

548
		len = hex2u64(line, &start);
549 550 551 552 553

		len++;
		if (len + 2 >= line_len)
			continue;

554
		symbol_type = line[len];
555 556 557
		len += 2;
		symbol_name = line + len;
		len = line_len - len;
558

559 560
		if (len >= KSYM_NAME_LEN) {
			err = -1;
561
			break;
562 563
		}

564 565 566 567 568 569 570 571 572
		/*
		 * module symbols are not sorted so we add all
		 * symbols with zero length and rely on
		 * symbols__fixup_end() to fix it up.
		 */
		err = process_symbol(arg, symbol_name,
				     symbol_type, start, start);
		if (err)
			break;
573 574 575 576
	}

	free(line);
	fclose(file);
577
	return err;
578 579 580 581 582

out_failure:
	return -1;
}

583 584 585 586 587
struct process_kallsyms_args {
	struct map *map;
	struct dso *dso;
};

588 589 590 591 592 593 594 595
static u8 kallsyms2elf_type(char type)
{
	if (type == 'W')
		return STB_WEAK;

	return isupper(type) ? STB_GLOBAL : STB_LOCAL;
}

596
static int map__process_kallsym_symbol(void *arg, const char *name,
597
				       char type, u64 start, u64 end)
598 599 600 601 602 603 604 605
{
	struct symbol *sym;
	struct process_kallsyms_args *a = arg;
	struct rb_root *root = &a->dso->symbols[a->map->type];

	if (!symbol_type__is_a(type, a->map->type))
		return 0;

606 607
	sym = symbol__new(start, end - start + 1,
			  kallsyms2elf_type(type), name);
608 609 610 611 612 613 614
	if (sym == NULL)
		return -ENOMEM;
	/*
	 * We will pass the symbols to the filter later, in
	 * map__split_kallsyms, when we have split the maps per module
	 */
	symbols__insert(root, sym);
615

616 617 618 619 620 621 622 623
	return 0;
}

/*
 * Loads the function entries in /proc/kallsyms into kernel_map->dso,
 * so that we can in the next step set the symbol ->end address and then
 * call kernel_maps__split_kallsyms.
 */
624
static int dso__load_all_kallsyms(struct dso *dso, const char *filename,
625
				  struct map *map)
626
{
627
	struct process_kallsyms_args args = { .map = map, .dso = dso, };
628
	return kallsyms__parse(filename, &args, map__process_kallsym_symbol);
629 630
}

631 632 633 634 635
/*
 * Split the symbols into maps, making sure there are no overlaps, i.e. the
 * kernel range is broken in several maps, named [kernel].N, as we don't have
 * the original ELF section names vmlinux have.
 */
636
static int dso__split_kallsyms(struct dso *dso, struct map *map,
637
			       symbol_filter_t filter)
638
{
639
	struct map_groups *kmaps = map__kmap(map)->kmaps;
640
	struct machine *machine = kmaps->machine;
641
	struct map *curr_map = map;
642
	struct symbol *pos;
643
	int count = 0, moved = 0;	
644
	struct rb_root *root = &dso->symbols[map->type];
645
	struct rb_node *next = rb_first(root);
646 647 648 649 650 651 652 653 654 655
	int kernel_range = 0;

	while (next) {
		char *module;

		pos = rb_entry(next, struct symbol, rb_node);
		next = rb_next(&pos->rb_node);

		module = strchr(pos->name, '\t');
		if (module) {
656
			if (!symbol_conf.use_modules)
657 658
				goto discard_symbol;

659 660
			*module++ = '\0';

661
			if (strcmp(curr_map->dso->short_name, module)) {
662
				if (curr_map != map &&
663
				    dso->kernel == DSO_TYPE_GUEST_KERNEL &&
664
				    machine__is_default_guest(machine)) {
665 666 667 668 669 670 671 672 673 674 675 676 677
					/*
					 * We assume all symbols of a module are
					 * continuous in * kallsyms, so curr_map
					 * points to a module and all its
					 * symbols are in its kmap. Mark it as
					 * loaded.
					 */
					dso__set_loaded(curr_map->dso,
							curr_map->type);
				}

				curr_map = map_groups__find_by_name(kmaps,
							map->type, module);
678
				if (curr_map == NULL) {
679
					pr_debug("%s/proc/{kallsyms,modules} "
680
					         "inconsistency while looking "
681
						 "for \"%s\" module!\n",
682
						 machine->root_dir, module);
683 684
					curr_map = map;
					goto discard_symbol;
685
				}
686

687
				if (curr_map->dso->loaded &&
688
				    !machine__is_default_guest(machine))
689
					goto discard_symbol;
690
			}
691 692 693 694
			/*
			 * So that we look just like we get from .ko files,
			 * i.e. not prelinked, relative to map->start.
			 */
695 696 697
			pos->start = curr_map->map_ip(curr_map, pos->start);
			pos->end   = curr_map->map_ip(curr_map, pos->end);
		} else if (curr_map != map) {
698
			char dso_name[PATH_MAX];
699
			struct dso *ndso;
700

701 702 703 704 705
			if (count == 0) {
				curr_map = map;
				goto filter_symbol;
			}

706
			if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
707 708 709 710 711 712 713
				snprintf(dso_name, sizeof(dso_name),
					"[guest.kernel].%d",
					kernel_range++);
			else
				snprintf(dso_name, sizeof(dso_name),
					"[kernel].%d",
					kernel_range++);
714

715 716
			ndso = dso__new(dso_name);
			if (ndso == NULL)
717 718
				return -1;

719
			ndso->kernel = dso->kernel;
720

721
			curr_map = map__new2(pos->start, ndso, map->type);
722
			if (curr_map == NULL) {
723
				dso__delete(ndso);
724 725
				return -1;
			}
726

727
			curr_map->map_ip = curr_map->unmap_ip = identity__map_ip;
728
			map_groups__insert(kmaps, curr_map);
729 730
			++kernel_range;
		}
731
filter_symbol:
732
		if (filter && filter(curr_map, pos)) {
733
discard_symbol:		rb_erase(&pos->rb_node, root);
734
			symbol__delete(pos);
735
		} else {
736 737 738
			if (curr_map != map) {
				rb_erase(&pos->rb_node, root);
				symbols__insert(&curr_map->dso->symbols[curr_map->type], pos);
739 740 741
				++moved;
			} else
				++count;
742
		}
743 744
	}

745
	if (curr_map != map &&
746
	    dso->kernel == DSO_TYPE_GUEST_KERNEL &&
747
	    machine__is_default_guest(kmaps->machine)) {
748 749 750
		dso__set_loaded(curr_map->dso, curr_map->type);
	}

751
	return count + moved;
752
}
753

754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771
static bool symbol__restricted_filename(const char *filename,
					const char *restricted_filename)
{
	bool restricted = false;

	if (symbol_conf.kptr_restrict) {
		char *r = realpath(filename, NULL);

		if (r != NULL) {
			restricted = strcmp(r, restricted_filename) == 0;
			free(r);
			return restricted;
		}
	}

	return restricted;
}

772
int dso__load_kallsyms(struct dso *dso, const char *filename,
773
		       struct map *map, symbol_filter_t filter)
774
{
775 776 777
	if (symbol__restricted_filename(filename, "/proc/kallsyms"))
		return -1;

778
	if (dso__load_all_kallsyms(dso, filename, map) < 0)
779 780
		return -1;

781
	symbols__fixup_duplicate(&dso->symbols[map->type]);
782 783
	symbols__fixup_end(&dso->symbols[map->type]);

784 785
	if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
		dso->symtab_type = SYMTAB__GUEST_KALLSYMS;
786
	else
787
		dso->symtab_type = SYMTAB__KALLSYMS;
788

789
	return dso__split_kallsyms(dso, map, filter);
790 791
}

792
static int dso__load_perf_map(struct dso *dso, struct map *map,
793
			      symbol_filter_t filter)
794 795 796 797 798 799
{
	char *line = NULL;
	size_t n;
	FILE *file;
	int nr_syms = 0;

800
	file = fopen(dso->long_name, "r");
801 802 803 804
	if (file == NULL)
		goto out_failure;

	while (!feof(file)) {
805
		u64 start, size;
806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829
		struct symbol *sym;
		int line_len, len;

		line_len = getline(&line, &n, file);
		if (line_len < 0)
			break;

		if (!line)
			goto out_failure;

		line[--line_len] = '\0'; /* \n */

		len = hex2u64(line, &start);

		len++;
		if (len + 2 >= line_len)
			continue;

		len += hex2u64(line + len, &size);

		len++;
		if (len + 2 >= line_len)
			continue;

830
		sym = symbol__new(start, size, STB_GLOBAL, line + len);
831 832 833 834

		if (sym == NULL)
			goto out_delete_line;

835
		if (filter && filter(map, sym))
836
			symbol__delete(sym);
837
		else {
838
			symbols__insert(&dso->symbols[map->type], sym);
839 840 841 842 843 844 845 846 847 848 849 850 851 852 853
			nr_syms++;
		}
	}

	free(line);
	fclose(file);

	return nr_syms;

out_delete_line:
	free(line);
out_failure:
	return -1;
}

854 855 856
/**
 * elf_symtab__for_each_symbol - iterate thru all the symbols
 *
857
 * @syms: struct elf_symtab instance to iterate
858
 * @idx: uint32_t idx
859 860
 * @sym: GElf_Sym iterator
 */
861 862 863 864
#define elf_symtab__for_each_symbol(syms, nr_syms, idx, sym) \
	for (idx = 0, gelf_getsym(syms, idx, &sym);\
	     idx < nr_syms; \
	     idx++, gelf_getsym(syms, idx, &sym))
865 866 867 868 869 870 871 872 873 874

static inline uint8_t elf_sym__type(const GElf_Sym *sym)
{
	return GELF_ST_TYPE(sym->st_info);
}

static inline int elf_sym__is_function(const GElf_Sym *sym)
{
	return elf_sym__type(sym) == STT_FUNC &&
	       sym->st_name != 0 &&
875
	       sym->st_shndx != SHN_UNDEF;
876 877
}

878 879 880 881 882 883 884
static inline bool elf_sym__is_object(const GElf_Sym *sym)
{
	return elf_sym__type(sym) == STT_OBJECT &&
		sym->st_name != 0 &&
		sym->st_shndx != SHN_UNDEF;
}

885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904
static inline int elf_sym__is_label(const GElf_Sym *sym)
{
	return elf_sym__type(sym) == STT_NOTYPE &&
		sym->st_name != 0 &&
		sym->st_shndx != SHN_UNDEF &&
		sym->st_shndx != SHN_ABS;
}

static inline const char *elf_sec__name(const GElf_Shdr *shdr,
					const Elf_Data *secstrs)
{
	return secstrs->d_buf + shdr->sh_name;
}

static inline int elf_sec__is_text(const GElf_Shdr *shdr,
					const Elf_Data *secstrs)
{
	return strstr(elf_sec__name(shdr, secstrs), "text") != NULL;
}

905 906 907 908 909 910
static inline bool elf_sec__is_data(const GElf_Shdr *shdr,
				    const Elf_Data *secstrs)
{
	return strstr(elf_sec__name(shdr, secstrs), "data") != NULL;
}

911 912 913 914 915 916 917 918
static inline const char *elf_sym__name(const GElf_Sym *sym,
					const Elf_Data *symstrs)
{
	return symstrs->d_buf + sym->st_name;
}

static Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep,
				    GElf_Shdr *shp, const char *name,
919
				    size_t *idx)
920 921 922 923 924 925 926 927 928 929
{
	Elf_Scn *sec = NULL;
	size_t cnt = 1;

	while ((sec = elf_nextscn(elf, sec)) != NULL) {
		char *str;

		gelf_getshdr(sec, shp);
		str = elf_strptr(elf, ep->e_shstrndx, shp->sh_name);
		if (!strcmp(name, str)) {
930 931
			if (idx)
				*idx = cnt;
932 933 934 935 936 937 938 939
			break;
		}
		++cnt;
	}

	return sec;
}

940 941 942 943 944 945 946 947 948 949
#define elf_section__for_each_rel(reldata, pos, pos_mem, idx, nr_entries) \
	for (idx = 0, pos = gelf_getrel(reldata, 0, &pos_mem); \
	     idx < nr_entries; \
	     ++idx, pos = gelf_getrel(reldata, idx, &pos_mem))

#define elf_section__for_each_rela(reldata, pos, pos_mem, idx, nr_entries) \
	for (idx = 0, pos = gelf_getrela(reldata, 0, &pos_mem); \
	     idx < nr_entries; \
	     ++idx, pos = gelf_getrela(reldata, idx, &pos_mem))

950 951 952 953 954 955 956
/*
 * We need to check if we have a .dynsym, so that we can handle the
 * .plt, synthesizing its symbols, that aren't on the symtabs (be it
 * .dynsym or .symtab).
 * And always look at the original dso, not at debuginfo packages, that
 * have the PLT data stripped out (shdr_rel_plt.sh_type == SHT_NOBITS).
 */
957
static int dso__synthesize_plt_symbols(struct  dso *dso, struct map *map,
958
				       symbol_filter_t filter)
959 960 961
{
	uint32_t nr_rel_entries, idx;
	GElf_Sym sym;
962
	u64 plt_offset;
963 964
	GElf_Shdr shdr_plt;
	struct symbol *f;
965
	GElf_Shdr shdr_rel_plt, shdr_dynsym;
966
	Elf_Data *reldata, *syms, *symstrs;
967 968 969
	Elf_Scn *scn_plt_rel, *scn_symstrs, *scn_dynsym;
	size_t dynsym_idx;
	GElf_Ehdr ehdr;
970
	char sympltname[1024];
971 972
	Elf *elf;
	int nr = 0, symidx, fd, err = 0;
973
	char name[PATH_MAX];
974

975
	snprintf(name, sizeof(name), "%s%s",
976
		 symbol_conf.symfs, dso->long_name);
977
	fd = open(name, O_RDONLY);
978 979 980
	if (fd < 0)
		goto out;

981
	elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
982 983 984 985 986 987 988 989 990 991
	if (elf == NULL)
		goto out_close;

	if (gelf_getehdr(elf, &ehdr) == NULL)
		goto out_elf_end;

	scn_dynsym = elf_section_by_name(elf, &ehdr, &shdr_dynsym,
					 ".dynsym", &dynsym_idx);
	if (scn_dynsym == NULL)
		goto out_elf_end;
992

993
	scn_plt_rel = elf_section_by_name(elf, &ehdr, &shdr_rel_plt,
994 995
					  ".rela.plt", NULL);
	if (scn_plt_rel == NULL) {
996
		scn_plt_rel = elf_section_by_name(elf, &ehdr, &shdr_rel_plt,
997 998
						  ".rel.plt", NULL);
		if (scn_plt_rel == NULL)
999
			goto out_elf_end;
1000 1001
	}

1002 1003
	err = -1;

1004
	if (shdr_rel_plt.sh_link != dynsym_idx)
1005
		goto out_elf_end;
1006

1007 1008
	if (elf_section_by_name(elf, &ehdr, &shdr_plt, ".plt", NULL) == NULL)
		goto out_elf_end;
1009 1010

	/*
1011
	 * Fetch the relocation section to find the idxes to the GOT
1012 1013 1014 1015
	 * and the symbols in the .dynsym they refer to.
	 */
	reldata = elf_getdata(scn_plt_rel, NULL);
	if (reldata == NULL)
1016
		goto out_elf_end;
1017 1018 1019

	syms = elf_getdata(scn_dynsym, NULL);
	if (syms == NULL)
1020
		goto out_elf_end;
1021

1022
	scn_symstrs = elf_getscn(elf, shdr_dynsym.sh_link);
1023
	if (scn_symstrs == NULL)
1024
		goto out_elf_end;
1025 1026 1027

	symstrs = elf_getdata(scn_symstrs, NULL);
	if (symstrs == NULL)
1028
		goto out_elf_end;
1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044

	nr_rel_entries = shdr_rel_plt.sh_size / shdr_rel_plt.sh_entsize;
	plt_offset = shdr_plt.sh_offset;

	if (shdr_rel_plt.sh_type == SHT_RELA) {
		GElf_Rela pos_mem, *pos;

		elf_section__for_each_rela(reldata, pos, pos_mem, idx,
					   nr_rel_entries) {
			symidx = GELF_R_SYM(pos->r_info);
			plt_offset += shdr_plt.sh_entsize;
			gelf_getsym(syms, symidx, &sym);
			snprintf(sympltname, sizeof(sympltname),
				 "%s@plt", elf_sym__name(&sym, symstrs));

			f = symbol__new(plt_offset, shdr_plt.sh_entsize,
1045
					STB_GLOBAL, sympltname);
1046
			if (!f)
1047
				goto out_elf_end;
1048

1049 1050 1051
			if (filter && filter(map, f))
				symbol__delete(f);
			else {
1052
				symbols__insert(&dso->symbols[map->type], f);
1053 1054
				++nr;
			}
1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066
		}
	} else if (shdr_rel_plt.sh_type == SHT_REL) {
		GElf_Rel pos_mem, *pos;
		elf_section__for_each_rel(reldata, pos, pos_mem, idx,
					  nr_rel_entries) {
			symidx = GELF_R_SYM(pos->r_info);
			plt_offset += shdr_plt.sh_entsize;
			gelf_getsym(syms, symidx, &sym);
			snprintf(sympltname, sizeof(sympltname),
				 "%s@plt", elf_sym__name(&sym, symstrs));

			f = symbol__new(plt_offset, shdr_plt.sh_entsize,
1067
					STB_GLOBAL, sympltname);
1068
			if (!f)
1069
				goto out_elf_end;
1070

1071 1072 1073
			if (filter && filter(map, f))
				symbol__delete(f);
			else {
1074
				symbols__insert(&dso->symbols[map->type], f);
1075 1076
				++nr;
			}
1077 1078 1079
		}
	}

1080 1081 1082 1083 1084 1085 1086 1087 1088
	err = 0;
out_elf_end:
	elf_end(elf);
out_close:
	close(fd);

	if (err == 0)
		return nr;
out:
1089
	pr_debug("%s: problems reading %s PLT info.\n",
1090
		 __func__, dso->long_name);
1091
	return 0;
1092 1093
}

1094
static bool elf_sym__is_a(GElf_Sym *sym, enum map_type type)
1095 1096 1097
{
	switch (type) {
	case MAP__FUNCTION:
1098
		return elf_sym__is_function(sym);
1099
	case MAP__VARIABLE:
1100
		return elf_sym__is_object(sym);
1101 1102 1103 1104 1105
	default:
		return false;
	}
}

1106 1107
static bool elf_sec__is_a(GElf_Shdr *shdr, Elf_Data *secstrs,
			  enum map_type type)
1108 1109 1110
{
	switch (type) {
	case MAP__FUNCTION:
1111
		return elf_sec__is_text(shdr, secstrs);
1112
	case MAP__VARIABLE:
1113
		return elf_sec__is_data(shdr, secstrs);
1114 1115 1116 1117 1118
	default:
		return false;
	}
}

1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137
static size_t elf_addr_to_index(Elf *elf, GElf_Addr addr)
{
	Elf_Scn *sec = NULL;
	GElf_Shdr shdr;
	size_t cnt = 1;

	while ((sec = elf_nextscn(elf, sec)) != NULL) {
		gelf_getshdr(sec, &shdr);

		if ((addr >= shdr.sh_addr) &&
		    (addr < (shdr.sh_addr + shdr.sh_size)))
			return cnt;

		++cnt;
	}

	return -1;
}

1138
static int dso__load_sym(struct dso *dso, struct map *map, const char *name,
1139 1140
			 int fd, symbol_filter_t filter, int kmodule,
			 int want_symtab)
1141
{
1142
	struct kmap *kmap = dso->kernel ? map__kmap(map) : NULL;
1143
	struct map *curr_map = map;
1144
	struct dso *curr_dso = dso;
1145
	Elf_Data *symstrs, *secstrs;
1146 1147
	uint32_t nr_syms;
	int err = -1;
1148
	uint32_t idx;
1149
	GElf_Ehdr ehdr;
1150 1151
	GElf_Shdr shdr, opdshdr;
	Elf_Data *syms, *opddata = NULL;
1152
	GElf_Sym sym;
1153
	Elf_Scn *sec, *sec_strndx, *opdsec;
1154
	Elf *elf;
1155
	int nr = 0;
1156
	size_t opdidx = 0;
1157

1158
	elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
1159
	if (elf == NULL) {
1160
		pr_debug("%s: cannot read %s ELF file.\n", __func__, name);
1161 1162 1163 1164
		goto out_close;
	}

	if (gelf_getehdr(elf, &ehdr) == NULL) {
1165
		pr_debug("%s: cannot get elf header.\n", __func__);
1166 1167 1168
		goto out_elf_end;
	}

1169
	/* Always reject images with a mismatched build-id: */
1170
	if (dso->has_build_id) {
1171 1172
		u8 build_id[BUILD_ID_SIZE];

1173
		if (elf_read_build_id(elf, build_id, BUILD_ID_SIZE) < 0)
1174 1175
			goto out_elf_end;

1176
		if (!dso__build_id_equal(dso, build_id))
1177 1178 1179
			goto out_elf_end;
	}

1180
	sec = elf_section_by_name(elf, &ehdr, &shdr, ".symtab", NULL);
1181
	if (sec == NULL) {
1182 1183 1184
		if (want_symtab)
			goto out_elf_end;

1185 1186
		sec = elf_section_by_name(elf, &ehdr, &shdr, ".dynsym", NULL);
		if (sec == NULL)
1187 1188
			goto out_elf_end;
	}
1189

1190
	opdsec = elf_section_by_name(elf, &ehdr, &opdshdr, ".opd", &opdidx);
1191 1192
	if (opdshdr.sh_type != SHT_PROGBITS)
		opdsec = NULL;
1193 1194 1195
	if (opdsec)
		opddata = elf_rawdata(opdsec, NULL);

1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207
	syms = elf_getdata(sec, NULL);
	if (syms == NULL)
		goto out_elf_end;

	sec = elf_getscn(elf, shdr.sh_link);
	if (sec == NULL)
		goto out_elf_end;

	symstrs = elf_getdata(sec, NULL);
	if (symstrs == NULL)
		goto out_elf_end;

1208 1209 1210 1211 1212
	sec_strndx = elf_getscn(elf, ehdr.e_shstrndx);
	if (sec_strndx == NULL)
		goto out_elf_end;

	secstrs = elf_getdata(sec_strndx, NULL);
S
Stoyan Gaydarov 已提交
1213
	if (secstrs == NULL)
1214 1215
		goto out_elf_end;

1216 1217
	nr_syms = shdr.sh_size / shdr.sh_entsize;

1218
	memset(&sym, 0, sizeof(sym));
1219 1220
	if (dso->kernel == DSO_TYPE_USER) {
		dso->adjust_symbols = (ehdr.e_type == ET_EXEC ||
1221 1222 1223
				elf_section_by_name(elf, &ehdr, &shdr,
						     ".gnu.prelink_undo",
						     NULL) != NULL);
1224 1225 1226
	} else {
		dso->adjust_symbols = 0;
	}
1227
	elf_symtab__for_each_symbol(syms, nr_syms, idx, sym) {
1228
		struct symbol *f;
1229
		const char *elf_name = elf_sym__name(&sym, symstrs);
1230
		char *demangled = NULL;
1231 1232
		int is_label = elf_sym__is_label(&sym);
		const char *section_name;
1233

1234 1235 1236
		if (kmap && kmap->ref_reloc_sym && kmap->ref_reloc_sym->name &&
		    strcmp(elf_name, kmap->ref_reloc_sym->name) == 0)
			kmap->ref_reloc_sym->unrelocated_addr = sym.st_value;
1237

1238
		if (!is_label && !elf_sym__is_a(&sym, map->type))
1239 1240
			continue;

1241 1242 1243 1244 1245 1246 1247 1248 1249 1250
		/* Reject ARM ELF "mapping symbols": these aren't unique and
		 * don't identify functions, so will confuse the profile
		 * output: */
		if (ehdr.e_machine == EM_ARM) {
			if (!strcmp(elf_name, "$a") ||
			    !strcmp(elf_name, "$d") ||
			    !strcmp(elf_name, "$t"))
				continue;
		}

1251 1252 1253 1254 1255 1256 1257
		if (opdsec && sym.st_shndx == opdidx) {
			u32 offset = sym.st_value - opdshdr.sh_addr;
			u64 *opd = opddata->d_buf + offset;
			sym.st_value = *opd;
			sym.st_shndx = elf_addr_to_index(elf, sym.st_value);
		}

1258 1259 1260 1261 1262
		sec = elf_getscn(elf, sym.st_shndx);
		if (!sec)
			goto out_elf_end;

		gelf_getshdr(sec, &shdr);
1263

1264
		if (is_label && !elf_sec__is_a(&shdr, secstrs, map->type))
1265 1266 1267
			continue;

		section_name = elf_sec__name(&shdr, secstrs);
1268

1269 1270 1271 1272 1273 1274 1275
		/* On ARM, symbols for thumb functions have 1 added to
		 * the symbol address as a flag - remove it */
		if ((ehdr.e_machine == EM_ARM) &&
		    (map->type == MAP__FUNCTION) &&
		    (sym.st_value & 1))
			--sym.st_value;

1276
		if (dso->kernel != DSO_TYPE_USER || kmodule) {
1277 1278 1279
			char dso_name[PATH_MAX];

			if (strcmp(section_name,
1280
				   (curr_dso->short_name +
1281
				    dso->short_name_len)) == 0)
1282 1283 1284 1285
				goto new_symbol;

			if (strcmp(section_name, ".text") == 0) {
				curr_map = map;
1286
				curr_dso = dso;
1287 1288 1289 1290
				goto new_symbol;
			}

			snprintf(dso_name, sizeof(dso_name),
1291
				 "%s%s", dso->short_name, section_name);
1292

1293
			curr_map = map_groups__find_by_name(kmap->kmaps, map->type, dso_name);
1294 1295 1296 1297 1298 1299
			if (curr_map == NULL) {
				u64 start = sym.st_value;

				if (kmodule)
					start += map->start + shdr.sh_offset;

1300
				curr_dso = dso__new(dso_name);
1301 1302
				if (curr_dso == NULL)
					goto out_elf_end;
1303 1304 1305
				curr_dso->kernel = dso->kernel;
				curr_dso->long_name = dso->long_name;
				curr_dso->long_name_len = dso->long_name_len;
1306
				curr_map = map__new2(start, curr_dso,
1307
						     map->type);
1308 1309 1310 1311
				if (curr_map == NULL) {
					dso__delete(curr_dso);
					goto out_elf_end;
				}
1312 1313
				curr_map->map_ip = identity__map_ip;
				curr_map->unmap_ip = identity__map_ip;
1314
				curr_dso->symtab_type = dso->symtab_type;
1315
				map_groups__insert(kmap->kmaps, curr_map);
1316
				dsos__add(&dso->node, curr_dso);
1317
				dso__set_loaded(curr_dso, map->type);
1318 1319 1320 1321
			} else
				curr_dso = curr_map->dso;

			goto new_symbol;
1322 1323
		}

1324
		if (curr_dso->adjust_symbols) {
1325 1326
			pr_debug4("%s: adjusting symbol: st_value: %#" PRIx64 " "
				  "sh_addr: %#" PRIx64 " sh_offset: %#" PRIx64 "\n", __func__,
1327 1328
				  (u64)sym.st_value, (u64)shdr.sh_addr,
				  (u64)shdr.sh_offset);
1329
			sym.st_value -= shdr.sh_addr - shdr.sh_offset;
1330
		}
1331 1332 1333 1334 1335
		/*
		 * We need to figure out if the object was created from C++ sources
		 * DWARF DW_compile_unit has this, but we don't always have access
		 * to it...
		 */
1336
		demangled = bfd_demangle(NULL, elf_name, DMGL_PARAMS | DMGL_ANSI);
1337
		if (demangled != NULL)
1338
			elf_name = demangled;
1339
new_symbol:
1340 1341
		f = symbol__new(sym.st_value, sym.st_size,
				GELF_ST_BIND(sym.st_info), elf_name);
1342
		free(demangled);
1343 1344 1345
		if (!f)
			goto out_elf_end;

1346
		if (filter && filter(curr_map, f))
1347
			symbol__delete(f);
1348
		else {
1349
			symbols__insert(&curr_dso->symbols[curr_map->type], f);
1350 1351
			nr++;
		}
1352 1353
	}

1354 1355 1356
	/*
	 * For misannotated, zeroed, ASM function sizes.
	 */
1357
	if (nr > 0) {
1358
		symbols__fixup_duplicate(&dso->symbols[map->type]);
1359
		symbols__fixup_end(&dso->symbols[map->type]);
1360 1361 1362 1363 1364 1365 1366 1367
		if (kmap) {
			/*
			 * We need to fixup this here too because we create new
			 * maps here, for things like vsyscall sections.
			 */
			__map_groups__fixup_end(kmap->kmaps, map->type);
		}
	}
1368 1369 1370 1371 1372 1373 1374
	err = nr;
out_elf_end:
	elf_end(elf);
out_close:
	return err;
}

1375
static bool dso__build_id_equal(const struct dso *dso, u8 *build_id)
1376
{
1377
	return memcmp(dso->build_id, build_id, sizeof(dso->build_id)) == 0;
1378 1379
}

1380
bool __dsos__read_build_ids(struct list_head *head, bool with_hits)
1381
{
1382
	bool have_build_id = false;
1383 1384
	struct dso *pos;

1385 1386 1387
	list_for_each_entry(pos, head, node) {
		if (with_hits && !pos->hit)
			continue;
1388 1389 1390 1391
		if (pos->has_build_id) {
			have_build_id = true;
			continue;
		}
1392 1393 1394 1395 1396
		if (filename__read_build_id(pos->long_name, pos->build_id,
					    sizeof(pos->build_id)) > 0) {
			have_build_id	  = true;
			pos->has_build_id = true;
		}
1397
	}
1398

1399
	return have_build_id;
1400 1401
}

1402 1403 1404 1405 1406
/*
 * Align offset to 4 bytes as needed for note name and descriptor data.
 */
#define NOTE_ALIGN(n) (((n) + 3) & -4U)

1407
static int elf_read_build_id(Elf *elf, void *bf, size_t size)
1408
{
1409
	int err = -1;
1410 1411
	GElf_Ehdr ehdr;
	GElf_Shdr shdr;
1412
	Elf_Data *data;
1413
	Elf_Scn *sec;
1414
	Elf_Kind ek;
1415
	void *ptr;
1416

1417 1418 1419
	if (size < BUILD_ID_SIZE)
		goto out;

1420 1421
	ek = elf_kind(elf);
	if (ek != ELF_K_ELF)
1422
		goto out;
1423

1424
	if (gelf_getehdr(elf, &ehdr) == NULL) {
1425
		pr_err("%s: cannot get elf header.\n", __func__);
1426
		goto out;
1427 1428
	}

1429 1430
	sec = elf_section_by_name(elf, &ehdr, &shdr,
				  ".note.gnu.build-id", NULL);
1431 1432 1433 1434
	if (sec == NULL) {
		sec = elf_section_by_name(elf, &ehdr, &shdr,
					  ".notes", NULL);
		if (sec == NULL)
1435
			goto out;
1436
	}
1437

1438 1439
	data = elf_getdata(sec, NULL);
	if (data == NULL)
1440
		goto out;
1441 1442 1443 1444

	ptr = data->d_buf;
	while (ptr < (data->d_buf + data->d_size)) {
		GElf_Nhdr *nhdr = ptr;
1445 1446
		size_t namesz = NOTE_ALIGN(nhdr->n_namesz),
		       descsz = NOTE_ALIGN(nhdr->n_descsz);
1447 1448 1449 1450 1451 1452 1453 1454
		const char *name;

		ptr += sizeof(*nhdr);
		name = ptr;
		ptr += namesz;
		if (nhdr->n_type == NT_GNU_BUILD_ID &&
		    nhdr->n_namesz == sizeof("GNU")) {
			if (memcmp(name, "GNU", sizeof("GNU")) == 0) {
1455 1456 1457 1458
				size_t sz = min(size, descsz);
				memcpy(bf, ptr, sz);
				memset(bf + sz, 0, size - sz);
				err = descsz;
1459 1460 1461 1462 1463
				break;
			}
		}
		ptr += descsz;
	}
1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488

out:
	return err;
}

int filename__read_build_id(const char *filename, void *bf, size_t size)
{
	int fd, err = -1;
	Elf *elf;

	if (size < BUILD_ID_SIZE)
		goto out;

	fd = open(filename, O_RDONLY);
	if (fd < 0)
		goto out;

	elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
	if (elf == NULL) {
		pr_debug2("%s: cannot read %s ELF file.\n", __func__, filename);
		goto out_close;
	}

	err = elf_read_build_id(elf, bf, size);

1489 1490 1491 1492 1493 1494 1495
	elf_end(elf);
out_close:
	close(fd);
out:
	return err;
}

1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509
int sysfs__read_build_id(const char *filename, void *build_id, size_t size)
{
	int fd, err = -1;

	if (size < BUILD_ID_SIZE)
		goto out;

	fd = open(filename, O_RDONLY);
	if (fd < 0)
		goto out;

	while (1) {
		char bf[BUFSIZ];
		GElf_Nhdr nhdr;
1510
		size_t namesz, descsz;
1511 1512 1513 1514

		if (read(fd, &nhdr, sizeof(nhdr)) != sizeof(nhdr))
			break;

1515 1516
		namesz = NOTE_ALIGN(nhdr.n_namesz);
		descsz = NOTE_ALIGN(nhdr.n_descsz);
1517 1518
		if (nhdr.n_type == NT_GNU_BUILD_ID &&
		    nhdr.n_namesz == sizeof("GNU")) {
1519
			if (read(fd, bf, namesz) != (ssize_t)namesz)
1520 1521
				break;
			if (memcmp(bf, "GNU", sizeof("GNU")) == 0) {
1522 1523 1524
				size_t sz = min(descsz, size);
				if (read(fd, build_id, sz) == (ssize_t)sz) {
					memset(build_id + sz, 0, size - sz);
1525 1526 1527
					err = 0;
					break;
				}
1528
			} else if (read(fd, bf, descsz) != (ssize_t)descsz)
1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540
				break;
		} else {
			int n = namesz + descsz;
			if (read(fd, bf, n) != n)
				break;
		}
	}
	close(fd);
out:
	return err;
}

1541
char dso__symtab_origin(const struct dso *dso)
1542 1543
{
	static const char origin[] = {
1544 1545 1546 1547 1548 1549 1550 1551 1552 1553
		[SYMTAB__KALLSYMS]	      = 'k',
		[SYMTAB__JAVA_JIT]	      = 'j',
		[SYMTAB__BUILD_ID_CACHE]      = 'B',
		[SYMTAB__FEDORA_DEBUGINFO]    = 'f',
		[SYMTAB__UBUNTU_DEBUGINFO]    = 'u',
		[SYMTAB__BUILDID_DEBUGINFO]   = 'b',
		[SYMTAB__SYSTEM_PATH_DSO]     = 'd',
		[SYMTAB__SYSTEM_PATH_KMODULE] = 'K',
		[SYMTAB__GUEST_KALLSYMS]      =  'g',
		[SYMTAB__GUEST_KMODULE]	      =  'G',
1554 1555
	};

1556
	if (dso == NULL || dso->symtab_type == SYMTAB__NOT_FOUND)
1557
		return '!';
1558
	return origin[dso->symtab_type];
1559 1560
}

1561
int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter)
1562
{
1563
	int size = PATH_MAX;
1564
	char *name;
1565 1566
	int ret = -1;
	int fd;
1567
	struct machine *machine;
1568
	const char *root_dir;
1569
	int want_symtab;
1570

1571
	dso__set_loaded(dso, map->type);
1572

1573 1574 1575 1576
	if (dso->kernel == DSO_TYPE_KERNEL)
		return dso__load_kernel_sym(dso, map, filter);
	else if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
		return dso__load_guest_kernel_sym(dso, map, filter);
1577

1578 1579
	if (map->groups && map->groups->machine)
		machine = map->groups->machine;
1580
	else
1581
		machine = NULL;
1582 1583

	name = malloc(size);
1584 1585 1586
	if (!name)
		return -1;

1587
	dso->adjust_symbols = 0;
1588

1589
	if (strncmp(dso->name, "/tmp/perf-", 10) == 0) {
1590 1591
		struct stat st;

1592
		if (lstat(dso->name, &st) < 0)
1593 1594 1595 1596 1597 1598 1599 1600
			return -1;

		if (st.st_uid && (st.st_uid != geteuid())) {
			pr_warning("File %s not owned by current user or root, "
				"ignoring it.\n", dso->name);
			return -1;
		}

1601 1602
		ret = dso__load_perf_map(dso, map, filter);
		dso->symtab_type = ret > 0 ? SYMTAB__JAVA_JIT :
1603
					      SYMTAB__NOT_FOUND;
1604 1605 1606
		return ret;
	}

1607 1608 1609 1610
	/* Iterate over candidate debug images.
	 * On the first pass, only load images if they have a full symtab.
	 * Failing that, do a second pass where we accept .dynsym also
	 */
1611 1612
	want_symtab = 1;
restart:
1613 1614 1615 1616
	for (dso->symtab_type = SYMTAB__BUILD_ID_CACHE;
	     dso->symtab_type != SYMTAB__NOT_FOUND;
	     dso->symtab_type++) {
		switch (dso->symtab_type) {
1617
		case SYMTAB__BUILD_ID_CACHE:
1618 1619
			/* skip the locally configured cache if a symfs is given */
			if (symbol_conf.symfs[0] ||
1620
			    (dso__build_id_filename(dso, name, size) == NULL)) {
1621
				continue;
1622
			}
1623
			break;
1624
		case SYMTAB__FEDORA_DEBUGINFO:
1625
			snprintf(name, size, "%s/usr/lib/debug%s.debug",
1626
				 symbol_conf.symfs, dso->long_name);
1627
			break;
1628
		case SYMTAB__UBUNTU_DEBUGINFO:
1629
			snprintf(name, size, "%s/usr/lib/debug%s",
1630
				 symbol_conf.symfs, dso->long_name);
1631
			break;
1632
		case SYMTAB__BUILDID_DEBUGINFO: {
1633 1634
			char build_id_hex[BUILD_ID_SIZE * 2 + 1];

1635
			if (!dso->has_build_id)
1636 1637
				continue;

1638 1639
			build_id__sprintf(dso->build_id,
					  sizeof(dso->build_id),
1640 1641
					  build_id_hex);
			snprintf(name, size,
1642 1643
				 "%s/usr/lib/debug/.build-id/%.2s/%s.debug",
				 symbol_conf.symfs, build_id_hex, build_id_hex + 2);
1644
			}
1645
			break;
1646
		case SYMTAB__SYSTEM_PATH_DSO:
1647
			snprintf(name, size, "%s%s",
1648
			     symbol_conf.symfs, dso->long_name);
1649
			break;
1650
		case SYMTAB__GUEST_KMODULE:
K
Kyle McMartin 已提交
1651 1652
			if (map->groups && machine)
				root_dir = machine->root_dir;
1653 1654
			else
				root_dir = "";
1655
			snprintf(name, size, "%s%s%s", symbol_conf.symfs,
1656
				 root_dir, dso->long_name);
1657 1658
			break;

1659
		case SYMTAB__SYSTEM_PATH_KMODULE:
1660
			snprintf(name, size, "%s%s", symbol_conf.symfs,
1661
				 dso->long_name);
1662
			break;
1663
		default:;
1664
		}
1665 1666

		/* Name is now the name of the next image to try */
1667
		fd = open(name, O_RDONLY);
1668 1669
		if (fd < 0)
			continue;
1670

1671
		ret = dso__load_sym(dso, map, name, fd, filter, 0,
1672 1673
				    want_symtab);
		close(fd);
1674

1675 1676 1677 1678 1679 1680
		/*
		 * Some people seem to have debuginfo files _WITHOUT_ debug
		 * info!?!?
		 */
		if (!ret)
			continue;
1681

1682
		if (ret > 0) {
1683 1684
			int nr_plt = dso__synthesize_plt_symbols(dso, map,
								 filter);
1685 1686 1687 1688
			if (nr_plt > 0)
				ret += nr_plt;
			break;
		}
1689
	}
1690

1691 1692 1693 1694 1695 1696 1697 1698 1699
	/*
	 * If we wanted a full symtab but no image had one,
	 * relax our requirements and repeat the search.
	 */
	if (ret <= 0 && want_symtab) {
		want_symtab = 0;
		goto restart;
	}

1700
	free(name);
1701
	if (ret < 0 && strstr(dso->name, " (deleted)") != NULL)
1702
		return 0;
1703 1704 1705
	return ret;
}

1706
struct map *map_groups__find_by_name(struct map_groups *mg,
1707
				     enum map_type type, const char *name)
1708 1709 1710
{
	struct rb_node *nd;

1711
	for (nd = rb_first(&mg->maps[type]); nd; nd = rb_next(nd)) {
1712 1713
		struct map *map = rb_entry(nd, struct map, rb_node);

1714
		if (map->dso && strcmp(map->dso->short_name, name) == 0)
1715 1716 1717 1718 1719 1720
			return map;
	}

	return NULL;
}

1721 1722
static int dso__kernel_module_get_build_id(struct dso *dso,
					   const char *root_dir)
1723 1724 1725 1726 1727 1728
{
	char filename[PATH_MAX];
	/*
	 * kernel module short names are of the form "[module]" and
	 * we need just "module" here.
	 */
1729
	const char *name = dso->short_name + 1;
1730 1731

	snprintf(filename, sizeof(filename),
1732 1733
		 "%s/sys/module/%.*s/notes/.note.gnu.build-id",
		 root_dir, (int)strlen(name) - 1, name);
1734

1735 1736 1737
	if (sysfs__read_build_id(filename, dso->build_id,
				 sizeof(dso->build_id)) == 0)
		dso->has_build_id = true;
1738 1739 1740 1741

	return 0;
}

1742
static int map_groups__set_modules_path_dir(struct map_groups *mg,
1743
				const char *dir_name)
1744
{
1745
	struct dirent *dent;
1746
	DIR *dir = opendir(dir_name);
1747
	int ret = 0;
1748

1749
	if (!dir) {
1750
		pr_debug("%s: cannot open %s dir\n", __func__, dir_name);
1751 1752
		return -1;
	}
1753

1754 1755
	while ((dent = readdir(dir)) != NULL) {
		char path[PATH_MAX];
1756 1757 1758
		struct stat st;

		/*sshfs might return bad dent->d_type, so we have to stat*/
1759
		snprintf(path, sizeof(path), "%s/%s", dir_name, dent->d_name);
1760 1761
		if (stat(path, &st))
			continue;
1762

1763
		if (S_ISDIR(st.st_mode)) {
1764 1765 1766 1767
			if (!strcmp(dent->d_name, ".") ||
			    !strcmp(dent->d_name, ".."))
				continue;

1768
			ret = map_groups__set_modules_path_dir(mg, path);
1769 1770
			if (ret < 0)
				goto out;
1771 1772 1773 1774
		} else {
			char *dot = strrchr(dent->d_name, '.'),
			     dso_name[PATH_MAX];
			struct map *map;
1775
			char *long_name;
1776 1777 1778 1779 1780 1781

			if (dot == NULL || strcmp(dot, ".ko"))
				continue;
			snprintf(dso_name, sizeof(dso_name), "[%.*s]",
				 (int)(dot - dent->d_name), dent->d_name);

1782
			strxfrchar(dso_name, '-', '_');
1783 1784
			map = map_groups__find_by_name(mg, MAP__FUNCTION,
						       dso_name);
1785 1786 1787
			if (map == NULL)
				continue;

1788
			long_name = strdup(path);
1789 1790 1791 1792
			if (long_name == NULL) {
				ret = -1;
				goto out;
			}
1793
			dso__set_long_name(map->dso, long_name);
1794
			map->dso->lname_alloc = 1;
1795
			dso__kernel_module_get_build_id(map->dso, "");
1796 1797
		}
	}
1798

1799
out:
1800
	closedir(dir);
1801
	return ret;
1802
}
1803

1804
static char *get_kernel_version(const char *root_dir)
1805
{
1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830
	char version[PATH_MAX];
	FILE *file;
	char *name, *tmp;
	const char *prefix = "Linux version ";

	sprintf(version, "%s/proc/version", root_dir);
	file = fopen(version, "r");
	if (!file)
		return NULL;

	version[0] = '\0';
	tmp = fgets(version, sizeof(version), file);
	fclose(file);

	name = strstr(version, prefix);
	if (!name)
		return NULL;
	name += strlen(prefix);
	tmp = strchr(name, ' ');
	if (tmp)
		*tmp = '\0';

	return strdup(name);
}

1831
static int machine__set_modules_path(struct machine *machine)
1832 1833
{
	char *version;
1834
	char modules_path[PATH_MAX];
1835

1836
	version = get_kernel_version(machine->root_dir);
1837
	if (!version)
1838
		return -1;
1839

1840
	snprintf(modules_path, sizeof(modules_path), "%s/lib/modules/%s/kernel",
1841
		 machine->root_dir, version);
1842
	free(version);
1843

1844
	return map_groups__set_modules_path_dir(&machine->kmaps, modules_path);
1845 1846
}

1847 1848 1849 1850 1851
/*
 * Constructor variant for modules (where we know from /proc/modules where
 * they are loaded) and for vmlinux, where only after we load all the
 * symbols we'll know where it starts and ends.
 */
1852
static struct map *map__new2(u64 start, struct dso *dso, enum map_type type)
1853
{
1854 1855 1856
	struct map *map = calloc(1, (sizeof(*map) +
				     (dso->kernel ? sizeof(struct kmap) : 0)));
	if (map != NULL) {
1857
		/*
1858
		 * ->end will be filled after we load all the symbols
1859
		 */
1860
		map__init(map, type, start, 0, 0, dso);
1861
	}
1862

1863
	return map;
1864 1865
}

1866
struct map *machine__new_module(struct machine *machine, u64 start,
1867
				const char *filename)
1868 1869
{
	struct map *map;
1870
	struct dso *dso = __dsos__findnew(&machine->kernel_dsos, filename);
1871 1872 1873 1874 1875 1876 1877 1878

	if (dso == NULL)
		return NULL;

	map = map__new2(start, dso, MAP__FUNCTION);
	if (map == NULL)
		return NULL;

1879
	if (machine__is_host(machine))
1880
		dso->symtab_type = SYMTAB__SYSTEM_PATH_KMODULE;
1881
	else
1882
		dso->symtab_type = SYMTAB__GUEST_KMODULE;
1883
	map_groups__insert(&machine->kmaps, map);
1884 1885 1886
	return map;
}

1887
static int machine__create_modules(struct machine *machine)
1888 1889 1890
{
	char *line = NULL;
	size_t n;
1891
	FILE *file;
1892
	struct map *map;
1893 1894 1895
	const char *modules;
	char path[PATH_MAX];

1896
	if (machine__is_default_guest(machine))
1897 1898
		modules = symbol_conf.default_guest_modules;
	else {
1899
		sprintf(path, "%s/proc/modules", machine->root_dir);
1900 1901
		modules = path;
	}
1902

1903 1904 1905
	if (symbol__restricted_filename(path, "/proc/modules"))
		return -1;

1906
	file = fopen(modules, "r");
1907 1908
	if (file == NULL)
		return -1;
1909

1910 1911 1912 1913 1914
	while (!feof(file)) {
		char name[PATH_MAX];
		u64 start;
		char *sep;
		int line_len;
1915

1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937
		line_len = getline(&line, &n, file);
		if (line_len < 0)
			break;

		if (!line)
			goto out_failure;

		line[--line_len] = '\0'; /* \n */

		sep = strrchr(line, 'x');
		if (sep == NULL)
			continue;

		hex2u64(sep + 1, &start);

		sep = strchr(line, ' ');
		if (sep == NULL)
			continue;

		*sep = '\0';

		snprintf(name, sizeof(name), "[%s]", line);
1938
		map = machine__new_module(machine, start, name);
1939
		if (map == NULL)
1940
			goto out_delete_line;
1941
		dso__kernel_module_get_build_id(map->dso, machine->root_dir);
1942
	}
1943 1944 1945 1946

	free(line);
	fclose(file);

1947
	return machine__set_modules_path(machine);
1948 1949 1950 1951 1952

out_delete_line:
	free(line);
out_failure:
	return -1;
1953 1954
}

1955
int dso__load_vmlinux(struct dso *dso, struct map *map,
1956
		      const char *vmlinux, symbol_filter_t filter)
1957
{
1958
	int err = -1, fd;
1959
	char symfs_vmlinux[PATH_MAX];
1960

1961
	snprintf(symfs_vmlinux, sizeof(symfs_vmlinux), "%s%s",
1962 1963
		 symbol_conf.symfs, vmlinux);
	fd = open(symfs_vmlinux, O_RDONLY);
1964 1965 1966
	if (fd < 0)
		return -1;

1967 1968 1969
	dso__set_long_name(dso, (char *)vmlinux);
	dso__set_loaded(dso, map->type);
	err = dso__load_sym(dso, map, symfs_vmlinux, fd, filter, 0, 0);
1970 1971
	close(fd);

1972
	if (err > 0)
1973
		pr_debug("Using %s for symbols\n", symfs_vmlinux);
1974

1975 1976 1977
	return err;
}

1978
int dso__load_vmlinux_path(struct dso *dso, struct map *map,
1979
			   symbol_filter_t filter)
1980 1981
{
	int i, err = 0;
1982
	char *filename;
1983 1984

	pr_debug("Looking at the vmlinux_path (%d entries long)\n",
1985 1986
		 vmlinux_path__nr_entries + 1);

1987
	filename = dso__build_id_filename(dso, NULL, 0);
1988
	if (filename != NULL) {
1989
		err = dso__load_vmlinux(dso, map, filename, filter);
1990
		if (err > 0) {
1991
			dso__set_long_name(dso, filename);
1992 1993 1994 1995
			goto out;
		}
		free(filename);
	}
1996 1997

	for (i = 0; i < vmlinux_path__nr_entries; ++i) {
1998
		err = dso__load_vmlinux(dso, map, vmlinux_path[i], filter);
1999
		if (err > 0) {
2000
			dso__set_long_name(dso, strdup(vmlinux_path[i]));
2001 2002 2003
			break;
		}
	}
2004
out:
2005 2006 2007
	return err;
}

2008
static int dso__load_kernel_sym(struct dso *dso, struct map *map,
2009
				symbol_filter_t filter)
2010
{
2011
	int err;
2012 2013
	const char *kallsyms_filename = NULL;
	char *kallsyms_allocated_filename = NULL;
2014
	/*
2015 2016
	 * Step 1: if the user specified a kallsyms or vmlinux filename, use
	 * it and only it, reporting errors to the user if it cannot be used.
2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028
	 *
	 * For instance, try to analyse an ARM perf.data file _without_ a
	 * build-id, or if the user specifies the wrong path to the right
	 * vmlinux file, obviously we can't fallback to another vmlinux (a
	 * x86_86 one, on the machine where analysis is being performed, say),
	 * or worse, /proc/kallsyms.
	 *
	 * If the specified file _has_ a build-id and there is a build-id
	 * section in the perf.data file, we will still do the expected
	 * validation in dso__load_vmlinux and will bail out if they don't
	 * match.
	 */
2029 2030 2031 2032 2033
	if (symbol_conf.kallsyms_name != NULL) {
		kallsyms_filename = symbol_conf.kallsyms_name;
		goto do_kallsyms;
	}

2034
	if (symbol_conf.vmlinux_name != NULL) {
2035
		err = dso__load_vmlinux(dso, map,
2036
					symbol_conf.vmlinux_name, filter);
2037
		if (err > 0) {
2038
			dso__set_long_name(dso,
2039 2040 2041 2042
					   strdup(symbol_conf.vmlinux_name));
			goto out_fixup;
		}
		return err;
2043
	}
2044 2045

	if (vmlinux_path != NULL) {
2046
		err = dso__load_vmlinux_path(dso, map, filter);
2047 2048
		if (err > 0)
			goto out_fixup;
2049 2050
	}

2051 2052 2053 2054
	/* do not try local files if a symfs was given */
	if (symbol_conf.symfs[0] != 0)
		return -1;

2055 2056 2057 2058 2059
	/*
	 * Say the kernel DSO was created when processing the build-id header table,
	 * we have a build-id, so check if it is the same as the running kernel,
	 * using it if it is.
	 */
2060
	if (dso->has_build_id) {
2061
		u8 kallsyms_build_id[BUILD_ID_SIZE];
2062
		char sbuild_id[BUILD_ID_SIZE * 2 + 1];
2063 2064

		if (sysfs__read_build_id("/sys/kernel/notes", kallsyms_build_id,
2065
					 sizeof(kallsyms_build_id)) == 0) {
2066
			if (dso__build_id_equal(dso, kallsyms_build_id)) {
2067
				kallsyms_filename = "/proc/kallsyms";
2068
				goto do_kallsyms;
2069
			}
2070
		}
2071 2072 2073 2074
		/*
		 * Now look if we have it on the build-id cache in
		 * $HOME/.debug/[kernel.kallsyms].
		 */
2075
		build_id__sprintf(dso->build_id, sizeof(dso->build_id),
2076 2077 2078 2079
				  sbuild_id);

		if (asprintf(&kallsyms_allocated_filename,
			     "%s/.debug/[kernel.kallsyms]/%s",
2080 2081
			     getenv("HOME"), sbuild_id) == -1) {
			pr_err("Not enough memory for kallsyms file lookup\n");
2082
			return -1;
2083
		}
2084

2085 2086
		kallsyms_filename = kallsyms_allocated_filename;

2087
		if (access(kallsyms_filename, F_OK)) {
2088 2089
			pr_err("No kallsyms or vmlinux with build-id %s "
			       "was found\n", sbuild_id);
2090
			free(kallsyms_allocated_filename);
2091
			return -1;
2092
		}
2093 2094 2095 2096 2097
	} else {
		/*
		 * Last resort, if we don't have a build-id and couldn't find
		 * any vmlinux file, try the running kernel kallsyms table.
		 */
2098 2099
		kallsyms_filename = "/proc/kallsyms";
	}
2100

2101
do_kallsyms:
2102
	err = dso__load_kallsyms(dso, kallsyms_filename, map, filter);
2103 2104
	if (err > 0)
		pr_debug("Using %s for symbols\n", kallsyms_filename);
2105
	free(kallsyms_allocated_filename);
2106 2107

	if (err > 0) {
2108
out_fixup:
2109
		if (kallsyms_filename != NULL)
2110
			dso__set_long_name(dso, strdup("[kernel.kallsyms]"));
2111 2112
		map__fixup_start(map);
		map__fixup_end(map);
2113
	}
2114

2115 2116 2117
	return err;
}

2118 2119
static int dso__load_guest_kernel_sym(struct dso *dso, struct map *map,
				      symbol_filter_t filter)
2120 2121 2122
{
	int err;
	const char *kallsyms_filename = NULL;
2123
	struct machine *machine;
2124 2125 2126 2127 2128 2129
	char path[PATH_MAX];

	if (!map->groups) {
		pr_debug("Guest kernel map hasn't the point to groups\n");
		return -1;
	}
2130
	machine = map->groups->machine;
2131

2132
	if (machine__is_default_guest(machine)) {
2133 2134 2135 2136 2137 2138
		/*
		 * if the user specified a vmlinux filename, use it and only
		 * it, reporting errors to the user if it cannot be used.
		 * Or use file guest_kallsyms inputted by user on commandline
		 */
		if (symbol_conf.default_guest_vmlinux_name != NULL) {
2139
			err = dso__load_vmlinux(dso, map,
2140 2141 2142 2143 2144 2145 2146 2147
				symbol_conf.default_guest_vmlinux_name, filter);
			goto out_try_fixup;
		}

		kallsyms_filename = symbol_conf.default_guest_kallsyms;
		if (!kallsyms_filename)
			return -1;
	} else {
2148
		sprintf(path, "%s/proc/kallsyms", machine->root_dir);
2149 2150 2151
		kallsyms_filename = path;
	}

2152
	err = dso__load_kallsyms(dso, kallsyms_filename, map, filter);
2153 2154 2155 2156 2157 2158
	if (err > 0)
		pr_debug("Using %s for symbols\n", kallsyms_filename);

out_try_fixup:
	if (err > 0) {
		if (kallsyms_filename != NULL) {
2159
			machine__mmap_name(machine, path, sizeof(path));
2160
			dso__set_long_name(dso, strdup(path));
2161 2162 2163 2164 2165 2166 2167
		}
		map__fixup_start(map);
		map__fixup_end(map);
	}

	return err;
}
2168

2169
static void dsos__add(struct list_head *head, struct dso *dso)
2170
{
2171
	list_add_tail(&dso->node, head);
2172 2173
}

2174
static struct dso *dsos__find(struct list_head *head, const char *name)
2175 2176 2177
{
	struct dso *pos;

2178
	list_for_each_entry(pos, head, node)
2179
		if (strcmp(pos->long_name, name) == 0)
2180 2181 2182 2183
			return pos;
	return NULL;
}

2184
struct dso *__dsos__findnew(struct list_head *head, const char *name)
2185
{
2186
	struct dso *dso = dsos__find(head, name);
2187

2188
	if (!dso) {
2189
		dso = dso__new(name);
2190
		if (dso != NULL) {
2191
			dsos__add(head, dso);
2192 2193
			dso__set_basename(dso);
		}
2194
	}
2195 2196 2197 2198

	return dso;
}

2199
size_t __dsos__fprintf(struct list_head *head, FILE *fp)
2200 2201
{
	struct dso *pos;
2202
	size_t ret = 0;
2203

2204 2205 2206
	list_for_each_entry(pos, head, node) {
		int i;
		for (i = 0; i < MAP__NR_TYPES; ++i)
2207
			ret += dso__fprintf(pos, i, fp);
2208
	}
2209 2210

	return ret;
2211 2212
}

2213
size_t machines__fprintf_dsos(struct rb_root *machines, FILE *fp)
2214
{
2215
	struct rb_node *nd;
2216
	size_t ret = 0;
2217

2218
	for (nd = rb_first(machines); nd; nd = rb_next(nd)) {
2219
		struct machine *pos = rb_entry(nd, struct machine, rb_node);
2220 2221
		ret += __dsos__fprintf(&pos->kernel_dsos, fp);
		ret += __dsos__fprintf(&pos->user_dsos, fp);
2222
	}
2223 2224

	return ret;
2225 2226
}

2227 2228
static size_t __dsos__fprintf_buildid(struct list_head *head, FILE *fp,
				      bool with_hits)
2229 2230 2231 2232
{
	struct dso *pos;
	size_t ret = 0;

2233
	list_for_each_entry(pos, head, node) {
2234 2235
		if (with_hits && !pos->hit)
			continue;
2236
		ret += dso__fprintf_buildid(pos, fp);
2237
		ret += fprintf(fp, " %s\n", pos->long_name);
2238 2239 2240 2241
	}
	return ret;
}

2242 2243
size_t machine__fprintf_dsos_buildid(struct machine *machine, FILE *fp,
				     bool with_hits)
2244
{
2245 2246
	return __dsos__fprintf_buildid(&machine->kernel_dsos, fp, with_hits) +
	       __dsos__fprintf_buildid(&machine->user_dsos, fp, with_hits);
2247 2248
}

2249 2250
size_t machines__fprintf_dsos_buildid(struct rb_root *machines,
				      FILE *fp, bool with_hits)
2251
{
2252 2253 2254
	struct rb_node *nd;
	size_t ret = 0;

2255
	for (nd = rb_first(machines); nd; nd = rb_next(nd)) {
2256
		struct machine *pos = rb_entry(nd, struct machine, rb_node);
2257
		ret += machine__fprintf_dsos_buildid(pos, fp, with_hits);
2258 2259
	}
	return ret;
2260 2261
}

2262 2263 2264
static struct dso*
dso__kernel_findnew(struct machine *machine, const char *name,
		    const char *short_name, int dso_type)
2265
{
2266 2267 2268 2269
	/*
	 * The kernel dso could be created by build_id processing.
	 */
	struct dso *dso = __dsos__findnew(&machine->kernel_dsos, name);
2270

2271 2272 2273 2274
	/*
	 * We need to run this in all cases, since during the build_id
	 * processing we had no idea this was the kernel dso.
	 */
2275
	if (dso != NULL) {
2276 2277
		dso__set_short_name(dso, short_name);
		dso->kernel = dso_type;
2278 2279
	}

2280
	return dso;
2281 2282
}

2283
void dso__read_running_kernel_build_id(struct dso *dso, struct machine *machine)
2284
{
2285 2286
	char path[PATH_MAX];

2287
	if (machine__is_default_guest(machine))
2288
		return;
2289
	sprintf(path, "%s/sys/kernel/notes", machine->root_dir);
2290 2291 2292
	if (sysfs__read_build_id(path, dso->build_id,
				 sizeof(dso->build_id)) == 0)
		dso->has_build_id = true;
2293 2294
}

2295
static struct dso *machine__get_kernel(struct machine *machine)
2296
{
2297 2298
	const char *vmlinux_name = NULL;
	struct dso *kernel;
2299

2300
	if (machine__is_host(machine)) {
2301
		vmlinux_name = symbol_conf.vmlinux_name;
2302 2303 2304 2305 2306 2307
		if (!vmlinux_name)
			vmlinux_name = "[kernel.kallsyms]";

		kernel = dso__kernel_findnew(machine, vmlinux_name,
					     "[kernel]",
					     DSO_TYPE_KERNEL);
2308
	} else {
2309 2310
		char bf[PATH_MAX];

2311
		if (machine__is_default_guest(machine))
2312
			vmlinux_name = symbol_conf.default_guest_vmlinux_name;
2313 2314 2315 2316 2317 2318 2319
		if (!vmlinux_name)
			vmlinux_name = machine__mmap_name(machine, bf,
							  sizeof(bf));

		kernel = dso__kernel_findnew(machine, vmlinux_name,
					     "[guest.kernel]",
					     DSO_TYPE_GUEST_KERNEL);
2320
	}
2321

2322
	if (kernel != NULL && (!kernel->has_build_id))
2323
		dso__read_running_kernel_build_id(kernel, machine);
2324

2325 2326 2327
	return kernel;
}

2328 2329 2330 2331 2332
struct process_args {
	u64 start;
};

static int symbol__in_kernel(void *arg, const char *name,
2333
			     char type __used, u64 start, u64 end __used)
2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361
{
	struct process_args *args = arg;

	if (strchr(name, '['))
		return 0;

	args->start = start;
	return 1;
}

/* Figure out the start address of kernel map from /proc/kallsyms */
static u64 machine__get_kernel_start_addr(struct machine *machine)
{
	const char *filename;
	char path[PATH_MAX];
	struct process_args args;

	if (machine__is_host(machine)) {
		filename = "/proc/kallsyms";
	} else {
		if (machine__is_default_guest(machine))
			filename = (char *)symbol_conf.default_guest_kallsyms;
		else {
			sprintf(path, "%s/proc/kallsyms", machine->root_dir);
			filename = path;
		}
	}

2362 2363 2364
	if (symbol__restricted_filename(filename, "/proc/kallsyms"))
		return 0;

2365 2366 2367 2368 2369 2370
	if (kallsyms__parse(filename, &args, symbol__in_kernel) <= 0)
		return 0;

	return args.start;
}

2371
int __machine__create_kernel_maps(struct machine *machine, struct dso *kernel)
2372
{
2373
	enum map_type type;
2374
	u64 start = machine__get_kernel_start_addr(machine);
2375

2376
	for (type = 0; type < MAP__NR_TYPES; ++type) {
2377 2378
		struct kmap *kmap;

2379 2380
		machine->vmlinux_maps[type] = map__new2(start, kernel, type);
		if (machine->vmlinux_maps[type] == NULL)
2381
			return -1;
2382

2383 2384 2385 2386 2387 2388 2389
		machine->vmlinux_maps[type]->map_ip =
			machine->vmlinux_maps[type]->unmap_ip =
				identity__map_ip;
		kmap = map__kmap(machine->vmlinux_maps[type]);
		kmap->kmaps = &machine->kmaps;
		map_groups__insert(&machine->kmaps,
				   machine->vmlinux_maps[type]);
2390 2391 2392
	}

	return 0;
2393 2394
}

2395
void machine__destroy_kernel_maps(struct machine *machine)
2396 2397 2398 2399 2400 2401
{
	enum map_type type;

	for (type = 0; type < MAP__NR_TYPES; ++type) {
		struct kmap *kmap;

2402
		if (machine->vmlinux_maps[type] == NULL)
2403 2404
			continue;

2405 2406 2407
		kmap = map__kmap(machine->vmlinux_maps[type]);
		map_groups__remove(&machine->kmaps,
				   machine->vmlinux_maps[type]);
2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420
		if (kmap->ref_reloc_sym) {
			/*
			 * ref_reloc_sym is shared among all maps, so free just
			 * on one of them.
			 */
			if (type == MAP__FUNCTION) {
				free((char *)kmap->ref_reloc_sym->name);
				kmap->ref_reloc_sym->name = NULL;
				free(kmap->ref_reloc_sym);
			}
			kmap->ref_reloc_sym = NULL;
		}

2421 2422
		map__delete(machine->vmlinux_maps[type]);
		machine->vmlinux_maps[type] = NULL;
2423 2424 2425
	}
}

2426
int machine__create_kernel_maps(struct machine *machine)
2427
{
2428
	struct dso *kernel = machine__get_kernel(machine);
2429 2430

	if (kernel == NULL ||
2431
	    __machine__create_kernel_maps(machine, kernel) < 0)
2432 2433
		return -1;

2434
	if (symbol_conf.use_modules && machine__create_modules(machine) < 0)
2435 2436 2437 2438
		pr_debug("Problems creating module maps, continuing anyway...\n");
	/*
	 * Now that we have all the maps created, just set the ->end of them:
	 */
2439
	map_groups__fixup_end(&machine->kmaps);
2440 2441 2442
	return 0;
}

2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470
static void vmlinux_path__exit(void)
{
	while (--vmlinux_path__nr_entries >= 0) {
		free(vmlinux_path[vmlinux_path__nr_entries]);
		vmlinux_path[vmlinux_path__nr_entries] = NULL;
	}

	free(vmlinux_path);
	vmlinux_path = NULL;
}

static int vmlinux_path__init(void)
{
	struct utsname uts;
	char bf[PATH_MAX];

	vmlinux_path = malloc(sizeof(char *) * 5);
	if (vmlinux_path == NULL)
		return -1;

	vmlinux_path[vmlinux_path__nr_entries] = strdup("vmlinux");
	if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
		goto out_fail;
	++vmlinux_path__nr_entries;
	vmlinux_path[vmlinux_path__nr_entries] = strdup("/boot/vmlinux");
	if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
		goto out_fail;
	++vmlinux_path__nr_entries;
2471 2472 2473 2474 2475 2476 2477 2478

	/* only try running kernel version if no symfs was given */
	if (symbol_conf.symfs[0] != 0)
		return 0;

	if (uname(&uts) < 0)
		return -1;

2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502
	snprintf(bf, sizeof(bf), "/boot/vmlinux-%s", uts.release);
	vmlinux_path[vmlinux_path__nr_entries] = strdup(bf);
	if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
		goto out_fail;
	++vmlinux_path__nr_entries;
	snprintf(bf, sizeof(bf), "/lib/modules/%s/build/vmlinux", uts.release);
	vmlinux_path[vmlinux_path__nr_entries] = strdup(bf);
	if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
		goto out_fail;
	++vmlinux_path__nr_entries;
	snprintf(bf, sizeof(bf), "/usr/lib/debug/lib/modules/%s/vmlinux",
		 uts.release);
	vmlinux_path[vmlinux_path__nr_entries] = strdup(bf);
	if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
		goto out_fail;
	++vmlinux_path__nr_entries;

	return 0;

out_fail:
	vmlinux_path__exit();
	return -1;
}

2503
size_t machine__fprintf_vmlinux_path(struct machine *machine, FILE *fp)
2504 2505 2506
{
	int i;
	size_t printed = 0;
2507
	struct dso *kdso = machine->vmlinux_maps[MAP__FUNCTION]->dso;
2508 2509 2510 2511 2512 2513

	if (kdso->has_build_id) {
		char filename[PATH_MAX];
		if (dso__build_id_filename(kdso, filename, sizeof(filename)))
			printed += fprintf(fp, "[0] %s\n", filename);
	}
2514 2515

	for (i = 0; i < vmlinux_path__nr_entries; ++i)
2516 2517
		printed += fprintf(fp, "[%d] %s\n",
				   i + kdso->has_build_id, vmlinux_path[i]);
2518 2519 2520 2521

	return printed;
}

2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535
static int setup_list(struct strlist **list, const char *list_str,
		      const char *list_name)
{
	if (list_str == NULL)
		return 0;

	*list = strlist__new(true, list_str);
	if (!*list) {
		pr_err("problems parsing %s list\n", list_name);
		return -1;
	}
	return 0;
}

2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554
static bool symbol__read_kptr_restrict(void)
{
	bool value = false;

	if (geteuid() != 0) {
		FILE *fp = fopen("/proc/sys/kernel/kptr_restrict", "r");
		if (fp != NULL) {
			char line[8];

			if (fgets(line, sizeof(line), fp) != NULL)
				value = atoi(line) != 0;

			fclose(fp);
		}
	}

	return value;
}

2555
int symbol__init(void)
2556
{
2557 2558
	const char *symfs;

2559 2560 2561
	if (symbol_conf.initialized)
		return 0;

2562 2563
	symbol_conf.priv_size = ALIGN(symbol_conf.priv_size, sizeof(u64));

2564
	elf_version(EV_CURRENT);
2565 2566 2567
	if (symbol_conf.sort_by_name)
		symbol_conf.priv_size += (sizeof(struct symbol_name_rb_node) -
					  sizeof(struct symbol));
2568

2569
	if (symbol_conf.try_vmlinux_path && vmlinux_path__init() < 0)
2570 2571
		return -1;

2572 2573 2574 2575 2576
	if (symbol_conf.field_sep && *symbol_conf.field_sep == '.') {
		pr_err("'.' is the only non valid --field-separator argument\n");
		return -1;
	}

2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588
	if (setup_list(&symbol_conf.dso_list,
		       symbol_conf.dso_list_str, "dso") < 0)
		return -1;

	if (setup_list(&symbol_conf.comm_list,
		       symbol_conf.comm_list_str, "comm") < 0)
		goto out_free_dso_list;

	if (setup_list(&symbol_conf.sym_list,
		       symbol_conf.sym_list_str, "symbol") < 0)
		goto out_free_comm_list;

2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600
	/*
	 * A path to symbols of "/" is identical to ""
	 * reset here for simplicity.
	 */
	symfs = realpath(symbol_conf.symfs, NULL);
	if (symfs == NULL)
		symfs = symbol_conf.symfs;
	if (strcmp(symfs, "/") == 0)
		symbol_conf.symfs = "";
	if (symfs != symbol_conf.symfs)
		free((void *)symfs);

2601 2602
	symbol_conf.kptr_restrict = symbol__read_kptr_restrict();

2603
	symbol_conf.initialized = true;
2604
	return 0;
2605 2606 2607

out_free_comm_list:
	strlist__delete(symbol_conf.comm_list);
2608 2609
out_free_dso_list:
	strlist__delete(symbol_conf.dso_list);
2610
	return -1;
2611 2612
}

2613 2614
void symbol__exit(void)
{
2615 2616
	if (!symbol_conf.initialized)
		return;
2617 2618 2619 2620 2621
	strlist__delete(symbol_conf.sym_list);
	strlist__delete(symbol_conf.dso_list);
	strlist__delete(symbol_conf.comm_list);
	vmlinux_path__exit();
	symbol_conf.sym_list = symbol_conf.dso_list = symbol_conf.comm_list = NULL;
2622
	symbol_conf.initialized = false;
2623 2624
}

2625
int machines__create_kernel_maps(struct rb_root *machines, pid_t pid)
2626
{
2627
	struct machine *machine = machines__findnew(machines, pid);
2628

2629
	if (machine == NULL)
2630
		return -1;
2631

2632
	return machine__create_kernel_maps(machine);
2633
}
2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676

static int hex(char ch)
{
	if ((ch >= '0') && (ch <= '9'))
		return ch - '0';
	if ((ch >= 'a') && (ch <= 'f'))
		return ch - 'a' + 10;
	if ((ch >= 'A') && (ch <= 'F'))
		return ch - 'A' + 10;
	return -1;
}

/*
 * While we find nice hex chars, build a long_val.
 * Return number of chars processed.
 */
int hex2u64(const char *ptr, u64 *long_val)
{
	const char *p = ptr;
	*long_val = 0;

	while (*p) {
		const int hex_val = hex(*p);

		if (hex_val < 0)
			break;

		*long_val = (*long_val << 4) | hex_val;
		p++;
	}

	return p - ptr;
}

char *strxfrchar(char *s, char from, char to)
{
	char *p = s;

	while ((p = strchr(p, from)) != NULL)
		*p++ = to;

	return s;
}
2677

2678
int machines__create_guest_kernel_maps(struct rb_root *machines)
2679 2680 2681 2682 2683 2684 2685 2686 2687 2688
{
	int ret = 0;
	struct dirent **namelist = NULL;
	int i, items = 0;
	char path[PATH_MAX];
	pid_t pid;

	if (symbol_conf.default_guest_vmlinux_name ||
	    symbol_conf.default_guest_modules ||
	    symbol_conf.default_guest_kallsyms) {
2689
		machines__create_kernel_maps(machines, DEFAULT_GUEST_KERNEL_ID);
2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709
	}

	if (symbol_conf.guestmount) {
		items = scandir(symbol_conf.guestmount, &namelist, NULL, NULL);
		if (items <= 0)
			return -ENOENT;
		for (i = 0; i < items; i++) {
			if (!isdigit(namelist[i]->d_name[0])) {
				/* Filter out . and .. */
				continue;
			}
			pid = atoi(namelist[i]->d_name);
			sprintf(path, "%s/%s/proc/kallsyms",
				symbol_conf.guestmount,
				namelist[i]->d_name);
			ret = access(path, R_OK);
			if (ret) {
				pr_debug("Can't access file %s\n", path);
				goto failure;
			}
2710
			machines__create_kernel_maps(machines, pid);
2711 2712 2713 2714 2715 2716 2717
		}
failure:
		free(namelist);
	}

	return ret;
}
2718

2719
void machines__destroy_guest_kernel_maps(struct rb_root *machines)
2720
{
2721
	struct rb_node *next = rb_first(machines);
2722 2723 2724 2725 2726

	while (next) {
		struct machine *pos = rb_entry(next, struct machine, rb_node);

		next = rb_next(&pos->rb_node);
2727
		rb_erase(&pos->rb_node, machines);
2728 2729 2730 2731
		machine__delete(pos);
	}
}

2732
int machine__load_kallsyms(struct machine *machine, const char *filename,
2733 2734
			   enum map_type type, symbol_filter_t filter)
{
2735
	struct map *map = machine->vmlinux_maps[type];
2736 2737 2738 2739 2740 2741 2742 2743 2744
	int ret = dso__load_kallsyms(map->dso, filename, map, filter);

	if (ret > 0) {
		dso__set_loaded(map->dso, type);
		/*
		 * Since /proc/kallsyms will have multiple sessions for the
		 * kernel, with modules between them, fixup the end of all
		 * sections.
		 */
2745
		__map_groups__fixup_end(&machine->kmaps, type);
2746 2747 2748 2749 2750
	}

	return ret;
}

2751
int machine__load_vmlinux_path(struct machine *machine, enum map_type type,
2752 2753
			       symbol_filter_t filter)
{
2754
	struct map *map = machine->vmlinux_maps[type];
2755 2756 2757 2758 2759 2760 2761 2762 2763
	int ret = dso__load_vmlinux_path(map->dso, map, filter);

	if (ret > 0) {
		dso__set_loaded(map->dso, type);
		map__reloc_vmlinux(map);
	}

	return ret;
}