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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-6.8/] [gdb/] [symfile-mem.c] - Blame information for rev 853

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

Line No. Rev Author Line
1 24 jeremybenn
/* Reading symbol files from memory.
2
 
3
   Copyright (C) 1986, 1987, 1989, 1991, 1994, 1995, 1996, 1998, 2000, 2001,
4
   2002, 2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
5
 
6
   This file is part of GDB.
7
 
8
   This program is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 3 of the License, or
11
   (at your option) any later version.
12
 
13
   This program is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
 
18
   You should have received a copy of the GNU General Public License
19
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
 
21
/* This file defines functions (and commands to exercise those
22
   functions) for reading debugging information from object files
23
   whose images are mapped directly into the inferior's memory.  For
24
   example, the Linux kernel maps a "syscall DSO" into each process's
25
   address space; this DSO provides kernel-specific code for some
26
   system calls.
27
 
28
   At the moment, BFD only has functions for parsing object files from
29
   memory for the ELF format, even though the general idea isn't
30
   ELF-specific.  This means that BFD only provides the functions GDB
31
   needs when configured for ELF-based targets.  So these functions
32
   may only be compiled on ELF-based targets.
33
 
34
   GDB has no idea whether it has been configured for an ELF-based
35
   target or not: it just tries to handle whatever files it is given.
36
   But this means there are no preprocessor symbols on which we could
37
   make these functions' compilation conditional.
38
 
39
   So, for the time being, we put these functions alone in this file,
40
   and have .mt files reference them as appropriate.  In the future, I
41
   hope BFD will provide a format-independent bfd_from_remote_memory
42
   entry point.  */
43
 
44
 
45
#include "defs.h"
46
#include "symtab.h"
47
#include "gdbcore.h"
48
#include "objfiles.h"
49
#include "exceptions.h"
50
#include "gdbcmd.h"
51
#include "target.h"
52
#include "value.h"
53
#include "symfile.h"
54
#include "observer.h"
55
#include "auxv.h"
56
#include "elf/common.h"
57
 
58
 
59
/* Read inferior memory at ADDR to find the header of a loaded object file
60
   and read its in-core symbols out of inferior memory.  TEMPL is a bfd
61
   representing the target's format.  NAME is the name to use for this
62
   symbol file in messages; it can be NULL or a malloc-allocated string
63
   which will be attached to the BFD.  */
64
static struct objfile *
65
symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, char *name,
66
                             int from_tty)
67
{
68
  struct objfile *objf;
69
  struct bfd *nbfd;
70
  struct bfd_section *sec;
71
  bfd_vma loadbase;
72
  struct section_addr_info *sai;
73
  unsigned int i;
74
 
75
  if (bfd_get_flavour (templ) != bfd_target_elf_flavour)
76
    error (_("add-symbol-file-from-memory not supported for this target"));
77
 
78
  nbfd = bfd_elf_bfd_from_remote_memory (templ, addr, &loadbase,
79
                                         target_read_memory);
80
  if (nbfd == NULL)
81
    error (_("Failed to read a valid object file image from memory."));
82
 
83
  if (name == NULL)
84
    nbfd->filename = xstrdup ("shared object read from target memory");
85
  else
86
    nbfd->filename = name;
87
 
88
  if (!bfd_check_format (nbfd, bfd_object))
89
    {
90
      /* FIXME: should be checking for errors from bfd_close (for one thing,
91
         on error it does not free all the storage associated with the
92
         bfd).  */
93
      bfd_close (nbfd);
94
      error (_("Got object file from memory but can't read symbols: %s."),
95
             bfd_errmsg (bfd_get_error ()));
96
    }
97
 
98
  sai = alloc_section_addr_info (bfd_count_sections (nbfd));
99
  make_cleanup (xfree, sai);
100
  i = 0;
101
  for (sec = nbfd->sections; sec != NULL; sec = sec->next)
102
    if ((bfd_get_section_flags (nbfd, sec) & (SEC_ALLOC|SEC_LOAD)) != 0)
103
      {
104
        sai->other[i].addr = bfd_get_section_vma (nbfd, sec) + loadbase;
105
        sai->other[i].name = (char *) bfd_get_section_name (nbfd, sec);
106
        sai->other[i].sectindex = sec->index;
107
        ++i;
108
      }
109
 
110
  objf = symbol_file_add_from_bfd (nbfd, from_tty,
111
                                   sai, 0, OBJF_SHARED);
112
 
113
  /* This might change our ideas about frames already looked at.  */
114
  reinit_frame_cache ();
115
 
116
  return objf;
117
}
118
 
