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