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