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