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