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