elfread.c revision 98944
1249259Sdim/* Read ELF (Executable and Linking Format) object files for GDB.
2249259Sdim   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3249259Sdim   2001, 2002
4249259Sdim   Free Software Foundation, Inc.
5249259Sdim   Written by Fred Fish at Cygnus Support.
6249259Sdim
7249259Sdim   This file is part of GDB.
8249259Sdim
9249259Sdim   This program is free software; you can redistribute it and/or modify
10249259Sdim   it under the terms of the GNU General Public License as published by
11249259Sdim   the Free Software Foundation; either version 2 of the License, or
12249259Sdim   (at your option) any later version.
13249259Sdim
14249259Sdim   This program is distributed in the hope that it will be useful,
15249259Sdim   but WITHOUT ANY WARRANTY; without even the implied warranty of
16249259Sdim   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17249259Sdim   GNU General Public License for more details.
18249259Sdim
19249259Sdim   You should have received a copy of the GNU General Public License
20249259Sdim   along with this program; if not, write to the Free Software
21249259Sdim   Foundation, Inc., 59 Temple Place - Suite 330,
22249259Sdim   Boston, MA 02111-1307, USA.  */
23249259Sdim
24249259Sdim#include "defs.h"
25249259Sdim#include "bfd.h"
26249259Sdim#include "gdb_string.h"
27249259Sdim#include "elf-bfd.h"
28249259Sdim#include "elf/mips.h"
29249259Sdim#include "symtab.h"
30249259Sdim#include "symfile.h"
31249259Sdim#include "objfiles.h"
32249259Sdim#include "buildsym.h"
33249259Sdim#include "stabsread.h"
34249259Sdim#include "gdb-stabs.h"
35249259Sdim#include "complaints.h"
36249259Sdim#include "demangle.h"
37249259Sdim
38249259Sdimextern void _initialize_elfread (void);
39249259Sdim
40249259Sdim/* The struct elfinfo is available only during ELF symbol table and
41249259Sdim   psymtab reading.  It is destroyed at the completion of psymtab-reading.
42249259Sdim   It's local to elf_symfile_read.  */
43249259Sdim
44251662Sdimstruct elfinfo
45249259Sdim  {
46249259Sdim    file_ptr dboffset;		/* Offset to dwarf debug section */
47249259Sdim    unsigned int dbsize;	/* Size of dwarf debug section */
48249259Sdim    file_ptr lnoffset;		/* Offset to dwarf line number section */
49249259Sdim    unsigned int lnsize;	/* Size of dwarf line number section */
50249259Sdim    asection *stabsect;		/* Section pointer for .stab section */
51249259Sdim    asection *stabindexsect;	/* Section pointer for .stab.index section */
52249259Sdim    asection *mdebugsect;	/* Section pointer for .mdebug section */
53251662Sdim  };
54249259Sdim
55249259Sdim/* Various things we might complain about... */
56249259Sdim
57249259Sdimstruct complaint section_info_complaint =
58249259Sdim{"elf/stab section information %s without a preceding file symbol", 0, 0};
59249259Sdim
60249259Sdimstruct complaint section_info_dup_complaint =
61249259Sdim{"duplicated elf/stab section information for %s", 0, 0};
62249259Sdim
63251662Sdimstruct complaint stab_info_mismatch_complaint =
64249259Sdim{"elf/stab section information missing for %s", 0, 0};
65249259Sdim
66249259Sdimstruct complaint stab_info_questionable_complaint =
67249259Sdim{"elf/stab section information questionable for %s", 0, 0};
68249259Sdim
69249259Sdimstatic void free_elfinfo (void *);
70249259Sdim
71249259Sdim/* We are called once per section from elf_symfile_read.  We
72249259Sdim   need to examine each section we are passed, check to see
73249259Sdim   if it is something we are interested in processing, and
74249259Sdim   if so, stash away some access information for the section.
75249259Sdim
76249259Sdim   For now we recognize the dwarf debug information sections and
77249259Sdim   line number sections from matching their section names.  The
78249259Sdim   ELF definition is no real help here since it has no direct
79249259Sdim   knowledge of DWARF (by design, so any debugging format can be
80249259Sdim   used).
81249259Sdim
82249259Sdim   We also recognize the ".stab" sections used by the Sun compilers
83249259Sdim   released with Solaris 2.
84249259Sdim
85249259Sdim   FIXME: The section names should not be hardwired strings (what
86249259Sdim   should they be?  I don't think most object file formats have enough
87249259Sdim   section flags to specify what kind of debug section it is
88249259Sdim   -kingdon).  */
89249259Sdim
90249259Sdimstatic void
91249259Sdimelf_locate_sections (bfd *ignore_abfd, asection *sectp, void *eip)
92249259Sdim{
93249259Sdim  register struct elfinfo *ei;
94249259Sdim
95249259Sdim  ei = (struct elfinfo *) eip;
96249259Sdim  if (STREQ (sectp->name, ".debug"))
97249259Sdim    {
98249259Sdim      ei->dboffset = sectp->filepos;
99249259Sdim      ei->dbsize = bfd_get_section_size_before_reloc (sectp);
100249259Sdim    }
101249259Sdim  else if (STREQ (sectp->name, ".line"))
102249259Sdim    {
103249259Sdim      ei->lnoffset = sectp->filepos;
104249259Sdim      ei->lnsize = bfd_get_section_size_before_reloc (sectp);
105249259Sdim    }
106249259Sdim  else if (STREQ (sectp->name, ".stab"))
107249259Sdim    {
108249259Sdim      ei->stabsect = sectp;
109249259Sdim    }
110249259Sdim  else if (STREQ (sectp->name, ".stab.index"))
111249259Sdim    {
112249259Sdim      ei->stabindexsect = sectp;
113249259Sdim    }
114249259Sdim  else if (STREQ (sectp->name, ".mdebug"))
115249259Sdim    {
116249259Sdim      ei->mdebugsect = sectp;
117249259Sdim    }
118249259Sdim}
119249259Sdim
120249259Sdim#if 0				/* Currently unused */
121249259Sdim
122249259Sdimchar *
123249259Sdimelf_interpreter (bfd *abfd)
124249259Sdim{
125249259Sdim  sec_ptr interp_sec;
126249259Sdim  unsigned size;
127249259Sdim  char *interp = NULL;
128249259Sdim
129249259Sdim  interp_sec = bfd_get_section_by_name (abfd, ".interp");
130249259Sdim  if (interp_sec)
131249259Sdim    {
132249259Sdim      size = bfd_section_size (abfd, interp_sec);
133249259Sdim      interp = alloca (size);
134249259Sdim      if (bfd_get_section_contents (abfd, interp_sec, interp, (file_ptr) 0,
135249259Sdim				    size))
136249259Sdim	{
137249259Sdim	  interp = savestring (interp, size - 1);
138249259Sdim	}
139249259Sdim      else
140249259Sdim	{
141249259Sdim	  interp = NULL;
142249259Sdim	}
143249259Sdim    }
144249259Sdim  return (interp);
145249259Sdim}
146249259Sdim
147249259Sdim#endif
148249259Sdim
149249259Sdimstatic struct minimal_symbol *
150249259Sdimrecord_minimal_symbol_and_info (char *name, CORE_ADDR address,
151249259Sdim				enum minimal_symbol_type ms_type, char *info,	/* FIXME, is this really char *? */
152249259Sdim				asection *bfd_section, struct objfile *objfile)
153249259Sdim{
154249259Sdim  if (ms_type == mst_text || ms_type == mst_file_text)
155249259Sdim    address = SMASH_TEXT_ADDRESS (address);
156249259Sdim
157249259Sdim  return prim_record_minimal_symbol_and_info
158249259Sdim    (name, address, ms_type, info, bfd_section->index, bfd_section, objfile);
159249259Sdim}
160249259Sdim
161249259Sdim/*
162249259Sdim
163249259Sdim   LOCAL FUNCTION
164249259Sdim
165249259Sdim   elf_symtab_read -- read the symbol table of an ELF file
166249259Sdim
167249259Sdim   SYNOPSIS
168249259Sdim
169249259Sdim   void elf_symtab_read (struct objfile *objfile, int dynamic)
170249259Sdim
171249259Sdim   DESCRIPTION
172249259Sdim
173249259Sdim   Given an objfile and a flag that specifies whether or not the objfile
174249259Sdim   is for an executable or not (may be shared library for example), add
175249259Sdim   all the global function and data symbols to the minimal symbol table.
176249259Sdim
177249259Sdim   In stabs-in-ELF, as implemented by Sun, there are some local symbols
178249259Sdim   defined in the ELF symbol table, which can be used to locate
179249259Sdim   the beginnings of sections from each ".o" file that was linked to
180249259Sdim   form the executable objfile.  We gather any such info and record it
181249259Sdim   in data structures hung off the objfile's private data.
182249259Sdim
183249259Sdim */
184249259Sdim
185249259Sdimstatic void
186249259Sdimelf_symtab_read (struct objfile *objfile, int dynamic)
187249259Sdim{
188249259Sdim  long storage_needed;
189249259Sdim  asymbol *sym;
190249259Sdim  asymbol **symbol_table;
191249259Sdim  long number_of_symbols;
192249259Sdim  long i;
193249259Sdim  int index;
194249259Sdim  struct cleanup *back_to;
195249259Sdim  CORE_ADDR symaddr;
196249259Sdim  CORE_ADDR offset;
197249259Sdim  enum minimal_symbol_type ms_type;
198249259Sdim  /* If sectinfo is nonNULL, it contains section info that should end up
199249259Sdim     filed in the objfile.  */
200249259Sdim  struct stab_section_info *sectinfo = NULL;
201249259Sdim  /* If filesym is nonzero, it points to a file symbol, but we haven't
202249259Sdim     seen any section info for it yet.  */
203249259Sdim  asymbol *filesym = 0;
204249259Sdim#ifdef SOFUN_ADDRESS_MAYBE_MISSING
205249259Sdim  /* Name of filesym, as saved on the symbol_obstack.  */
206249259Sdim  char *filesymname = obsavestring ("", 0, &objfile->symbol_obstack);
207249259Sdim#endif
208249259Sdim  struct dbx_symfile_info *dbx = objfile->sym_stab_info;
209249259Sdim  unsigned long size;
210249259Sdim  int stripped = (bfd_get_symcount (objfile->obfd) == 0);
211249259Sdim
212249259Sdim  if (dynamic)
213249259Sdim    {
214249259Sdim      storage_needed = bfd_get_dynamic_symtab_upper_bound (objfile->obfd);
215249259Sdim
216249259Sdim      /* Nothing to be done if there is no dynamic symtab.  */
217249259Sdim      if (storage_needed < 0)
218249259Sdim	return;
219249259Sdim    }
220249259Sdim  else
221249259Sdim    {
222249259Sdim      storage_needed = bfd_get_symtab_upper_bound (objfile->obfd);
223249259Sdim      if (storage_needed < 0)
224249259Sdim	error ("Can't read symbols from %s: %s", bfd_get_filename (objfile->obfd),
225249259Sdim	       bfd_errmsg (bfd_get_error ()));
226249259Sdim    }
227249259Sdim  if (storage_needed > 0)
228249259Sdim    {
229249259Sdim      symbol_table = (asymbol **) xmalloc (storage_needed);
230249259Sdim      back_to = make_cleanup (xfree, symbol_table);
231249259Sdim      if (dynamic)
232249259Sdim	number_of_symbols = bfd_canonicalize_dynamic_symtab (objfile->obfd,
233249259Sdim							     symbol_table);
234249259Sdim      else
235249259Sdim	number_of_symbols = bfd_canonicalize_symtab (objfile->obfd, symbol_table);
236249259Sdim      if (number_of_symbols < 0)
237249259Sdim	error ("Can't read symbols from %s: %s", bfd_get_filename (objfile->obfd),
238249259Sdim	       bfd_errmsg (bfd_get_error ()));
239249259Sdim
240249259Sdim      for (i = 0; i < number_of_symbols; i++)
241249259Sdim	{
242249259Sdim	  sym = symbol_table[i];
243249259Sdim	  if (sym->name == NULL || *sym->name == '\0')
244249259Sdim	    {
245249259Sdim	      /* Skip names that don't exist (shouldn't happen), or names
246249259Sdim	         that are null strings (may happen). */
247249259Sdim	      continue;
248249259Sdim	    }
249249259Sdim
250249259Sdim          offset = ANOFFSET (objfile->section_offsets, sym->section->index);
251249259Sdim	  if (dynamic
252249259Sdim	      && sym->section == &bfd_und_section
253249259Sdim	      && (sym->flags & BSF_FUNCTION))
254249259Sdim	    {
255249259Sdim	      struct minimal_symbol *msym;
256249259Sdim
257249259Sdim	      /* Symbol is a reference to a function defined in
258249259Sdim	         a shared library.
259249259Sdim	         If its value is non zero then it is usually the address
260249259Sdim	         of the corresponding entry in the procedure linkage table,
261249259Sdim	         plus the desired section offset.
262249259Sdim	         If its value is zero then the dynamic linker has to resolve
263249259Sdim	         the symbol. We are unable to find any meaningful address
264249259Sdim	         for this symbol in the executable file, so we skip it.  */
265249259Sdim	      symaddr = sym->value;
266249259Sdim	      if (symaddr == 0)
267249259Sdim		continue;
268249259Sdim	      symaddr += offset;
269249259Sdim	      msym = record_minimal_symbol_and_info
270249259Sdim		((char *) sym->name, symaddr,
271249259Sdim		 mst_solib_trampoline, NULL, sym->section, objfile);
272249259Sdim#ifdef SOFUN_ADDRESS_MAYBE_MISSING
273249259Sdim	      if (msym != NULL)
274249259Sdim		msym->filename = filesymname;
275249259Sdim#endif
276249259Sdim	      continue;
277249259Sdim	    }
278249259Sdim
279249259Sdim	  /* If it is a nonstripped executable, do not enter dynamic
280249259Sdim	     symbols, as the dynamic symbol table is usually a subset
281249259Sdim	     of the main symbol table.  */
282249259Sdim	  if (dynamic && !stripped)
283249259Sdim	    continue;
284249259Sdim	  if (sym->flags & BSF_FILE)
285249259Sdim	    {
286249259Sdim	      /* STT_FILE debugging symbol that helps stabs-in-elf debugging.
287249259Sdim	         Chain any old one onto the objfile; remember new sym.  */
288249259Sdim	      if (sectinfo != NULL)
289249259Sdim		{
290249259Sdim		  sectinfo->next = dbx->stab_section_info;
291249259Sdim		  dbx->stab_section_info = sectinfo;
292249259Sdim		  sectinfo = NULL;
293249259Sdim		}
294249259Sdim	      filesym = sym;
295249259Sdim#ifdef SOFUN_ADDRESS_MAYBE_MISSING
296249259Sdim	      filesymname =
297249259Sdim		obsavestring ((char *) filesym->name, strlen (filesym->name),
298249259Sdim			      &objfile->symbol_obstack);
299249259Sdim#endif
300249259Sdim	    }
301249259Sdim	  else if (sym->flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK))
302249259Sdim	    {
303249259Sdim	      struct minimal_symbol *msym;
304249259Sdim
305249259Sdim	      /* Select global/local/weak symbols.  Note that bfd puts abs
306249259Sdim	         symbols in their own section, so all symbols we are
307249259Sdim	         interested in will have a section. */
308249259Sdim	      /* Bfd symbols are section relative. */
309249259Sdim	      symaddr = sym->value + sym->section->vma;
310249259Sdim	      /* Relocate all non-absolute symbols by the section offset.  */
311249259Sdim	      if (sym->section != &bfd_abs_section)
312249259Sdim		{
313249259Sdim		  symaddr += offset;
314249259Sdim		}
315249259Sdim	      /* For non-absolute symbols, use the type of the section
316249259Sdim	         they are relative to, to intuit text/data.  Bfd provides
317249259Sdim	         no way of figuring this out for absolute symbols. */
318249259Sdim	      if (sym->section == &bfd_abs_section)
319249259Sdim		{
320249259Sdim		  /* This is a hack to get the minimal symbol type
321249259Sdim		     right for Irix 5, which has absolute addresses
322249259Sdim		     with special section indices for dynamic symbols. */
323249259Sdim		  unsigned short shndx =
324249259Sdim		  ((elf_symbol_type *) sym)->internal_elf_sym.st_shndx;
325249259Sdim
326249259Sdim		  switch (shndx)
327249259Sdim		    {
328249259Sdim		    case SHN_MIPS_TEXT:
329249259Sdim		      ms_type = mst_text;
330249259Sdim		      break;
331249259Sdim		    case SHN_MIPS_DATA:
332249259Sdim		      ms_type = mst_data;
333249259Sdim		      break;
334249259Sdim		    case SHN_MIPS_ACOMMON:
335249259Sdim		      ms_type = mst_bss;
336249259Sdim		      break;
337249259Sdim		    default:
338249259Sdim		      ms_type = mst_abs;
339249259Sdim		    }
340249259Sdim
341249259Sdim		  /* If it is an Irix dynamic symbol, skip section name
342249259Sdim		     symbols, relocate all others by section offset. */
343249259Sdim		  if (ms_type != mst_abs)
344249259Sdim		    {
345249259Sdim		      if (sym->name[0] == '.')
346249259Sdim			continue;
347249259Sdim		      symaddr += offset;
348249259Sdim		    }
349249259Sdim		}
350249259Sdim	      else if (sym->section->flags & SEC_CODE)
351249259Sdim		{
352249259Sdim		  if (sym->flags & BSF_GLOBAL)
353249259Sdim		    {
354249259Sdim		      ms_type = mst_text;
355249259Sdim		    }
356249259Sdim		  else if ((sym->name[0] == '.' && sym->name[1] == 'L')
357249259Sdim			   || ((sym->flags & BSF_LOCAL)
358249259Sdim			       && sym->name[0] == '$'
359249259Sdim			       && sym->name[1] == 'L'))
360249259Sdim		    /* Looks like a compiler-generated label.  Skip it.
361249259Sdim		       The assembler should be skipping these (to keep
362249259Sdim		       executables small), but apparently with gcc on the
363249259Sdim		       delta m88k SVR4, it loses.  So to have us check too
364249259Sdim		       should be harmless (but I encourage people to fix this
365249259Sdim		       in the assembler instead of adding checks here).  */
366249259Sdim		    continue;
367249259Sdim#ifdef HARRIS_TARGET
368249259Sdim		  else if (sym->name[0] == '.' && sym->name[1] == '.')
369249259Sdim		    {
370249259Sdim		      /* Looks like a Harris compiler generated label for the
371249259Sdim		         purpose of marking instructions that are relevant to
372249259Sdim		         DWARF dies.  The assembler can't get rid of these
373249259Sdim		         because they are relocatable addresses that the
374249259Sdim		         linker needs to resolve. */
375249259Sdim		      continue;
376249259Sdim		    }
377249259Sdim#endif
378249259Sdim		  else
379249259Sdim		    {
380249259Sdim		      ms_type = mst_file_text;
381249259Sdim		    }
382249259Sdim		}
383249259Sdim	      else if (sym->section->flags & SEC_ALLOC)
384249259Sdim		{
385249259Sdim		  if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
386249259Sdim		    {
387249259Sdim		      if (sym->section->flags & SEC_LOAD)
388249259Sdim			{
389249259Sdim			  ms_type = mst_data;
390249259Sdim			}
391249259Sdim		      else
392249259Sdim			{
393249259Sdim			  ms_type = mst_bss;
394249259Sdim			}
395249259Sdim		    }
396249259Sdim		  else if (sym->flags & BSF_LOCAL)
397249259Sdim		    {
398249259Sdim		      /* Named Local variable in a Data section.  Check its
399249259Sdim		         name for stabs-in-elf.  The STREQ macro checks the
400249259Sdim		         first character inline, so we only actually do a
401249259Sdim		         strcmp function call on names that start with 'B'
402249259Sdim		         or 'D' */
403249259Sdim		      index = SECT_OFF_MAX;
404249259Sdim		      if (STREQ ("Bbss.bss", sym->name))
405249259Sdim			{
406249259Sdim			  index = SECT_OFF_BSS (objfile);
407249259Sdim			}
408249259Sdim		      else if (STREQ ("Ddata.data", sym->name))
409249259Sdim			{
410249259Sdim			  index = SECT_OFF_DATA (objfile);
411249259Sdim			}
412249259Sdim		      else if (STREQ ("Drodata.rodata", sym->name))
413249259Sdim			{
414249259Sdim			  index = SECT_OFF_RODATA (objfile);
415249259Sdim			}
416249259Sdim		      if (index != SECT_OFF_MAX)
417249259Sdim			{
418249259Sdim			  /* Found a special local symbol.  Allocate a
419249259Sdim			     sectinfo, if needed, and fill it in.  */
420249259Sdim			  if (sectinfo == NULL)
421249259Sdim			    {
422249259Sdim			      sectinfo = (struct stab_section_info *)
423249259Sdim				xmmalloc (objfile->md, sizeof (*sectinfo));
424249259Sdim			      memset (sectinfo, 0,
425249259Sdim				      sizeof (*sectinfo));
426249259Sdim			      if (filesym == NULL)
427249259Sdim				{
428249259Sdim				  complain (&section_info_complaint,
429249259Sdim					    sym->name);
430249259Sdim				}
431249259Sdim			      else
432249259Sdim				{
433249259Sdim				  sectinfo->filename =
434249259Sdim				    (char *) filesym->name;
435249259Sdim				}
436249259Sdim			    }
437249259Sdim			  if (index != -1)
438249259Sdim			    {
439249259Sdim			      if (sectinfo->sections[index] != 0)
440249259Sdim				{
441249259Sdim				  complain (&section_info_dup_complaint,
442249259Sdim					    sectinfo->filename);
443249259Sdim				}
444249259Sdim			    }
445249259Sdim			  else
446249259Sdim			    internal_error (__FILE__, __LINE__,
447249259Sdim					    "Section index uninitialized.");
448249259Sdim			  /* Bfd symbols are section relative. */
449249259Sdim			  symaddr = sym->value + sym->section->vma;
450249259Sdim			  /* Relocate non-absolute symbols by the section offset. */
451249259Sdim			  if (sym->section != &bfd_abs_section)
452249259Sdim			    {
453249259Sdim			      symaddr += offset;
454249259Sdim			    }
455249259Sdim			  if (index != -1)
456249259Sdim			    sectinfo->sections[index] = symaddr;
457249259Sdim			  else
458249259Sdim			    internal_error (__FILE__, __LINE__,
459249259Sdim					    "Section index uninitialized.");
460249259Sdim			  /* The special local symbols don't go in the
461249259Sdim			     minimal symbol table, so ignore this one. */
462249259Sdim			  continue;
463249259Sdim			}
464249259Sdim		      /* Not a special stabs-in-elf symbol, do regular
465249259Sdim		         symbol processing. */
466249259Sdim		      if (sym->section->flags & SEC_LOAD)
467249259Sdim			{
468249259Sdim			  ms_type = mst_file_data;
469249259Sdim			}
470249259Sdim		      else
471249259Sdim			{
472249259Sdim			  ms_type = mst_file_bss;
473249259Sdim			}
474249259Sdim		    }
475249259Sdim		  else
476249259Sdim		    {
477249259Sdim		      ms_type = mst_unknown;
478249259Sdim		    }
479249259Sdim		}
480249259Sdim	      else
481249259Sdim		{
482249259Sdim		  /* FIXME:  Solaris2 shared libraries include lots of
483263508Sdim		     odd "absolute" and "undefined" symbols, that play
484249259Sdim		     hob with actions like finding what function the PC
485249259Sdim		     is in.  Ignore them if they aren't text, data, or bss.  */
486249259Sdim		  /* ms_type = mst_unknown; */
487249259Sdim		  continue;	/* Skip this symbol. */
488249259Sdim		}
489249259Sdim	      /* Pass symbol size field in via BFD.  FIXME!!!  */
490249259Sdim	      size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
491249259Sdim	      msym = record_minimal_symbol_and_info
492249259Sdim		((char *) sym->name, symaddr,
493249259Sdim		 ms_type, (void *) size, sym->section, objfile);
494249259Sdim#ifdef SOFUN_ADDRESS_MAYBE_MISSING
495249259Sdim	      if (msym != NULL)
496249259Sdim		msym->filename = filesymname;
497249259Sdim#endif
498249259Sdim	      ELF_MAKE_MSYMBOL_SPECIAL (sym, msym);
499249259Sdim	    }
500249259Sdim	}
501249259Sdim      do_cleanups (back_to);
502249259Sdim    }
503249259Sdim}
504249259Sdim
505249259Sdim/* Scan and build partial symbols for a symbol file.
506249259Sdim   We have been initialized by a call to elf_symfile_init, which
507249259Sdim   currently does nothing.
508249259Sdim
509249259Sdim   SECTION_OFFSETS is a set of offsets to apply to relocate the symbols
510263508Sdim   in each section.  We simplify it down to a single offset for all
511263508Sdim   symbols.  FIXME.
512263508Sdim
513249259Sdim   MAINLINE is true if we are reading the main symbol
514263508Sdim   table (as opposed to a shared lib or dynamically loaded file).
515263508Sdim
516263508Sdim   This function only does the minimum work necessary for letting the
517263508Sdim   user "name" things symbolically; it does not read the entire symtab.
518263508Sdim   Instead, it reads the external and static symbols and puts them in partial
519263508Sdim   symbol tables.  When more extensive information is requested of a
520249259Sdim   file, the corresponding partial symbol table is mutated into a full
521249259Sdim   fledged symbol table by going back and reading the symbols
522249259Sdim   for real.
523249259Sdim
524249259Sdim   We look for sections with specific names, to tell us what debug
525249259Sdim   format to look for:  FIXME!!!
526249259Sdim
527249259Sdim   dwarf_build_psymtabs() builds psymtabs for DWARF symbols;
528249259Sdim   elfstab_build_psymtabs() handles STABS symbols;
529249259Sdim   mdebug_build_psymtabs() handles ECOFF debugging information.
530249259Sdim
531249259Sdim   Note that ELF files have a "minimal" symbol table, which looks a lot
532249259Sdim   like a COFF symbol table, but has only the minimal information necessary
533249259Sdim   for linking.  We process this also, and use the information to
534249259Sdim   build gdb's minimal symbol table.  This gives us some minimal debugging
535249259Sdim   capability even for files compiled without -g.  */
536249259Sdim
537249259Sdimstatic void
538249259Sdimelf_symfile_read (struct objfile *objfile, int mainline)
539249259Sdim{
540249259Sdim  bfd *abfd = objfile->obfd;
541249259Sdim  struct elfinfo ei;
542249259Sdim  struct cleanup *back_to;
543249259Sdim  CORE_ADDR offset;
544249259Sdim
545249259Sdim  init_minimal_symbol_collection ();
546249259Sdim  back_to = make_cleanup_discard_minimal_symbols ();
547249259Sdim
548249259Sdim  memset ((char *) &ei, 0, sizeof (ei));
549249259Sdim
550249259Sdim  /* Allocate struct to keep track of the symfile */
551249259Sdim  objfile->sym_stab_info = (struct dbx_symfile_info *)
552249259Sdim    xmmalloc (objfile->md, sizeof (struct dbx_symfile_info));
553249259Sdim  memset ((char *) objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
554249259Sdim  make_cleanup (free_elfinfo, (void *) objfile);
555249259Sdim
556249259Sdim  /* Process the normal ELF symbol table first.  This may write some
557249259Sdim     chain of info into the dbx_symfile_info in objfile->sym_stab_info,
558249259Sdim     which can later be used by elfstab_offset_sections.  */
559249259Sdim
560249259Sdim  elf_symtab_read (objfile, 0);
561249259Sdim
562249259Sdim  /* Add the dynamic symbols.  */
563249259Sdim
564249259Sdim  elf_symtab_read (objfile, 1);
565249259Sdim
566249259Sdim  /* Now process debugging information, which is contained in
567249259Sdim     special ELF sections. */
568249259Sdim
569249259Sdim  /* If we are reinitializing, or if we have never loaded syms yet,
570249259Sdim     set table to empty.  MAINLINE is cleared so that *_read_psymtab
571249259Sdim     functions do not all also re-initialize the psymbol table. */
572249259Sdim  if (mainline)
573249259Sdim    {
574249259Sdim      init_psymbol_list (objfile, 0);
575249259Sdim      mainline = 0;
576249259Sdim    }
577249259Sdim
578249259Sdim  /* We first have to find them... */
579249259Sdim  bfd_map_over_sections (abfd, elf_locate_sections, (void *) & ei);
580249259Sdim
581249259Sdim  /* ELF debugging information is inserted into the psymtab in the
582249259Sdim     order of least informative first - most informative last.  Since
583249259Sdim     the psymtab table is searched `most recent insertion first' this
584249259Sdim     increases the probability that more detailed debug information
585249259Sdim     for a section is found.
586249259Sdim
587249259Sdim     For instance, an object file might contain both .mdebug (XCOFF)
588249259Sdim     and .debug_info (DWARF2) sections then .mdebug is inserted first
589249259Sdim     (searched last) and DWARF2 is inserted last (searched first).  If
590249259Sdim     we don't do this then the XCOFF info is found first - for code in
591249259Sdim     an included file XCOFF info is useless. */
592249259Sdim
593249259Sdim  if (ei.mdebugsect)
594249259Sdim    {
595249259Sdim      const struct ecoff_debug_swap *swap;
596249259Sdim
597249259Sdim      /* .mdebug section, presumably holding ECOFF debugging
598249259Sdim         information.  */
599249259Sdim      swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
600249259Sdim      if (swap)
601249259Sdim	elfmdebug_build_psymtabs (objfile, swap, ei.mdebugsect);
602249259Sdim    }
603249259Sdim  if (ei.stabsect)
604249259Sdim    {
605249259Sdim      asection *str_sect;
606249259Sdim
607249259Sdim      /* Stab sections have an associated string table that looks like
608249259Sdim         a separate section.  */
609249259Sdim      str_sect = bfd_get_section_by_name (abfd, ".stabstr");
610249259Sdim
611249259Sdim      /* FIXME should probably warn about a stab section without a stabstr.  */
612249259Sdim      if (str_sect)
613249259Sdim	elfstab_build_psymtabs (objfile,
614249259Sdim				mainline,
615249259Sdim				ei.stabsect->filepos,
616249259Sdim				bfd_section_size (abfd, ei.stabsect),
617249259Sdim				str_sect->filepos,
618249259Sdim				bfd_section_size (abfd, str_sect));
619249259Sdim    }
620249259Sdim  if (dwarf2_has_info (abfd))
621249259Sdim    {
622249259Sdim      /* DWARF 2 sections */
623249259Sdim      dwarf2_build_psymtabs (objfile, mainline);
624249259Sdim    }
625249259Sdim  else if (ei.dboffset && ei.lnoffset)
626249259Sdim    {
627249259Sdim      /* DWARF sections */
628249259Sdim      dwarf_build_psymtabs (objfile,
629249259Sdim			    mainline,
630249259Sdim			    ei.dboffset, ei.dbsize,
631249259Sdim			    ei.lnoffset, ei.lnsize);
632263508Sdim    }
633263508Sdim
634263508Sdim  if (DWARF2_BUILD_FRAME_INFO_P ())
635263508Sdim    DWARF2_BUILD_FRAME_INFO(objfile);
636263508Sdim
637263508Sdim  /* Install any minimal symbols that have been collected as the current
638263508Sdim     minimal symbols for this objfile. */
639249259Sdim
640249259Sdim  install_minimal_symbols (objfile);
641249259Sdim
642249259Sdim  do_cleanups (back_to);
643249259Sdim}
644249259Sdim
645249259Sdim/* This cleans up the objfile's sym_stab_info pointer, and the chain of
646249259Sdim   stab_section_info's, that might be dangling from it.  */
647249259Sdim
648249259Sdimstatic void
649249259Sdimfree_elfinfo (void *objp)
650249259Sdim{
651249259Sdim  struct objfile *objfile = (struct objfile *) objp;
652249259Sdim  struct dbx_symfile_info *dbxinfo = objfile->sym_stab_info;
653249259Sdim  struct stab_section_info *ssi, *nssi;
654249259Sdim
655249259Sdim  ssi = dbxinfo->stab_section_info;
656249259Sdim  while (ssi)
657249259Sdim    {
658249259Sdim      nssi = ssi->next;
659249259Sdim      xmfree (objfile->md, ssi);
660249259Sdim      ssi = nssi;
661249259Sdim    }
662249259Sdim
663249259Sdim  dbxinfo->stab_section_info = 0;	/* Just say No mo info about this.  */
664249259Sdim}
665249259Sdim
666249259Sdim
667249259Sdim/* Initialize anything that needs initializing when a completely new symbol
668249259Sdim   file is specified (not just adding some symbols from another file, e.g. a
669249259Sdim   shared library).
670249259Sdim
671249259Sdim   We reinitialize buildsym, since we may be reading stabs from an ELF file.  */
672249259Sdim
673249259Sdimstatic void
674249259Sdimelf_new_init (struct objfile *ignore)
675249259Sdim{
676249259Sdim  stabsread_new_init ();
677249259Sdim  buildsym_new_init ();
678249259Sdim}
679249259Sdim
680249259Sdim/* Perform any local cleanups required when we are done with a particular
681249259Sdim   objfile.  I.E, we are in the process of discarding all symbol information
682249259Sdim   for an objfile, freeing up all memory held for it, and unlinking the
683249259Sdim   objfile struct from the global list of known objfiles. */
684249259Sdim
685249259Sdimstatic void
686249259Sdimelf_symfile_finish (struct objfile *objfile)
687249259Sdim{
688249259Sdim  if (objfile->sym_stab_info != NULL)
689249259Sdim    {
690249259Sdim      xmfree (objfile->md, objfile->sym_stab_info);
691249259Sdim    }
692249259Sdim}
693249259Sdim
694249259Sdim/* ELF specific initialization routine for reading symbols.
695249259Sdim
696249259Sdim   It is passed a pointer to a struct sym_fns which contains, among other
697249259Sdim   things, the BFD for the file whose symbols are being read, and a slot for
698249259Sdim   a pointer to "private data" which we can fill with goodies.
699249259Sdim
700249259Sdim   For now at least, we have nothing in particular to do, so this function is
701249259Sdim   just a stub. */
702249259Sdim
703249259Sdimstatic void
704249259Sdimelf_symfile_init (struct objfile *objfile)
705249259Sdim{
706  /* ELF objects may be reordered, so set OBJF_REORDERED.  If we
707     find this causes a significant slowdown in gdb then we could
708     set it in the debug symbol readers only when necessary.  */
709  objfile->flags |= OBJF_REORDERED;
710}
711
712/* When handling an ELF file that contains Sun STABS debug info,
713   some of the debug info is relative to the particular chunk of the
714   section that was generated in its individual .o file.  E.g.
715   offsets to static variables are relative to the start of the data
716   segment *for that module before linking*.  This information is
717   painfully squirreled away in the ELF symbol table as local symbols
718   with wierd names.  Go get 'em when needed.  */
719
720void
721elfstab_offset_sections (struct objfile *objfile, struct partial_symtab *pst)
722{
723  char *filename = pst->filename;
724  struct dbx_symfile_info *dbx = objfile->sym_stab_info;
725  struct stab_section_info *maybe = dbx->stab_section_info;
726  struct stab_section_info *questionable = 0;
727  int i;
728  char *p;
729
730  /* The ELF symbol info doesn't include path names, so strip the path
731     (if any) from the psymtab filename.  */
732  while (0 != (p = strchr (filename, '/')))
733    filename = p + 1;
734
735  /* FIXME:  This linear search could speed up significantly
736     if it was chained in the right order to match how we search it,
737     and if we unchained when we found a match. */
738  for (; maybe; maybe = maybe->next)
739    {
740      if (filename[0] == maybe->filename[0]
741	  && STREQ (filename, maybe->filename))
742	{
743	  /* We found a match.  But there might be several source files
744	     (from different directories) with the same name.  */
745	  if (0 == maybe->found)
746	    break;
747	  questionable = maybe;	/* Might use it later.  */
748	}
749    }
750
751  if (maybe == 0 && questionable != 0)
752    {
753      complain (&stab_info_questionable_complaint, filename);
754      maybe = questionable;
755    }
756
757  if (maybe)
758    {
759      /* Found it!  Allocate a new psymtab struct, and fill it in.  */
760      maybe->found++;
761      pst->section_offsets = (struct section_offsets *)
762	obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS);
763      for (i = 0; i < SECT_OFF_MAX; i++)
764	(pst->section_offsets)->offsets[i] = maybe->sections[i];
765      return;
766    }
767
768  /* We were unable to find any offsets for this file.  Complain.  */
769  if (dbx->stab_section_info)	/* If there *is* any info, */
770    complain (&stab_info_mismatch_complaint, filename);
771}
772
773/* Register that we are able to handle ELF object file formats.  */
774
775static struct sym_fns elf_sym_fns =
776{
777  bfd_target_elf_flavour,
778  elf_new_init,			/* sym_new_init: init anything gbl to entire symtab */
779  elf_symfile_init,		/* sym_init: read initial info, setup for sym_read() */
780  elf_symfile_read,		/* sym_read: read a symbol file into symtab */
781  elf_symfile_finish,		/* sym_finish: finished with file, cleanup */
782  default_symfile_offsets,	/* sym_offsets:  Translate ext. to int. relocation */
783  NULL				/* next: pointer to next struct sym_fns */
784};
785
786void
787_initialize_elfread (void)
788{
789  add_symtab_fns (&elf_sym_fns);
790}
791