symbol.c 37.1 KB
Newer Older
1 2
#include "util.h"
#include "../perf.h"
3
#include "string.h"
4
#include "symbol.h"
5
#include "thread.h"
6

7 8
#include "debug.h"

9
#include <asm/bug.h>
10 11 12
#include <libelf.h>
#include <gelf.h>
#include <elf.h>
13
#include <limits.h>
14
#include <sys/utsname.h>
P
Peter Zijlstra 已提交
15

16 17 18 19
#ifndef NT_GNU_BUILD_ID
#define NT_GNU_BUILD_ID 3
#endif

20 21 22 23 24 25 26
enum dso_origin {
	DSO__ORIG_KERNEL = 0,
	DSO__ORIG_JAVA_JIT,
	DSO__ORIG_FEDORA,
	DSO__ORIG_UBUNTU,
	DSO__ORIG_BUILDID,
	DSO__ORIG_DSO,
27
	DSO__ORIG_KMODULE,
28 29 30
	DSO__ORIG_NOT_FOUND,
};

31
static void dsos__add(struct list_head *head, struct dso *dso);
32
static struct map *map_groups__find_by_name(struct map_groups *self, char *name);
33
static struct map *map__new2(u64 start, struct dso *dso, enum map_type type);
34
struct symbol *dso__find_symbol(struct dso *self, enum map_type type, u64 addr);
35
static int dso__load_kernel_sym(struct dso *self, struct map *map,
36
				struct map_groups *mg, symbol_filter_t filter);
37
unsigned int symbol__priv_size;
38 39
static int vmlinux_path__nr_entries;
static char **vmlinux_path;
40

41 42 43 44 45
static struct symbol_conf symbol_conf__defaults = {
	.use_modules	  = true,
	.try_vmlinux_path = true,
};

46 47
static struct map_groups kmaps_mem;
struct map_groups *kmaps = &kmaps_mem;
48

49 50 51 52 53 54 55 56 57 58
bool dso__loaded(const struct dso *self, enum map_type type)
{
	return self->loaded & (1 << type);
}

static void dso__set_loaded(struct dso *self, enum map_type type)
{
	self->loaded |= (1 << type);
}

59 60 61 62 63
static bool symbol_type__is_a(char symbol_type, enum map_type map_type)
{
	switch (map_type) {
	case MAP__FUNCTION:
		return symbol_type == 'T' || symbol_type == 'W';
64 65
	case MAP__VARIABLE:
		return symbol_type == 'D' || symbol_type == 'd';
66 67 68 69 70
	default:
		return false;
	}
}

71
static void symbols__fixup_end(struct rb_root *self)
72
{
73
	struct rb_node *nd, *prevnd = rb_first(self);
74
	struct symbol *curr, *prev;
75 76 77 78

	if (prevnd == NULL)
		return;

79 80
	curr = rb_entry(prevnd, struct symbol, rb_node);

81
	for (nd = rb_next(prevnd); nd; nd = rb_next(nd)) {
82 83
		prev = curr;
		curr = rb_entry(nd, struct symbol, rb_node);
84 85 86 87

		if (prev->end == prev->start)
			prev->end = curr->start - 1;
	}
88 89 90 91

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

94
static void __map_groups__fixup_end(struct map_groups *self, enum map_type type)
95 96
{
	struct map *prev, *curr;
97
	struct rb_node *nd, *prevnd = rb_first(&self->maps[type]);
98 99 100 101 102 103 104 105 106 107

	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;
108
	}
109 110 111 112 113 114

	/*
	 * We still haven't the actual symbols, so guess the
	 * last map final address.
	 */
	curr->end = ~0UL;
115 116
}

117
static void map_groups__fixup_end(struct map_groups *self)
118 119 120
{
	int i;
	for (i = 0; i < MAP__NR_TYPES; ++i)
121
		__map_groups__fixup_end(self, i);
122 123
}

124
static struct symbol *symbol__new(u64 start, u64 len, const char *name)
125
{
126
	size_t namelen = strlen(name) + 1;
127 128 129
	struct symbol *self = zalloc(symbol__priv_size +
				     sizeof(*self) + namelen);
	if (self == NULL)
130 131
		return NULL;

132
	if (symbol__priv_size)
133
		self = ((void *)self) + symbol__priv_size;
134

135
	self->start = start;
136
	self->end   = len ? start + len - 1 : start;
137

138
	pr_debug3("%s: %s %#Lx-%#Lx\n", __func__, name, start, self->end);
139

140
	memcpy(self->name, name, namelen);
141 142 143 144

	return self;
}

145
static void symbol__delete(struct symbol *self)
146
{
147
	free(((void *)self) - symbol__priv_size);
148 149 150 151
}

static size_t symbol__fprintf(struct symbol *self, FILE *fp)
{
152
	return fprintf(fp, " %llx-%llx %s\n",
153 154 155
		       self->start, self->end, self->name);
}

156 157
static void dso__set_long_name(struct dso *self, char *name)
{
158 159
	if (name == NULL)
		return;
160 161 162 163 164 165 166 167 168
	self->long_name = name;
	self->long_name_len = strlen(name);
}

static void dso__set_basename(struct dso *self)
{
	self->short_name = basename(self->long_name);
}

169
struct dso *dso__new(const char *name)
170 171 172 173
{
	struct dso *self = malloc(sizeof(*self) + strlen(name) + 1);

	if (self != NULL) {
174
		int i;
175
		strcpy(self->name, name);
176
		dso__set_long_name(self, self->name);
177
		self->short_name = self->name;
178 179 180
		for (i = 0; i < MAP__NR_TYPES; ++i)
			self->symbols[i] = RB_ROOT;
		self->find_symbol = dso__find_symbol;
181
		self->slen_calculated = 0;
182
		self->origin = DSO__ORIG_NOT_FOUND;
183 184
		self->loaded = 0;
		self->has_build_id = 0;
185 186 187 188 189
	}

	return self;
}

