]> Git Repo - binutils.git/blob - gdb/corefile.c
gdb: remove SYMBOL_CLASS macro, add getter
[binutils.git] / gdb / corefile.c
1 /* Core dump and executable file functions above target vector, for GDB.
2
3    Copyright (C) 1986-2022 Free Software Foundation, Inc.
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 3 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, see <http://www.gnu.org/licenses/>.  */
19
20 #include "defs.h"
21 #include <signal.h>
22 #include <fcntl.h>
23 #include "inferior.h"
24 #include "symtab.h"
25 #include "command.h"
26 #include "gdbcmd.h"
27 #include "bfd.h"
28 #include "target.h"
29 #include "gdbcore.h"
30 #include "dis-asm.h"
31 #include <sys/stat.h>
32 #include "completer.h"
33 #include "observable.h"
34 #include "cli/cli-utils.h"
35 #include "gdbarch.h"
36
37 /* You can have any number of hooks for `exec_file_command' command to
38    call.  If there's only one hook, it is set in exec_file_display
39    hook.  If there are two or more hooks, they are set in
40    exec_file_extra_hooks[], and deprecated_exec_file_display_hook is
41    set to a function that calls all of them.  This extra complexity is
42    needed to preserve compatibility with old code that assumed that
43    only one hook could be set, and which called
44    deprecated_exec_file_display_hook directly.  */
45
46 typedef void (*hook_type) (const char *);
47
48 hook_type deprecated_exec_file_display_hook;    /* The original hook.  */
49 static hook_type *exec_file_extra_hooks;        /* Array of additional
50                                                    hooks.  */
51 static int exec_file_hook_count = 0;            /* Size of array.  */
52
53 \f
54
55 /* If there are two or more functions that wish to hook into
56    exec_file_command, this function will call all of the hook
57    functions.  */
58
59 static void
60 call_extra_exec_file_hooks (const char *filename)
61 {
62   int i;
63
64   for (i = 0; i < exec_file_hook_count; i++)
65     (*exec_file_extra_hooks[i]) (filename);
66 }
67
68 /* Call this to specify the hook for exec_file_command to call back.
69    This is called from the x-window display code.  */
70
71 void
72 specify_exec_file_hook (void (*hook) (const char *))
73 {
74   hook_type *new_array;
75
76   if (deprecated_exec_file_display_hook != NULL)
77     {
78       /* There's already a hook installed.  Arrange to have both it
79          and the subsequent hooks called.  */
80       if (exec_file_hook_count == 0)
81         {
82           /* If this is the first extra hook, initialize the hook
83              array.  */
84           exec_file_extra_hooks = XNEW (hook_type);
85           exec_file_extra_hooks[0] = deprecated_exec_file_display_hook;
86           deprecated_exec_file_display_hook = call_extra_exec_file_hooks;
87           exec_file_hook_count = 1;
88         }
89
90       /* Grow the hook array by one and add the new hook to the end.
91          Yes, it's inefficient to grow it by one each time but since
92          this is hardly ever called it's not a big deal.  */
93       exec_file_hook_count++;
94       new_array = (hook_type *)
95         xrealloc (exec_file_extra_hooks,
96                   exec_file_hook_count * sizeof (hook_type));
97       exec_file_extra_hooks = new_array;
98       exec_file_extra_hooks[exec_file_hook_count - 1] = hook;
99     }
100   else
101     deprecated_exec_file_display_hook = hook;
102 }
103
104 void
105 reopen_exec_file (void)
106 {
107   int res;
108   struct stat st;
109
110   /* Don't do anything if there isn't an exec file.  */
111   if (current_program_space->exec_bfd () == NULL)
112     return;
113
114   /* If the timestamp of the exec file has changed, reopen it.  */
115   std::string filename = bfd_get_filename (current_program_space->exec_bfd ());
116   res = stat (filename.c_str (), &st);
117
118   if (res == 0
119       && current_program_space->ebfd_mtime
120       && current_program_space->ebfd_mtime != st.st_mtime)
121     exec_file_attach (filename.c_str (), 0);
122   else
123     /* If we accessed the file since last opening it, close it now;
124        this stops GDB from holding the executable open after it
125        exits.  */
126     bfd_cache_close_all ();
127 }
128 \f
129 /* If we have both a core file and an exec file,
130    print a warning if they don't go together.  */
131
132 void
133 validate_files (void)
134 {
135   if (current_program_space->exec_bfd () && core_bfd)
136     {
137       if (!core_file_matches_executable_p (core_bfd,
138                                            current_program_space->exec_bfd ()))
139         warning (_("core file may not match specified executable file."));
140       else if (bfd_get_mtime (current_program_space->exec_bfd ())
141                > bfd_get_mtime (core_bfd))
142         warning (_("exec file is newer than core file."));
143     }
144 }
145
146 /* See gdbsupport/common-inferior.h.  */
147
148 const char *
149 get_exec_file (int err)
150 {
151   if (current_program_space->exec_filename != nullptr)
152     return current_program_space->exec_filename.get ();
153   if (!err)
154     return NULL;
155
156   error (_("No executable file specified.\n\
157 Use the \"file\" or \"exec-file\" command."));
158 }
159 \f
160
161 std::string
162 memory_error_message (enum target_xfer_status err,
163                       struct gdbarch *gdbarch, CORE_ADDR memaddr)
164 {
165   switch (err)
166     {
167     case TARGET_XFER_E_IO:
168       /* Actually, address between memaddr and memaddr + len was out of
169          bounds.  */
170       return string_printf (_("Cannot access memory at address %s"),
171                             paddress (gdbarch, memaddr));
172     case TARGET_XFER_UNAVAILABLE:
173       return string_printf (_("Memory at address %s unavailable."),
174                             paddress (gdbarch, memaddr));
175     default:
176       internal_error (__FILE__, __LINE__,
177                       "unhandled target_xfer_status: %s (%s)",
178                       target_xfer_status_to_string (err),
179                       plongest (err));
180     }
181 }
182
183 /* Report a memory error by throwing a suitable exception.  */
184
185 void
186 memory_error (enum target_xfer_status err, CORE_ADDR memaddr)
187 {
188   enum errors exception = GDB_NO_ERROR;
189
190   /* Build error string.  */
191   std::string str = memory_error_message (err, target_gdbarch (), memaddr);
192
193   /* Choose the right error to throw.  */
194   switch (err)
195     {
196     case TARGET_XFER_E_IO:
197       exception = MEMORY_ERROR;
198       break;
199     case TARGET_XFER_UNAVAILABLE:
200       exception = NOT_AVAILABLE_ERROR;
201       break;
202     }
203
204   /* Throw it.  */
205   throw_error (exception, ("%s"), str.c_str ());
206 }
207
208 /* Helper function.  */
209
210 static void
211 read_memory_object (enum target_object object, CORE_ADDR memaddr,
212                     gdb_byte *myaddr, ssize_t len)
213 {
214   ULONGEST xfered = 0;
215
216   while (xfered < len)
217     {
218       enum target_xfer_status status;
219       ULONGEST xfered_len;
220
221       status = target_xfer_partial (current_inferior ()->top_target (), object,
222                                     NULL, myaddr + xfered, NULL,
223                                     memaddr + xfered, len - xfered,
224                                     &xfered_len);
225
226       if (status != TARGET_XFER_OK)
227         memory_error (status == TARGET_XFER_EOF ? TARGET_XFER_E_IO : status,
228                       memaddr + xfered);
229
230       xfered += xfered_len;
231       QUIT;
232     }
233 }
234
235 /* Same as target_read_memory, but report an error if can't read.  */
236
237 void
238 read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
239 {
240   read_memory_object (TARGET_OBJECT_MEMORY, memaddr, myaddr, len);
241 }
242
243 /* Same as target_read_stack, but report an error if can't read.  */
244
245 void
246 read_stack (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
247 {
248   read_memory_object (TARGET_OBJECT_STACK_MEMORY, memaddr, myaddr, len);
249 }
250
251 /* Same as target_read_code, but report an error if can't read.  */
252
253 void
254 read_code (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
255 {
256   read_memory_object (TARGET_OBJECT_CODE_MEMORY, memaddr, myaddr, len);
257 }
258
259 /* Read memory at MEMADDR of length LEN and put the contents in
260    RETURN_VALUE.  Return 0 if MEMADDR couldn't be read and non-zero
261    if successful.  */
262
263 int
264 safe_read_memory_integer (CORE_ADDR memaddr, int len, 
265                           enum bfd_endian byte_order,
266                           LONGEST *return_value)
267 {
268   gdb_byte buf[sizeof (LONGEST)];
269
270   if (target_read_memory (memaddr, buf, len))
271     return 0;
272
273   *return_value = extract_signed_integer (buf, len, byte_order);
274   return 1;
275 }
276
277 /* Read memory at MEMADDR of length LEN and put the contents in
278    RETURN_VALUE.  Return 0 if MEMADDR couldn't be read and non-zero
279    if successful.  */
280
281 int
282 safe_read_memory_unsigned_integer (CORE_ADDR memaddr, int len,
283                                    enum bfd_endian byte_order,
284                                    ULONGEST *return_value)
285 {
286   gdb_byte buf[sizeof (ULONGEST)];
287
288   if (target_read_memory (memaddr, buf, len))
289     return 0;
290
291   *return_value = extract_unsigned_integer (buf, len, byte_order);
292   return 1;
293 }
294
295 LONGEST
296 read_memory_integer (CORE_ADDR memaddr, int len,
297                      enum bfd_endian byte_order)
298 {
299   gdb_byte buf[sizeof (LONGEST)];
300
301   read_memory (memaddr, buf, len);
302   return extract_signed_integer (buf, len, byte_order);
303 }
304
305 ULONGEST
306 read_memory_unsigned_integer (CORE_ADDR memaddr, int len,
307                               enum bfd_endian byte_order)
308 {
309   gdb_byte buf[sizeof (ULONGEST)];
310
311   read_memory (memaddr, buf, len);
312   return extract_unsigned_integer (buf, len, byte_order);
313 }
314
315 LONGEST
316 read_code_integer (CORE_ADDR memaddr, int len,
317                    enum bfd_endian byte_order)
318 {
319   gdb_byte buf[sizeof (LONGEST)];
320
321   read_code (memaddr, buf, len);
322   return extract_signed_integer (buf, len, byte_order);
323 }
324
325 ULONGEST
326 read_code_unsigned_integer (CORE_ADDR memaddr, int len,
327                             enum bfd_endian byte_order)
328 {
329   gdb_byte buf[sizeof (ULONGEST)];
330
331   read_code (memaddr, buf, len);
332   return extract_unsigned_integer (buf, len, byte_order);
333 }
334
335 CORE_ADDR
336 read_memory_typed_address (CORE_ADDR addr, struct type *type)
337 {
338   gdb_byte *buf = (gdb_byte *) alloca (TYPE_LENGTH (type));
339
340   read_memory (addr, buf, TYPE_LENGTH (type));
341   return extract_typed_address (buf, type);
342 }
343
344 /* See gdbcore.h.  */
345
346 void
347 write_memory (CORE_ADDR memaddr, 
348               const bfd_byte *myaddr, ssize_t len)
349 {
350   int status;
351
352   status = target_write_memory (memaddr, myaddr, len);
353   if (status != 0)
354     memory_error (TARGET_XFER_E_IO, memaddr);
355 }
356
357 /* Same as write_memory, but notify 'memory_changed' observers.  */
358
359 void
360 write_memory_with_notification (CORE_ADDR memaddr, const bfd_byte *myaddr,
361                                 ssize_t len)
362 {
363   write_memory (memaddr, myaddr, len);
364   gdb::observers::memory_changed.notify (current_inferior (), memaddr, len, myaddr);
365 }
366
367 /* Store VALUE at ADDR in the inferior as a LEN-byte unsigned
368    integer.  */
369 void
370 write_memory_unsigned_integer (CORE_ADDR addr, int len, 
371                                enum bfd_endian byte_order,
372                                ULONGEST value)
373 {
374   gdb_byte *buf = (gdb_byte *) alloca (len);
375
376   store_unsigned_integer (buf, len, byte_order, value);
377   write_memory (addr, buf, len);
378 }
379
380 /* Store VALUE at ADDR in the inferior as a LEN-byte signed
381    integer.  */
382 void
383 write_memory_signed_integer (CORE_ADDR addr, int len, 
384                              enum bfd_endian byte_order,
385                              LONGEST value)
386 {
387   gdb_byte *buf = (gdb_byte *) alloca (len);
388
389   store_signed_integer (buf, len, byte_order, value);
390   write_memory (addr, buf, len);
391 }
392 \f
393 /* The current default bfd target.  Points to storage allocated for
394    gnutarget_string.  */
395 const char *gnutarget;
396
397 /* Same thing, except it is "auto" not NULL for the default case.  */
398 static std::string gnutarget_string;
399 static void
400 show_gnutarget_string (struct ui_file *file, int from_tty,
401                        struct cmd_list_element *c,
402                        const char *value)
403 {
404   fprintf_filtered (file,
405                     _("The current BFD target is \"%s\".\n"), value);
406 }
407
408 static void
409 set_gnutarget_command (const char *ignore, int from_tty,
410                        struct cmd_list_element *c)
411 {
412   const char *gend = gnutarget_string.c_str () + gnutarget_string.size ();
413   gend = remove_trailing_whitespace (gnutarget_string.c_str (), gend);
414   gnutarget_string
415     = gnutarget_string.substr (0, gend - gnutarget_string.data ());
416
417   if (gnutarget_string == "auto")
418     gnutarget = NULL;
419   else
420     gnutarget = gnutarget_string.c_str ();
421 }
422
423 /* A completion function for "set gnutarget".  */
424
425 static void
426 complete_set_gnutarget (struct cmd_list_element *cmd,
427                         completion_tracker &tracker,
428                         const char *text, const char *word)
429 {
430   static const char **bfd_targets;
431
432   if (bfd_targets == NULL)
433     {
434       int last;
435
436       bfd_targets = bfd_target_list ();
437       for (last = 0; bfd_targets[last] != NULL; ++last)
438         ;
439
440       bfd_targets = XRESIZEVEC (const char *, bfd_targets, last + 2);
441       bfd_targets[last] = "auto";
442       bfd_targets[last + 1] = NULL;
443     }
444
445   complete_on_enum (tracker, bfd_targets, text, word);
446 }
447
448 /* Set the gnutarget.  */
449 void
450 set_gnutarget (const char *newtarget)
451 {
452   gnutarget_string = newtarget;
453   set_gnutarget_command (NULL, 0, NULL);
454 }
455
456 void _initialize_core ();
457 void
458 _initialize_core ()
459 {
460   cmd_list_element *core_file_cmd
461     = add_cmd ("core-file", class_files, core_file_command, _("\
462 Use FILE as core dump for examining memory and registers.\n\
463 Usage: core-file FILE\n\
464 No arg means have no core file.  This command has been superseded by the\n\
465 `target core' and `detach' commands."), &cmdlist);
466   set_cmd_completer (core_file_cmd, filename_completer);
467
468   
469   set_show_commands set_show_gnutarget
470     = add_setshow_string_noescape_cmd ("gnutarget", class_files,
471                                        &gnutarget_string, _("\
472 Set the current BFD target."), _("\
473 Show the current BFD target."), _("\
474 Use `set gnutarget auto' to specify automatic detection."),
475                                        set_gnutarget_command,
476                                        show_gnutarget_string,
477                                        &setlist, &showlist);
478   set_cmd_completer (set_show_gnutarget.set, complete_set_gnutarget);
479
480   add_alias_cmd ("g", set_show_gnutarget.set, class_files, 1, &setlist);
481
482   if (getenv ("GNUTARGET"))
483     set_gnutarget (getenv ("GNUTARGET"));
484   else
485     set_gnutarget ("auto");
486 }
This page took 0.055422 seconds and 4 git commands to generate.