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