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