190
static void symbols__delete(struct rb_root *self)
191 192
{
	struct symbol *pos;
193
	struct rb_node *next = rb_first(self);
194 195 196 197

	while (next) {
		pos = rb_entry(next, struct symbol, rb_node);
		next = rb_next(&pos->rb_node);
198
		rb_erase(&pos->rb_node, self);
199
		symbol__delete(pos);
200 201 202 203 204
	}
}

void dso__delete(struct dso *self)
{
205 206 207
	int i;
	for (i = 0; i < MAP__NR_TYPES; ++i)
		symbols__delete(&self->symbols[i]);
208 209
	if (self->long_name != self->name)
		free(self->long_name);
210 211 212
	free(self);
}

213 214 215 216 217 218
void dso__set_build_id(struct dso *self, void *build_id)
{
	memcpy(self->build_id, build_id, sizeof(self->build_id));
	self->has_build_id = 1;
}

219
static void symbols__insert(struct rb_root *self, struct symbol *sym)
220
{
221
	struct rb_node **p = &self->rb_node;
222
	struct rb_node *parent = NULL;
223
	const u64 ip = sym->start;
224 225 226 227 228 229 230 231 232 233 234
	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);
235
	rb_insert_color(&sym->rb_node, self);
236 237
}

238
static struct symbol *symbols__find(struct rb_root *self, u64 ip)
239 240 241 242 243 244
{
	struct rb_node *n;

	if (self == NULL)
		return NULL;

245
	n = self->rb_node;
246 247 248 249 250 251 252 253 254 255 256 257 258 259 260

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

261
struct symbol *dso__find_symbol(struct dso *self, enum map_type type, u64 addr)
262
{
263
	return symbols__find(&self->symbols[type], addr);
264 265
}

266
int build_id__sprintf(u8 *self, int len, char *bf)
267
{
268 269 270
	char *bid = bf;
	u8 *raw = self;
	int i;
271

272 273 274 275 276 277 278 279 280
	for (i = 0; i < len; ++i) {
		sprintf(bid, "%02x", *raw);
		++raw;
		bid += 2;
	}

	return raw - self;
}

281
size_t dso__fprintf_buildid(struct dso *self, FILE *fp)
282 283 284 285
{
	char sbuild_id[BUILD_ID_SIZE * 2 + 1];

	build_id__sprintf(self->build_id, sizeof(self->build_id), sbuild_id);
286 287 288
	return fprintf(fp, "%s", sbuild_id);
}

289
size_t dso__fprintf(struct dso *self, enum map_type type, FILE *fp)
290 291 292 293 294
{
	struct rb_node *nd;
	size_t ret = fprintf(fp, "dso: %s (", self->short_name);

	ret += dso__fprintf_buildid(self, fp);
295
	ret += fprintf(fp, ")\n");
296 297 298
	for (nd = rb_first(&self->symbols[type]); nd; nd = rb_next(nd)) {
		struct symbol *pos = rb_entry(nd, struct symbol, rb_node);
		ret += symbol__fprintf(pos, fp);
299 300 301 302 303
	}

	return ret;
}

304 305 306 307 308
/*
 * 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.
 */
309
static int dso__load_all_kallsyms(struct dso *self, struct map *map)
310 311 312
{
	char *line = NULL;
	size_t n;
313
	struct rb_root *root = &self->symbols[map->type];
314 315 316 317 318 319
	FILE *file = fopen("/proc/kallsyms", "r");

	if (file == NULL)
		goto out_failure;

	while (!feof(file)) {
320
		u64 start;
321 322 323
		struct symbol *sym;
		int line_len, len;
		char symbol_type;
324
		char *symbol_name;
325 326 327 328 329 330 331 332 333 334

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

		if (!line)
			goto out_failure;

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

335
		len = hex2u64(line, &start);
336 337 338 339 340 341

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

		symbol_type = toupper(line[len]);
342
		if (!symbol_type__is_a(symbol_type, map->type))
343
			continue;
344 345

		symbol_name = line + len + 2;
346 347 348
		/*
		 * Will fix up the end later, when we have all symbols sorted.
		 */
349
		sym = symbol__new(start, 0, symbol_name);
350

351 352
		if (sym == NULL)
			goto out_delete_line;
353 354
		/*
		 * We will pass the symbols to the filter later, in
355
		 * map__split_kallsyms, when we have split the maps per module
356
		 */
357
		symbols__insert(root, sym);
358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375
	}

	free(line);
	fclose(file);

	return 0;

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

/*
 * 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.
 */
376 377
static int dso__split_kallsyms(struct dso *self, struct map *map,
			       struct map_groups *mg, symbol_filter_t filter)
378
{
379
	struct map *curr_map = map;
380 381
	struct symbol *pos;
	int count = 0;
382 383
	struct rb_root *root = &self->symbols[map->type];
	struct rb_node *next = rb_first(root);
384 385 386 387 388 389 390 391 392 393
	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) {
394
			if (!mg->use_modules)
395 396
				goto discard_symbol;

397 398
			*module++ = '\0';

399
			if (strcmp(self->name, module)) {
400
				curr_map = map_groups__find_by_name(mg, module);
401
				if (curr_map == NULL) {
402 403
					pr_debug("/proc/{kallsyms,modules} "
					         "inconsistency!\n");
404 405 406
					return -1;
				}
			}
407 408 409 410
			/*
			 * So that we look just like we get from .ko files,
			 * i.e. not prelinked, relative to map->start.
			 */
411 412 413
			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) {
414 415 416 417 418 419
			char dso_name[PATH_MAX];
			struct dso *dso;

			snprintf(dso_name, sizeof(dso_name), "[kernel].%d",
				 kernel_range++);

420
			dso = dso__new(dso_name);
421 422 423
			if (dso == NULL)
				return -1;

424
			curr_map = map__new2(pos->start, dso, map->type);
425 426 427 428
			if (map == NULL) {
				dso__delete(dso);
				return -1;
			}
429

430
			curr_map->map_ip = curr_map->unmap_ip = identity__map_ip;
431
			map_groups__insert(mg, curr_map);
432 433
			++kernel_range;
		}
434

435
		if (filter && filter(curr_map, pos)) {
436
discard_symbol:		rb_erase(&pos->rb_node, root);
437
			symbol__delete(pos);
438
		} else {
439 440 441
			if (curr_map != map) {
				rb_erase(&pos->rb_node, root);
				symbols__insert(&curr_map->dso->symbols[curr_map->type], pos);
442
			}
443 444
			count++;
		}
445 446
	}

447
	return count;
448
}
449

