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