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