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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.3/] [gdb/] [objfiles.c] - Blame information for rev 1774

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1181 sfurman
/* GDB routines for manipulating objfiles.
2
 
3
   Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4
   2001, 2002 Free Software Foundation, Inc.
5
 
6
   Contributed by Cygnus Support, using pieces from other GDB modules.
7
 
8
   This file is part of GDB.
9
 
10
   This program is free software; you can redistribute it and/or modify
11
   it under the terms of the GNU General Public License as published by
12
   the Free Software Foundation; either version 2 of the License, or
13
   (at your option) any later version.
14
 
15
   This program is distributed in the hope that it will be useful,
16
   but WITHOUT ANY WARRANTY; without even the implied warranty of
17
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
   GNU General Public License for more details.
19
 
20
   You should have received a copy of the GNU General Public License
21
   along with this program; if not, write to the Free Software
22
   Foundation, Inc., 59 Temple Place - Suite 330,
23
   Boston, MA 02111-1307, USA.  */
24
 
25
/* This file contains support routines for creating, manipulating, and
26
   destroying objfile structures. */
27
 
28
#include "defs.h"
29
#include "bfd.h"                /* Binary File Description */
30
#include "symtab.h"
31
#include "symfile.h"
32
#include "objfiles.h"
33
#include "gdb-stabs.h"
34
#include "target.h"
35
#include "bcache.h"
36
 
37
#include <sys/types.h>
38
#include "gdb_stat.h"
39
#include <fcntl.h>
40
#include "gdb_obstack.h"
41
#include "gdb_string.h"
42
 
43
#include "breakpoint.h"
44
 
45
/* Prototypes for local functions */
46
 
47
#if defined(USE_MMALLOC) && defined(HAVE_MMAP)
48
 
49
#include "mmalloc.h"
50
 
51
static int open_existing_mapped_file (char *, long, int);
52
 
53
static int open_mapped_file (char *filename, long mtime, int flags);
54
 
55
static PTR map_to_file (int);
56
 
57
#endif /* defined(USE_MMALLOC) && defined(HAVE_MMAP) */
58
 
59
static void add_to_objfile_sections (bfd *, sec_ptr, PTR);
60
 
61
/* Externally visible variables that are owned by this module.
62
   See declarations in objfile.h for more info. */
63
 
64
struct objfile *object_files;   /* Linked list of all objfiles */
65
struct objfile *current_objfile;        /* For symbol file being read in */
66
struct objfile *symfile_objfile;        /* Main symbol table loaded from */
67
struct objfile *rt_common_objfile;      /* For runtime common symbols */
68
 
69
int mapped_symbol_files;        /* Try to use mapped symbol files */
70
 
71
/* Locate all mappable sections of a BFD file.
72
   objfile_p_char is a char * to get it through
73
   bfd_map_over_sections; we cast it back to its proper type.  */
74
 
75
#ifndef TARGET_KEEP_SECTION
76
#define TARGET_KEEP_SECTION(ASECT)      0
77
#endif
78
 
79
/* Called via bfd_map_over_sections to build up the section table that
80
   the objfile references.  The objfile contains pointers to the start
81
   of the table (objfile->sections) and to the first location after
82
   the end of the table (objfile->sections_end). */
83
 
84
static void
85
add_to_objfile_sections (bfd *abfd, sec_ptr asect, PTR objfile_p_char)
86
{
87
  struct objfile *objfile = (struct objfile *) objfile_p_char;
88
  struct obj_section section;
89
  flagword aflag;
90
 
91
  aflag = bfd_get_section_flags (abfd, asect);
92
 
93
  if (!(aflag & SEC_ALLOC) && !(TARGET_KEEP_SECTION (asect)))
94
    return;
95
 
96
  if (0 == bfd_section_size (abfd, asect))
97
    return;
98
  section.offset = 0;
99
  section.objfile = objfile;
100
  section.the_bfd_section = asect;
101
  section.ovly_mapped = 0;
102
  section.addr = bfd_section_vma (abfd, asect);
103
  section.endaddr = section.addr + bfd_section_size (abfd, asect);
104
  obstack_grow (&objfile->psymbol_obstack, (char *) &section, sizeof (section));
105
  objfile->sections_end = (struct obj_section *) (((unsigned long) objfile->sections_end) + 1);
106
}
107
 
108
/* Builds a section table for OBJFILE.
109
   Returns 0 if OK, 1 on error (in which case bfd_error contains the
110
   error).
111
 
112
   Note that while we are building the table, which goes into the
113
   psymbol obstack, we hijack the sections_end pointer to instead hold
114
   a count of the number of sections.  When bfd_map_over_sections
115
   returns, this count is used to compute the pointer to the end of
116
   the sections table, which then overwrites the count.
117
 
118
   Also note that the OFFSET and OVLY_MAPPED in each table entry
119
   are initialized to zero.
120
 
121
   Also note that if anything else writes to the psymbol obstack while
122
   we are building the table, we're pretty much hosed. */