450

451
static int dso__load_kallsyms(struct dso *self, struct map *map,
452
			      struct map_groups *mg, symbol_filter_t filter)
453
{
454
	if (dso__load_all_kallsyms(self, map) < 0)
455 456
		return -1;

457 458
	symbols__fixup_end(&self->symbols[map->type]);
	self->origin = DSO__ORIG_KERNEL;
459

460
	return dso__split_kallsyms(self, map, mg, filter);
461 462 463 464 465
}

size_t kernel_maps__fprintf(FILE *fp)
{
	size_t printed = fprintf(fp, "Kernel maps:\n");
466
	printed += map_groups__fprintf_maps(kmaps, fp);
467
	return printed + fprintf(fp, "END kernel maps\n");
468 469
}

470
static int dso__load_perf_map(struct dso *self, struct map *map,
471
			      symbol_filter_t filter)
472 473 474 475 476 477
{
	char *line = NULL;
	size_t n;
	FILE *file;
	int nr_syms = 0;

478
	file = fopen(self->long_name, "r");
479 480 481 482
	if (file == NULL)
		goto out_failure;

	while (!feof(file)) {
483
		u64 start, size;
484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507
		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;

508
		sym = symbol__new(start, size, line + len);
509 510 511 512

		if (sym == NULL)
			goto out_delete_line;

513
		if (filter && filter(map, sym))
514
			symbol__delete(sym);
515
		else {
516
			symbols__insert(&self->symbols[map->type], sym);
517 518 519 520 521 522 523 524 525 526 527 528 529 530 531
			nr_syms++;
		}
	}

	free(line);
	fclose(file);

	return nr_syms;

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

532 533 534 535
/**
 * elf_symtab__for_each_symbol - iterate thru all the symbols
 *
 * @self: struct elf_symtab instance to iterate
536
 * @idx: uint32_t idx
537 538
 * @sym: GElf_Sym iterator
 */
539 540 541 542
#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))
543 544 545 546 547 548 549 550 551 552

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 &&
553
	       sym->st_shndx != SHN_UNDEF;
554 555
}

556 557 558 559 560 561 562
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;
}

563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582
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;
}

583 584 585 586 587 588
static inline bool elf_sec__is_data(const GElf_Shdr *shdr,
				    const Elf_Data *secstrs)
{
	return strstr(elf_sec__name(shdr, secstrs), "data") != NULL;
}

589 590 591 592 593 594 595 596
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,
597
				    size_t *idx)
598 599 600 601 602 603 604 605 606 607
{
	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)) {
608 609
			if (idx)
				*idx = cnt;
610 611 612 613 614 615 616 617
			break;
		}
		++cnt;
	}

	return sec;
}

618 619 620 621 622 623 624 625 626 627
#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))

628 629 630 631 632 633 634
/*
 * 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).
 */
635 636
static int dso__synthesize_plt_symbols(struct  dso *self, struct map *map,
				       symbol_filter_t filter)
637 638 639
{
	uint32_t nr_rel_entries, idx;
	GElf_Sym sym;
640
	u64 plt_offset;
641 642
	GElf_Shdr shdr_plt;
	struct symbol *f;
643
	GElf_Shdr shdr_rel_plt, shdr_dynsym;
644
	Elf_Data *reldata, *syms, *symstrs;
645 646 647
	Elf_Scn *scn_plt_rel, *scn_symstrs, *scn_dynsym;
	size_t dynsym_idx;
	GElf_Ehdr ehdr;
648
	char sympltname[1024];
649 650 651
	Elf *elf;
	int nr = 0, symidx, fd, err = 0;

652
	fd = open(self->long_name, O_RDONLY);
653 654 655
	if (fd < 0)
		goto out;

656
	elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
657 658 659 660 661 662 663 664 665 666
	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;
667

668
	scn_plt_rel = elf_section_by_name(elf, &ehdr, &shdr_rel_plt,
669 670
					  ".rela.plt", NULL);
	if (scn_plt_rel == NULL) {
671
		scn_plt_rel = elf_section_by_name(elf, &ehdr, &shdr_rel_plt,
672 673
						  ".rel.plt", NULL);
		if (scn_plt_rel == NULL)
674
			goto out_elf_end;
675 676
	}

677 678
	err = -1;

679
	if (shdr_rel_plt.sh_link != dynsym_idx)
680
		goto out_elf_end;
681

682 683
	if (elf_section_by_name(elf, &ehdr, &shdr_plt, ".plt", NULL) == NULL)
		goto out_elf_end;
684 685

	/*
686
	 * Fetch the relocation section to find the idxes to the GOT
687 688 689 690
	 * and the symbols in the .dynsym they refer to.
	 */
	reldata = elf_getdata(scn_plt_rel, NULL);
	if (reldata == NULL)
691
		goto out_elf_end;
692 693 694

	syms = elf_getdata(scn_dynsym, NULL);
	if (syms == NULL)
695
		goto out_elf_end;
696

697
	scn_symstrs = elf_getscn(elf, shdr_dynsym.sh_link);
698
	if (scn_symstrs == NULL)
699
		goto out_elf_end;
700 701 702

	symstrs = elf_getdata(scn_symstrs, NULL);
	if (symstrs == NULL)
703
		goto out_elf_end;
704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719

	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,
720
					sympltname);
