Fix problem building PE DLL test generator with compilers that do not support c99...
[deliverable/binutils-gdb.git] / gdb / gcore.c
CommitLineData
be4d1333 1/* Generate a core file for the inferior process.
1bac305b 2
42a4f53d 3 Copyright (C) 2001-2019 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
98 bfd_set_section_vma (obfd, note_sec, 0);
99 bfd_set_section_alignment (obfd, note_sec, 0);
100 bfd_set_section_size (obfd, 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
MS
147
148 /* Open the output file. */
bef155c3 149 gdb_bfd_ref_ptr obfd (create_gcore_bfd (corefilename.get ()));
0156b218 150
bef155c3
TT
151 /* Arrange to unlink the file on failure. */
152 gdb::unlinker unlink_file (corefilename.get ());
0156b218
MS
153
154 /* Call worker function. */
bef155c3 155 write_gcore_file (obfd.get ());
0156b218 156
d3420b2f 157 /* Succeeded. */
bef155c3 158 unlink_file.keep ();
1e351ed1 159
bef155c3 160 fprintf_filtered (gdb_stdout, "Saved corefile %s\n", corefilename.get ());
be4d1333
MS
161}
162
163static unsigned long
164default_gcore_mach (void)
165{
d3420b2f 166#if 1 /* See if this even matters... */
6dbdc4a3
MS
167 return 0;
168#else
1143fffb 169
f5656ead 170 const struct bfd_arch_info *bfdarch = gdbarch_bfd_arch_info (target_gdbarch ());
be4d1333
MS
171
172 if (bfdarch != NULL)
173 return bfdarch->mach;
be4d1333 174 if (exec_bfd == NULL)
8a3fe4f8 175 error (_("Can't find default bfd machine type (need execfile)."));
be4d1333
MS
176
177 return bfd_get_mach (exec_bfd);
6dbdc4a3 178#endif /* 1 */
be4d1333
MS
179}
180
181static enum bfd_architecture
182default_gcore_arch (void)
183{
f5656ead 184 const struct bfd_arch_info *bfdarch = gdbarch_bfd_arch_info (target_gdbarch ());
be4d1333
MS
185
186 if (bfdarch != NULL)
187 return bfdarch->arch;
be4d1333 188 if (exec_bfd == NULL)
8a3fe4f8 189 error (_("Can't find bfd architecture for corefile (need execfile)."));
be4d1333
MS
190
191 return bfd_get_arch (exec_bfd);
192}
193
a78c2d62 194static const char *
be4d1333
MS
195default_gcore_target (void)
196{
a78c2d62 197 /* The gdbarch may define a target to use for core files. */
f5656ead
TT
198 if (gdbarch_gcore_bfd_target_p (target_gdbarch ()))
199 return gdbarch_gcore_bfd_target (target_gdbarch ());
a78c2d62
UW
200
201 /* Otherwise, try to fall back to the exec_bfd target. This will probably
202 not work for non-ELF targets. */
be4d1333 203 if (exec_bfd == NULL)
6dbdc4a3
MS
204 return NULL;
205 else
206 return bfd_get_target (exec_bfd);
be4d1333
MS
207}
208
d3420b2f
MK
209/* Derive a reasonable stack segment by unwinding the target stack,
210 and store its limits in *BOTTOM and *TOP. Return non-zero if
211 successful. */
be4d1333 212
cbb83bd1 213static int
69db8bae 214derive_stack_segment (bfd_vma *bottom, bfd_vma *top)
be4d1333 215{
be4d1333
MS
216 struct frame_info *fi, *tmp_fi;
217
d3420b2f
MK
218 gdb_assert (bottom);
219 gdb_assert (top);
be4d1333 220
d3420b2f 221 /* Can't succeed without stack and registers. */
be4d1333 222 if (!target_has_stack || !target_has_registers)
d3420b2f 223 return 0;
be4d1333 224
d3420b2f
MK
225 /* Can't succeed without current frame. */
226 fi = get_current_frame ();
227 if (fi == NULL)
228 return 0;
be4d1333 229
d3420b2f 230 /* Save frame pointer of TOS frame. */
8d357cca 231 *top = get_frame_base (fi);
d3420b2f 232 /* If current stack pointer is more "inner", use that instead. */
40a6adc1 233 if (gdbarch_inner_than (get_frame_arch (fi), get_frame_sp (fi), *top))
fb4443d8 234 *top = get_frame_sp (fi);
be4d1333 235
d3420b2f 236 /* Find prev-most frame. */
be4d1333
MS
237 while ((tmp_fi = get_prev_frame (fi)) != NULL)
238 fi = tmp_fi;
239
d3420b2f 240 /* Save frame pointer of prev-most frame. */
8d357cca 241 *bottom = get_frame_base (fi);
be4d1333 242
d3420b2f
MK
243 /* Now canonicalize their order, so that BOTTOM is a lower address
244 (as opposed to a lower stack frame). */
be4d1333
MS
245 if (*bottom > *top)
246 {
d3420b2f
MK
247 bfd_vma tmp_vma;
248
be4d1333
MS
249 tmp_vma = *top;
250 *top = *bottom;
251 *bottom = tmp_vma;
252 }
253
d3420b2f 254 return 1;
be4d1333
MS
255}
256
0156b218
MS
257/* call_target_sbrk --
258 helper function for derive_heap_segment. */
259
260static bfd_vma
261call_target_sbrk (int sbrk_arg)
262{
263 struct objfile *sbrk_objf;
264 struct gdbarch *gdbarch;
265 bfd_vma top_of_heap;
266 struct value *target_sbrk_arg;
267 struct value *sbrk_fn, *ret;
268 bfd_vma tmp;
269
3b7344d5 270 if (lookup_minimal_symbol ("sbrk", NULL, NULL).minsym != NULL)
0156b218
MS
271 {
272 sbrk_fn = find_function_in_inferior ("sbrk", &sbrk_objf);
273 if (sbrk_fn == NULL)
274 return (bfd_vma) 0;
275 }
3b7344d5 276 else if (lookup_minimal_symbol ("_sbrk", NULL, NULL).minsym != NULL)
0156b218
MS
277 {
278 sbrk_fn = find_function_in_inferior ("_sbrk", &sbrk_objf);
279 if (sbrk_fn == NULL)
280 return (bfd_vma) 0;
281 }
282 else
283 return (bfd_vma) 0;
284
285 gdbarch = get_objfile_arch (sbrk_objf);
286 target_sbrk_arg = value_from_longest (builtin_type (gdbarch)->builtin_int,
287 sbrk_arg);
288 gdb_assert (target_sbrk_arg);
e71585ff 289 ret = call_function_by_hand (sbrk_fn, NULL, target_sbrk_arg);
0156b218
MS
290 if (ret == NULL)
291 return (bfd_vma) 0;
292
293 tmp = value_as_long (ret);
294 if ((LONGEST) tmp <= 0 || (LONGEST) tmp == 0xffffffff)
295 return (bfd_vma) 0;
296
297 top_of_heap = tmp;
298 return top_of_heap;
299}
300
d3420b2f
MK
301/* Derive a reasonable heap segment for ABFD by looking at sbrk and
302 the static data sections. Store its limits in *BOTTOM and *TOP.
303 Return non-zero if successful. */
be4d1333 304
cbb83bd1 305static int
69db8bae 306derive_heap_segment (bfd *abfd, bfd_vma *bottom, bfd_vma *top)
be4d1333
MS
307{
308 bfd_vma top_of_data_memory = 0;
309 bfd_vma top_of_heap = 0;
310 bfd_size_type sec_size;
be4d1333
MS
311 bfd_vma sec_vaddr;
312 asection *sec;
313
d3420b2f
MK
314 gdb_assert (bottom);
315 gdb_assert (top);
be4d1333 316
d3420b2f
MK
317 /* This function depends on being able to call a function in the
318 inferior. */
be4d1333 319 if (!target_has_execution)
d3420b2f
MK
320 return 0;
321
322 /* The following code assumes that the link map is arranged as
323 follows (low to high addresses):
be4d1333 324
d3420b2f
MK
325 ---------------------------------
326 | text sections |
327 ---------------------------------
328 | data sections (including bss) |
329 ---------------------------------
330 | heap |
331 --------------------------------- */
be4d1333
MS
332
333 for (sec = abfd->sections; sec; sec = sec->next)
334 {
d3420b2f
MK
335 if (bfd_get_section_flags (abfd, sec) & SEC_DATA
336 || strcmp (".bss", bfd_section_name (abfd, sec)) == 0)
be4d1333
MS
337 {
338 sec_vaddr = bfd_get_section_vma (abfd, sec);
2c500098 339 sec_size = bfd_get_section_size (sec);
be4d1333
MS
340 if (sec_vaddr + sec_size > top_of_data_memory)
341 top_of_data_memory = sec_vaddr + sec_size;
342 }
343 }
d3420b2f 344
0156b218
MS
345 top_of_heap = call_target_sbrk (0);
346 if (top_of_heap == (bfd_vma) 0)
be4d1333 347 return 0;
be4d1333 348
d3420b2f 349 /* Return results. */
be4d1333
MS
350 if (top_of_heap > top_of_data_memory)
351 {
352 *bottom = top_of_data_memory;
353 *top = top_of_heap;
d3420b2f 354 return 1;
be4d1333 355 }
d3420b2f
MK
356
357 /* No additional heap space needs to be saved. */
358 return 0;
be4d1333
MS
359}
360
be4d1333
MS
361static void
362make_output_phdrs (bfd *obfd, asection *osec, void *ignored)
363{
364 int p_flags = 0;
0156b218 365 int p_type = 0;
be4d1333
MS
366
367 /* FIXME: these constants may only be applicable for ELF. */
61012eef 368 if (startswith (bfd_section_name (obfd, osec), "load"))
be4d1333 369 p_type = PT_LOAD;
61012eef 370 else if (startswith (bfd_section_name (obfd, osec), "note"))
be4d1333 371 p_type = PT_NOTE;
0156b218
MS
372 else
373 p_type = PT_NULL;
be4d1333
MS
374
375 p_flags |= PF_R; /* Segment is readable. */
376 if (!(bfd_get_section_flags (obfd, osec) & SEC_READONLY))
377 p_flags |= PF_W; /* Segment is writable. */
378 if (bfd_get_section_flags (obfd, osec) & SEC_CODE)
379 p_flags |= PF_X; /* Segment is executable. */
380
d3420b2f 381 bfd_record_phdr (obfd, p_type, 1, p_flags, 0, 0, 0, 0, 1, &osec);
be4d1333
MS
382}
383
4f69f4c2
JK
384/* find_memory_region_ftype implementation. DATA is 'bfd *' for the core file
385 GDB is creating. */
386
cbb83bd1 387static int
4f69f4c2
JK
388gcore_create_callback (CORE_ADDR vaddr, unsigned long size, int read,
389 int write, int exec, int modified, void *data)
be4d1333 390{
9a3c8263 391 bfd *obfd = (bfd *) data;
be4d1333 392 asection *osec;
cbb83bd1
RM
393 flagword flags = SEC_ALLOC | SEC_HAS_CONTENTS | SEC_LOAD;
394
86fbe6cc
EZ
395 /* If the memory segment has no permissions set, ignore it, otherwise
396 when we later try to access it for read/write, we'll get an error
397 or jam the kernel. */
4f69f4c2 398 if (read == 0 && write == 0 && exec == 0 && modified == 0)
86fbe6cc
EZ
399 {
400 if (info_verbose)
401 {
5af949e3 402 fprintf_filtered (gdb_stdout, "Ignore segment, %s bytes at %s\n",
f5656ead 403 plongest (size), paddress (target_gdbarch (), vaddr));
86fbe6cc
EZ
404 }
405
406 return 0;
407 }
408
4f69f4c2 409 if (write == 0 && modified == 0 && !solib_keep_data_in_core (vaddr, size))
cbb83bd1
RM
410 {
411 /* See if this region of memory lies inside a known file on disk.
412 If so, we can avoid copying its contents by clearing SEC_LOAD. */
cbb83bd1
RM
413 struct obj_section *objsec;
414
2030c079 415 for (objfile *objfile : current_program_space->objfiles ())
3b9d3ac2
TT
416 ALL_OBJFILE_OSECTIONS (objfile, objsec)
417 {
418 bfd *abfd = objfile->obfd;
419 asection *asec = objsec->the_bfd_section;
420 bfd_vma align = (bfd_vma) 1 << bfd_get_section_alignment (abfd,
421 asec);
422 bfd_vma start = obj_section_addr (objsec) & -align;
423 bfd_vma end = (obj_section_endaddr (objsec) + align - 1) & -align;
424
425 /* Match if either the entire memory region lies inside the
426 section (i.e. a mapping covering some pages of a large
427 segment) or the entire section lies inside the memory region
428 (i.e. a mapping covering multiple small sections).
429
430 This BFD was synthesized from reading target memory,
431 we don't want to omit that. */
432 if (objfile->separate_debug_objfile_backlink == NULL
433 && ((vaddr >= start && vaddr + size <= end)
434 || (start >= vaddr && end <= vaddr + size))
435 && !(bfd_get_file_flags (abfd) & BFD_IN_MEMORY))
436 {
437 flags &= ~(SEC_LOAD | SEC_HAS_CONTENTS);
438 goto keep; /* Break out of two nested for loops. */
439 }
440 }
cbb83bd1 441
4f69f4c2 442 keep:;
cbb83bd1
RM
443 }
444
4f69f4c2
JK
445 if (write == 0)
446 flags |= SEC_READONLY;
447
cbb83bd1
RM
448 if (exec)
449 flags |= SEC_CODE;
450 else
451 flags |= SEC_DATA;
be4d1333 452
52b57208 453 osec = bfd_make_section_anyway_with_flags (obfd, "load", flags);
d3420b2f 454 if (osec == NULL)
be4d1333 455 {
8a3fe4f8 456 warning (_("Couldn't make gcore segment: %s"),
be4d1333 457 bfd_errmsg (bfd_get_error ()));
cbb83bd1 458 return 1;
be4d1333
MS
459 }
460
461 if (info_verbose)
462 {
5af949e3 463 fprintf_filtered (gdb_stdout, "Save segment, %s bytes at %s\n",
f5656ead 464 plongest (size), paddress (target_gdbarch (), vaddr));
be4d1333
MS
465 }
466
467 bfd_set_section_size (obfd, osec, size);
cbb83bd1 468 bfd_set_section_vma (obfd, osec, vaddr);
d3420b2f 469 bfd_section_lma (obfd, osec) = 0; /* ??? bfd_set_section_lma? */
cbb83bd1 470 return 0;
be4d1333
MS
471}
472
b427c1bc
TT
473int
474objfile_find_memory_regions (struct target_ops *self,
475 find_memory_region_ftype func, void *obfd)
be4d1333 476{
d3420b2f 477 /* Use objfile data to create memory sections. */
be4d1333
MS
478 struct obj_section *objsec;
479 bfd_vma temp_bottom, temp_top;
480
d3420b2f 481 /* Call callback function for each objfile section. */
2030c079 482 for (objfile *objfile : current_program_space->objfiles ())
3b9d3ac2
TT
483 ALL_OBJFILE_OSECTIONS (objfile, objsec)
484 {
485 bfd *ibfd = objfile->obfd;
486 asection *isec = objsec->the_bfd_section;
487 flagword flags = bfd_get_section_flags (ibfd, isec);
488
489 /* Separate debug info files are irrelevant for gcore. */
490 if (objfile->separate_debug_objfile_backlink != NULL)
491 continue;
492
493 if ((flags & SEC_ALLOC) || (flags & SEC_LOAD))
494 {
495 int size = bfd_section_size (ibfd, isec);
496 int ret;
497
498 ret = (*func) (obj_section_addr (objsec), size,
499 1, /* All sections will be readable. */
500 (flags & SEC_READONLY) == 0, /* Writable. */
501 (flags & SEC_CODE) != 0, /* Executable. */
502 1, /* MODIFIED is unknown, pass it as true. */
503 obfd);
504 if (ret != 0)
505 return ret;
506 }
507 }
be4d1333 508
d3420b2f 509 /* Make a stack segment. */
be4d1333 510 if (derive_stack_segment (&temp_bottom, &temp_top))
cbb83bd1 511 (*func) (temp_bottom, temp_top - temp_bottom,
d3420b2f
MK
512 1, /* Stack section will be readable. */
513 1, /* Stack section will be writable. */
514 0, /* Stack section will not be executable. */
4f69f4c2 515 1, /* Stack section will be modified. */
be4d1333
MS
516 obfd);
517
0963b4bd 518 /* Make a heap segment. */
be4d1333 519 if (derive_heap_segment (exec_bfd, &temp_bottom, &temp_top))
d3420b2f
MK
520 (*func) (temp_bottom, temp_top - temp_bottom,
521 1, /* Heap section will be readable. */
522 1, /* Heap section will be writable. */
523 0, /* Heap section will not be executable. */
4f69f4c2 524 1, /* Heap section will be modified. */
be4d1333 525 obfd);
d3420b2f 526
be4d1333
MS
527 return 0;
528}
529
530static void
531gcore_copy_callback (bfd *obfd, asection *osec, void *ignored)
532{
804e0f53
DJ
533 bfd_size_type size, total_size = bfd_section_size (obfd, osec);
534 file_ptr offset = 0;
be4d1333 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. */
61012eef 541 if (!startswith (bfd_section_name (obfd, osec), "load"))
d3420b2f 542 return;
be4d1333 543
325fac50 544 size = std::min (total_size, (bfd_size_type) MAX_COPY_BYTES);
26fcd5d7 545 gdb::byte_vector memhunk (size);
be4d1333 546
804e0f53
DJ
547 while (total_size > 0)
548 {
549 if (size > total_size)
550 size = total_size;
551
552 if (target_read_memory (bfd_section_vma (obfd, osec) + offset,
26fcd5d7 553 memhunk.data (), size) != 0)
804e0f53 554 {
3e43a32a
MS
555 warning (_("Memory read failed for corefile "
556 "section, %s bytes at %s."),
5af949e3 557 plongest (size),
f5656ead 558 paddress (target_gdbarch (), bfd_section_vma (obfd, osec)));
804e0f53
DJ
559 break;
560 }
26fcd5d7
TT
561 if (!bfd_set_section_contents (obfd, osec, memhunk.data (),
562 offset, size))
804e0f53
DJ
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
MS
572}
573
574static int
575gcore_memory_sections (bfd *obfd)
576{
35c2fab7 577 /* Try gdbarch method first, then fall back to target method. */
f5656ead
TT
578 if (!gdbarch_find_memory_regions_p (target_gdbarch ())
579 || gdbarch_find_memory_regions (target_gdbarch (),
35c2fab7
UW
580 gcore_create_callback, obfd) != 0)
581 {
582 if (target_find_memory_regions (gcore_create_callback, obfd) != 0)
583 return 0; /* FIXME: error return/msg? */
584 }
be4d1333 585
d3420b2f 586 /* Record phdrs for section-to-segment mapping. */
be4d1333
MS
587 bfd_map_over_sections (obfd, make_output_phdrs, NULL);
588
d3420b2f 589 /* Copy memory region contents. */
be4d1333
MS
590 bfd_map_over_sections (obfd, gcore_copy_callback, NULL);
591
d3420b2f 592 return 1;
be4d1333
MS
593}
594
595void
596_initialize_gcore (void)
597{
1bedd215 598 add_com ("generate-core-file", class_files, gcore_command, _("\
d3420b2f 599Save a core file with the current state of the debugged process.\n\
0cab2f1e
TT
600Usage: generate-core-file [FILENAME]\n\
601Argument is optional filename. Default filename is 'core.PROCESS_ID'."));
be4d1333
MS
602
603 add_com_alias ("gcore", "generate-core-file", class_files, 1);
be4d1333 604}
This page took 1.347451 seconds and 4 git commands to generate.