3 Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
5 This file is part of GNU Binutils.
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 2 of the License, or
10 (at your option) any later version.
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.
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., 59 Temple Place - Suite 330, Boston, MA
22 #include "libiberty.h"
24 #include "search_list.h"
32 asection *core_text_sect;
38 /* For mapping symbols to specific .o files during file ordering. */
45 struct function_map *symbol_map;
46 unsigned int symbol_map_count;
48 extern void i386_find_call PARAMS ((Sym *, bfd_vma, bfd_vma));
49 extern void alpha_find_call PARAMS ((Sym *, bfd_vma, bfd_vma));
50 extern void vax_find_call PARAMS ((Sym *, bfd_vma, bfd_vma));
51 extern void tahoe_find_call PARAMS ((Sym *, bfd_vma, bfd_vma));
52 extern void sparc_find_call PARAMS ((Sym *, bfd_vma, bfd_vma));
53 extern void mips_find_call PARAMS ((Sym *, bfd_vma, bfd_vma));
56 DEFUN (read_function_mappings, (filename), const char *filename)
58 FILE *file = fopen (filename, "r");
64 fprintf (stderr, _("%s: could not open %s.\n"), whoami, filename);
68 /* First parse the mapping file so we know how big we need to
69 make our tables. We also do some sanity checks at this
75 matches = fscanf (file, "%[^\n:]", dummy);
78 fprintf (stderr, _("%s: unable to parse mapping file %s.\n"),
83 /* Just skip messages about files with no symbols. */
84 if (!strncmp (dummy, "No symbols in ", 14))
90 /* Don't care what else is on this line at this point. */
91 fscanf (file, "%[^\n]\n", dummy);
95 /* Now we know how big we need to make our table. */
96 symbol_map = ((struct function_map *)
97 xmalloc (count * sizeof (struct function_map)));
99 /* Rewind the input file so we can read it again. */
102 /* Read each entry and put it into the table. */
109 matches = fscanf (file, "%[^\n:]", dummy);
112 fprintf (stderr, _("%s: unable to parse mapping file %s.\n"),
117 /* Just skip messages about files with no symbols. */
118 if (!strncmp (dummy, "No symbols in ", 14))
124 /* dummy has the filename, go ahead and copy it. */
125 symbol_map[count].file_name = xmalloc (strlen (dummy) + 1);
126 strcpy (symbol_map[count].file_name, dummy);
128 /* Now we need the function name. */
129 fscanf (file, "%[^\n]\n", dummy);
130 tmp = strrchr (dummy, ' ') + 1;
131 symbol_map[count].function_name = xmalloc (strlen (tmp) + 1);
132 strcpy (symbol_map[count].function_name, tmp);
136 /* Record the size of the map table for future reference. */
137 symbol_map_count = count;
142 DEFUN (core_init, (a_out_name), const char *a_out_name)
144 core_bfd = bfd_openr (a_out_name, 0);
152 if (!bfd_check_format (core_bfd, bfd_object))
154 fprintf (stderr, _("%s: %s: not in a.out format\n"), whoami, a_out_name);
158 /* Get core's text section. */
159 core_text_sect = bfd_get_section_by_name (core_bfd, ".text");
162 core_text_sect = bfd_get_section_by_name (core_bfd, "$CODE$");
165 fprintf (stderr, _("%s: can't find .text section in %s\n"),
171 /* Read core's symbol table. */
173 /* This will probably give us more than we need, but that's ok. */
174 core_num_syms = bfd_get_symtab_upper_bound (core_bfd);
175 if (core_num_syms < 0)
177 fprintf (stderr, "%s: %s: %s\n", whoami, a_out_name,
178 bfd_errmsg (bfd_get_error ()));
182 core_syms = (asymbol **) xmalloc (core_num_syms);
183 core_num_syms = bfd_canonicalize_symtab (core_bfd, core_syms);
185 if (core_num_syms < 0)
187 fprintf (stderr, "%s: %s: %s\n", whoami, a_out_name,
188 bfd_errmsg (bfd_get_error ()));
195 switch (bfd_get_arch (core_bfd))
210 if (function_mapping_file)
211 read_function_mappings (function_mapping_file);
214 /* Read in the text space of an a.out file. */
217 DEFUN (core_get_text_space, (core_bfd), bfd * core_bfd)
219 core_text_space = (PTR) malloc (core_text_sect->_raw_size);
221 if (!core_text_space)
223 fprintf (stderr, _("%s: ran out room for %lu bytes of text space\n"),
224 whoami, (unsigned long) core_text_sect->_raw_size);
228 if (!bfd_get_section_contents (core_bfd, core_text_sect, core_text_space,
229 0, core_text_sect->_raw_size))
231 bfd_perror ("bfd_get_section_contents");
232 free (core_text_space);
236 if (!core_text_space)
237 fprintf (stderr, _("%s: can't do -c\n"), whoami);
242 DEFUN (find_call, (parent, p_lowpc, p_highpc),
243 Sym * parent AND bfd_vma p_lowpc AND bfd_vma p_highpc)
245 switch (bfd_get_arch (core_bfd))
248 i386_find_call (parent, p_lowpc, p_highpc);
252 alpha_find_call (parent, p_lowpc, p_highpc);
256 vax_find_call (parent, p_lowpc, p_highpc);
260 sparc_find_call (parent, p_lowpc, p_highpc);
264 tahoe_find_call (parent, p_lowpc, p_highpc);
268 mips_find_call (parent, p_lowpc, p_highpc);
272 fprintf (stderr, _("%s: -c not supported on architecture %s\n"),
273 whoami, bfd_printable_name(core_bfd));
275 /* Don't give the error more than once. */
276 ignore_direct_calls = false;
280 /* Return class of symbol SYM. The returned class can be any of:
281 0 -> symbol is not interesting to us
282 'T' -> symbol is a global name
283 't' -> symbol is a local (static) name. */
286 DEFUN (core_sym_class, (sym), asymbol * sym)
293 if (sym->section == NULL || (sym->flags & BSF_DEBUGGING) != 0)
296 /* Must be a text symbol, and static text symbols
297 don't qualify if ignore_static_funcs set. */
298 if (ignore_static_funcs && (sym->flags & BSF_LOCAL))
300 DBG (AOUTDEBUG, printf ("[core_sym_class] %s: not a function\n",
305 bfd_get_symbol_info (core_bfd, sym, &syminfo);
309 return i; /* It's a global symbol. */
312 /* Treat weak symbols as text symbols. FIXME: a weak symbol may
313 also be a data symbol. */
318 /* Not a static text symbol. */
319 DBG (AOUTDEBUG, printf ("[core_sym_class] %s is of class %c\n",
324 /* Do some more filtering on static function-names. */
325 if (ignore_static_funcs)
328 /* Can't zero-length name or funny characters in name, where
329 `funny' includes: `.' (.o file names) and `$' (Pascal labels). */
330 if (!sym->name || sym->name[0] == '\0')
333 for (name = sym->name; *name; ++name)
335 if (*name == '.' || *name == '$')
339 /* On systems where the C compiler adds an underscore to all
340 names, static names without underscores seem usually to be
341 labels in hand written assembler in the library. We don't want
342 these names. This is certainly necessary on a Sparc running
343 SunOS 4.1 (try profiling a program that does a lot of
344 division). I don't know whether it has harmful side effects on
345 other systems. Perhaps it should be made configurable. */
346 sym_prefix = bfd_get_symbol_leading_char (core_bfd);
348 if ((sym_prefix && sym_prefix != sym->name[0])
349 /* GCC may add special symbols to help gdb figure out the file
350 language. We want to ignore these, since sometimes they mask
351 the real function. (dj@ctron) */
352 || !strncmp (sym->name, "__gnu_compiled", 14)
353 || !strncmp (sym->name, "___gnu_compiled", 15))
358 /* If the object file supports marking of function symbols, then
359 we can zap anything that doesn't have BSF_FUNCTION set. */
360 if (ignore_non_functions && (sym->flags & BSF_FUNCTION) == 0)
363 return 't'; /* It's a static text symbol. */
366 /* Get whatever source info we can get regarding address ADDR. */
369 DEFUN (get_src_info, (addr, filename, name, line_num),
370 bfd_vma addr AND const char **filename AND const char **name
373 const char *fname = 0, *func_name = 0;
376 if (bfd_find_nearest_line (core_bfd, core_text_sect, core_syms,
377 addr - core_text_sect->vma,
378 &fname, &func_name, (unsigned int *) &l)
379 && fname && func_name && l)
381 DBG (AOUTDEBUG, printf ("[get_src_info] 0x%lx -> %s:%d (%s)\n",
382 (unsigned long) addr, fname, l, func_name));
390 DBG (AOUTDEBUG, printf ("[get_src_info] no info for 0x%lx (%s:%d,%s)\n",
391 (long) addr, fname ? fname : "<unknown>", l,
392 func_name ? func_name : "<unknown>"));
397 /* Read in symbol table from core.
398 One symbol per function is entered. */
401 core_create_function_syms (core_bfd)
402 bfd *core_bfd ATTRIBUTE_UNUSED;
404 bfd_vma min_vma = ~0, max_vma = 0;
409 /* Pass 1 - determine upper bound on number of function names. */
412 for (i = 0; i < core_num_syms; ++i)
414 if (!core_sym_class (core_syms[i]))
417 /* This should be replaced with a binary search or hashed
420 Don't create a symtab entry for a function that has
421 a mapping to a file, unless it's the first function
424 for (j = 0; j < symbol_map_count; j++)
425 if (!strcmp (core_syms[i]->name, symbol_map[j].function_name))
427 if (j > 0 && ! strcmp (symbol_map [j].file_name,
428 symbol_map [j - 1].file_name))
439 fprintf (stderr, _("%s: file `%s' has no symbols\n"), whoami, a_out_name);
443 /* The "+ 2" is for the sentinels. */
444 symtab.base = (Sym *) xmalloc ((symtab.len + 2) * sizeof (Sym));
446 /* Pass 2 - create symbols. */
447 symtab.limit = symtab.base;
449 for (i = 0; i < core_num_syms; ++i)
451 class = core_sym_class (core_syms[i]);
456 printf ("[core_create_function_syms] rejecting: 0x%lx %s\n",
457 (unsigned long) core_syms[i]->value,
458 core_syms[i]->name));
462 /* This should be replaced with a binary search or hashed
467 for (j = 0; j < symbol_map_count; j++)
468 if (!strcmp (core_syms[i]->name, symbol_map[j].function_name))
470 if (j > 0 && ! strcmp (symbol_map [j].file_name,
471 symbol_map [j - 1].file_name))
481 sym_init (symtab.limit);
483 /* Symbol offsets are always section-relative. */
484 symtab.limit->addr = core_syms[i]->value + core_syms[i]->section->vma;
487 && !strcmp (core_syms[i]->name, symbol_map[found].function_name))
489 symtab.limit->name = symbol_map[found].file_name;
490 symtab.limit->mapped = 1;
494 symtab.limit->name = core_syms[i]->name;
495 symtab.limit->mapped = 0;
498 /* Lookup filename and line number, if we can. */
500 const char *filename, *func_name;
502 if (get_src_info (symtab.limit->addr, &filename, &func_name,
503 &symtab.limit->line_num))
505 symtab.limit->file = source_file_lookup_path (filename);
507 /* FIXME: Checking __osf__ here does not work with a cross
510 /* Suppress symbols that are not function names. This is
511 useful to suppress code-labels and aliases.
513 This is known to be useful under DEC's OSF/1. Under SunOS 4.x,
514 labels do not appear in the symbol table info, so this isn't
517 if (strcmp (symtab.limit->name, func_name) != 0)
519 /* The symbol's address maps to a different name, so
520 it can't be a function-entry point. This happens
521 for labels, for example. */
523 printf ("[core_create_function_syms: rej %s (maps to %s)\n",
524 symtab.limit->name, func_name));
531 symtab.limit->is_func = true;
532 symtab.limit->is_bb_head = true;
535 symtab.limit->is_static = true;
537 min_vma = MIN (symtab.limit->addr, min_vma);
538 max_vma = MAX (symtab.limit->addr, max_vma);
540 /* If we see "main" without an initial '_', we assume names
541 are *not* prefixed by '_'. */
542 if (symtab.limit->name[0] == 'm' && discard_underscores
543 && strcmp (symtab.limit->name, "main") == 0)
544 discard_underscores = 0;
546 DBG (AOUTDEBUG, printf ("[core_create_function_syms] %ld %s 0x%lx\n",
547 (long) (symtab.limit - symtab.base),
549 (unsigned long) symtab.limit->addr));
553 /* Create sentinels. */
554 sym_init (symtab.limit);
555 symtab.limit->name = "<locore>";
556 symtab.limit->addr = 0;
557 symtab.limit->end_addr = min_vma - 1;
560 sym_init (symtab.limit);
561 symtab.limit->name = "<hicore>";
562 symtab.limit->addr = max_vma + 1;
563 symtab.limit->end_addr = ~0;
566 symtab.len = symtab.limit - symtab.base;
567 symtab_finalize (&symtab);
570 /* Read in symbol table from core.
571 One symbol per line of source code is entered. */
574 DEFUN (core_create_line_syms, (core_bfd), bfd * core_bfd)
576 char *prev_name, *prev_filename;
577 int prev_name_len, prev_filename_len;
578 bfd_vma vma, min_vma = ~0, max_vma = 0;
580 Sym *prev, dummy, *sentinel, *sym;
581 const char *filename;
585 /* Create symbols for functions as usual. This is necessary in
586 cases where parts of a program were not compiled with -g. For
587 those parts we still want to get info at the function level. */
588 core_create_function_syms (core_bfd);
590 /* Pass 1 - counter number of symbols. */
592 /* To find all line information, walk through all possible
593 text-space addresses (one by one!) and get the debugging
594 info for each address. When the debugging info changes,
595 it is time to create a new symbol.
597 Of course, this is rather slow and it would be better if
598 bfd would provide an iterator for enumerating all line infos. */
599 prev_name_len = PATH_MAX;
600 prev_filename_len = PATH_MAX;
601 prev_name = xmalloc (prev_name_len);
602 prev_filename = xmalloc (prev_filename_len);
606 for (offset = 0; offset < core_text_sect->_raw_size; offset += min_insn_size)
610 vma = core_text_sect->vma + offset;
612 if (!get_src_info (vma, &filename, &dummy.name, &dummy.line_num)
613 || (prev_line_num == dummy.line_num
615 && strcmp (prev_name, dummy.name) == 0
616 && strcmp (prev_filename, filename) == 0))
620 prev_line_num = dummy.line_num;
622 len = strlen (dummy.name);
623 if (len >= prev_name_len)
625 prev_name_len = len + 1024;
627 prev_name = xmalloc (prev_name_len);
630 strcpy (prev_name, dummy.name);
631 len = strlen (filename);
633 if (len >= prev_filename_len)
635 prev_filename_len = len + 1024;
636 free (prev_filename);
637 prev_filename = xmalloc (prev_filename_len);
640 strcpy (prev_filename, filename);
642 min_vma = MIN (vma, min_vma);
643 max_vma = MAX (vma, max_vma);
647 free (prev_filename);
649 /* Make room for function symbols, too. */
650 ltab.len += symtab.len;
651 ltab.base = (Sym *) xmalloc (ltab.len * sizeof (Sym));
652 ltab.limit = ltab.base;
654 /* Pass 2 - create symbols. */
656 /* We now set is_static as we go along, rather than by running
657 through the symbol table at the end.
659 The old way called symtab_finalize before the is_static pass,
660 causing a problem since symtab_finalize uses is_static as part of
661 its address conflict resolution algorithm. Since global symbols
662 were prefered over static symbols, and all line symbols were
663 global at that point, static function names that conflicted with
664 their own line numbers (static, but labeled as global) were
665 rejected in favor of the line num.
667 This was not the desired functionality. We always want to keep
668 our function symbols and discard any conflicting line symbols.
669 Perhaps symtab_finalize should be modified to make this
670 distinction as well, but the current fix works and the code is a
674 for (offset = 0; offset < core_text_sect->_raw_size; offset += min_insn_size)
676 sym_init (ltab.limit);
678 if (!get_src_info (core_text_sect->vma + offset, &filename,
679 <ab.limit->name, <ab.limit->line_num)
680 || (prev && prev->line_num == ltab.limit->line_num
681 && strcmp (prev->name, ltab.limit->name) == 0
682 && strcmp (prev->file->name, filename) == 0))
685 /* Make name pointer a malloc'ed string. */
686 ltab.limit->name = xstrdup (ltab.limit->name);
687 ltab.limit->file = source_file_lookup_path (filename);
689 ltab.limit->addr = core_text_sect->vma + offset;
691 /* Set is_static based on the enclosing function, using either:
692 1) the previous symbol, if it's from the same function, or
693 2) a symtab lookup. */
694 if (prev && ltab.limit->file == prev->file &&
695 strcmp (ltab.limit->name, prev->name) == 0)
697 ltab.limit->is_static = prev->is_static;
701 sym = sym_lookup(&symtab, ltab.limit->addr);
702 ltab.limit->is_static = sym->is_static;
707 /* If we see "main" without an initial '_', we assume names
708 are *not* prefixed by '_'. */
709 if (ltab.limit->name[0] == 'm' && discard_underscores
710 && strcmp (ltab.limit->name, "main") == 0)
711 discard_underscores = 0;
713 DBG (AOUTDEBUG, printf ("[core_create_line_syms] %lu %s 0x%lx\n",
714 (unsigned long) (ltab.limit - ltab.base),
716 (unsigned long) ltab.limit->addr));
720 /* Update sentinels. */
721 sentinel = sym_lookup (&symtab, 0);
723 if (strcmp (sentinel->name, "<locore>") == 0
724 && min_vma <= sentinel->end_addr)
725 sentinel->end_addr = min_vma - 1;
727 sentinel = sym_lookup (&symtab, ~0);
729 if (strcmp (sentinel->name, "<hicore>") == 0 && max_vma >= sentinel->addr)
730 sentinel->addr = max_vma + 1;
732 /* Copy in function symbols. */
733 memcpy (ltab.limit, symtab.base, symtab.len * sizeof (Sym));
734 ltab.limit += symtab.len;
736 if ((unsigned int) (ltab.limit - ltab.base) != ltab.len)
739 _("%s: somebody miscounted: ltab.len=%d instead of %ld\n"),
740 whoami, ltab.len, (long) (ltab.limit - ltab.base));
744 /* Finalize ltab and make it symbol table. */
745 symtab_finalize (<ab);