721
			if (!f)
722
				goto out_elf_end;
723

724 725 726
			if (filter && filter(map, f))
				symbol__delete(f);
			else {
727
				symbols__insert(&self->symbols[map->type], f);
728 729
				++nr;
			}
730 731 732 733 734 735 736 737 738 739 740 741
		}
	} 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,
742
					sympltname);
743
			if (!f)
744
				goto out_elf_end;
745

746 747 748
			if (filter && filter(map, f))
				symbol__delete(f);
			else {
749
				symbols__insert(&self->symbols[map->type], f);
750 751
				++nr;
			}
752 753 754
		}
	}

755 756 757 758 759 760 761 762 763
	err = 0;
out_elf_end:
	elf_end(elf);
out_close:
	close(fd);

	if (err == 0)
		return nr;
out:
764 765
	pr_warning("%s: problems reading %s PLT info.\n",
		   __func__, self->long_name);
766
	return 0;
767 768
}

769 770 771 772 773
static bool elf_sym__is_a(GElf_Sym *self, enum map_type type)
{
	switch (type) {
	case MAP__FUNCTION:
		return elf_sym__is_function(self);
774 775
	case MAP__VARIABLE:
		return elf_sym__is_object(self);
776 777 778 779 780 781 782 783 784 785
	default:
		return false;
	}
}

static bool elf_sec__is_a(GElf_Shdr *self, Elf_Data *secstrs, enum map_type type)
{
	switch (type) {
	case MAP__FUNCTION:
		return elf_sec__is_text(self, secstrs);
786 787
	case MAP__VARIABLE:
		return elf_sec__is_data(self, secstrs);
788 789 790 791 792
	default:
		return false;
	}
}

793
static int dso__load_sym(struct dso *self, struct map *map,
794
			 struct map_groups *mg, const char *name, int fd,
795
			 symbol_filter_t filter, int kernel, int kmodule)
