OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.3/] [gdb/] [elfread.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.