119
 
120
static void
121
add_symbol_file_from_memory_command (char *args, int from_tty)
122
{
123
  CORE_ADDR addr;
124
  struct bfd *templ;
125
 
126
  if (args == NULL)
127
    error (_("add-symbol-file-from-memory requires an expression argument"));
128
 
129
  addr = parse_and_eval_address (args);
130
 
131
  /* We need some representative bfd to know the target we are looking at.  */
132
  if (symfile_objfile != NULL)
133
    templ = symfile_objfile->obfd;
134
  else
135
    templ = exec_bfd;
136
  if (templ == NULL)
137
    error (_("\
138
Must use symbol-file or exec-file before add-symbol-file-from-memory."));
139
 
140
  symbol_file_add_from_memory (templ, addr, NULL, from_tty);
141
}
142
 
143
/* Arguments for symbol_file_add_from_memory_wrapper.  */
144
 
145
struct symbol_file_add_from_memory_args
146
{
147
  struct bfd *bfd;
148
  CORE_ADDR sysinfo_ehdr;
149
  char *name;
150
  int from_tty;
151
};
152
 
153
/* Wrapper function for symbol_file_add_from_memory, for
154
   catch_exceptions.  */
155
 
156
static int
157
symbol_file_add_from_memory_wrapper (struct ui_out *uiout, void *data)
158
{
159
  struct symbol_file_add_from_memory_args *args = data;
160
 
161
  symbol_file_add_from_memory (args->bfd, args->sysinfo_ehdr, args->name,
162
                               args->from_tty);
163
  return 0;
164
}
165
 
166
/* Try to add the symbols for the vsyscall page, if there is one.  This function
167
   is called via the inferior_created observer.  */
168
 
169
static void
170
add_vsyscall_page (struct target_ops *target, int from_tty)
171
{
172
  CORE_ADDR sysinfo_ehdr;
173
 
174
  if (target_auxv_search (target, AT_SYSINFO_EHDR, &sysinfo_ehdr) > 0
175
      && sysinfo_ehdr != (CORE_ADDR) 0)
176
    {
177
      struct bfd *bfd;
178
      struct symbol_file_add_from_memory_args args;
179
 
180
      if (core_bfd != NULL)
181
        bfd = core_bfd;
182
      else if (exec_bfd != NULL)
183
        bfd = exec_bfd;
184
      else
185
       /* FIXME: cagney/2004-05-06: Should not require an existing
186
          BFD when trying to create a run-time BFD of the VSYSCALL
187
          page in the inferior.  Unfortunately that's the current
188
          interface so for the moment bail.  Introducing a
189
          ``bfd_runtime'' (a BFD created using the loaded image) file
190
          format should fix this.  */
191
        {
192
          warning (_("\
193
Could not load vsyscall page because no executable was specified\n\
194
try using the \"file\" command first."));
195
          return;
196
        }
197
      args.bfd = bfd;
198
      args.sysinfo_ehdr = sysinfo_ehdr;
199
      args.name = xstrprintf ("system-supplied DSO at 0x%s",
200
                 paddr_nz (sysinfo_ehdr));
201
      /* Pass zero for FROM_TTY, because the action of loading the
202
         vsyscall DSO was not triggered by the user, even if the user
203
         typed "run" at the TTY.  */
204
      args.from_tty = 0;
205
      catch_exceptions (uiout, symbol_file_add_from_memory_wrapper,
206
                        &args, RETURN_MASK_ALL);
207
    }
208
}
209
 
210
 
211
void
212
_initialize_symfile_mem (void)
213
{
214
  add_cmd ("add-symbol-file-from-memory", class_files,
215
           add_symbol_file_from_memory_command, _("\
216
Load the symbols out of memory from a dynamically loaded object file.\n\
217
Give an expression for the address of the file's shared object file header."),
218
           &cmdlist);
219
 
220
  /* Want to know of each new inferior so that its vsyscall info can
221
     be extracted.  */
222
  observer_attach_inferior_created (add_vsyscall_page);
223
}

powered by: WebSVN 2.1.0

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