796
{
797 798 799
	struct map *curr_map = map;
	struct dso *curr_dso = self;
	size_t dso_name_len = strlen(self->short_name);
800
	Elf_Data *symstrs, *secstrs;
801 802
	uint32_t nr_syms;
	int err = -1;
803
	uint32_t idx;
804 805 806 807
	GElf_Ehdr ehdr;
	GElf_Shdr shdr;
	Elf_Data *syms;
	GElf_Sym sym;
808
	Elf_Scn *sec, *sec_strndx;
809
	Elf *elf;
810
	int nr = 0;
811

812
	elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
813
	if (elf == NULL) {
814
		pr_err("%s: cannot read %s ELF file.\n", __func__, name);
815 816 817 818
		goto out_close;
	}

	if (gelf_getehdr(elf, &ehdr) == NULL) {
819
		pr_err("%s: cannot get elf header.\n", __func__);
820 821 822 823
		goto out_elf_end;
	}

	sec = elf_section_by_name(elf, &ehdr, &shdr, ".symtab", NULL);
824
	if (sec == NULL) {
825 826
		sec = elf_section_by_name(elf, &ehdr, &shdr, ".dynsym", NULL);
		if (sec == NULL)
827 828
			goto out_elf_end;
	}
829 830 831 832 833 834 835 836 837 838 839 840 841

	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;

842 843 844 845 846
	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 已提交
847
	if (secstrs == NULL)
848 849
		goto out_elf_end;

850 851
	nr_syms = shdr.sh_size / shdr.sh_entsize;

852
	memset(&sym, 0, sizeof(sym));
853 854
	if (!kernel) {
		self->adjust_symbols = (ehdr.e_type == ET_EXEC ||
855 856 857
				elf_section_by_name(elf, &ehdr, &shdr,
						     ".gnu.prelink_undo",
						     NULL) != NULL);
858 859
	} else self->adjust_symbols = 0;

860
	elf_symtab__for_each_symbol(syms, nr_syms, idx, sym) {
861
		struct symbol *f;
862
		const char *elf_name;
863
		char *demangled = NULL;
864 865
		int is_label = elf_sym__is_label(&sym);
		const char *section_name;
866

867
		if (!is_label && !elf_sym__is_a(&sym, map->type))
868 869 870 871 872 873 874
			continue;

		sec = elf_getscn(elf, sym.st_shndx);
		if (!sec)
			goto out_elf_end;

		gelf_getshdr(sec, &shdr);
875

876
		if (is_label && !elf_sec__is_a(&shdr, secstrs, map->type))
877 878
			continue;

879
		elf_name = elf_sym__name(&sym, symstrs);
880
		section_name = elf_sec__name(&shdr, secstrs);
881

882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897
		if (kernel || kmodule) {
			char dso_name[PATH_MAX];

			if (strcmp(section_name,
				   curr_dso->short_name + dso_name_len) == 0)
				goto new_symbol;

			if (strcmp(section_name, ".text") == 0) {
				curr_map = map;
				curr_dso = self;
				goto new_symbol;
			}

			snprintf(dso_name, sizeof(dso_name),
				 "%s%s", self->short_name, section_name);

898
			curr_map = map_groups__find_by_name(mg, dso_name);
899 900 901 902 903 904
			if (curr_map == NULL) {
				u64 start = sym.st_value;

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

905
				curr_dso = dso__new(dso_name);
906 907
				if (curr_dso == NULL)
					goto out_elf_end;
908 909
				curr_map = map__new2(start, curr_dso,
						     MAP__FUNCTION);
910 911 912 913
				if (curr_map == NULL) {
					dso__delete(curr_dso);
					goto out_elf_end;
				}
914 915
				curr_map->map_ip = identity__map_ip;
				curr_map->unmap_ip = identity__map_ip;
916
				curr_dso->origin = DSO__ORIG_KERNEL;
917
				map_groups__insert(kmaps, curr_map);
918
				dsos__add(&dsos__kernel, curr_dso);
919 920 921 922
			} else
				curr_dso = curr_map->dso;

			goto new_symbol;
923 924
		}

925
		if (curr_dso->adjust_symbols) {
926 927 928
			pr_debug2("adjusting symbol: st_value: %Lx sh_addr: "
				  "%Lx sh_offset: %Lx\n", (u64)sym.st_value,
				  (u64)shdr.sh_addr, (u64)shdr.sh_offset);
929
			sym.st_value -= shdr.sh_addr - shdr.sh_offset;
930
		}
931 932 933 934 935
		/*
		 * 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...
		 */
936
		demangled = bfd_demangle(NULL, elf_name, DMGL_PARAMS | DMGL_ANSI);
937
		if (demangled != NULL)
938
			elf_name = demangled;
939
new_symbol:
940
		f = symbol__new(sym.st_value, sym.st_size, elf_name);
941
		free(demangled);
942 943 944
		if (!f)
			goto out_elf_end;

945
		if (filter && filter(curr_map, f))
946
			symbol__delete(f);
947
		else {
948
			symbols__insert(&curr_dso->symbols[curr_map->type], f);
949 950
			nr++;
		}
951 952
	}

953 954 955 956
	/*
	 * For misannotated, zeroed, ASM function sizes.
	 */
	if (nr > 0)
957
		symbols__fixup_end(&self->symbols[map->type]);
958 959 960 961 962 963 964
	err = nr;
out_elf_end:
	elf_end(elf);
out_close:
	return err;
}

965 966 967 968 969
static bool dso__build_id_equal(const struct dso *self, u8 *build_id)
{
	return memcmp(self->build_id, build_id, sizeof(self->build_id)) == 0;
}

970
static bool __dsos__read_build_ids(struct list_head *head)
971
{
972
	bool have_build_id = false;
973 974
	struct dso *pos;

975
	list_for_each_entry(pos, head, node)
976 977 978 979 980
		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;
		}
981

982
	return have_build_id;
983 984
}

985 986
bool dsos__read_build_ids(void)
{
987 988 989
	bool kbuildids = __dsos__read_build_ids(&dsos__kernel),
	     ubuildids = __dsos__read_build_ids(&dsos__user);
	return kbuildids || ubuildids;
990 991
}

992 993 994 995 996
/*
 * Align offset to 4 bytes as needed for note name and descriptor data.
 */
#define NOTE_ALIGN(n) (((n) + 3) & -4U)

997
int filename__read_build_id(const char *filename, void *bf, size_t size)
998
{
999
	int fd, err = -1;
1000 1001
	GElf_Ehdr ehdr;
	GElf_Shdr shdr;
1002
	Elf_Data *data;
1003
	Elf_Scn *sec;
1004
	Elf_Kind ek;
1005
	void *ptr;
1006 1007
	Elf *elf;

1008 1009 1010 1011
	if (size < BUILD_ID_SIZE)
		goto out;

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

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

1021 1022 1023 1024
	ek = elf_kind(elf);
	if (ek != ELF_K_ELF)
		goto out_elf_end;

1025
	if (gelf_getehdr(elf, &ehdr) == NULL) {
1026
		pr_err("%s: cannot get elf header.\n", __func__);
1027 1028 1029
		goto out_elf_end;
	}

1030 1031
	sec = elf_section_by_name(elf, &ehdr, &shdr,
				  ".note.gnu.build-id", NULL);
1032 1033 1034 1035 1036 1037
	if (sec == NULL) {
		sec = elf_section_by_name(elf, &ehdr, &shdr,
					  ".notes", NULL);
		if (sec == NULL)
			goto out_elf_end;
	}
1038

1039 1040
	data = elf_getdata(sec, NULL);
	if (data == NULL)
1041
		goto out_elf_end;
1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062

	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;
	}
1063 1064 1065 1066 1067 1068 1069 1070
out_elf_end:
	elf_end(elf);
out_close:
	close(fd);
out:
	return err;
}

1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089
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;

1090 1091
		namesz = NOTE_ALIGN(nhdr.n_namesz);
		descsz = NOTE_ALIGN(nhdr.n_descsz);
1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114
		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;
}

