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