123
 
124
int
125
build_objfile_section_table (struct objfile *objfile)
126
{
127
  /* objfile->sections can be already set when reading a mapped symbol
128
     file.  I believe that we do need to rebuild the section table in
129
     this case (we rebuild other things derived from the bfd), but we
130
     can't free the old one (it's in the psymbol_obstack).  So we just
131
     waste some memory.  */
132
 
133
  objfile->sections_end = 0;
134
  bfd_map_over_sections (objfile->obfd, add_to_objfile_sections, (char *) objfile);
135
  objfile->sections = (struct obj_section *)
136
    obstack_finish (&objfile->psymbol_obstack);
137
  objfile->sections_end = objfile->sections + (unsigned long) objfile->sections_end;
138
  return (0);
139
}
140
 
141
/* Given a pointer to an initialized bfd (ABFD) and some flag bits
142
   allocate a new objfile struct, fill it in as best we can, link it
143
   into the list of all known objfiles, and return a pointer to the
144
   new objfile struct.
145
 
146
   The FLAGS word contains various bits (OBJF_*) that can be taken as
147
   requests for specific operations, like trying to open a mapped
148
   version of the objfile (OBJF_MAPPED).  Other bits like
149
   OBJF_SHARED are simply copied through to the new objfile flags
150
   member. */
151
 