1115 1116 1117 1118 1119 1120 1121 1122 1123
char dso__symtab_origin(const struct dso *self)
{
	static const char origin[] = {
		[DSO__ORIG_KERNEL] =   'k',
		[DSO__ORIG_JAVA_JIT] = 'j',
		[DSO__ORIG_FEDORA] =   'f',
		[DSO__ORIG_UBUNTU] =   'u',
		[DSO__ORIG_BUILDID] =  'b',
		[DSO__ORIG_DSO] =      'd',
1124
		[DSO__ORIG_KMODULE] =  'K',
1125 1126 1127 1128 1129 1130 1131
	};

	if (self == NULL || self->origin == DSO__ORIG_NOT_FOUND)
		return '!';
	return origin[self->origin];
}

1132
int dso__load(struct dso *self, struct map *map, symbol_filter_t filter)
1133
{
1134
	int size = PATH_MAX;
1135
	char *name;
1136
	u8 build_id[BUILD_ID_SIZE];
1137 1138 1139
	int ret = -1;
	int fd;

1140
	dso__set_loaded(self, map->type);
1141

1142
	if (self->kernel)
1143
		return dso__load_kernel_sym(self, map, kmaps, filter);
1144 1145

	name = malloc(size);
1146 1147 1148
	if (!name)
		return -1;

1149
	self->adjust_symbols = 0;
1150

1151
	if (strncmp(self->name, "/tmp/perf-", 10) == 0) {
1152
		ret = dso__load_perf_map(self, map, filter);
1153 1154 1155 1156 1157 1158
		self->origin = ret > 0 ? DSO__ORIG_JAVA_JIT :
					 DSO__ORIG_NOT_FOUND;
		return ret;
	}

	self->origin = DSO__ORIG_FEDORA - 1;
1159

1160 1161
more:
	do {
1162 1163 1164
		self->origin++;
		switch (self->origin) {
		case DSO__ORIG_FEDORA:
1165 1166
			snprintf(name, size, "/usr/lib/debug%s.debug",
				 self->long_name);
1167
			break;
1168
		case DSO__ORIG_UBUNTU:
1169 1170
			snprintf(name, size, "/usr/lib/debug%s",
				 self->long_name);
1171
			break;
1172
		case DSO__ORIG_BUILDID:
1173 1174 1175 1176 1177 1178
			if (filename__read_build_id(self->long_name, build_id,
						    sizeof(build_id))) {
				char build_id_hex[BUILD_ID_SIZE * 2 + 1];

				build_id__sprintf(build_id, sizeof(build_id),
						  build_id_hex);
1179 1180
				snprintf(name, size,
					 "/usr/lib/debug/.build-id/%.2s/%s.debug",
1181 1182 1183 1184
					build_id_hex, build_id_hex + 2);
				if (self->has_build_id)
					goto compare_build_id;
				break;
1185
			}
1186
			self->origin++;
1187
			/* Fall thru */
1188
		case DSO__ORIG_DSO:
1189
			snprintf(name, size, "%s", self->long_name);
1190 1191 1192 1193 1194 1195
			break;

		default:
			goto out;
		}

1196
		if (self->has_build_id) {
1197 1198
			if (filename__read_build_id(name, build_id,
						    sizeof(build_id)) < 0)
1199 1200
				goto more;
compare_build_id:
1201
			if (!dso__build_id_equal(self, build_id))
1202 1203 1204
				goto more;
		}

1205 1206 1207
		fd = open(name, O_RDONLY);
	} while (fd < 0);

1208
	ret = dso__load_sym(self, map, NULL, name, fd, filter, 0, 0);
1209 1210 1211 1212 1213 1214 1215 1216
	close(fd);

	/*
	 * Some people seem to have debuginfo files _WITHOUT_ debug info!?!?
	 */
	if (!ret)
		goto more;

1217
	if (ret > 0) {
1218
		int nr_plt = dso__synthesize_plt_symbols(self, map, filter);
1219 1220 1221
		if (nr_plt > 0)
			ret += nr_plt;
	}
1222 1223
out:
	free(name);
1224 1225
	if (ret < 0 && strstr(self->name, " (deleted)") != NULL)
		return 0;
1226 1227 1228
	return ret;
}

1229
static struct map *map_groups__find_by_name(struct map_groups *self, char *name)
1230 1231 1232
{
	struct rb_node *nd;

1233
	for (nd = rb_first(&self->maps[MAP__FUNCTION]); nd; nd = rb_next(nd)) {
1234 1235 1236 1237 1238 1239 1240 1241 1242
		struct map *map = rb_entry(nd, struct map, rb_node);

		if (map->dso && strcmp(map->dso->name, name) == 0)
			return map;
	}

	return NULL;
}

1243
static int dsos__set_modules_path_dir(char *dirname)
1244
{
1245 1246
	struct dirent *dent;
	DIR *dir = opendir(dirname);
1247

1248
	if (!dir) {
1249
		pr_debug("%s: cannot open %s dir\n", __func__, dirname);
1250 1251
		return -1;
	}
1252

1253 1254 1255 1256 1257 1258 1259 1260 1261 1262
	while ((dent = readdir(dir)) != NULL) {
		char path[PATH_MAX];

		if (dent->d_type == DT_DIR) {
			if (!strcmp(dent->d_name, ".") ||
			    !strcmp(dent->d_name, ".."))
				continue;

			snprintf(path, sizeof(path), "%s/%s",
				 dirname, dent->d_name);
1263
			if (dsos__set_modules_path_dir(path) < 0)
1264 1265 1266 1267 1268
				goto failure;
		} else {
			char *dot = strrchr(dent->d_name, '.'),
			     dso_name[PATH_MAX];
			struct map *map;
1269
			char *long_name;
1270 1271 1272 1273 1274 1275

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

1276
			strxfrchar(dso_name, '-', '_');
1277
			map = map_groups__find_by_name(kmaps, dso_name);
1278 1279 1280 1281 1282 1283
			if (map == NULL)
				continue;

			snprintf(path, sizeof(path), "%s/%s",
				 dirname, dent->d_name);

1284 1285
			long_name = strdup(path);
			if (long_name == NULL)
1286
				goto failure;
1287
			dso__set_long_name(map->dso, long_name);
1288 1289
		}
	}
1290

1291
	return 0;
1292 1293 1294 1295
failure:
	closedir(dir);
	return -1;
}
1296

