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