152
struct objfile *
153
allocate_objfile (bfd *abfd, int flags)
154
{
155
  struct objfile *objfile = NULL;
156
  struct objfile *last_one = NULL;
157
 
158
  if (mapped_symbol_files)
159
    flags |= OBJF_MAPPED;
160
 
161
#if defined(USE_MMALLOC) && defined(HAVE_MMAP)
162
  if (abfd != NULL)
163
    {
164
 
165
      /* If we can support mapped symbol files, try to open/reopen the
166
         mapped file that corresponds to the file from which we wish to
167
         read symbols.  If the objfile is to be mapped, we must malloc
168
         the structure itself using the mmap version, and arrange that
169
         all memory allocation for the objfile uses the mmap routines.
170
         If we are reusing an existing mapped file, from which we get
171
         our objfile pointer, we have to make sure that we update the
172
         pointers to the alloc/free functions in the obstack, in case
173
         these functions have moved within the current gdb.  */
174
 
175
      int fd;
176
 
177
      fd = open_mapped_file (bfd_get_filename (abfd), bfd_get_mtime (abfd),
178
                             flags);
179
      if (fd >= 0)
180
        {
181
          PTR md;
182
 
183
          if ((md = map_to_file (fd)) == NULL)
184
            {
185
              close (fd);
186
            }
187
          else if ((objfile = (struct objfile *) mmalloc_getkey (md, 0)) != NULL)
188
            {
189
              /* Update memory corruption handler function addresses. */
190
              init_malloc (md);
191
              objfile->md = md;
192
              objfile->mmfd = fd;
193
              /* Update pointers to functions to *our* copies */
194
              obstack_chunkfun (&objfile->psymbol_cache.cache, xmmalloc);
195
              obstack_freefun (&objfile->psymbol_cache.cache, xmfree);
196
              obstack_chunkfun (&objfile->macro_cache.cache, xmmalloc);
197
              obstack_freefun (&objfile->macro_cache.cache, xmfree);
198
              obstack_chunkfun (&objfile->psymbol_obstack, xmmalloc);
199
              obstack_freefun (&objfile->psymbol_obstack, xmfree);
200
              obstack_chunkfun (&objfile->symbol_obstack, xmmalloc);
201
              obstack_freefun (&objfile->symbol_obstack, xmfree);
202
              obstack_chunkfun (&objfile->type_obstack, xmmalloc);
203
              obstack_freefun (&objfile->type_obstack, xmfree);
204
              /* If already in objfile list, unlink it. */
205
              unlink_objfile (objfile);
206
              /* Forget things specific to a particular gdb, may have changed. */
207
              objfile->sf = NULL;
208
            }
209
          else
210
            {
211
 
212
              /* Set up to detect internal memory corruption.  MUST be
213
                 done before the first malloc.  See comments in
214
                 init_malloc() and mmcheck().  */
215
 
216
              init_malloc (md);
217
 
218
              objfile = (struct objfile *)
219
                xmmalloc (md, sizeof (struct objfile));
220
              memset (objfile, 0, sizeof (struct objfile));
221
              objfile->md = md;
222
              objfile->mmfd = fd;
223
              objfile->flags |= OBJF_MAPPED;
224
              mmalloc_setkey (objfile->md, 0, objfile);
225
              obstack_specify_allocation_with_arg (&objfile->psymbol_cache.cache,
226
                                                   0, 0, xmmalloc, xmfree,
227
                                                   objfile->md);
228
              obstack_specify_allocation_with_arg (&objfile->macro_cache.cache,
229
                                                   0, 0, xmmalloc, xmfree,
230
                                                   objfile->md);
231
              obstack_specify_allocation_with_arg (&objfile->psymbol_obstack,
232
                                                   0, 0, xmmalloc, xmfree,
233
                                                   objfile->md);
234
              obstack_specify_allocation_with_arg (&objfile->symbol_obstack,
235
                                                   0, 0, xmmalloc, xmfree,
236
                                                   objfile->md);
237
              obstack_specify_allocation_with_arg (&objfile->type_obstack,
238
                                                   0, 0, xmmalloc, xmfree,
239
                                                   objfile->md);
240
            }
241
        }
242
 
243
      if ((flags & OBJF_MAPPED) && (objfile == NULL))
244
        {
245
          warning ("symbol table for '%s' will not be mapped",
246
                   bfd_get_filename (abfd));
247
          flags &= ~OBJF_MAPPED;
248
        }
249
    }
250
#else /* !defined(USE_MMALLOC) || !defined(HAVE_MMAP) */
251
 
252
  if (flags & OBJF_MAPPED)
253
    {
254
      warning ("mapped symbol tables are not supported on this machine; missing or broken mmap().");
255
 
256
      /* Turn off the global flag so we don't try to do mapped symbol tables
257
         any more, which shuts up gdb unless the user specifically gives the
258
         "mapped" keyword again. */
259
 
260
      mapped_symbol_files = 0;
261
      flags &= ~OBJF_MAPPED;
262
    }
263
 
264
#endif /* defined(USE_MMALLOC) && defined(HAVE_MMAP) */
265
 
266
  /* If we don't support mapped symbol files, didn't ask for the file to be
267
     mapped, or failed to open the mapped file for some reason, then revert
268
     back to an unmapped objfile. */
269
 
270
  if (objfile == NULL)
271
    {
272
      objfile = (struct objfile *) xmalloc (sizeof (struct objfile));
273
      memset (objfile, 0, sizeof (struct objfile));
274
      objfile->md = NULL;
275
      objfile->psymbol_cache = bcache_xmalloc ();
276
      objfile->macro_cache = bcache_xmalloc ();
277
      obstack_specify_allocation (&objfile->psymbol_obstack, 0, 0, xmalloc,
278
                                  xfree);
279
      obstack_specify_allocation (&objfile->symbol_obstack, 0, 0, xmalloc,
280
                                  xfree);
281
      obstack_specify_allocation (&objfile->type_obstack, 0, 0, xmalloc,
282
                                  xfree);
283
      flags &= ~OBJF_MAPPED;
284
    }
285
 
286
  /* Update the per-objfile information that comes from the bfd, ensuring
287
     that any data that is reference is saved in the per-objfile data
288
     region. */
289
 
290
  objfile->obfd = abfd;
291
  if (objfile->name != NULL)
292
    {
293
      xmfree (objfile->md, objfile->name);
294
    }
295
  if (abfd != NULL)
296
    {
297
      objfile->name = mstrsave (objfile->md, bfd_get_filename (abfd));
298
      objfile->mtime = bfd_get_mtime (abfd);
299
 
300
      /* Build section table.  */
301
 
302
      if (build_objfile_section_table (objfile))
303
        {
304
          error ("Can't find the file sections in `%s': %s",
305
                 objfile->name, bfd_errmsg (bfd_get_error ()));
306
        }
307
    }
308
 
309
  /* Initialize the section indexes for this objfile, so that we can
310
     later detect if they are used w/o being properly assigned to. */
311
 
312
    objfile->sect_index_text = -1;
313
    objfile->sect_index_data = -1;
314
    objfile->sect_index_bss = -1;
315
    objfile->sect_index_rodata = -1;
316
 
317
  /* Add this file onto the tail of the linked list of other such files. */
318
 
319
  objfile->next = NULL;
320
  if (object_files == NULL)
321
    object_files = objfile;
322
  else
323
    {
324
      for (last_one = object_files;
325
           last_one->next;
326
           last_one = last_one->next);
327
      last_one->next = objfile;
328
    }
329
 
330
  /* Save passed in flag bits. */
331
  objfile->flags |= flags;
332
 
333
  return (objfile);
334
}
335
 
336
/* Put OBJFILE at the front of the list.  */
337
 
338
void
339
objfile_to_front (struct objfile *objfile)
340
{
341
  struct objfile **objp;
342
  for (objp = &object_files; *objp != NULL; objp = &((*objp)->next))
343
    {
344
      if (*objp == objfile)
345
        {
346
          /* Unhook it from where it is.  */
347
          *objp = objfile->next;
348
          /* Put it in the front.  */
349
          objfile->next = object_files;
350
          object_files = objfile;
351
          break;
352
        }
353
    }
354
}
355
 
