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