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