symbol.c 62.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
#define _GNU_SOURCE
#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>
14
#include <inttypes.h>
15
#include "build-id.h"
16
#include "debug.h"
17
#include "symbol.h"
18
#include "strlist.h"
19 20 21 22

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

26 27 28 29
#ifndef KSYM_NAME_LEN
#define KSYM_NAME_LEN 128
#endif

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

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 43
static int vmlinux_path__nr_entries;
static char **vmlinux_path;
44

45
struct symbol_conf symbol_conf = {
46
	.exclude_other	  = true,
47 48
	.use_modules	  = true,
	.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 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 1173 1174 1175 1176
		u8 build_id[BUILD_ID_SIZE];

		if (elf_read_build_id(elf, build_id,
				      BUILD_ID_SIZE) != BUILD_ID_SIZE)
			goto out_elf_end;

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

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

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

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

1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208
	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;

1209 1210 1211 1212 1213
	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 已提交
1214
	if (secstrs == NULL)
1215 1216
		goto out_elf_end;

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

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

1235 1236 1237
		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;
1238

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

1242 1243 1244 1245 1246 1247 1248 1249 1250 1251
		/* 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;
		}

1252 1253 1254 1255 1256 1257 1258
		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);
		}

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

		gelf_getshdr(sec, &shdr);
1264

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

		section_name = elf_sec__name(&shdr, secstrs);
1269

1270 1271 1272 1273 1274 1275 1276
		/* 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;

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

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

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

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

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

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

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

			goto new_symbol;
1323 1324
		}

1325
		if (curr_dso->adjust_symbols) {
1326 1327
			pr_debug4("%s: adjusting symbol: st_value: %#" PRIx64 " "
				  "sh_addr: %#" PRIx64 " sh_offset: %#" PRIx64 "\n", __func__,
1328 1329
				  (u64)sym.st_value, (u64)shdr.sh_addr,
				  (u64)shdr.sh_offset);
1330
			sym.st_value -= shdr.sh_addr - shdr.sh_offset;
1331
		}
1332 1333 1334 1335 1336
		/*
		 * 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...
		 */
1337
		demangled = bfd_demangle(NULL, elf_name, DMGL_PARAMS | DMGL_ANSI);
1338
		if (demangled != NULL)
1339
			elf_name = demangled;
1340
new_symbol:
1341 1342
		f = symbol__new(sym.st_value, sym.st_size,
				GELF_ST_BIND(sym.st_info), elf_name);
1343
		free(demangled);
1344 1345 1346
		if (!f)
			goto out_elf_end;

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

1355 1356 1357
	/*
	 * For misannotated, zeroed, ASM function sizes.
	 */
1358
	if (nr > 0) {
1359
		symbols__fixup_duplicate(&dso->symbols[map->type]);
1360
		symbols__fixup_end(&dso->symbols[map->type]);
1361 1362 1363 1364 1365 1366 1367 1368
		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);
		}
	}
1369 1370 1371 1372 1373 1374 1375
	err = nr;
out_elf_end:
	elf_end(elf);
out_close:
	return err;
}

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

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

1386 1387 1388
	list_for_each_entry(pos, head, node) {
		if (with_hits && !pos->hit)
			continue;
1389 1390 1391 1392
		if (pos->has_build_id) {
			have_build_id = true;
			continue;
		}
1393 1394 1395 1396 1397
		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;
		}
1398
	}
1399

1400
	return have_build_id;
1401 1402
}

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

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

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

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

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

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

1439 1440
	data = elf_getdata(sec, NULL);
	if (data == NULL)
1441
		goto out;
1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462

	ptr = data->d_buf;
	while (ptr < (data->d_buf + data->d_size)) {
		GElf_Nhdr *nhdr = ptr;
		int namesz = NOTE_ALIGN(nhdr->n_namesz),
		    descsz = NOTE_ALIGN(nhdr->n_descsz);
		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) {
				memcpy(bf, ptr, BUILD_ID_SIZE);
				err = BUILD_ID_SIZE;
				break;
			}
		}
		ptr += descsz;
	}
1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487

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);

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

1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513
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;
		int namesz, descsz;

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

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

1539
char dso__symtab_origin(const struct dso *dso)
1540 1541
{
	static const char origin[] = {
1542 1543 1544 1545 1546 1547 1548 1549 1550 1551
		[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',
1552 1553
	};

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

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

1569
	dso__set_loaded(dso, map->type);
1570

1571 1572 1573 1574
	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);
1575

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

	name = malloc(size);
1582 1583 1584
	if (!name)
		return -1;

1585
	dso->adjust_symbols = 0;
1586

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

1590
		if (lstat(dso->name, &st) < 0)
1591 1592 1593 1594 1595 1596 1597 1598
			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;
		}

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

