gdb: Implement native dumpcore function
[deliverable/binutils-gdb.git] / gdb / gcore.c
CommitLineData
be4d1333 1/* Generate a core file for the inferior process.
1bac305b 2
b811d2c2 3 Copyright (C) 2001-2020 Free Software Foundation, Inc.
be4d1333
MS
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
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
be4d1333
MS
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
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
be4d1333
MS
19
20#include "defs.h"
d3420b2f
MK
21#include "elf-bfd.h"
22#include "infcall.h"
be4d1333
MS
23#include "inferior.h"
24#include "gdbcore.h"
be4d1333 25#include "objfiles.h"
de18c1d8 26#include "solib.h"
d3420b2f 27#include "symfile.h"
0156b218
MS
28#include "arch-utils.h"
29#include "completer.h"
30#include "gcore.h"
d3420b2f 31#include "cli/cli-decode.h"
0156b218
MS
32#include <fcntl.h>
33#include "regcache.h"
34#include "regset.h"
cbb099e8 35#include "gdb_bfd.h"
47ecca85 36#include "readline/tilde.h"
325fac50 37#include <algorithm>
268a13a5
TT
38#include "gdbsupport/gdb_unlinker.h"
39#include "gdbsupport/byte-vector.h"
40#include "gdbsupport/scope-exit.h"
be4d1333 41
804e0f53
DJ
42/* The largest amount of memory to read from the target at once. We
43 must throttle it to limit the amount of memory used by GDB during
44 generate-core-file for programs with large resident data. */
45#define MAX_COPY_BYTES (1024 * 1024)
46
a78c2d62 47static const char *default_gcore_target (void);
d3420b2f
MK
48static enum bfd_architecture default_gcore_arch (void);
49static unsigned long default_gcore_mach (void);
50static int gcore_memory_sections (bfd *);
51
0156b218
MS
52/* create_gcore_bfd -- helper for gcore_command (exported).
53 Open a new bfd core file for output, and return the handle. */
be4d1333 54
192b62ce 55gdb_bfd_ref_ptr
85e1311a 56create_gcore_bfd (const char *filename)
be4d1333 57{
192b62ce 58 gdb_bfd_ref_ptr obfd (gdb_bfd_openw (filename, default_gcore_target ()));
d8734c88 59
192b62ce 60 if (obfd == NULL)
0156b218 61 error (_("Failed to open '%s' for output."), filename);
192b62ce
TT
62 bfd_set_format (obfd.get (), bfd_core);
63 bfd_set_arch_mach (obfd.get (), default_gcore_arch (), default_gcore_mach ());
0156b218
MS
64 return obfd;
65}
66
5fff78c4 67/* write_gcore_file_1 -- do the actual work of write_gcore_file. */
0156b218 68
5fff78c4
MM
69static void
70write_gcore_file_1 (bfd *obfd)
0156b218 71{
44287fd8 72 gdb::unique_xmalloc_ptr<char> note_data;
0156b218
MS
73 int note_size = 0;
74 asection *note_sec = NULL;
be4d1333 75
d3420b2f 76 /* An external target method must build the notes section. */
6432734d
UW
77 /* FIXME: uweigand/2011-10-06: All architectures that support core file
78 generation should be converted to gdbarch_make_corefile_notes; at that
79 point, the target vector method can be removed. */
f5656ead 80 if (!gdbarch_make_corefile_notes_p (target_gdbarch ()))
44287fd8 81 note_data.reset (target_make_corefile_notes (obfd, &note_size));
6432734d 82 else
44287fd8
TT
83 note_data.reset (gdbarch_make_corefile_notes (target_gdbarch (), obfd,
84 &note_size));
1d1f1ccb 85
6432734d
UW
86 if (note_data == NULL || note_size == 0)
87 error (_("Target does not support core file generation."));
be4d1333 88
d3420b2f 89 /* Create the note section. */
6432734d
UW
90 note_sec = bfd_make_section_anyway_with_flags (obfd, "note0",
91 SEC_HAS_CONTENTS
92 | SEC_READONLY
93 | SEC_ALLOC);
94 if (note_sec == NULL)
95 error (_("Failed to create 'note' section for corefile: %s"),
96 bfd_errmsg (bfd_get_error ()));
97
fd361982
AM
98 bfd_set_section_vma (note_sec, 0);
99 bfd_set_section_alignment (note_sec, 0);
100 bfd_set_section_size (note_sec, note_size);
be4d1333 101
d3420b2f 102 /* Now create the memory/load sections. */
be4d1333 103 if (gcore_memory_sections (obfd) == 0)
8a3fe4f8 104 error (_("gcore: failed to get corefile memory sections from target."));
be4d1333 105
d3420b2f 106 /* Write out the contents of the note section. */
44287fd8
TT
107 if (!bfd_set_section_contents (obfd, note_sec, note_data.get (), 0,
108 note_size))
6432734d 109 warning (_("writing note section (%s)"), bfd_errmsg (bfd_get_error ()));
0156b218
MS
110}
111
5fff78c4
MM
112/* write_gcore_file -- helper for gcore_command (exported).
113 Compose and write the corefile data to the core file. */
114
115void
116write_gcore_file (bfd *obfd)
117{
5fff78c4 118 target_prepare_to_generate_core ();
a7b1986e
TT
119 SCOPE_EXIT { target_done_generating_core (); };
120 write_gcore_file_1 (obfd);
5fff78c4
MM
121}
122
0156b218
MS
123/* gcore_command -- implements the 'gcore' command.
124 Generate a core file from the inferior process. */
125
126static void
0b39b52e 127gcore_command (const char *args, int from_tty)
0156b218 128{
bef155c3 129 gdb::unique_xmalloc_ptr<char> corefilename;
0156b218
MS
130
131 /* No use generating a corefile without a target process. */
132 if (!target_has_execution)
133 noprocess ();
134
135 if (args && *args)
bef155c3 136 corefilename.reset (tilde_expand (args));
0156b218
MS
137 else
138 {
139 /* Default corefile name is "core.PID". */
e99b03dc 140 corefilename.reset (xstrprintf ("core.%d", inferior_ptid.pid ()));
be4d1333
MS
141 }
142
0156b218
MS
143 if (info_verbose)
144 fprintf_filtered (gdb_stdout,
bef155c3
TT
145 "Opening corefile '%s' for output.\n",
146 corefilename.get ());
0156b218 147
b31488a3
KR
148 if (target_supports_dumpcore ())
149 target_dumpcore (corefilename.get ());
150 else
151 {
152 /* Open the output file. */
153 gdb_bfd_ref_ptr obfd (create_gcore_bfd (corefilename.get ()));
0156b218 154
b31488a3
KR
155 /* Arrange to unlink the file on failure. */
156 gdb::unlinker unlink_file (corefilename.get ());
0156b218 157
b31488a3
KR
158 /* Call worker function. */
159 write_gcore_file (obfd.get ());
0156b218 160
b31488a3
KR
161 /* Succeeded. */
162 unlink_file.keep ();
163 }
1e351ed1 164
bef155c3 165 fprintf_filtered (gdb_stdout, "Saved corefile %s\n", corefilename.get ());
be4d1333
MS
166}
167
168static unsigned long
169default_gcore_mach (void)
170{
d3420b2f 171#if 1 /* See if this even matters... */
6dbdc4a3
MS
172 return 0;
173#else
1143fffb 174
f5656ead 175 const struct bfd_arch_info *bfdarch = gdbarch_bfd_arch_info (target_gdbarch ());
be4d1333
MS
176
177 if (bfdarch != NULL)
178 return bfdarch->mach;
be4d1333 179 if (exec_bfd == NULL)
8a3fe4f8 180 error (_("Can't find default bfd machine type (need execfile)."));
be4d1333
MS
181
182 return bfd_get_mach (exec_bfd);
6dbdc4a3 183#endif /* 1 */
be4d1333
MS
184}
185
186static enum bfd_architecture
187default_gcore_arch (void)
188{
f5656ead 189 const struct bfd_arch_info *bfdarch = gdbarch_bfd_arch_info (target_gdbarch ());
be4d1333
MS
190
191 if (bfdarch != NULL)
192 return bfdarch->arch;
be4d1333 193 if (exec_bfd == NULL)
8a3fe4f8 194 error (_("Can't find bfd architecture for corefile (need execfile)."));
be4d1333
MS
195
196 return bfd_get_arch (exec_bfd);
197}
198
a78c2d62 199static const char *
be4d1333
MS
200default_gcore_target (void)
201{
a78c2d62 202 /* The gdbarch may define a target to use for core files. */
f5656ead
TT
203 if (gdbarch_gcore_bfd_target_p (target_gdbarch ()))
204 return gdbarch_gcore_bfd_target (target_gdbarch ());
a78c2d62
UW
205
206 /* Otherwise, try to fall back to the exec_bfd target. This will probably
207 not work for non-ELF targets. */
be4d1333 208 if (exec_bfd == NULL)
6dbdc4a3
MS
209 return NULL;
210 else
211 return bfd_get_target (exec_bfd);
be4d1333
MS
212}
213
d3420b2f
MK
214/* Derive a reasonable stack segment by unwinding the target stack,
215 and store its limits in *BOTTOM and *TOP. Return non-zero if
216 successful. */
be4d1333 217
cbb83bd1 218static int
69db8bae 219derive_stack_segment (bfd_vma *bottom, bfd_vma *top)
be4d1333 220{
be4d1333
MS
221 struct frame_info *fi, *tmp_fi;
222
d3420b2f
MK
223 gdb_assert (bottom);
224 gdb_assert (top);
be4d1333 225
d3420b2f 226 /* Can't succeed without stack and registers. */
be4d1333 227 if (!target_has_stack || !target_has_registers)
d3420b2f 228 return 0;
be4d1333 229
d3420b2f
MK
230 /* Can't succeed without current frame. */
231 fi = get_current_frame ();
232 if (fi == NULL)
233 return 0;
be4d1333 234
d3420b2f 235 /* Save frame pointer of TOS frame. */
8d357cca 236 *top = get_frame_base (fi);
d3420b2f 237 /* If current stack pointer is more "inner", use that instead. */
40a6adc1 238 if (gdbarch_inner_than (get_frame_arch (fi), get_frame_sp (fi), *top))
fb4443d8 239 *top = get_frame_sp (fi);
be4d1333 240
d3420b2f 241 /* Find prev-most frame. */
be4d1333
MS
242 while ((tmp_fi = get_prev_frame (fi)) != NULL)
243 fi = tmp_fi;
244
d3420b2f 245 /* Save frame pointer of prev-most frame. */
8d357cca 246 *bottom = get_frame_base (fi);
be4d1333 247
d3420b2f
MK
248 /* Now canonicalize their order, so that BOTTOM is a lower address
249 (as opposed to a lower stack frame). */
be4d1333
MS
250 if (*bottom > *top)
251 {
d3420b2f
MK
252 bfd_vma tmp_vma;
253
be4d1333
MS
254 tmp_vma = *top;
255 *top = *bottom;
256 *bottom = tmp_vma;
257 }
258
d3420b2f 259 return 1;
be4d1333
MS
260}
261
0156b218
MS
262/* call_target_sbrk --
263 helper function for derive_heap_segment. */
264
265static bfd_vma
266call_target_sbrk (int sbrk_arg)
267{
268 struct objfile *sbrk_objf;
269 struct gdbarch *gdbarch;
270 bfd_vma top_of_heap;
271 struct value *target_sbrk_arg;
272 struct value *sbrk_fn, *ret;
273 bfd_vma tmp;
274
3b7344d5 275 if (lookup_minimal_symbol ("sbrk", NULL, NULL).minsym != NULL)
0156b218
MS
276 {
277 sbrk_fn = find_function_in_inferior ("sbrk", &sbrk_objf);
278 if (sbrk_fn == NULL)
279 return (bfd_vma) 0;
280 }
3b7344d5 281 else if (lookup_minimal_symbol ("_sbrk", NULL, NULL).minsym != NULL)
0156b218
MS
282 {
283 sbrk_fn = find_function_in_inferior ("_sbrk", &sbrk_objf);
284 if (sbrk_fn == NULL)
285 return (bfd_vma) 0;
286 }
287 else
288 return (bfd_vma) 0;
289
08feed99 290 gdbarch = sbrk_objf->arch ();
0156b218
MS
291 target_sbrk_arg = value_from_longest (builtin_type (gdbarch)->builtin_int,
292 sbrk_arg);
293 gdb_assert (target_sbrk_arg);
e71585ff 294 ret = call_function_by_hand (sbrk_fn, NULL, target_sbrk_arg);
0156b218
MS
295 if (ret == NULL)
296 return (bfd_vma) 0;
297
298 tmp = value_as_long (ret);
299 if ((LONGEST) tmp <= 0 || (LONGEST) tmp == 0xffffffff)
300 return (bfd_vma) 0;
301
302 top_of_heap = tmp;
303 return top_of_heap;
304}
305
d3420b2f
MK
306/* Derive a reasonable heap segment for ABFD by looking at sbrk and
307 the static data sections. Store its limits in *BOTTOM and *TOP.
308 Return non-zero if successful. */
be4d1333 309
cbb83bd1 310static int
69db8bae 311derive_heap_segment (bfd *abfd, bfd_vma *bottom, bfd_vma *top)
be4d1333
MS
312{
313 bfd_vma top_of_data_memory = 0;
314 bfd_vma top_of_heap = 0;
315 bfd_size_type sec_size;
be4d1333
MS
316 bfd_vma sec_vaddr;
317 asection *sec;
318
d3420b2f
MK
319 gdb_assert (bottom);
320 gdb_assert (top);
be4d1333 321
d3420b2f
MK
322 /* This function depends on being able to call a function in the
323 inferior. */
be4d1333 324 if (!target_has_execution)
d3420b2f
MK
325 return 0;
326
327 /* The following code assumes that the link map is arranged as
328 follows (low to high addresses):
be4d1333 329
d3420b2f
MK
330 ---------------------------------
331 | text sections |
332 ---------------------------------
333 | data sections (including bss) |
334 ---------------------------------
335 | heap |
336 --------------------------------- */
be4d1333
MS
337
338 for (sec = abfd->sections; sec; sec = sec->next)
339 {
fd361982
AM
340 if (bfd_section_flags (sec) & SEC_DATA
341 || strcmp (".bss", bfd_section_name (sec)) == 0)
be4d1333 342 {
fd361982
AM
343 sec_vaddr = bfd_section_vma (sec);
344 sec_size = bfd_section_size (sec);
be4d1333
MS
345 if (sec_vaddr + sec_size > top_of_data_memory)
346 top_of_data_memory = sec_vaddr + sec_size;
347 }
348 }
d3420b2f 349
0156b218
MS
350 top_of_heap = call_target_sbrk (0);
351 if (top_of_heap == (bfd_vma) 0)
be4d1333 352 return 0;
be4d1333 353
d3420b2f 354 /* Return results. */
be4d1333
MS
355 if (top_of_heap > top_of_data_memory)
356 {
357 *bottom = top_of_data_memory;
358 *top = top_of_heap;
d3420b2f 359 return 1;
be4d1333 360 }
d3420b2f
MK
361
362 /* No additional heap space needs to be saved. */
363 return 0;
be4d1333
MS
364}
365
be4d1333
MS
366static void
367make_output_phdrs (bfd *obfd, asection *osec, void *ignored)
368{
369 int p_flags = 0;
0156b218 370 int p_type = 0;
be4d1333
MS
371
372 /* FIXME: these constants may only be applicable for ELF. */
fd361982 373 if (startswith (bfd_section_name (osec), "load"))
be4d1333 374 p_type = PT_LOAD;
fd361982 375 else if (startswith (bfd_section_name (osec), "note"))
be4d1333 376 p_type = PT_NOTE;
0156b218
MS
377 else
378 p_type = PT_NULL;
be4d1333
MS
379
380 p_flags |= PF_R; /* Segment is readable. */
fd361982 381 if (!(bfd_section_flags (osec) & SEC_READONLY))
be4d1333 382 p_flags |= PF_W; /* Segment is writable. */
fd361982 383 if (bfd_section_flags (osec) & SEC_CODE)
be4d1333
MS
384 p_flags |= PF_X; /* Segment is executable. */
385
d3420b2f 386 bfd_record_phdr (obfd, p_type, 1, p_flags, 0, 0, 0, 0, 1, &osec);
be4d1333
MS
387}
388
4f69f4c2
JK
389/* find_memory_region_ftype implementation. DATA is 'bfd *' for the core file
390 GDB is creating. */
391
cbb83bd1 392static int
4f69f4c2
JK
393gcore_create_callback (CORE_ADDR vaddr, unsigned long size, int read,
394 int write, int exec, int modified, void *data)
be4d1333 395{
9a3c8263 396 bfd *obfd = (bfd *) data;
be4d1333 397 asection *osec;
cbb83bd1
RM
398 flagword flags = SEC_ALLOC | SEC_HAS_CONTENTS | SEC_LOAD;
399
86fbe6cc
EZ
400 /* If the memory segment has no permissions set, ignore it, otherwise
401 when we later try to access it for read/write, we'll get an error
402 or jam the kernel. */
4f69f4c2 403 if (read == 0 && write == 0 && exec == 0 && modified == 0)
86fbe6cc
EZ
404 {
405 if (info_verbose)
406 {
5af949e3 407 fprintf_filtered (gdb_stdout, "Ignore segment, %s bytes at %s\n",
f5656ead 408 plongest (size), paddress (target_gdbarch (), vaddr));
86fbe6cc
EZ
409 }
410
411 return 0;
412 }
413
4f69f4c2 414 if (write == 0 && modified == 0 && !solib_keep_data_in_core (vaddr, size))
cbb83bd1
RM
415 {
416 /* See if this region of memory lies inside a known file on disk.
417 If so, we can avoid copying its contents by clearing SEC_LOAD. */
cbb83bd1
RM
418 struct obj_section *objsec;
419
2030c079 420 for (objfile *objfile : current_program_space->objfiles ())
3b9d3ac2
TT
421 ALL_OBJFILE_OSECTIONS (objfile, objsec)
422 {
423 bfd *abfd = objfile->obfd;
424 asection *asec = objsec->the_bfd_section;
fd361982 425 bfd_vma align = (bfd_vma) 1 << bfd_section_alignment (asec);
3b9d3ac2
TT
426 bfd_vma start = obj_section_addr (objsec) & -align;
427 bfd_vma end = (obj_section_endaddr (objsec) + align - 1) & -align;
428
429 /* Match if either the entire memory region lies inside the
430 section (i.e. a mapping covering some pages of a large
431 segment) or the entire section lies inside the memory region
432 (i.e. a mapping covering multiple small sections).
433
434 This BFD was synthesized from reading target memory,
435 we don't want to omit that. */
436 if (objfile->separate_debug_objfile_backlink == NULL
437 && ((vaddr >= start && vaddr + size <= end)
438 || (start >= vaddr && end <= vaddr + size))
439 && !(bfd_get_file_flags (abfd) & BFD_IN_MEMORY))
440 {
441 flags &= ~(SEC_LOAD | SEC_HAS_CONTENTS);
442 goto keep; /* Break out of two nested for loops. */
443 }
444 }
cbb83bd1 445
4f69f4c2 446 keep:;
cbb83bd1
RM
447 }
448
4f69f4c2
JK
449 if (write == 0)
450 flags |= SEC_READONLY;
451
cbb83bd1
RM
452 if (exec)
453 flags |= SEC_CODE;
454 else
455 flags |= SEC_DATA;
be4d1333 456
52b57208 457 osec = bfd_make_section_anyway_with_flags (obfd, "load", flags);
d3420b2f 458 if (osec == NULL)
be4d1333 459 {
8a3fe4f8 460 warning (_("Couldn't make gcore segment: %s"),
be4d1333 461 bfd_errmsg (bfd_get_error ()));
cbb83bd1 462 return 1;
be4d1333
MS
463 }
464
465 if (info_verbose)
466 {
5af949e3 467 fprintf_filtered (gdb_stdout, "Save segment, %s bytes at %s\n",
f5656ead 468 plongest (size), paddress (target_gdbarch (), vaddr));
be4d1333
MS
469 }
470
fd361982
AM
471 bfd_set_section_size (osec, size);
472 bfd_set_section_vma (osec, vaddr);
473 bfd_set_section_lma (osec, 0);
cbb83bd1 474 return 0;
be4d1333
MS
475}
476
b427c1bc
TT
477int
478objfile_find_memory_regions (struct target_ops *self,
479 find_memory_region_ftype func, void *obfd)
be4d1333 480{
d3420b2f 481 /* Use objfile data to create memory sections. */
be4d1333
MS
482 struct obj_section *objsec;
483 bfd_vma temp_bottom, temp_top;
484
d3420b2f 485 /* Call callback function for each objfile section. */
2030c079 486 for (objfile *objfile : current_program_space->objfiles ())
3b9d3ac2
TT
487 ALL_OBJFILE_OSECTIONS (objfile, objsec)
488 {
3b9d3ac2 489 asection *isec = objsec->the_bfd_section;
fd361982 490 flagword flags = bfd_section_flags (isec);
3b9d3ac2
TT
491
492 /* Separate debug info files are irrelevant for gcore. */
493 if (objfile->separate_debug_objfile_backlink != NULL)
494 continue;
495
496 if ((flags & SEC_ALLOC) || (flags & SEC_LOAD))
497 {
fd361982 498 int size = bfd_section_size (isec);
3b9d3ac2
TT
499 int ret;
500
501 ret = (*func) (obj_section_addr (objsec), size,
502 1, /* All sections will be readable. */
503 (flags & SEC_READONLY) == 0, /* Writable. */
504 (flags & SEC_CODE) != 0, /* Executable. */
505 1, /* MODIFIED is unknown, pass it as true. */
506 obfd);
507 if (ret != 0)
508 return ret;
509 }
510 }
be4d1333 511
d3420b2f 512 /* Make a stack segment. */
be4d1333 513 if (derive_stack_segment (&temp_bottom, &temp_top))
cbb83bd1 514 (*func) (temp_bottom, temp_top - temp_bottom,
d3420b2f
MK
515 1, /* Stack section will be readable. */
516 1, /* Stack section will be writable. */
517 0, /* Stack section will not be executable. */
4f69f4c2 518 1, /* Stack section will be modified. */
be4d1333
MS
519 obfd);
520
0963b4bd 521 /* Make a heap segment. */
be4d1333 522 if (derive_heap_segment (exec_bfd, &temp_bottom, &temp_top))
d3420b2f
MK
523 (*func) (temp_bottom, temp_top - temp_bottom,
524 1, /* Heap section will be readable. */
525 1, /* Heap section will be writable. */
526 0, /* Heap section will not be executable. */
4f69f4c2 527 1, /* Heap section will be modified. */
be4d1333 528 obfd);
d3420b2f 529
be4d1333
MS
530 return 0;
531}
532
533static void
534gcore_copy_callback (bfd *obfd, asection *osec, void *ignored)
535{
fd361982 536 bfd_size_type size, total_size = bfd_section_size (osec);
804e0f53 537 file_ptr offset = 0;
be4d1333 538
cbb83bd1 539 /* Read-only sections are marked; we don't have to copy their contents. */
fd361982 540 if ((bfd_section_flags (osec) & SEC_LOAD) == 0)
d3420b2f
MK
541 return;
542
543 /* Only interested in "load" sections. */
fd361982 544 if (!startswith (bfd_section_name (osec), "load"))
d3420b2f 545 return;
be4d1333 546
325fac50 547 size = std::min (total_size, (bfd_size_type) MAX_COPY_BYTES);
26fcd5d7 548 gdb::byte_vector memhunk (size);
be4d1333 549
804e0f53
DJ
550 while (total_size > 0)
551 {
552 if (size > total_size)
553 size = total_size;
554
fd361982 555 if (target_read_memory (bfd_section_vma (osec) + offset,
26fcd5d7 556 memhunk.data (), size) != 0)
804e0f53 557 {
3e43a32a
MS
558 warning (_("Memory read failed for corefile "
559 "section, %s bytes at %s."),
5af949e3 560 plongest (size),
fd361982 561 paddress (target_gdbarch (), bfd_section_vma (osec)));
804e0f53
DJ
562 break;
563 }
26fcd5d7
TT
564 if (!bfd_set_section_contents (obfd, osec, memhunk.data (),
565 offset, size))
804e0f53
DJ
566 {
567 warning (_("Failed to write corefile contents (%s)."),
568 bfd_errmsg (bfd_get_error ()));
569 break;
570 }
571
572 total_size -= size;
573 offset += size;
574 }
be4d1333
MS
575}
576
577static int
578gcore_memory_sections (bfd *obfd)
579{
35c2fab7 580 /* Try gdbarch method first, then fall back to target method. */
f5656ead
TT
581 if (!gdbarch_find_memory_regions_p (target_gdbarch ())
582 || gdbarch_find_memory_regions (target_gdbarch (),
35c2fab7
UW
583 gcore_create_callback, obfd) != 0)
584 {
585 if (target_find_memory_regions (gcore_create_callback, obfd) != 0)
586 return 0; /* FIXME: error return/msg? */
587 }
be4d1333 588
d3420b2f 589 /* Record phdrs for section-to-segment mapping. */
be4d1333
MS
590 bfd_map_over_sections (obfd, make_output_phdrs, NULL);
591
d3420b2f 592 /* Copy memory region contents. */
be4d1333
MS
593 bfd_map_over_sections (obfd, gcore_copy_callback, NULL);
594
d3420b2f 595 return 1;
be4d1333
MS
596}
597
6c265988 598void _initialize_gcore ();
be4d1333 599void
6c265988 600_initialize_gcore ()
be4d1333 601{
1bedd215 602 add_com ("generate-core-file", class_files, gcore_command, _("\
d3420b2f 603Save a core file with the current state of the debugged process.\n\
0cab2f1e
TT
604Usage: generate-core-file [FILENAME]\n\
605Argument is optional filename. Default filename is 'core.PROCESS_ID'."));
be4d1333
MS
606
607 add_com_alias ("gcore", "generate-core-file", class_files, 1);
be4d1333 608}
This page took 1.429456 seconds and 4 git commands to generate.