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