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