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