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