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