1605 1606 1607 1608
	/* 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
	 */
1609 1610
	want_symtab = 1;
restart:
1611 1612 1613 1614
	for (dso->symtab_type = SYMTAB__BUILD_ID_CACHE;
	     dso->symtab_type != SYMTAB__NOT_FOUND;
	     dso->symtab_type++) {
		switch (dso->symtab_type) {
1615
		case SYMTAB__BUILD_ID_CACHE:
1616 1617
			/* skip the locally configured cache if a symfs is given */
			if (symbol_conf.symfs[0] ||
1618
			    (dso__build_id_filename(dso, name, size) == NULL)) {
1619
				continue;
1620
			}
1621
			break;
1622
		case SYMTAB__FEDORA_DEBUGINFO:
1623
			snprintf(name, size, "%s/usr/lib/debug%s.debug",
1624
				 symbol_conf.symfs, dso->long_name);
1625
			break;
1626
		case SYMTAB__UBUNTU_DEBUGINFO:
1627
			snprintf(name, size, "%s/usr/lib/debug%s",
1628
				 symbol_conf.symfs, dso->long_name);
1629
			break;
1630
		case SYMTAB__BUILDID_DEBUGINFO: {
1631 1632
			char build_id_hex[BUILD_ID_SIZE * 2 + 1];

1633
			if (!dso->has_build_id)
1634 1635
				continue;

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

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

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

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

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

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

1689 1690 1691 1692 1693 1694 1695 1696 1697
	/*
	 * 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;
	}

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

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

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

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

	return NULL;
}

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

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

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

	return 0;
}

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

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

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

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

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

			snprintf(path, sizeof(path), "%s/%s",
1767
				 dir_name, dent->d_name);
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 1788
			if (map == NULL)
				continue;

			snprintf(path, sizeof(path), "%s/%s",
1789
				 dir_name, dent->d_name);
1790

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

1802
out:
1803
	closedir(dir);
1804
	return ret;
1805
}
1806

1807
static char *get_kernel_version(const char *root_dir)
1808
{
1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833
	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);
}

1834
static int machine__set_modules_path(struct machine *machine)
1835 1836
{
	char *version;
1837
	char modules_path[PATH_MAX];
1838

1839
	version = get_kernel_version(machine->root_dir);
1840
	if (!version)
1841
		return -1;
1842

1843
	snprintf(modules_path, sizeof(modules_path), "%s/lib/modules/%s/kernel",
1844
		 machine->root_dir, version);
1845
	free(version);
1846

1847
	return map_groups__set_modules_path_dir(&machine->kmaps, modules_path);
1848 1849
}

1850 1851 1852 1853 1854
/*
 * 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.
 */
1855
static struct map *map__new2(u64 start, struct dso *dso, enum map_type type)
1856
{
1857 1858 1859
	struct map *map = calloc(1, (sizeof(*map) +
				     (dso->kernel ? sizeof(struct kmap) : 0)));
	if (map != NULL) {
1860
		/*
1861
		 * ->end will be filled after we load all the symbols
1862
		 */
1863
		map__init(map, type, start, 0, 0, dso);
1864
	}
1865

1866
	return map;
1867 1868
}

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

	if (dso == NULL)
		return NULL;

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

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

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

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

1906 1907 1908
	if (symbol__restricted_filename(path, "/proc/modules"))
		return -1;

1909
	file = fopen(modules, "r");
1910 1911
	if (file == NULL)
		return -1;
1912

1913 1914 1915 1916 1917
	while (!feof(file)) {
		char name[PATH_MAX];
		u64 start;
		char *sep;
		int line_len;
1918

1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940
		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);
1941
		map = machine__new_module(machine, start, name);
1942
		if (map == NULL)
1943
			goto out_delete_line;
1944
		dso__kernel_module_get_build_id(map->dso, machine->root_dir);
1945
	}
1946 1947 1948 1949

	free(line);
	fclose(file);

1950
	return machine__set_modules_path(machine);
1951 1952 1953 1954 1955

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

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

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

1970 1971 1972
	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);
1973 1974
	close(fd);

1975
	if (err > 0)
1976
		pr_debug("Using %s for symbols\n", symfs_vmlinux);
1977

1978 1979 1980
	return err;
}

1981
int dso__load_vmlinux_path(struct dso *dso, struct map *map,
1982
			   symbol_filter_t filter)