1297
static int dsos__set_modules_path(void)
1298 1299 1300
{
	struct utsname uts;
	char modules_path[PATH_MAX];
1301

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

1305 1306
	snprintf(modules_path, sizeof(modules_path), "/lib/modules/%s/kernel",
		 uts.release);
1307

1308
	return dsos__set_modules_path_dir(modules_path);
1309 1310
}

1311 1312 1313 1314 1315
/*
 * 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.
 */
1316
static struct map *map__new2(u64 start, struct dso *dso, enum map_type type)
1317
{
1318
	struct map *self = malloc(sizeof(*self));
1319

1320 1321
	if (self != NULL) {
		/*
1322
		 * ->end will be filled after we load all the symbols
1323
		 */
1324
		map__init(self, type, start, 0, 0, dso);
1325
	}
1326

1327 1328 1329
	return self;
}

1330
static int map_groups__create_module_maps(struct map_groups *self)
1331 1332 1333 1334 1335
{
	char *line = NULL;
	size_t n;
	FILE *file = fopen("/proc/modules", "r");
	struct map *map;
1336

1337 1338
	if (file == NULL)
		return -1;
1339

1340 1341 1342 1343 1344 1345
	while (!feof(file)) {
		char name[PATH_MAX];
		u64 start;
		struct dso *dso;
		char *sep;
		int line_len;
1346

1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368
		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);
1369
		dso = dso__new(name);
1370 1371 1372 1373

		if (dso == NULL)
			goto out_delete_line;

1374
		map = map__new2(start, dso, MAP__FUNCTION);
1375 1376 1377
		if (map == NULL) {
			dso__delete(dso);
			goto out_delete_line;
1378
		}
1379

1380 1381 1382 1383 1384 1385
		snprintf(name, sizeof(name),
			 "/sys/module/%s/notes/.note.gnu.build-id", line);
		if (sysfs__read_build_id(name, dso->build_id,
					 sizeof(dso->build_id)) == 0)
			dso->has_build_id = true;

1386
		dso->origin = DSO__ORIG_KMODULE;
1387
		map_groups__insert(self, map);
1388
		dsos__add(&dsos__kernel, dso);
1389
	}
1390 1391 1392 1393

	free(line);
	fclose(file);

1394
	return dsos__set_modules_path();
1395 1396 1397 1398 1399

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

1402 1403
static int dso__load_vmlinux(struct dso *self, struct map *map,
			     struct map_groups *mg,
1404
			     const char *vmlinux, symbol_filter_t filter)
1405
{
1406
	int err = -1, fd;
1407

1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430
	if (self->has_build_id) {
		u8 build_id[BUILD_ID_SIZE];

		if (filename__read_build_id(vmlinux, build_id,
					    sizeof(build_id)) < 0) {
			pr_debug("No build_id in %s, ignoring it\n", vmlinux);
			return -1;
		}
		if (!dso__build_id_equal(self, build_id)) {
			char expected_build_id[BUILD_ID_SIZE * 2 + 1],
			     vmlinux_build_id[BUILD_ID_SIZE * 2 + 1];

			build_id__sprintf(self->build_id,
					  sizeof(self->build_id),
					  expected_build_id);
			build_id__sprintf(build_id, sizeof(build_id),
					  vmlinux_build_id);
			pr_debug("build_id in %s is %s while expected is %s, "
				 "ignoring it\n", vmlinux, vmlinux_build_id,
				 expected_build_id);
			return -1;
		}
	}
1431

1432
	fd = open(vmlinux, O_RDONLY);
1433 1434 1435
	if (fd < 0)
		return -1;

1436
	dso__set_loaded(self, map->type);
1437
	err = dso__load_sym(self, map, mg, self->long_name, fd, filter, 1, 0);
1438 1439 1440 1441 1442
	close(fd);

	return err;
}

1443
static int dso__load_kernel_sym(struct dso *self, struct map *map,
1444
				struct map_groups *mg, symbol_filter_t filter)
1445
{
1446 1447 1448 1449 1450 1451 1452 1453
	int err;
	bool is_kallsyms;

	if (vmlinux_path != NULL) {
		int i;
		pr_debug("Looking at the vmlinux_path (%d entries long)\n",
			 vmlinux_path__nr_entries);
		for (i = 0; i < vmlinux_path__nr_entries; ++i) {
1454
			err = dso__load_vmlinux(self, map, mg,
1455
						vmlinux_path[i], filter);
1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468
			if (err > 0) {
				pr_debug("Using %s for symbols\n",
					 vmlinux_path[i]);
				dso__set_long_name(self,
						   strdup(vmlinux_path[i]));
				goto out_fixup;
			}
		}
	}

	is_kallsyms = self->long_name[0] == '[';
	if (is_kallsyms)
		goto do_kallsyms;
1469

1470
	err = dso__load_vmlinux(self, map, mg, self->long_name, filter);
1471
	if (err <= 0) {
1472 1473 1474
		pr_info("The file %s cannot be used, "
			"trying to use /proc/kallsyms...", self->long_name);
do_kallsyms:
1475
		err = dso__load_kallsyms(self, map, mg, filter);
1476
		if (err > 0 && !is_kallsyms)
1477 1478
                        dso__set_long_name(self, strdup("[kernel.kallsyms]"));
	}
1479 1480

	if (err > 0) {
1481
out_fixup:
1482 1483
		map__fixup_start(map);
		map__fixup_end(map);
1484
	}
1485

1486 1487 1488
	return err;
}

