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