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