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