356
/* Unlink OBJFILE from the list of known objfiles, if it is found in the
357
   list.
358
 
359
   It is not a bug, or error, to call this function if OBJFILE is not known
360
   to be in the current list.  This is done in the case of mapped objfiles,
361
   for example, just to ensure that the mapped objfile doesn't appear twice
362
   in the list.  Since the list is threaded, linking in a mapped objfile
363
   twice would create a circular list.
364
 
365
   If OBJFILE turns out to be in the list, we zap it's NEXT pointer after
366
   unlinking it, just to ensure that we have completely severed any linkages
367
   between the OBJFILE and the list. */
368
 
369
void
370
unlink_objfile (struct objfile *objfile)
371
{
372
  struct objfile **objpp;
373
 
374
  for (objpp = &object_files; *objpp != NULL; objpp = &((*objpp)->next))
375
    {
376
      if (*objpp == objfile)
377
        {
378
          *objpp = (*objpp)->next;
379
          objfile->next = NULL;
380
          return;
381
        }
382
    }
383
 
384
  internal_error (__FILE__, __LINE__,
385
                  "unlink_objfile: objfile already unlinked");
386
}
387
 
388
 
389
/* Destroy an objfile and all the symtabs and psymtabs under it.  Note
390
   that as much as possible is allocated on the symbol_obstack and
391
   psymbol_obstack, so that the memory can be efficiently freed.
392
 
393
   Things which we do NOT free because they are not in malloc'd memory
394
   or not in memory specific to the objfile include:
395
 
396
   objfile -> sf
397
 
398
   FIXME:  If the objfile is using reusable symbol information (via mmalloc),
399
   then we need to take into account the fact that more than one process
400
   may be using the symbol information at the same time (when mmalloc is
401
   extended to support cooperative locking).  When more than one process
402
   is using the mapped symbol info, we need to be more careful about when
403
   we free objects in the reusable area. */
404
 
405
void
406
free_objfile (struct objfile *objfile)
407
{
408
  /* First do any symbol file specific actions required when we are
409
     finished with a particular symbol file.  Note that if the objfile
410
     is using reusable symbol information (via mmalloc) then each of
411
     these routines is responsible for doing the correct thing, either
412
     freeing things which are valid only during this particular gdb
413
     execution, or leaving them to be reused during the next one. */
414
 
415
  if (objfile->sf != NULL)
416
    {
417
      (*objfile->sf->sym_finish) (objfile);
418
    }
419
 
420
  /* We always close the bfd. */
421
 
422
  if (objfile->obfd != NULL)
423
    {
424
      char *name = bfd_get_filename (objfile->obfd);
425
      if (!bfd_close (objfile->obfd))
426
        warning ("cannot close \"%s\": %s",
427
                 name, bfd_errmsg (bfd_get_error ()));
428
      xfree (name);
429
    }
430
 
431
  /* Remove it from the chain of all objfiles. */
432
 
433
  unlink_objfile (objfile);
434
 
435
  /* If we are going to free the runtime common objfile, mark it
436
     as unallocated.  */
437
 
438
  if (objfile == rt_common_objfile)
439
    rt_common_objfile = NULL;
440
 
441
  /* Before the symbol table code was redone to make it easier to
442
     selectively load and remove information particular to a specific
443
     linkage unit, gdb used to do these things whenever the monolithic
444
     symbol table was blown away.  How much still needs to be done
445
     is unknown, but we play it safe for now and keep each action until
446
     it is shown to be no longer needed. */
447
 
448
  /* I *think* all our callers call clear_symtab_users.  If so, no need
449
     to call this here.  */
450
  clear_pc_function_cache ();
451
 
452
  /* The last thing we do is free the objfile struct itself for the
453
     non-reusable case, or detach from the mapped file for the
454
     reusable case.  Note that the mmalloc_detach or the xmfree() is
455
     the last thing we can do with this objfile. */
456
 
457
#if defined(USE_MMALLOC) && defined(HAVE_MMAP)
458
 
459
  if (objfile->flags & OBJF_MAPPED)
460
    {
461
      /* Remember the fd so we can close it.  We can't close it before
462
         doing the detach, and after the detach the objfile is gone. */
463
      int mmfd;
464
 
465
      mmfd = objfile->mmfd;
466
      mmalloc_detach (objfile->md);
467
      objfile = NULL;
468
      close (mmfd);
469
    }
470
 
471
#endif /* defined(USE_MMALLOC) && defined(HAVE_MMAP) */
472
 
473
  /* If we still have an objfile, then either we don't support reusable
474
     objfiles or this one was not reusable.  So free it normally. */
475
 
476
  if (objfile != NULL)
477
    {
478
      if (objfile->name != NULL)
479
        {
480
          xmfree (objfile->md, objfile->name);
481
        }
482
      if (objfile->global_psymbols.list)
483
        xmfree (objfile->md, objfile->global_psymbols.list);
484
      if (objfile->static_psymbols.list)
485
        xmfree (objfile->md, objfile->static_psymbols.list);
486
      /* Free the obstacks for non-reusable objfiles */
487
      bcache_xfree (objfile->psymbol_cache);
488
      bcache_xfree (objfile->macro_cache);
489
      obstack_free (&objfile->psymbol_obstack, 0);
490
      obstack_free (&objfile->symbol_obstack, 0);
491
      obstack_free (&objfile->type_obstack, 0);
492
      xmfree (objfile->md, objfile);
493
      objfile = NULL;
494
    }
495
}
496
 