1983 1984
{
	int i, err = 0;
1985
	char *filename;
1986 1987

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

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

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

2011
static int dso__load_kernel_sym(struct dso *dso, struct map *map,
2012
				symbol_filter_t filter)
2013
{
2014
	int err;
2015 2016
	const char *kallsyms_filename = NULL;
	char *kallsyms_allocated_filename = NULL;
2017
	/*
2018 2019
	 * 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.
2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031
	 *
	 * 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.
	 */
2032 2033 2034 2035 2036
	if (symbol_conf.kallsyms_name != NULL) {
		kallsyms_filename = symbol_conf.kallsyms_name;
		goto do_kallsyms;
	}

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

	if (vmlinux_path != NULL) {
2049
		err = dso__load_vmlinux_path(dso, map, filter);
2050 2051
		if (err > 0)
			goto out_fixup;
2052 2053
	}

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

2058 2059 2060 2061 2062
	/*
	 * 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.
	 */
2063
	if (dso->has_build_id) {
2064
		u8 kallsyms_build_id[BUILD_ID_SIZE];
2065
		char sbuild_id[BUILD_ID_SIZE * 2 + 1];
2066 2067

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

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

2088 2089
		kallsyms_filename = kallsyms_allocated_filename;

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

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

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

2118 2119 2120
	return err;
}

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

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

2135
	if (machine__is_default_guest(machine)) {
2136 2137 2138 2139 2140 2141
		/*
		 * 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) {
2142
			err = dso__load_vmlinux(dso, map,
2143 2144 2145 2146 2147 2148 2149 2150
				symbol_conf.default_guest_vmlinux_name, filter);
			goto out_try_fixup;
		}

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

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

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

	return err;
}
2171

2172
static void dsos__add(struct list_head *head, struct dso *dso)
2173
{
2174
	list_add_tail(&dso->node, head);
2175 2176
}

2177
static struct dso *dsos__find(struct list_head *head, const char *name)
2178 2179 2180
{
	struct dso *pos;

2181
	list_for_each_entry(pos, head, node)
2182
		if (strcmp(pos->long_name, name) == 0)
2183 2184 2185 2186
			return pos;
	return NULL;
}

2187
struct dso *__dsos__findnew(struct list_head *head, const char *name)
2188
{
2189
	struct dso *dso = dsos__find(head, name);
2190

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

	return dso;
}

2202
size_t __dsos__fprintf(struct list_head *head, FILE *fp)
2203 2204
{
	struct dso *pos;
2205
	size_t ret = 0;
2206

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

	return ret;
2214 2215
}

2216
size_t machines__fprintf_dsos(struct rb_root *machines, FILE *fp)
2217
{
2218
	struct rb_node *nd;
2219
	size_t ret = 0;
2220

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

	return ret;
2228 2229
}

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

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

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

2252 2253
size_t machines__fprintf_dsos_buildid(struct rb_root *machines,
				      FILE *fp, bool with_hits)
2254
{
2255 2256 2257
	struct rb_node *nd;
	size_t ret = 0;

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

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

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

2283
	return dso;
2284 2285
}

2286
void dso__read_running_kernel_build_id(struct dso *dso, struct machine *machine)
2287
{
2288 2289
	char path[PATH_MAX];

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

2298
static struct dso *machine__get_kernel(struct machine *machine)
2299
{
2300 2301
	const char *vmlinux_name = NULL;
	struct dso *kernel;
2302

2303
	if (machine__is_host(machine)) {
2304
		vmlinux_name = symbol_conf.vmlinux_name;
2305 2306 2307 2308 2309 2310
		if (!vmlinux_name)
			vmlinux_name = "[kernel.kallsyms]";

		kernel = dso__kernel_findnew(machine, vmlinux_name,
					     "[kernel]",
					     DSO_TYPE_KERNEL);
2311
	} else {
2312 2313
		char bf[PATH_MAX];

2314
		if (machine__is_default_guest(machine))
2315
			vmlinux_name = symbol_conf.default_guest_vmlinux_name;
2316 2317 2318 2319 2320 2321 2322
		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);
2323
	}
2324

2325
	if (kernel != NULL && (!kernel->has_build_id))
2326
		dso__read_running_kernel_build_id(kernel, machine);
2327

2328 2329 2330
	return kernel;
}

2331 2332 2333 2334 2335
struct process_args {
	u64 start;
};

static int symbol__in_kernel(void *arg, const char *name,
2336
			     char type __used, u64 start, u64 end __used)
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 2362 2363 2364
{
	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;
		}
	}

2365 2366 2367
	if (symbol__restricted_filename(filename, "/proc/kallsyms"))
		return 0;

2368 2369 2370 2371 2372 2373
	if (kallsyms__parse(filename, &args, symbol__in_kernel) <= 0)
		return 0;

	return args.start;
}

2374
int __machine__create_kernel_maps(struct machine *machine, struct dso *kernel)
2375
{
2376
	enum map_type type;
2377
	u64 start = machine__get_kernel_start_addr(machine);
2378

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

2382 2383
		machine->vmlinux_maps[type] = map__new2(start, kernel, type);
		if (machine->vmlinux_maps[type] == NULL)
2384
			return -1;
2385

2386 2387 2388 2389 2390 2391 2392
		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]);
2393 2394 2395
	}

	return 0;
2396 2397
}

2398
void machine__destroy_kernel_maps(struct machine *machine)
2399 2400 2401 2402 2403 2404
{
	enum map_type type;

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

2405
		if (machine->vmlinux_maps[type] == NULL)
2406 2407
			continue;

2408 2409 2410
		kmap = map__kmap(machine->vmlinux_maps[type]);
		map_groups__remove(&machine->kmaps,
				   machine->vmlinux_maps[type]);
2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423
		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;
		}

2424 2425
		map__delete(machine->vmlinux_maps[type]);
		machine->vmlinux_maps[type] = NULL;
2426 2427 2428
	}
}

2429
int machine__create_kernel_maps(struct machine *machine)
2430
{
2431
	struct dso *kernel = machine__get_kernel(machine);
2432 2433

	if (kernel == NULL ||
2434
	    __machine__create_kernel_maps(machine, kernel) < 0)
2435 2436
		return -1;

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

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 2471 2472 2473
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;
2474 2475 2476 2477 2478 2479 2480 2481

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

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

2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505
	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;
}

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

	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);
	}
2517 2518

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

	return printed;
}

2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538
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;
}

2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557
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;
}

2558
int symbol__init(void)
2559
{
2560 2561
	const char *symfs;

2562 2563 2564
	if (symbol_conf.initialized)
		return 0;

2565 2566
	symbol_conf.priv_size = ALIGN(symbol_conf.priv_size, sizeof(u64));

2567
	elf_version(EV_CURRENT);
2568 2569 2570
	if (symbol_conf.sort_by_name)
		symbol_conf.priv_size += (sizeof(struct symbol_name_rb_node) -
					  sizeof(struct symbol));
2571

2572
	if (symbol_conf.try_vmlinux_path && vmlinux_path__init() < 0)
2573 2574
		return -1;

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

2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591
	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;

2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603
	/*
	 * 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);

2604 2605
	symbol_conf.kptr_restrict = symbol__read_kptr_restrict();

2606
	symbol_conf.initialized = true;
2607
	return 0;
2608 2609 2610 2611 2612 2613

out_free_dso_list:
	strlist__delete(symbol_conf.dso_list);
out_free_comm_list:
	strlist__delete(symbol_conf.comm_list);
	return -1;
2614 2615
}

2616 2617
void symbol__exit(void)
{
2618 2619
	if (!symbol_conf.initialized)
		return;
2620 2621 2622 2623 2624
	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;
2625
	symbol_conf.initialized = false;
2626 2627
}

2628
int machines__create_kernel_maps(struct rb_root *machines, pid_t pid)
2629
{
2630
	struct machine *machine = machines__findnew(machines, pid);
2631

2632
	if (machine == NULL)
2633
		return -1;
2634

2635
	return machine__create_kernel_maps(machine);
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 2677 2678 2679

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;
}
2680

2681
int machines__create_guest_kernel_maps(struct rb_root *machines)
2682 2683 2684 2685 2686 2687 2688 2689 2690 2691
{
	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) {
2692
		machines__create_kernel_maps(machines, DEFAULT_GUEST_KERNEL_ID);
2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712
	}

	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;
			}
2713
			machines__create_kernel_maps(machines, pid);
2714 2715 2716 2717 2718 2719 2720
		}
failure:
		free(namelist);
	}

	return ret;
}
2721

2722
void machines__destroy_guest_kernel_maps(struct rb_root *machines)
2723
{
2724
	struct rb_node *next = rb_first(machines);
2725 2726 2727 2728 2729

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

		next = rb_next(&pos->rb_node);
2730
		rb_erase(&pos->rb_node, machines);
2731 2732 2733 2734
		machine__delete(pos);
	}
}

2735
int machine__load_kallsyms(struct machine *machine, const char *filename,
2736 2737
			   enum map_type type, symbol_filter_t filter)
{
2738
	struct map *map = machine->vmlinux_maps[type];
2739 2740 2741 2742 2743 2744 2745 2746 2747
	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.
		 */
2748
		__map_groups__fixup_end(&machine->kmaps, type);
2749 2750 2751 2752 2753
	}

	return ret;
}

2754
int machine__load_vmlinux_path(struct machine *machine, enum map_type type,
2755 2756
			       symbol_filter_t filter)
{
2757
	struct map *map = machine->vmlinux_maps[type];
2758 2759 2760 2761 2762 2763 2764 2765 2766
	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;
}