1489 1490
LIST_HEAD(dsos__user);
LIST_HEAD(dsos__kernel);
1491
struct dso *vdso;
1492

1493
static void dsos__add(struct list_head *head, struct dso *dso)
1494
{
1495
	list_add_tail(&dso->node, head);
1496 1497
}

1498
static struct dso *dsos__find(struct list_head *head, const char *name)
1499 1500 1501
{
	struct dso *pos;

1502
	list_for_each_entry(pos, head, node)
1503 1504 1505 1506 1507
		if (strcmp(pos->name, name) == 0)
			return pos;
	return NULL;
}

1508
struct dso *dsos__findnew(const char *name)
1509
{
1510
	struct dso *dso = dsos__find(&dsos__user, name);
1511

1512
	if (!dso) {
1513
		dso = dso__new(name);
1514
		if (dso != NULL) {
1515
			dsos__add(&dsos__user, dso);
1516 1517
			dso__set_basename(dso);
		}
1518
	}
1519 1520 1521 1522

	return dso;
}

1523
static void __dsos__fprintf(struct list_head *head, FILE *fp)
1524 1525 1526
{
	struct dso *pos;

1527 1528 1529 1530 1531
	list_for_each_entry(pos, head, node) {
		int i;
		for (i = 0; i < MAP__NR_TYPES; ++i)
			dso__fprintf(pos, i, fp);
	}
1532 1533
}

1534 1535 1536 1537 1538 1539 1540
void dsos__fprintf(FILE *fp)
{
	__dsos__fprintf(&dsos__kernel, fp);
	__dsos__fprintf(&dsos__user, fp);
}

static size_t __dsos__fprintf_buildid(struct list_head *head, FILE *fp)
1541 1542 1543 1544
{
	struct dso *pos;
	size_t ret = 0;

1545
	list_for_each_entry(pos, head, node) {
1546
		ret += dso__fprintf_buildid(pos, fp);
1547
		ret += fprintf(fp, " %s\n", pos->long_name);
1548 1549 1550 1551
	}
	return ret;
}

1552 1553 1554 1555 1556 1557
size_t dsos__fprintf_buildid(FILE *fp)
{
	return (__dsos__fprintf_buildid(&dsos__kernel, fp) +
		__dsos__fprintf_buildid(&dsos__user, fp));
}

1558
static struct dso *dsos__create_kernel( const char *vmlinux)
1559
{
1560
	struct dso *kernel = dso__new(vmlinux ?: "[kernel.kallsyms]");
1561

1562
	if (kernel == NULL)
1563
		return NULL;
1564

1565 1566
	kernel->short_name = "[kernel]";
	kernel->kernel	   = 1;
1567

1568
	vdso = dso__new("[vdso]");
1569
	if (vdso == NULL)
1570
		goto out_delete_kernel_dso;
1571
	dso__set_loaded(vdso, MAP__FUNCTION);
1572 1573 1574 1575

	if (sysfs__read_build_id("/sys/kernel/notes", kernel->build_id,
				 sizeof(kernel->build_id)) == 0)
		kernel->has_build_id = true;
1576

1577 1578
	dsos__add(&dsos__kernel, kernel);
	dsos__add(&dsos__user, vdso);
1579

1580
	return kernel;
1581 1582 1583

out_delete_kernel_dso:
	dso__delete(kernel);
1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610
	return NULL;
}

static int map_groups__create_kernel_maps(struct map_groups *self, const char *vmlinux)
{
	struct map *functions, *variables;
	struct dso *kernel = dsos__create_kernel(vmlinux);

	if (kernel == NULL)
		return -1;

	functions = map__new2(0, kernel, MAP__FUNCTION);
	if (functions == NULL)
		return -1;

	variables = map__new2(0, kernel, MAP__VARIABLE);
	if (variables == NULL) {
		map__delete(functions);
		return -1;
	}

	functions->map_ip = functions->unmap_ip =
		variables->map_ip = variables->unmap_ip = identity__map_ip;
	map_groups__insert(self, functions);
	map_groups__insert(self, variables);

	return 0;
1611 1612
}

1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667
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];

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

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

1668
int symbol__init(struct symbol_conf *conf)
1669
{
1670 1671
	const struct symbol_conf *pconf = conf ?: &symbol_conf__defaults;

1672
	elf_version(EV_CURRENT);
1673
	symbol__priv_size = pconf->priv_size;
1674
	map_groups__init(kmaps);
1675 1676

	if (pconf->try_vmlinux_path && vmlinux_path__init() < 0)
1677 1678
		return -1;

1679
	if (map_groups__create_kernel_maps(kmaps, pconf->vmlinux_name) < 0) {
1680 1681 1682 1683
		vmlinux_path__exit();
		return -1;
	}

1684 1685
	kmaps->use_modules = pconf->use_modules;
	if (pconf->use_modules && map_groups__create_module_maps(kmaps) < 0)
1686 1687
		pr_debug("Failed to load list of modules in use, "
			 "continuing...\n");
1688 1689 1690
	/*
	 * Now that we have all the maps created, just set the ->end of them:
	 */
1691
	map_groups__fixup_end(kmaps);
1692
	return 0;
1693
}