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