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