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