497
static void
498
do_free_objfile_cleanup (void *obj)
499
{
500
  free_objfile (obj);
501
}
502
 
503
struct cleanup *
504
make_cleanup_free_objfile (struct objfile *obj)
505
{
506
  return make_cleanup (do_free_objfile_cleanup, obj);
507
}
508
 
509
/* Free all the object files at once and clean up their users.  */
510
 
511
void
512
free_all_objfiles (void)
513
{
514
  struct objfile *objfile, *temp;
515
 
516
  ALL_OBJFILES_SAFE (objfile, temp)
517
  {
518
    free_objfile (objfile);
519
  }
520
  clear_symtab_users ();
521
}
522
 
523
/* Relocate OBJFILE to NEW_OFFSETS.  There should be OBJFILE->NUM_SECTIONS
524
   entries in new_offsets.  */
525
void
526
objfile_relocate (struct objfile *objfile, struct section_offsets *new_offsets)
527
{
528
  struct section_offsets *delta =
529
    (struct section_offsets *) alloca (SIZEOF_SECTION_OFFSETS);
530
 
531
  {
532
    int i;
533
    int something_changed = 0;
534
    for (i = 0; i < objfile->num_sections; ++i)
535
      {
536
        delta->offsets[i] =
537
          ANOFFSET (new_offsets, i) - ANOFFSET (objfile->section_offsets, i);
538
        if (ANOFFSET (delta, i) != 0)
539
          something_changed = 1;
540
      }
541
    if (!something_changed)
542
      return;
543
  }
544
 
545
  /* OK, get all the symtabs.  */
546
  {
547
    struct symtab *s;
548
 
549
    ALL_OBJFILE_SYMTABS (objfile, s)
550
    {
551
      struct linetable *l;
552
      struct blockvector *bv;
553
      int i;
554
 
555
      /* First the line table.  */
556
      l = LINETABLE (s);
557
      if (l)
558
        {
559
          for (i = 0; i < l->nitems; ++i)
560
            l->item[i].pc += ANOFFSET (delta, s->block_line_section);
561
        }
562
 
563
      /* Don't relocate a shared blockvector more than once.  */
564
      if (!s->primary)
565
        continue;
566
 
567
      bv = BLOCKVECTOR (s);
568
      for (i = 0; i < BLOCKVECTOR_NBLOCKS (bv); ++i)
569
        {
570
          struct block *b;
571
          struct symbol *sym;
572
          int j;
573
 
574
          b = BLOCKVECTOR_BLOCK (bv, i);
575
          BLOCK_START (b) += ANOFFSET (delta, s->block_line_section);
576
          BLOCK_END (b) += ANOFFSET (delta, s->block_line_section);
577
 
578
          ALL_BLOCK_SYMBOLS (b, j, sym)
579
            {
580
              fixup_symbol_section (sym, objfile);
581
 
582
              /* The RS6000 code from which this was taken skipped
583
                 any symbols in STRUCT_NAMESPACE or UNDEF_NAMESPACE.
584
                 But I'm leaving out that test, on the theory that
585
                 they can't possibly pass the tests below.  */
586
              if ((SYMBOL_CLASS (sym) == LOC_LABEL
587
                   || SYMBOL_CLASS (sym) == LOC_STATIC
588
                   || SYMBOL_CLASS (sym) == LOC_INDIRECT)
589
                  && SYMBOL_SECTION (sym) >= 0)
590
                {
591
                  SYMBOL_VALUE_ADDRESS (sym) +=
592
                    ANOFFSET (delta, SYMBOL_SECTION (sym));
593
                }
594
#ifdef MIPS_EFI_SYMBOL_NAME
595
              /* Relocate Extra Function Info for ecoff.  */
596
 
597
              else if (SYMBOL_CLASS (sym) == LOC_CONST
598
                       && SYMBOL_NAMESPACE (sym) == LABEL_NAMESPACE
599
                       && strcmp (SYMBOL_NAME (sym), MIPS_EFI_SYMBOL_NAME) == 0)
600
                ecoff_relocate_efi (sym, ANOFFSET (delta,
601
                                                   s->block_line_section));
602
#endif
603
            }
604
        }
605
    }
606
  }
607
 
608
  {
609
    struct partial_symtab *p;
610
 
611
    ALL_OBJFILE_PSYMTABS (objfile, p)
612
    {
613
      p->textlow += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
614
      p->texthigh += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
615
    }
616
  }
617
 
618
  {
619
    struct partial_symbol **psym;
620
 
621
    for (psym = objfile->global_psymbols.list;
622
         psym < objfile->global_psymbols.next;
623
         psym++)
624
      {
625
        fixup_psymbol_section (*psym, objfile);
626
        if (SYMBOL_SECTION (*psym) >= 0)
627
          SYMBOL_VALUE_ADDRESS (*psym) += ANOFFSET (delta,
628
                                                    SYMBOL_SECTION (*psym));
629
      }
630
    for (psym = objfile->static_psymbols.list;
631
         psym < objfile->static_psymbols.next;
632
         psym++)
633
      {
634
        fixup_psymbol_section (*psym, objfile);
635
        if (SYMBOL_SECTION (*psym) >= 0)
636
          SYMBOL_VALUE_ADDRESS (*psym) += ANOFFSET (delta,
637
                                                    SYMBOL_SECTION (*psym));
638
      }
639
  }
640
 
641
  {
642
    struct minimal_symbol *msym;
643
    ALL_OBJFILE_MSYMBOLS (objfile, msym)
644
      if (SYMBOL_SECTION (msym) >= 0)
645
      SYMBOL_VALUE_ADDRESS (msym) += ANOFFSET (delta, SYMBOL_SECTION (msym));
646
  }
647
  /* Relocating different sections by different amounts may cause the symbols
648
     to be out of order.  */
649
  msymbols_sort (objfile);
650
 
651
  {
652
    int i;
653
    for (i = 0; i < objfile->num_sections; ++i)
654
      (objfile->section_offsets)->offsets[i] = ANOFFSET (new_offsets, i);
655
  }
656
 
657
  if (objfile->ei.entry_point != ~(CORE_ADDR) 0)
658
    {
659
      /* Relocate ei.entry_point with its section offset, use SECT_OFF_TEXT
660
         only as a fallback.  */
661
      struct obj_section *s;
662
      s = find_pc_section (objfile->ei.entry_point);
663
      if (s)
664
        objfile->ei.entry_point += ANOFFSET (delta, s->the_bfd_section->index);
665
      else
666
        objfile->ei.entry_point += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
667
    }
668
 
669
  {
670
    struct obj_section *s;
671
    bfd *abfd;
672
 
673
    abfd = objfile->obfd;
674
 
675
    ALL_OBJFILE_OSECTIONS (objfile, s)
676
      {
677
        int idx = s->the_bfd_section->index;
678
 
679
        s->addr += ANOFFSET (delta, idx);
680
        s->endaddr += ANOFFSET (delta, idx);
681
      }
682
  }
683
 
684
  if (objfile->ei.entry_func_lowpc != INVALID_ENTRY_LOWPC)
685
    {
686
      objfile->ei.entry_func_lowpc += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
687
      objfile->ei.entry_func_highpc += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
688
    }
689
 
690
  if (objfile->ei.entry_file_lowpc != INVALID_ENTRY_LOWPC)
691
    {
692
      objfile->ei.entry_file_lowpc += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
693
      objfile->ei.entry_file_highpc += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
694
    }
695
 
696
  if (objfile->ei.main_func_lowpc != INVALID_ENTRY_LOWPC)
697
    {
698
      objfile->ei.main_func_lowpc += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
699
      objfile->ei.main_func_highpc += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
700
    }
701
 
702
  /* Relocate breakpoints as necessary, after things are relocated. */
703
  breakpoint_re_set ();
704
}
705
 
