1/* Read ELF (Executable and Linking Format) object files for GDB.
2
3   Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4   2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
5
6   Written by Fred Fish at Cygnus Support.
7
8   This file is part of GDB.
9
10   This program is free software; you can redistribute it and/or modify
11   it under the terms of the GNU General Public License as published by
12   the Free Software Foundation; either version 3 of the License, or
13   (at your option) any later version.
14
15   This program is distributed in the hope that it will be useful,
16   but WITHOUT ANY WARRANTY; without even the implied warranty of
17   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18   GNU General Public License for more details.
19
20   You should have received a copy of the GNU General Public License
21   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
22
23#include "defs.h"
24#include "bfd.h"
25#include "gdb_string.h"
26#include "elf-bfd.h"
27#include "elf/common.h"
28#include "elf/internal.h"
29#include "elf/mips.h"
30#include "symtab.h"
31#include "symfile.h"
32#include "objfiles.h"
33#include "buildsym.h"
34#include "stabsread.h"
35#include "gdb-stabs.h"
36#include "complaints.h"
37#include "demangle.h"
38
39extern void _initialize_elfread (void);
40
41/* The struct elfinfo is available only during ELF symbol table and
42   psymtab reading.  It is destroyed at the completion of psymtab-reading.
43   It's local to elf_symfile_read.  */
44
45struct elfinfo
46  {
47    asection *stabsect;		/* Section pointer for .stab section */
48    asection *stabindexsect;	/* Section pointer for .stab.index section */
49    asection *mdebugsect;	/* Section pointer for .mdebug section */
50  };
51
52static void free_elfinfo (void *);
53
54/* Locate the segments in ABFD.  */
55
56static struct symfile_segment_data *
57elf_symfile_segments (bfd *abfd)
58{
59  Elf_Internal_Phdr *phdrs, **segments;
60  long phdrs_size;
61  int num_phdrs, num_segments, num_sections, i;
62  asection *sect;
63  struct symfile_segment_data *data;
64
65  phdrs_size = bfd_get_elf_phdr_upper_bound (abfd);
66  if (phdrs_size == -1)
67    return NULL;
68
69  phdrs = alloca (phdrs_size);
70  num_phdrs = bfd_get_elf_phdrs (abfd, phdrs);
71  if (num_phdrs == -1)
72    return NULL;
73
74  num_segments = 0;
75  segments = alloca (sizeof (Elf_Internal_Phdr *) * num_phdrs);
76  for (i = 0; i < num_phdrs; i++)
77    if (phdrs[i].p_type == PT_LOAD)
78      segments[num_segments++] = &phdrs[i];
79
80  if (num_segments == 0)
81    return NULL;
82
83  data = XZALLOC (struct symfile_segment_data);
84  data->num_segments = num_segments;
85  data->segment_bases = XCALLOC (num_segments, CORE_ADDR);
86  data->segment_sizes = XCALLOC (num_segments, CORE_ADDR);
87
88  for (i = 0; i < num_segments; i++)
89    {
90      data->segment_bases[i] = segments[i]->p_vaddr;
91      data->segment_sizes[i] = segments[i]->p_memsz;
92    }
93
94  num_sections = bfd_count_sections (abfd);
95  data->segment_info = XCALLOC (num_sections, int);
96
97  for (i = 0, sect = abfd->sections; sect != NULL; i++, sect = sect->next)
98    {
99      int j;
100      CORE_ADDR vma;
101
102      if ((bfd_get_section_flags (abfd, sect) & SEC_ALLOC) == 0)
103	continue;
104
105      vma = bfd_get_section_vma (abfd, sect);
106
107      for (j = 0; j < num_segments; j++)
108	if (segments[j]->p_memsz > 0
109	    && vma >= segments[j]->p_vaddr
110	    && vma < segments[j]->p_vaddr + segments[j]->p_memsz)
111	  {
112	    data->segment_info[i] = j + 1;
113	    break;
114	  }
115
116      if (bfd_get_section_size (sect) > 0 && j == num_segments)
117	warning (_("Loadable segment \"%s\" outside of ELF segments"),
118		 bfd_section_name (abfd, sect));
119    }
120
121  return data;
122}
123
124/* We are called once per section from elf_symfile_read.  We
125   need to examine each section we are passed, check to see
126   if it is something we are interested in processing, and
127   if so, stash away some access information for the section.
128
129   For now we recognize the dwarf debug information sections and
130   line number sections from matching their section names.  The
131   ELF definition is no real help here since it has no direct
132   knowledge of DWARF (by design, so any debugging format can be
133   used).
134
135   We also recognize the ".stab" sections used by the Sun compilers
136   released with Solaris 2.
137
138   FIXME: The section names should not be hardwired strings (what
139   should they be?  I don't think most object file formats have enough
140   section flags to specify what kind of debug section it is
141   -kingdon).  */
142
143static void
144elf_locate_sections (bfd *ignore_abfd, asection *sectp, void *eip)
145{
146  struct elfinfo *ei;
147
148  ei = (struct elfinfo *) eip;
149  if (strcmp (sectp->name, ".stab") == 0)
150    {
151      ei->stabsect = sectp;
152    }
153  else if (strcmp (sectp->name, ".stab.index") == 0)
154    {
155      ei->stabindexsect = sectp;
156    }
157  else if (strcmp (sectp->name, ".mdebug") == 0)
158    {
159      ei->mdebugsect = sectp;
160    }
161}
162
163static struct minimal_symbol *
164record_minimal_symbol (char *name, CORE_ADDR address,
165		       enum minimal_symbol_type ms_type,
166		       asection *bfd_section, struct objfile *objfile)
167{
168  if (ms_type == mst_text || ms_type == mst_file_text)
169    address = gdbarch_smash_text_address (current_gdbarch, address);
170
171  return prim_record_minimal_symbol_and_info
172    (name, address, ms_type, NULL, bfd_section->index, bfd_section, objfile);
173}
174
175/*
176
177   LOCAL FUNCTION
178
179   elf_symtab_read -- read the symbol table of an ELF file
180
181   SYNOPSIS
182
183   void elf_symtab_read (struct objfile *objfile, int dynamic,
184			 long number_of_symbols, asymbol **symbol_table)
185
186   DESCRIPTION
187
188   Given an objfile, a symbol table, and a flag indicating whether the
189   symbol table contains dynamic symbols, add all the global function
190   and data symbols to the minimal symbol table.
191
192   In stabs-in-ELF, as implemented by Sun, there are some local symbols
193   defined in the ELF symbol table, which can be used to locate
194   the beginnings of sections from each ".o" file that was linked to
195   form the executable objfile.  We gather any such info and record it
196   in data structures hung off the objfile's private data.
197
198 */
199
200static void
201elf_symtab_read (struct objfile *objfile, int dynamic,
202		 long number_of_symbols, asymbol **symbol_table)
203{
204  long storage_needed;
205  asymbol *sym;
206  long i;
207  CORE_ADDR symaddr;
208  CORE_ADDR offset;
209  enum minimal_symbol_type ms_type;
210  /* If sectinfo is nonNULL, it contains section info that should end up
211     filed in the objfile.  */
212  struct stab_section_info *sectinfo = NULL;
213  /* If filesym is nonzero, it points to a file symbol, but we haven't
214     seen any section info for it yet.  */
215  asymbol *filesym = 0;
216#ifdef SOFUN_ADDRESS_MAYBE_MISSING
217  /* Name of filesym, as saved on the objfile_obstack.  */
218  char *filesymname = obsavestring ("", 0, &objfile->objfile_obstack);
219#endif
220  struct dbx_symfile_info *dbx = objfile->deprecated_sym_stab_info;
221  int stripped = (bfd_get_symcount (objfile->obfd) == 0);
222
223  for (i = 0; i < number_of_symbols; i++)
224    {
225      sym = symbol_table[i];
226      if (sym->name == NULL || *sym->name == '\0')
227	{
228	  /* Skip names that don't exist (shouldn't happen), or names
229	     that are null strings (may happen). */
230	  continue;
231	}
232
233      /* Skip "special" symbols, e.g. ARM mapping symbols.  These are
234	 symbols which do not correspond to objects in the symbol table,
235	 but have some other target-specific meaning.  */
236      if (bfd_is_target_special_symbol (objfile->obfd, sym))
237	continue;
238
239      offset = ANOFFSET (objfile->section_offsets, sym->section->index);
240      if (dynamic
241	  && sym->section == &bfd_und_section
242	  && (sym->flags & BSF_FUNCTION))
243	{
244	  struct minimal_symbol *msym;
245
246	  /* Symbol is a reference to a function defined in
247	     a shared library.
248	     If its value is non zero then it is usually the address
249	     of the corresponding entry in the procedure linkage table,
250	     plus the desired section offset.
251	     If its value is zero then the dynamic linker has to resolve
252	     the symbol. We are unable to find any meaningful address
253	     for this symbol in the executable file, so we skip it.  */
254	  symaddr = sym->value;
255	  if (symaddr == 0)
256	    continue;
257	  symaddr += offset;
258	  msym = record_minimal_symbol
259	    ((char *) sym->name, symaddr,
260	     mst_solib_trampoline, sym->section, objfile);
261#ifdef SOFUN_ADDRESS_MAYBE_MISSING
262	  if (msym != NULL)
263	    msym->filename = filesymname;
264#endif
265	  continue;
266	}
267
268      /* If it is a nonstripped executable, do not enter dynamic
269	 symbols, as the dynamic symbol table is usually a subset
270	 of the main symbol table.  */
271      if (dynamic && !stripped)
272	continue;
273      if (sym->flags & BSF_FILE)
274	{
275	  /* STT_FILE debugging symbol that helps stabs-in-elf debugging.
276	     Chain any old one onto the objfile; remember new sym.  */
277	  if (sectinfo != NULL)
278	    {
279	      sectinfo->next = dbx->stab_section_info;
280	      dbx->stab_section_info = sectinfo;
281	      sectinfo = NULL;
282	    }
283	  filesym = sym;
284#ifdef SOFUN_ADDRESS_MAYBE_MISSING
285	  filesymname =
286	    obsavestring ((char *) filesym->name, strlen (filesym->name),
287			  &objfile->objfile_obstack);
288#endif
289	}
290      else if (sym->flags & BSF_SECTION_SYM)
291	continue;
292      else if (sym->flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK))
293	{
294	  struct minimal_symbol *msym;
295
296	  /* Select global/local/weak symbols.  Note that bfd puts abs
297	     symbols in their own section, so all symbols we are
298	     interested in will have a section. */
299	  /* Bfd symbols are section relative. */
300	  symaddr = sym->value + sym->section->vma;
301	  /* Relocate all non-absolute symbols by the section offset.  */
302	  if (sym->section != &bfd_abs_section)
303	    {
304	      symaddr += offset;
305	    }
306	  /* For non-absolute symbols, use the type of the section
307	     they are relative to, to intuit text/data.  Bfd provides
308	     no way of figuring this out for absolute symbols. */
309	  if (sym->section == &bfd_abs_section)
310	    {
311	      /* This is a hack to get the minimal symbol type
312		 right for Irix 5, which has absolute addresses
313		 with special section indices for dynamic symbols. */
314	      unsigned short shndx =
315		((elf_symbol_type *) sym)->internal_elf_sym.st_shndx;
316
317	      switch (shndx)
318		{
319		case SHN_MIPS_TEXT:
320		  ms_type = mst_text;
321		  break;
322		case SHN_MIPS_DATA:
323		  ms_type = mst_data;
324		  break;
325		case SHN_MIPS_ACOMMON:
326		  ms_type = mst_bss;
327		  break;
328		default:
329		  ms_type = mst_abs;
330		}
331
332	      /* If it is an Irix dynamic symbol, skip section name
333		 symbols, relocate all others by section offset. */
334	      if (ms_type != mst_abs)
335		{
336		  if (sym->name[0] == '.')
337		    continue;
338		  symaddr += offset;
339		}
340	    }
341	  else if (sym->section->flags & SEC_CODE)
342	    {
343	      if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
344		{
345		  ms_type = mst_text;
346		}
347	      else if ((sym->name[0] == '.' && sym->name[1] == 'L')
348		       || ((sym->flags & BSF_LOCAL)
349			   && sym->name[0] == '$'
350			   && sym->name[1] == 'L'))
351		/* Looks like a compiler-generated label.  Skip
352		   it.  The assembler should be skipping these (to
353		   keep executables small), but apparently with
354		   gcc on the (deleted) delta m88k SVR4, it loses.
355		   So to have us check too should be harmless (but
356		   I encourage people to fix this in the assembler
357		   instead of adding checks here).  */
358		continue;
359	      else
360		{
361		  ms_type = mst_file_text;
362		}
363	    }
364	  else if (sym->section->flags & SEC_ALLOC)
365	    {
366	      if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
367		{
368		  if (sym->section->flags & SEC_LOAD)
369		    {
370		      ms_type = mst_data;
371		    }
372		  else
373		    {
374		      ms_type = mst_bss;
375		    }
376		}
377	      else if (sym->flags & BSF_LOCAL)
378		{
379		  /* Named Local variable in a Data section.
380		     Check its name for stabs-in-elf.  */
381		  int special_local_sect;
382		  if (strcmp ("Bbss.bss", sym->name) == 0)
383		    special_local_sect = SECT_OFF_BSS (objfile);
384		  else if (strcmp ("Ddata.data", sym->name) == 0)
385		    special_local_sect = SECT_OFF_DATA (objfile);
386		  else if (strcmp ("Drodata.rodata", sym->name) == 0)
387		    special_local_sect = SECT_OFF_RODATA (objfile);
388		  else
389		    special_local_sect = -1;
390		  if (special_local_sect >= 0)
391		    {
392		      /* Found a special local symbol.  Allocate a
393			 sectinfo, if needed, and fill it in.  */
394		      if (sectinfo == NULL)
395			{
396			  int max_index;
397			  size_t size;
398
399			  max_index
400			    = max (SECT_OFF_BSS (objfile),
401				   max (SECT_OFF_DATA (objfile),
402					SECT_OFF_RODATA (objfile)));
403
404			  /* max_index is the largest index we'll
405			     use into this array, so we must
406			     allocate max_index+1 elements for it.
407			     However, 'struct stab_section_info'
408			     already includes one element, so we
409			     need to allocate max_index aadditional
410			     elements.  */
411			  size = (sizeof (struct stab_section_info)
412				  + (sizeof (CORE_ADDR)
413				     * max_index));
414			  sectinfo = (struct stab_section_info *)
415			    xmalloc (size);
416			  memset (sectinfo, 0, size);
417			  sectinfo->num_sections = max_index;
418			  if (filesym == NULL)
419			    {
420			      complaint (&symfile_complaints,
421					 _("elf/stab section information %s without a preceding file symbol"),
422					 sym->name);
423			    }
424			  else
425			    {
426			      sectinfo->filename =
427				(char *) filesym->name;
428			    }
429			}
430		      if (sectinfo->sections[special_local_sect] != 0)
431			complaint (&symfile_complaints,
432				   _("duplicated elf/stab section information for %s"),
433				   sectinfo->filename);
434		      /* BFD symbols are section relative.  */
435		      symaddr = sym->value + sym->section->vma;
436		      /* Relocate non-absolute symbols by the
437			 section offset.  */
438		      if (sym->section != &bfd_abs_section)
439			symaddr += offset;
440		      sectinfo->sections[special_local_sect] = symaddr;
441		      /* The special local symbols don't go in the
442			 minimal symbol table, so ignore this one.  */
443		      continue;
444		    }
445		  /* Not a special stabs-in-elf symbol, do regular
446		     symbol processing.  */
447		  if (sym->section->flags & SEC_LOAD)
448		    {
449		      ms_type = mst_file_data;
450		    }
451		  else
452		    {
453		      ms_type = mst_file_bss;
454		    }
455		}
456	      else
457		{
458		  ms_type = mst_unknown;
459		}
460	    }
461	  else
462	    {
463	      /* FIXME:  Solaris2 shared libraries include lots of
464		 odd "absolute" and "undefined" symbols, that play
465		 hob with actions like finding what function the PC
466		 is in.  Ignore them if they aren't text, data, or bss.  */
467	      /* ms_type = mst_unknown; */
468	      continue;	/* Skip this symbol. */
469	    }
470	  msym = record_minimal_symbol
471	    ((char *) sym->name, symaddr,
472	     ms_type, sym->section, objfile);
473	  if (msym)
474	    {
475	      /* Pass symbol size field in via BFD.  FIXME!!!  */
476	      unsigned long size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
477	      MSYMBOL_SIZE(msym) = size;
478	    }
479#ifdef SOFUN_ADDRESS_MAYBE_MISSING
480	  if (msym != NULL)
481	    msym->filename = filesymname;
482#endif
483	  gdbarch_elf_make_msymbol_special (current_gdbarch, sym, msym);
484	}
485    }
486}
487
488/* Scan and build partial symbols for a symbol file.
489   We have been initialized by a call to elf_symfile_init, which
490   currently does nothing.
491
492   SECTION_OFFSETS is a set of offsets to apply to relocate the symbols
493   in each section.  We simplify it down to a single offset for all
494   symbols.  FIXME.
495
496   MAINLINE is true if we are reading the main symbol
497   table (as opposed to a shared lib or dynamically loaded file).
498
499   This function only does the minimum work necessary for letting the
500   user "name" things symbolically; it does not read the entire symtab.
501   Instead, it reads the external and static symbols and puts them in partial
502   symbol tables.  When more extensive information is requested of a
503   file, the corresponding partial symbol table is mutated into a full
504   fledged symbol table by going back and reading the symbols
505   for real.
506
507   We look for sections with specific names, to tell us what debug
508   format to look for:  FIXME!!!
509
510   elfstab_build_psymtabs() handles STABS symbols;
511   mdebug_build_psymtabs() handles ECOFF debugging information.
512
513   Note that ELF files have a "minimal" symbol table, which looks a lot
514   like a COFF symbol table, but has only the minimal information necessary
515   for linking.  We process this also, and use the information to
516   build gdb's minimal symbol table.  This gives us some minimal debugging
517   capability even for files compiled without -g.  */
518
519static void
520elf_symfile_read (struct objfile *objfile, int mainline)
521{
522  bfd *abfd = objfile->obfd;
523  struct elfinfo ei;
524  struct cleanup *back_to;
525  CORE_ADDR offset;
526  long symcount = 0, dynsymcount = 0, synthcount, storage_needed;
527  asymbol **symbol_table = NULL, **dyn_symbol_table = NULL;
528  asymbol *synthsyms;
529
530  init_minimal_symbol_collection ();
531  back_to = make_cleanup_discard_minimal_symbols ();
532
533  memset ((char *) &ei, 0, sizeof (ei));
534
535  /* Allocate struct to keep track of the symfile */
536  objfile->deprecated_sym_stab_info = (struct dbx_symfile_info *)
537    xmalloc (sizeof (struct dbx_symfile_info));
538  memset ((char *) objfile->deprecated_sym_stab_info, 0, sizeof (struct dbx_symfile_info));
539  make_cleanup (free_elfinfo, (void *) objfile);
540
541  /* Process the normal ELF symbol table first.  This may write some
542     chain of info into the dbx_symfile_info in objfile->deprecated_sym_stab_info,
543     which can later be used by elfstab_offset_sections.  */
544
545  storage_needed = bfd_get_symtab_upper_bound (objfile->obfd);
546  if (storage_needed < 0)
547    error (_("Can't read symbols from %s: %s"), bfd_get_filename (objfile->obfd),
548	   bfd_errmsg (bfd_get_error ()));
549
550  if (storage_needed > 0)
551    {
552      symbol_table = (asymbol **) xmalloc (storage_needed);
553      make_cleanup (xfree, symbol_table);
554      symcount = bfd_canonicalize_symtab (objfile->obfd, symbol_table);
555
556      if (symcount < 0)
557	error (_("Can't read symbols from %s: %s"), bfd_get_filename (objfile->obfd),
558	       bfd_errmsg (bfd_get_error ()));
559
560      elf_symtab_read (objfile, 0, symcount, symbol_table);
561    }
562
563  /* Add the dynamic symbols.  */
564
565  storage_needed = bfd_get_dynamic_symtab_upper_bound (objfile->obfd);
566
567  if (storage_needed > 0)
568    {
569      dyn_symbol_table = (asymbol **) xmalloc (storage_needed);
570      make_cleanup (xfree, dyn_symbol_table);
571      dynsymcount = bfd_canonicalize_dynamic_symtab (objfile->obfd,
572						     dyn_symbol_table);
573
574      if (dynsymcount < 0)
575	error (_("Can't read symbols from %s: %s"), bfd_get_filename (objfile->obfd),
576	       bfd_errmsg (bfd_get_error ()));
577
578      elf_symtab_read (objfile, 1, dynsymcount, dyn_symbol_table);
579    }
580
581  /* Add synthetic symbols - for instance, names for any PLT entries.  */
582
583  synthcount = bfd_get_synthetic_symtab (abfd, symcount, symbol_table,
584					 dynsymcount, dyn_symbol_table,
585					 &synthsyms);
586  if (synthcount > 0)
587    {
588      asymbol **synth_symbol_table;
589      long i;
590
591      make_cleanup (xfree, synthsyms);
592      synth_symbol_table = xmalloc (sizeof (asymbol *) * synthcount);
593      for (i = 0; i < synthcount; i++)
594	synth_symbol_table[i] = synthsyms + i;
595      make_cleanup (xfree, synth_symbol_table);
596      elf_symtab_read (objfile, 0, synthcount, synth_symbol_table);
597    }
598
599  /* Install any minimal symbols that have been collected as the current
600     minimal symbols for this objfile.  The debug readers below this point
601     should not generate new minimal symbols; if they do it's their
602     responsibility to install them.  "mdebug" appears to be the only one
603     which will do this.  */
604
605  install_minimal_symbols (objfile);
606  do_cleanups (back_to);
607
608  /* Now process debugging information, which is contained in
609     special ELF sections. */
610
611  /* If we are reinitializing, or if we have never loaded syms yet,
612     set table to empty.  MAINLINE is cleared so that *_read_psymtab
613     functions do not all also re-initialize the psymbol table. */
614  if (mainline)
615    {
616      init_psymbol_list (objfile, 0);
617      mainline = 0;
618    }
619
620  /* We first have to find them... */
621  bfd_map_over_sections (abfd, elf_locate_sections, (void *) & ei);
622
623  /* ELF debugging information is inserted into the psymtab in the
624     order of least informative first - most informative last.  Since
625     the psymtab table is searched `most recent insertion first' this
626     increases the probability that more detailed debug information
627     for a section is found.
628
629     For instance, an object file might contain both .mdebug (XCOFF)
630     and .debug_info (DWARF2) sections then .mdebug is inserted first
631     (searched last) and DWARF2 is inserted last (searched first).  If
632     we don't do this then the XCOFF info is found first - for code in
633     an included file XCOFF info is useless. */
634
635  if (ei.mdebugsect)
636    {
637      const struct ecoff_debug_swap *swap;
638
639      /* .mdebug section, presumably holding ECOFF debugging
640         information.  */
641      swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
642      if (swap)
643	elfmdebug_build_psymtabs (objfile, swap, ei.mdebugsect);
644    }
645  if (ei.stabsect)
646    {
647      asection *str_sect;
648
649      /* Stab sections have an associated string table that looks like
650         a separate section.  */
651      str_sect = bfd_get_section_by_name (abfd, ".stabstr");
652
653      /* FIXME should probably warn about a stab section without a stabstr.  */
654      if (str_sect)
655	elfstab_build_psymtabs (objfile,
656				mainline,
657				ei.stabsect,
658				str_sect->filepos,
659				bfd_section_size (abfd, str_sect));
660    }
661  if (dwarf2_has_info (objfile))
662    {
663      /* DWARF 2 sections */
664      dwarf2_build_psymtabs (objfile, mainline);
665    }
666
667  /* FIXME: kettenis/20030504: This still needs to be integrated with
668     dwarf2read.c in a better way.  */
669  dwarf2_build_frame_info (objfile);
670}
671
672/* This cleans up the objfile's deprecated_sym_stab_info pointer, and
673   the chain of stab_section_info's, that might be dangling from
674   it.  */
675
676static void
677free_elfinfo (void *objp)
678{
679  struct objfile *objfile = (struct objfile *) objp;
680  struct dbx_symfile_info *dbxinfo = objfile->deprecated_sym_stab_info;
681  struct stab_section_info *ssi, *nssi;
682
683  ssi = dbxinfo->stab_section_info;
684  while (ssi)
685    {
686      nssi = ssi->next;
687      xfree (ssi);
688      ssi = nssi;
689    }
690
691  dbxinfo->stab_section_info = 0;	/* Just say No mo info about this.  */
692}
693
694
695/* Initialize anything that needs initializing when a completely new symbol
696   file is specified (not just adding some symbols from another file, e.g. a
697   shared library).
698
699   We reinitialize buildsym, since we may be reading stabs from an ELF file.  */
700
701static void
702elf_new_init (struct objfile *ignore)
703{
704  stabsread_new_init ();
705  buildsym_new_init ();
706}
707
708/* Perform any local cleanups required when we are done with a particular
709   objfile.  I.E, we are in the process of discarding all symbol information
710   for an objfile, freeing up all memory held for it, and unlinking the
711   objfile struct from the global list of known objfiles. */
712
713static void
714elf_symfile_finish (struct objfile *objfile)
715{
716  if (objfile->deprecated_sym_stab_info != NULL)
717    {
718      xfree (objfile->deprecated_sym_stab_info);
719    }
720}
721
722/* ELF specific initialization routine for reading symbols.
723
724   It is passed a pointer to a struct sym_fns which contains, among other
725   things, the BFD for the file whose symbols are being read, and a slot for
726   a pointer to "private data" which we can fill with goodies.
727
728   For now at least, we have nothing in particular to do, so this function is
729   just a stub. */
730
731static void
732elf_symfile_init (struct objfile *objfile)
733{
734  /* ELF objects may be reordered, so set OBJF_REORDERED.  If we
735     find this causes a significant slowdown in gdb then we could
736     set it in the debug symbol readers only when necessary.  */
737  objfile->flags |= OBJF_REORDERED;
738}
739
740/* When handling an ELF file that contains Sun STABS debug info,
741   some of the debug info is relative to the particular chunk of the
742   section that was generated in its individual .o file.  E.g.
743   offsets to static variables are relative to the start of the data
744   segment *for that module before linking*.  This information is
745   painfully squirreled away in the ELF symbol table as local symbols
746   with wierd names.  Go get 'em when needed.  */
747
748void
749elfstab_offset_sections (struct objfile *objfile, struct partial_symtab *pst)
750{
751  char *filename = pst->filename;
752  struct dbx_symfile_info *dbx = objfile->deprecated_sym_stab_info;
753  struct stab_section_info *maybe = dbx->stab_section_info;
754  struct stab_section_info *questionable = 0;
755  int i;
756  char *p;
757
758  /* The ELF symbol info doesn't include path names, so strip the path
759     (if any) from the psymtab filename.  */
760  while (0 != (p = strchr (filename, '/')))
761    filename = p + 1;
762
763  /* FIXME:  This linear search could speed up significantly
764     if it was chained in the right order to match how we search it,
765     and if we unchained when we found a match. */
766  for (; maybe; maybe = maybe->next)
767    {
768      if (filename[0] == maybe->filename[0]
769	  && strcmp (filename, maybe->filename) == 0)
770	{
771	  /* We found a match.  But there might be several source files
772	     (from different directories) with the same name.  */
773	  if (0 == maybe->found)
774	    break;
775	  questionable = maybe;	/* Might use it later.  */
776	}
777    }
778
779  if (maybe == 0 && questionable != 0)
780    {
781      complaint (&symfile_complaints,
782		 _("elf/stab section information questionable for %s"), filename);
783      maybe = questionable;
784    }
785
786  if (maybe)
787    {
788      /* Found it!  Allocate a new psymtab struct, and fill it in.  */
789      maybe->found++;
790      pst->section_offsets = (struct section_offsets *)
791	obstack_alloc (&objfile->objfile_obstack,
792		       SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
793      for (i = 0; i < maybe->num_sections; i++)
794	(pst->section_offsets)->offsets[i] = maybe->sections[i];
795      return;
796    }
797
798  /* We were unable to find any offsets for this file.  Complain.  */
799  if (dbx->stab_section_info)	/* If there *is* any info, */
800    complaint (&symfile_complaints,
801	       _("elf/stab section information missing for %s"), filename);
802}
803
804/* Register that we are able to handle ELF object file formats.  */
805
806static struct sym_fns elf_sym_fns =
807{
808  bfd_target_elf_flavour,
809  elf_new_init,			/* sym_new_init: init anything gbl to entire symtab */
810  elf_symfile_init,		/* sym_init: read initial info, setup for sym_read() */
811  elf_symfile_read,		/* sym_read: read a symbol file into symtab */
812  elf_symfile_finish,		/* sym_finish: finished with file, cleanup */
813  default_symfile_offsets,	/* sym_offsets:  Translate ext. to int. relocation */
814  elf_symfile_segments,		/* sym_segments: Get segment information from
815				   a file.  */
816  NULL				/* next: pointer to next struct sym_fns */
817};
818
819void
820_initialize_elfread (void)
821{
822  add_symtab_fns (&elf_sym_fns);
823}
824