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