706
/* Many places in gdb want to test just to see if we have any partial
707
   symbols available.  This function returns zero if none are currently
708
   available, nonzero otherwise. */
709
 
710
int
711
have_partial_symbols (void)
712
{
713
  struct objfile *ofp;
714
 
715
  ALL_OBJFILES (ofp)
716
  {
717
    if (ofp->psymtabs != NULL)
718
      {
719
        return 1;
720
      }
721
  }
722
  return 0;
723
}
724
 
725
/* Many places in gdb want to test just to see if we have any full
726
   symbols available.  This function returns zero if none are currently
727
   available, nonzero otherwise. */
728
 
729
int
730
have_full_symbols (void)
731
{
732
  struct objfile *ofp;
733
 
734
  ALL_OBJFILES (ofp)
735
  {
736
    if (ofp->symtabs != NULL)
737
      {
738
        return 1;
739
      }
740
  }
741
  return 0;
742
}
743
 
744
 
745
/* This operations deletes all objfile entries that represent solibs that
746
   weren't explicitly loaded by the user, via e.g., the add-symbol-file
747
   command.
748
 */
749
void
750
objfile_purge_solibs (void)
751
{
752
  struct objfile *objf;
753
  struct objfile *temp;
754
 
755
  ALL_OBJFILES_SAFE (objf, temp)
756
  {
757
    /* We assume that the solib package has been purged already, or will
758
       be soon.
759
     */
760
    if (!(objf->flags & OBJF_USERLOADED) && (objf->flags & OBJF_SHARED))
761
      free_objfile (objf);
762
  }
763
}
764
 
