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