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