765
 
766
/* Many places in gdb want to test just to see if we have any minimal
767
   symbols available.  This function returns zero if none are currently
768
   available, nonzero otherwise. */
769
 
770
int
771
have_minimal_symbols (void)
772
{
773
  struct objfile *ofp;
774
 
775
  ALL_OBJFILES (ofp)
776
  {
777
    if (ofp->msymbols != NULL)
778
      {
779
        return 1;
780
      }
781
  }
782
  return 0;
783
}
784
 
785
#if defined(USE_MMALLOC) && defined(HAVE_MMAP)
786
 
787
/* Given the name of a mapped symbol file in SYMSFILENAME, and the timestamp
788
   of the corresponding symbol file in MTIME, try to open an existing file
789
   with the name SYMSFILENAME and verify it is more recent than the base
790
   file by checking it's timestamp against MTIME.
791
 
792
   If SYMSFILENAME does not exist (or can't be stat'd), simply returns -1.
793
 
794
   If SYMSFILENAME does exist, but is out of date, we check to see if the
795
   user has specified creation of a mapped file.  If so, we don't issue
796
   any warning message because we will be creating a new mapped file anyway,
797
   overwriting the old one.  If not, then we issue a warning message so that
798
   the user will know why we aren't using this existing mapped symbol file.
799
   In either case, we return -1.
800
 
801
   If SYMSFILENAME does exist and is not out of date, but can't be opened for
802
   some reason, then prints an appropriate system error message and returns -1.
803
 
804
   Otherwise, returns the open file descriptor.  */
805
 
806
static int
807
open_existing_mapped_file (char *symsfilename, long mtime, int flags)
808
{
809
  int fd = -1;
810
  struct stat sbuf;
811
 
812
  if (stat (symsfilename, &sbuf) == 0)
813
    {
814
      if (sbuf.st_mtime < mtime)
815
        {
816
          if (!(flags & OBJF_MAPPED))
817
            {
818
              warning ("mapped symbol file `%s' is out of date, ignored it",
819
                       symsfilename);
820
            }
821
        }
822
      else if ((fd = open (symsfilename, O_RDWR)) < 0)
823
        {
824
          if (error_pre_print)
825
            {
826
              printf_unfiltered (error_pre_print);
827
            }
828
          print_sys_errmsg (symsfilename, errno);
829
        }
830
    }
831
  return (fd);
832
}
833
 
834
/* Look for a mapped symbol file that corresponds to FILENAME and is more
835
   recent than MTIME.  If MAPPED is nonzero, the user has asked that gdb
836
   use a mapped symbol file for this file, so create a new one if one does
837
   not currently exist.
838
 
839
   If found, then return an open file descriptor for the file, otherwise
840
   return -1.
841
 
842
   This routine is responsible for implementing the policy that generates
843
   the name of the mapped symbol file from the name of a file containing
844
   symbols that gdb would like to read.  Currently this policy is to append
845
   ".syms" to the name of the file.
846
 
847
   This routine is also responsible for implementing the policy that
848
   determines where the mapped symbol file is found (the search path).
849
   This policy is that when reading an existing mapped file, a file of
850
   the correct name in the current directory takes precedence over a
851
   file of the correct name in the same directory as the symbol file.
852
   When creating a new mapped file, it is always created in the current
853
   directory.  This helps to minimize the chances of a user unknowingly
854
   creating big mapped files in places like /bin and /usr/local/bin, and
855
   allows a local copy to override a manually installed global copy (in
856
   /bin for example).  */
857
 
