1 /* corefile.c 2 3 Copyright (C) 1999-2018 Free Software Foundation, Inc. 4 5 This file is part of GNU Binutils. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 20 02110-1301, USA. */ 21 22 #include "gprof.h" 23 #include "libiberty.h" 24 #include "filenames.h" 25 #include "search_list.h" 26 #include "source.h" 27 #include "symtab.h" 28 #include "hist.h" 29 #include "corefile.h" 30 #include "safe-ctype.h" 31 #include <limits.h> /* For UINT_MAX. */ 32 33 #include <stdlib.h> 34 35 bfd *core_bfd; 36 static int core_num_syms; 37 static asymbol **core_syms; 38 asection *core_text_sect; 39 void * core_text_space; 40 41 static int min_insn_size; 42 int offset_to_code; 43 44 /* For mapping symbols to specific .o files during file ordering. */ 45 struct function_map * symbol_map; 46 unsigned int symbol_map_count; 47 48 static void read_function_mappings (const char *); 49 static int core_sym_class (asymbol *); 50 static bfd_boolean get_src_info 51 (bfd_vma, const char **, const char **, int *); 52 53 extern void i386_find_call (Sym *, bfd_vma, bfd_vma); 54 extern void alpha_find_call (Sym *, bfd_vma, bfd_vma); 55 extern void vax_find_call (Sym *, bfd_vma, bfd_vma); 56 extern void tahoe_find_call (Sym *, bfd_vma, bfd_vma); 57 extern void sparc_find_call (Sym *, bfd_vma, bfd_vma); 58 extern void mips_find_call (Sym *, bfd_vma, bfd_vma); 59 extern void aarch64_find_call (Sym *, bfd_vma, bfd_vma); 60 61 static void 62 parse_error (const char *filename) 63 { 64 fprintf (stderr, _("%s: unable to parse mapping file %s.\n"), whoami, filename); 65 done (1); 66 } 67 68 /* Compare two function_map structs based on function name. 69 We want to sort in ascending order. */ 70 71 static int 72 cmp_symbol_map (const void * l, const void * r) 73 { 74 return strcmp (((struct function_map *) l)->function_name, 75 ((struct function_map *) r)->function_name); 76 } 77 78 #define BUFSIZE (1024) 79 /* This is BUFSIZE - 1 as a string. Suitable for use in fprintf/sscanf format strings. */ 80 #define STR_BUFSIZE "1023" 81 82 static void 83 read_function_mappings (const char *filename) 84 { 85 FILE * file = fopen (filename, "r"); 86 char dummy[BUFSIZE]; 87 int count = 0; 88 unsigned int i; 89 90 if (!file) 91 { 92 fprintf (stderr, _("%s: could not open %s.\n"), whoami, filename); 93 done (1); 94 } 95 96 /* First parse the mapping file so we know how big we need to 97 make our tables. We also do some sanity checks at this 98 time. */ 99 while (!feof (file)) 100 { 101 int matches; 102 103 matches = fscanf (file, "%" STR_BUFSIZE "[^\n:]", dummy); 104 if (!matches) 105 parse_error (filename); 106 107 /* Just skip messages about files with no symbols. */ 108 if (!strncmp (dummy, "No symbols in ", 14)) 109 { 110 matches = fscanf (file, "\n"); 111 if (matches == EOF) 112 parse_error (filename); 113 continue; 114 } 115 116 /* Don't care what else is on this line at this point. */ 117 matches = fscanf (file, "%" STR_BUFSIZE "[^\n]\n", dummy); 118 if (!matches) 119 parse_error (filename); 120 count++; 121 } 122 123 /* Now we know how big we need to make our table. */ 124 symbol_map = ((struct function_map *) 125 xmalloc (count * sizeof (struct function_map))); 126 127 /* Rewind the input file so we can read it again. */ 128 rewind (file); 129 130 /* Read each entry and put it into the table. */ 131 count = 0; 132 while (!feof (file)) 133 { 134 int matches; 135 char *tmp; 136 137 matches = fscanf (file, "%" STR_BUFSIZE "[^\n:]", dummy); 138 if (!matches) 139 parse_error (filename); 140 141 /* Just skip messages about files with no symbols. */ 142 if (!strncmp (dummy, "No symbols in ", 14)) 143 { 144 matches = fscanf (file, "\n"); 145 if (matches == EOF) 146 parse_error (filename); 147 continue; 148 } 149 150 /* dummy has the filename, go ahead and copy it. */ 151 symbol_map[count].file_name = (char *) xmalloc (strlen (dummy) + 1); 152 strcpy (symbol_map[count].file_name, dummy); 153 154 /* Now we need the function name. */ 155 matches = fscanf (file, "%" STR_BUFSIZE "[^\n]\n", dummy); 156 if (!matches) 157 parse_error (filename); 158 tmp = strrchr (dummy, ' ') + 1; 159 symbol_map[count].function_name = (char *) xmalloc (strlen (tmp) + 1); 160 strcpy (symbol_map[count].function_name, tmp); 161 count++; 162 } 163 164 /* Record the size of the map table for future reference. */ 165 symbol_map_count = count; 166 167 for (i = 0; i < symbol_map_count; ++i) 168 if (i == 0 169 || filename_cmp (symbol_map[i].file_name, symbol_map[i - 1].file_name)) 170 symbol_map[i].is_first = 1; 171 172 qsort (symbol_map, symbol_map_count, sizeof (struct function_map), cmp_symbol_map); 173 174 fclose (file); 175 } 176 177 void 178 core_init (const char * aout_name) 179 { 180 int core_sym_bytes; 181 asymbol *synthsyms; 182 long synth_count; 183 184 core_bfd = bfd_openr (aout_name, 0); 185 186 if (!core_bfd) 187 { 188 perror (aout_name); 189 done (1); 190 } 191 192 if (!bfd_check_format (core_bfd, bfd_object)) 193 { 194 fprintf (stderr, _("%s: %s: not in executable format\n"), whoami, aout_name); 195 done (1); 196 } 197 198 /* Get core's text section. */ 199 core_text_sect = bfd_get_section_by_name (core_bfd, ".text"); 200 if (!core_text_sect) 201 { 202 core_text_sect = bfd_get_section_by_name (core_bfd, "$CODE$"); 203 if (!core_text_sect) 204 { 205 fprintf (stderr, _("%s: can't find .text section in %s\n"), 206 whoami, aout_name); 207 done (1); 208 } 209 } 210 211 /* Read core's symbol table. */ 212 213 /* This will probably give us more than we need, but that's ok. */ 214 core_sym_bytes = bfd_get_symtab_upper_bound (core_bfd); 215 if (core_sym_bytes < 0) 216 { 217 fprintf (stderr, "%s: %s: %s\n", whoami, aout_name, 218 bfd_errmsg (bfd_get_error ())); 219 done (1); 220 } 221 222 core_syms = (asymbol **) xmalloc (core_sym_bytes); 223 core_num_syms = bfd_canonicalize_symtab (core_bfd, core_syms); 224 225 if (core_num_syms < 0) 226 { 227 fprintf (stderr, "%s: %s: %s\n", whoami, aout_name, 228 bfd_errmsg (bfd_get_error ())); 229 done (1); 230 } 231 232 synth_count = bfd_get_synthetic_symtab (core_bfd, core_num_syms, core_syms, 233 0, NULL, &synthsyms); 234 if (synth_count > 0) 235 { 236 asymbol **symp; 237 long new_size; 238 long i; 239 240 new_size = (core_num_syms + synth_count + 1) * sizeof (*core_syms); 241 core_syms = (asymbol **) xrealloc (core_syms, new_size); 242 symp = core_syms + core_num_syms; 243 core_num_syms += synth_count; 244 for (i = 0; i < synth_count; i++) 245 *symp++ = synthsyms + i; 246 *symp = 0; 247 } 248 249 min_insn_size = 1; 250 offset_to_code = 0; 251 252 switch (bfd_get_arch (core_bfd)) 253 { 254 case bfd_arch_vax: 255 case bfd_arch_tahoe: 256 offset_to_code = 2; 257 break; 258 259 case bfd_arch_alpha: 260 min_insn_size = 4; 261 break; 262 263 default: 264 break; 265 } 266 267 if (function_mapping_file) 268 read_function_mappings (function_mapping_file); 269 } 270 271 /* Read in the text space of an a.out file. */ 272 273 void 274 core_get_text_space (bfd *cbfd) 275 { 276 core_text_space = malloc (bfd_get_section_size (core_text_sect)); 277 278 if (!core_text_space) 279 { 280 fprintf (stderr, _("%s: ran out room for %lu bytes of text space\n"), 281 whoami, (unsigned long) bfd_get_section_size (core_text_sect)); 282 done (1); 283 } 284 285 if (!bfd_get_section_contents (cbfd, core_text_sect, core_text_space, 286 0, bfd_get_section_size (core_text_sect))) 287 { 288 bfd_perror ("bfd_get_section_contents"); 289 free (core_text_space); 290 core_text_space = 0; 291 } 292 293 if (!core_text_space) 294 fprintf (stderr, _("%s: can't do -c\n"), whoami); 295 } 296 297 298 void 299 find_call (Sym *parent, bfd_vma p_lowpc, bfd_vma p_highpc) 300 { 301 if (core_text_space == 0) 302 return; 303 304 hist_clip_symbol_address (&p_lowpc, &p_highpc); 305 306 switch (bfd_get_arch (core_bfd)) 307 { 308 case bfd_arch_i386: 309 i386_find_call (parent, p_lowpc, p_highpc); 310 break; 311 312 case bfd_arch_alpha: 313 alpha_find_call (parent, p_lowpc, p_highpc); 314 break; 315 316 case bfd_arch_vax: 317 vax_find_call (parent, p_lowpc, p_highpc); 318 break; 319 320 case bfd_arch_sparc: 321 sparc_find_call (parent, p_lowpc, p_highpc); 322 break; 323 324 case bfd_arch_tahoe: 325 tahoe_find_call (parent, p_lowpc, p_highpc); 326 break; 327 328 case bfd_arch_mips: 329 mips_find_call (parent, p_lowpc, p_highpc); 330 break; 331 332 case bfd_arch_aarch64: 333 aarch64_find_call (parent, p_lowpc, p_highpc); 334 break; 335 336 default: 337 fprintf (stderr, _("%s: -c not supported on architecture %s\n"), 338 whoami, bfd_printable_name(core_bfd)); 339 340 /* Don't give the error more than once. */ 341 ignore_direct_calls = FALSE; 342 } 343 } 344 345 /* Return class of symbol SYM. The returned class can be any of: 346 0 -> symbol is not interesting to us 347 'T' -> symbol is a global name 348 't' -> symbol is a local (static) name. */ 349 350 static int 351 core_sym_class (asymbol *sym) 352 { 353 symbol_info syminfo; 354 const char *name; 355 char sym_prefix; 356 int i; 357 358 if (sym->section == NULL || (sym->flags & BSF_DEBUGGING) != 0) 359 return 0; 360 361 /* Must be a text symbol, and static text symbols 362 don't qualify if ignore_static_funcs set. */ 363 if (ignore_static_funcs && (sym->flags & BSF_LOCAL)) 364 { 365 DBG (AOUTDEBUG, printf ("[core_sym_class] %s: not a function\n", 366 sym->name)); 367 return 0; 368 } 369 370 bfd_get_symbol_info (core_bfd, sym, &syminfo); 371 i = syminfo.type; 372 373 if (i == 'T') 374 return i; /* It's a global symbol. */ 375 376 if (i == 'W') 377 /* Treat weak symbols as text symbols. FIXME: a weak symbol may 378 also be a data symbol. */ 379 return 'T'; 380 381 if (i != 't') 382 { 383 /* Not a static text symbol. */ 384 DBG (AOUTDEBUG, printf ("[core_sym_class] %s is of class %c\n", 385 sym->name, i)); 386 return 0; 387 } 388 389 /* Do some more filtering on static function-names. */ 390 if (ignore_static_funcs) 391 return 0; 392 393 /* Can't zero-length name or funny characters in name, where 394 `funny' includes: `.' (.o file names) and `$' (Pascal labels). */ 395 if (!sym->name || sym->name[0] == '\0') 396 return 0; 397 398 for (name = sym->name; *name; ++name) 399 { 400 if (*name == '$') 401 return 0; 402 403 while (*name == '.') 404 { 405 /* Allow both nested subprograms (which end with ".NNN", where N is 406 a digit) and GCC cloned functions (which contain ".clone"). 407 Allow for multiple iterations of both - apparently GCC can clone 408 clones and subprograms. */ 409 int digit_seen = 0; 410 #define CLONE_NAME ".clone." 411 #define CLONE_NAME_LEN strlen (CLONE_NAME) 412 #define CONSTPROP_NAME ".constprop." 413 #define CONSTPROP_NAME_LEN strlen (CONSTPROP_NAME) 414 415 if (strlen (name) > CLONE_NAME_LEN 416 && strncmp (name, CLONE_NAME, CLONE_NAME_LEN) == 0) 417 name += CLONE_NAME_LEN - 1; 418 419 else if (strlen (name) > CONSTPROP_NAME_LEN 420 && strncmp (name, CONSTPROP_NAME, CONSTPROP_NAME_LEN) == 0) 421 name += CONSTPROP_NAME_LEN - 1; 422 423 for (name++; *name; name++) 424 if (digit_seen && *name == '.') 425 break; 426 else if (ISDIGIT (*name)) 427 digit_seen = 1; 428 else 429 return 0; 430 } 431 } 432 433 /* On systems where the C compiler adds an underscore to all 434 names, static names without underscores seem usually to be 435 labels in hand written assembler in the library. We don't want 436 these names. This is certainly necessary on a Sparc running 437 SunOS 4.1 (try profiling a program that does a lot of 438 division). I don't know whether it has harmful side effects on 439 other systems. Perhaps it should be made configurable. */ 440 sym_prefix = bfd_get_symbol_leading_char (core_bfd); 441 442 if ((sym_prefix && sym_prefix != sym->name[0]) 443 /* GCC may add special symbols to help gdb figure out the file 444 language. We want to ignore these, since sometimes they mask 445 the real function. (dj@ctron) */ 446 || !strncmp (sym->name, "__gnu_compiled", 14) 447 || !strncmp (sym->name, "___gnu_compiled", 15)) 448 { 449 return 0; 450 } 451 452 /* If the object file supports marking of function symbols, then 453 we can zap anything that doesn't have BSF_FUNCTION set. */ 454 if (ignore_non_functions && (sym->flags & BSF_FUNCTION) == 0) 455 return 0; 456 457 return 't'; /* It's a static text symbol. */ 458 } 459 460 /* Get whatever source info we can get regarding address ADDR. */ 461 462 static bfd_boolean 463 get_src_info (bfd_vma addr, const char **filename, const char **name, int *line_num) 464 { 465 const char *fname = 0, *func_name = 0; 466 int l = 0; 467 468 if (bfd_find_nearest_line (core_bfd, core_text_sect, core_syms, 469 addr - core_text_sect->vma, 470 &fname, &func_name, (unsigned int *) &l) 471 && fname && func_name && l) 472 { 473 DBG (AOUTDEBUG, printf ("[get_src_info] 0x%lx -> %s:%d (%s)\n", 474 (unsigned long) addr, fname, l, func_name)); 475 *filename = fname; 476 *name = func_name; 477 *line_num = l; 478 return TRUE; 479 } 480 else 481 { 482 DBG (AOUTDEBUG, printf ("[get_src_info] no info for 0x%lx (%s:%d,%s)\n", 483 (unsigned long) addr, 484 fname ? fname : "<unknown>", l, 485 func_name ? func_name : "<unknown>")); 486 return FALSE; 487 } 488 } 489 490 static char buf[BUFSIZE]; 491 static char address[BUFSIZE]; 492 static char name[BUFSIZE]; 493 494 /* Return number of symbols in a symbol-table file. */ 495 496 static unsigned int 497 num_of_syms_in (FILE * f) 498 { 499 char type; 500 unsigned int num = 0; 501 502 while (!feof (f) && fgets (buf, BUFSIZE - 1, f)) 503 { 504 if (sscanf (buf, "%" STR_BUFSIZE "s %c %" STR_BUFSIZE "s", address, &type, name) == 3) 505 if (type == 't' || type == 'T') 506 { 507 /* PR 20499 - prevent integer overflow computing argument to xmalloc. */ 508 if (++num >= UINT_MAX / sizeof (Sym)) 509 return -1U; 510 } 511 } 512 513 return num; 514 } 515 516 /* Read symbol table from a file. */ 517 518 void 519 core_create_syms_from (const char * sym_table_file) 520 { 521 char type; 522 bfd_vma min_vma = ~(bfd_vma) 0; 523 bfd_vma max_vma = 0; 524 FILE * f; 525 526 f = fopen (sym_table_file, "r"); 527 if (!f) 528 { 529 fprintf (stderr, _("%s: could not open %s.\n"), whoami, sym_table_file); 530 done (1); 531 } 532 533 /* Pass 1 - determine upper bound on number of function names. */ 534 symtab.len = num_of_syms_in (f); 535 536 if (symtab.len == 0) 537 { 538 fprintf (stderr, _("%s: file `%s' has no symbols\n"), whoami, sym_table_file); 539 done (1); 540 } 541 else if (symtab.len == -1U) 542 { 543 fprintf (stderr, _("%s: file `%s' has too many symbols\n"), 544 whoami, sym_table_file); 545 done (1); 546 } 547 548 symtab.base = (Sym *) xmalloc (symtab.len * sizeof (Sym)); 549 550 /* Pass 2 - create symbols. */ 551 symtab.limit = symtab.base; 552 553 if (fseek (f, 0, SEEK_SET) != 0) 554 { 555 perror (sym_table_file); 556 done (1); 557 } 558 559 while (!feof (f) && fgets (buf, BUFSIZE - 1, f)) 560 { 561 if (sscanf (buf, "%" STR_BUFSIZE "s %c %" STR_BUFSIZE "s", address, &type, name) != 3) 562 continue; 563 if (type != 't' && type != 'T') 564 continue; 565 566 sym_init (symtab.limit); 567 568 sscanf (address, "%" BFD_VMA_FMT "x", &(symtab.limit->addr) ); 569 570 symtab.limit->name = (char *) xmalloc (strlen (name) + 1); 571 strcpy ((char *) symtab.limit->name, name); 572 symtab.limit->mapped = 0; 573 symtab.limit->is_func = TRUE; 574 symtab.limit->is_bb_head = TRUE; 575 symtab.limit->is_static = (type == 't'); 576 min_vma = MIN (symtab.limit->addr, min_vma); 577 max_vma = MAX (symtab.limit->addr, max_vma); 578 579 ++symtab.limit; 580 } 581 fclose (f); 582 583 symtab.len = symtab.limit - symtab.base; 584 symtab_finalize (&symtab); 585 } 586 587 static int 588 search_mapped_symbol (const void * l, const void * r) 589 { 590 return strcmp ((const char *) l, ((const struct function_map *) r)->function_name); 591 } 592 593 /* Read in symbol table from core. 594 One symbol per function is entered. */ 595 596 void 597 core_create_function_syms (void) 598 { 599 bfd_vma min_vma = ~ (bfd_vma) 0; 600 bfd_vma max_vma = 0; 601 int cxxclass; 602 long i; 603 struct function_map * found = NULL; 604 int core_has_func_syms = 0; 605 606 switch (core_bfd->xvec->flavour) 607 { 608 default: 609 break; 610 case bfd_target_coff_flavour: 611 case bfd_target_ecoff_flavour: 612 case bfd_target_xcoff_flavour: 613 case bfd_target_elf_flavour: 614 case bfd_target_nlm_flavour: 615 case bfd_target_som_flavour: 616 core_has_func_syms = 1; 617 } 618 619 /* Pass 1 - determine upper bound on number of function names. */ 620 symtab.len = 0; 621 622 for (i = 0; i < core_num_syms; ++i) 623 { 624 if (!core_sym_class (core_syms[i])) 625 continue; 626 627 /* Don't create a symtab entry for a function that has 628 a mapping to a file, unless it's the first function 629 in the file. */ 630 if (symbol_map_count != 0) 631 { 632 /* Note: some systems (SunOS 5.8) crash if bsearch base argument 633 is NULL. */ 634 found = (struct function_map *) bsearch 635 (core_syms[i]->name, symbol_map, symbol_map_count, 636 sizeof (struct function_map), search_mapped_symbol); 637 } 638 if (found == NULL || found->is_first) 639 ++symtab.len; 640 } 641 642 if (symtab.len == 0) 643 { 644 fprintf (stderr, _("%s: file `%s' has no symbols\n"), whoami, a_out_name); 645 done (1); 646 } 647 648 symtab.base = (Sym *) xmalloc (symtab.len * sizeof (Sym)); 649 650 /* Pass 2 - create symbols. */ 651 symtab.limit = symtab.base; 652 653 for (i = 0; i < core_num_syms; ++i) 654 { 655 asection *sym_sec; 656 657 cxxclass = core_sym_class (core_syms[i]); 658 659 if (!cxxclass) 660 { 661 DBG (AOUTDEBUG, 662 printf ("[core_create_function_syms] rejecting: 0x%lx %s\n", 663 (unsigned long) core_syms[i]->value, 664 core_syms[i]->name)); 665 continue; 666 } 667 668 if (symbol_map_count != 0) 669 { 670 /* Note: some systems (SunOS 5.8) crash if bsearch base argument 671 is NULL. */ 672 found = (struct function_map *) bsearch 673 (core_syms[i]->name, symbol_map, symbol_map_count, 674 sizeof (struct function_map), search_mapped_symbol); 675 } 676 if (found && ! found->is_first) 677 continue; 678 679 sym_init (symtab.limit); 680 681 /* Symbol offsets are always section-relative. */ 682 sym_sec = core_syms[i]->section; 683 symtab.limit->addr = core_syms[i]->value; 684 if (sym_sec) 685 symtab.limit->addr += bfd_get_section_vma (sym_sec->owner, sym_sec); 686 687 if (found) 688 { 689 symtab.limit->name = found->file_name; 690 symtab.limit->mapped = 1; 691 } 692 else 693 { 694 symtab.limit->name = core_syms[i]->name; 695 symtab.limit->mapped = 0; 696 } 697 698 /* Lookup filename and line number, if we can. */ 699 { 700 const char * filename; 701 const char * func_name; 702 703 if (get_src_info (symtab.limit->addr, & filename, & func_name, 704 & symtab.limit->line_num)) 705 { 706 symtab.limit->file = source_file_lookup_path (filename); 707 708 /* FIXME: Checking __osf__ here does not work with a cross 709 gprof. */ 710 #ifdef __osf__ 711 /* Suppress symbols that are not function names. This is 712 useful to suppress code-labels and aliases. 713 714 This is known to be useful under DEC's OSF/1. Under SunOS 4.x, 715 labels do not appear in the symbol table info, so this isn't 716 necessary. */ 717 718 if (strcmp (symtab.limit->name, func_name) != 0) 719 { 720 /* The symbol's address maps to a different name, so 721 it can't be a function-entry point. This happens 722 for labels, for example. */ 723 DBG (AOUTDEBUG, 724 printf ("[core_create_function_syms: rej %s (maps to %s)\n", 725 symtab.limit->name, func_name)); 726 continue; 727 } 728 #endif 729 } 730 } 731 732 symtab.limit->is_func = (!core_has_func_syms 733 || (core_syms[i]->flags & BSF_FUNCTION) != 0); 734 symtab.limit->is_bb_head = TRUE; 735 736 if (cxxclass == 't') 737 symtab.limit->is_static = TRUE; 738 739 /* Keep track of the minimum and maximum vma addresses used by all 740 symbols. When computing the max_vma, use the ending address of the 741 section containing the symbol, if available. */ 742 min_vma = MIN (symtab.limit->addr, min_vma); 743 if (sym_sec) 744 max_vma = MAX (bfd_get_section_vma (sym_sec->owner, sym_sec) 745 + bfd_section_size (sym_sec->owner, sym_sec) - 1, 746 max_vma); 747 else 748 max_vma = MAX (symtab.limit->addr, max_vma); 749 750 DBG (AOUTDEBUG, printf ("[core_create_function_syms] %ld %s 0x%lx\n", 751 (long) (symtab.limit - symtab.base), 752 symtab.limit->name, 753 (unsigned long) symtab.limit->addr)); 754 ++symtab.limit; 755 } 756 757 symtab.len = symtab.limit - symtab.base; 758 symtab_finalize (&symtab); 759 } 760 761 /* Read in symbol table from core. 762 One symbol per line of source code is entered. */ 763 764 void 765 core_create_line_syms (void) 766 { 767 char *prev_name, *prev_filename; 768 unsigned int prev_name_len, prev_filename_len; 769 bfd_vma vma, min_vma = ~(bfd_vma) 0, max_vma = 0; 770 Sym *prev, dummy, *sym; 771 const char *filename; 772 int prev_line_num; 773 Sym_Table ltab; 774 bfd_vma vma_high; 775 776 /* Create symbols for functions as usual. This is necessary in 777 cases where parts of a program were not compiled with -g. For 778 those parts we still want to get info at the function level. */ 779 core_create_function_syms (); 780 781 /* Pass 1: count the number of symbols. */ 782 783 /* To find all line information, walk through all possible 784 text-space addresses (one by one!) and get the debugging 785 info for each address. When the debugging info changes, 786 it is time to create a new symbol. 787 788 Of course, this is rather slow and it would be better if 789 BFD would provide an iterator for enumerating all line infos. */ 790 prev_name_len = PATH_MAX; 791 prev_filename_len = PATH_MAX; 792 prev_name = (char *) xmalloc (prev_name_len); 793 prev_filename = (char *) xmalloc (prev_filename_len); 794 ltab.len = 0; 795 prev_line_num = 0; 796 797 vma_high = core_text_sect->vma + bfd_get_section_size (core_text_sect); 798 for (vma = core_text_sect->vma; vma < vma_high; vma += min_insn_size) 799 { 800 unsigned int len; 801 802 if (!get_src_info (vma, &filename, &dummy.name, &dummy.line_num) 803 || (prev_line_num == dummy.line_num 804 && prev_name != NULL 805 && strcmp (prev_name, dummy.name) == 0 806 && filename_cmp (prev_filename, filename) == 0)) 807 continue; 808 809 ++ltab.len; 810 prev_line_num = dummy.line_num; 811 812 len = strlen (dummy.name); 813 if (len >= prev_name_len) 814 { 815 prev_name_len = len + 1024; 816 free (prev_name); 817 prev_name = (char *) xmalloc (prev_name_len); 818 } 819 820 strcpy (prev_name, dummy.name); 821 len = strlen (filename); 822 823 if (len >= prev_filename_len) 824 { 825 prev_filename_len = len + 1024; 826 free (prev_filename); 827 prev_filename = (char *) xmalloc (prev_filename_len); 828 } 829 830 strcpy (prev_filename, filename); 831 832 min_vma = MIN (vma, min_vma); 833 max_vma = MAX (vma, max_vma); 834 } 835 836 free (prev_name); 837 free (prev_filename); 838 839 /* Make room for function symbols, too. */ 840 ltab.len += symtab.len; 841 ltab.base = (Sym *) xmalloc (ltab.len * sizeof (Sym)); 842 ltab.limit = ltab.base; 843 844 /* Pass 2 - create symbols. */ 845 846 /* We now set is_static as we go along, rather than by running 847 through the symbol table at the end. 848 849 The old way called symtab_finalize before the is_static pass, 850 causing a problem since symtab_finalize uses is_static as part of 851 its address conflict resolution algorithm. Since global symbols 852 were preferred over static symbols, and all line symbols were 853 global at that point, static function names that conflicted with 854 their own line numbers (static, but labeled as global) were 855 rejected in favor of the line num. 856 857 This was not the desired functionality. We always want to keep 858 our function symbols and discard any conflicting line symbols. 859 Perhaps symtab_finalize should be modified to make this 860 distinction as well, but the current fix works and the code is a 861 lot cleaner now. */ 862 prev = 0; 863 864 for (vma = core_text_sect->vma; vma < vma_high; vma += min_insn_size) 865 { 866 sym_init (ltab.limit); 867 868 if (!get_src_info (vma, &filename, <ab.limit->name, <ab.limit->line_num) 869 || (prev && prev->line_num == ltab.limit->line_num 870 && strcmp (prev->name, ltab.limit->name) == 0 871 && filename_cmp (prev->file->name, filename) == 0)) 872 continue; 873 874 /* Make name pointer a malloc'ed string. */ 875 ltab.limit->name = xstrdup (ltab.limit->name); 876 ltab.limit->file = source_file_lookup_path (filename); 877 878 ltab.limit->addr = vma; 879 880 /* Set is_static based on the enclosing function, using either: 881 1) the previous symbol, if it's from the same function, or 882 2) a symtab lookup. */ 883 if (prev && ltab.limit->file == prev->file && 884 strcmp (ltab.limit->name, prev->name) == 0) 885 { 886 ltab.limit->is_static = prev->is_static; 887 } 888 else 889 { 890 sym = sym_lookup(&symtab, ltab.limit->addr); 891 if (sym) 892 ltab.limit->is_static = sym->is_static; 893 } 894 895 prev = ltab.limit; 896 897 DBG (AOUTDEBUG, printf ("[core_create_line_syms] %lu %s 0x%lx\n", 898 (unsigned long) (ltab.limit - ltab.base), 899 ltab.limit->name, 900 (unsigned long) ltab.limit->addr)); 901 ++ltab.limit; 902 } 903 904 /* Copy in function symbols. */ 905 memcpy (ltab.limit, symtab.base, symtab.len * sizeof (Sym)); 906 ltab.limit += symtab.len; 907 908 if ((unsigned int) (ltab.limit - ltab.base) != ltab.len) 909 { 910 fprintf (stderr, 911 _("%s: somebody miscounted: ltab.len=%d instead of %ld\n"), 912 whoami, ltab.len, (long) (ltab.limit - ltab.base)); 913 done (1); 914 } 915 916 /* Finalize ltab and make it symbol table. */ 917 symtab_finalize (<ab); 918 free (symtab.base); 919 symtab = ltab; 920 } 921