858
static int
859
open_mapped_file (char *filename, long mtime, int flags)
860
{
861
  int fd;
862
  char *symsfilename;
863
 
864
  /* First try to open an existing file in the current directory, and
865
     then try the directory where the symbol file is located. */
866
 
867
  symsfilename = concat ("./", lbasename (filename), ".syms", (char *) NULL);
868
  if ((fd = open_existing_mapped_file (symsfilename, mtime, flags)) < 0)
869
    {
870
      xfree (symsfilename);
871
      symsfilename = concat (filename, ".syms", (char *) NULL);
872
      fd = open_existing_mapped_file (symsfilename, mtime, flags);
873
    }
874
 
875
  /* If we don't have an open file by now, then either the file does not
876
     already exist, or the base file has changed since it was created.  In
877
     either case, if the user has specified use of a mapped file, then
878
     create a new mapped file, truncating any existing one.  If we can't
879
     create one, print a system error message saying why we can't.
880
 
881
     By default the file is rw for everyone, with the user's umask taking
882
     care of turning off the permissions the user wants off. */
883
 
884
  if ((fd < 0) && (flags & OBJF_MAPPED))
885
    {
886
      xfree (symsfilename);
887
      symsfilename = concat ("./", lbasename (filename), ".syms",
888
                             (char *) NULL);
889
      if ((fd = open (symsfilename, O_RDWR | O_CREAT | O_TRUNC, 0666)) < 0)
890
        {
891
          if (error_pre_print)
892
            {
893
              printf_unfiltered (error_pre_print);
894
            }
895
          print_sys_errmsg (symsfilename, errno);
896
        }
897
    }
898
 
899
  xfree (symsfilename);
900
  return (fd);
901
}
902
 
903
static PTR
904
map_to_file (int fd)
905
{
906
  PTR md;
907
  CORE_ADDR mapto;
908
 
909
  md = mmalloc_attach (fd, (PTR) 0);
910
  if (md != NULL)
911
    {
912
      mapto = (CORE_ADDR) mmalloc_getkey (md, 1);
913
      md = mmalloc_detach (md);
914
      if (md != NULL)
915
        {
916
          /* FIXME: should figure out why detach failed */
917
          md = NULL;
918
        }
919
      else if (mapto != (CORE_ADDR) NULL)
920
        {
921
          /* This mapping file needs to be remapped at "mapto" */
922
          md = mmalloc_attach (fd, (PTR) mapto);
923
        }
924
      else
925
        {
926
          /* This is a freshly created mapping file. */
927
          mapto = (CORE_ADDR) mmalloc_findbase (20 * 1024 * 1024);
928
          if (mapto != 0)
929
            {
930
              /* To avoid reusing the freshly created mapping file, at the
931
                 address selected by mmap, we must truncate it before trying
932
                 to do an attach at the address we want. */
933
              ftruncate (fd, 0);
934
              md = mmalloc_attach (fd, (PTR) mapto);
935
              if (md != NULL)
936
                {
937
                  mmalloc_setkey (md, 1, (PTR) mapto);
938
                }
939
            }
940
        }
941
    }
942
  return (md);
943
}
944
 
945
#endif /* defined(USE_MMALLOC) && defined(HAVE_MMAP) */
946
 
947
/* Returns a section whose range includes PC and SECTION,
948
   or NULL if none found.  Note the distinction between the return type,
949
   struct obj_section (which is defined in gdb), and the input type
950
   struct sec (which is a bfd-defined data type).  The obj_section
951
   contains a pointer to the bfd struct sec section.  */
952
 
953
struct obj_section *
954
find_pc_sect_section (CORE_ADDR pc, struct sec *section)
955
{
956
  struct obj_section *s;
957
  struct objfile *objfile;
958
 
959
  ALL_OBJSECTIONS (objfile, s)
960
    if ((section == 0 || section == s->the_bfd_section) &&
961
        s->addr <= pc && pc < s->endaddr)
962
      return (s);
963
 
964
  return (NULL);
965
}
966
 
967
/* Returns a section whose range includes PC or NULL if none found.
968
   Backward compatibility, no section.  */
969
 
970
struct obj_section *
971
find_pc_section (CORE_ADDR pc)
972
{
973
  return find_pc_sect_section (pc, find_pc_mapped_section (pc));
974
}
975
 
976
 
977
/* In SVR4, we recognize a trampoline by it's section name.
978
   That is, if the pc is in a section named ".plt" then we are in
979
   a trampoline.  */
980
 
981
int
982
in_plt_section (CORE_ADDR pc, char *name)
983
{
984
  struct obj_section *s;
985
  int retval = 0;
986
 
987
  s = find_pc_section (pc);
988
 
989
  retval = (s != NULL
990
            && s->the_bfd_section->name != NULL
991
            && STREQ (s->the_bfd_section->name, ".plt"));
992
  return (retval);
993
}
994
 
995
/* Return nonzero if NAME is in the import list of OBJFILE.  Else
996
   return zero.  */
997
 
998
int
999
is_in_import_list (char *name, struct objfile *objfile)
1000
{
1001
  register int i;
1002
 
1003
  if (!objfile || !name || !*name)
1004
    return 0;
1005
 
1006
  for (i = 0; i < objfile->import_list_size; i++)
1007
    if (objfile->import_list[i] && STREQ (name, objfile->import_list[i]))
1008
      return 1;
1009
  return 0;
1010
}
1011
 

powered by: WebSVN 2.1.0

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