1 /* Work with executable files, for GDB.
2 Copyright 1988, 1989, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
30 #include <sys/types.h>
33 #include <sys/param.h>
35 #include "gdb_string.h"
45 #include "xcoffsolib.h"
47 struct vmap *map_vmap PARAMS ((bfd *, bfd *));
49 /* Prototypes for local functions */
51 static void add_to_section_table PARAMS ((bfd *, sec_ptr, PTR));
53 static void exec_close PARAMS ((int));
55 static void file_command PARAMS ((char *, int));
57 static void set_section_command PARAMS ((char *, int));
59 static void exec_files_info PARAMS ((struct target_ops *));
61 extern int info_verbose;
63 /* The Binary File Descriptor handle for the executable file. */
67 /* Whether to open exec and core files read-only or read-write. */
71 /* Text start and end addresses (KLUDGE) if needed */
73 #ifdef NEED_TEXT_START_END
74 CORE_ADDR text_start = 0;
75 CORE_ADDR text_end = 0;
82 extern struct target_ops exec_ops;
89 int need_symtab_cleanup = 0;
90 struct vmap *vp, *nxt;
92 for (nxt = vmap; nxt != NULL; )
97 /* if there is an objfile associated with this bfd,
98 free_objfile() will do proper cleanup of objfile *and* bfd. */
102 free_objfile (vp->objfile);
103 need_symtab_cleanup = 1;
105 else if (vp->bfd != exec_bfd)
106 /* FIXME-leak: We should be freeing vp->name too, I think. */
107 if (!bfd_close (vp->bfd))
108 warning ("cannot close \"%s\": %s",
109 vp->name, bfd_errmsg (bfd_get_error ()));
111 /* FIXME: This routine is #if 0'd in symfile.c. What should we
112 be doing here? Should we just free everything in
113 vp->objfile->symtabs? Should free_objfile do that?
114 FIXME-as-well: free_objfile already free'd vp->name, so it isn't
116 free_named_symtabs (vp->name);
124 char *name = bfd_get_filename (exec_bfd);
126 if (!bfd_close (exec_bfd))
127 warning ("cannot close \"%s\": %s",
128 name, bfd_errmsg (bfd_get_error ()));
133 if (exec_ops.to_sections)
135 free ((PTR)exec_ops.to_sections);
136 exec_ops.to_sections = NULL;
137 exec_ops.to_sections_end = NULL;
141 /* Process the first arg in ARGS as the new exec file.
143 Note that we have to explicitly ignore additional args, since we can
144 be called from file_command(), which also calls symbol_file_command()
145 which can take multiple args. */
148 exec_file_command (args, from_tty)
155 target_preopen (from_tty);
157 /* Remove any previous exec file. */
158 unpush_target (&exec_ops);
160 /* Now open and digest the file the user requested, if any. */
164 char *scratch_pathname;
167 /* Scan through the args and pick up the first non option arg
170 argv = buildargv (args);
174 make_cleanup (freeargv, (char *) argv);
176 for (; (*argv != NULL) && (**argv == '-'); argv++) {;}
178 error ("no exec file name was specified");
180 filename = tilde_expand (*argv);
181 make_cleanup (free, filename);
183 scratch_chan = openp (getenv ("PATH"), 1, filename,
184 write_files? O_RDWR|O_BINARY: O_RDONLY|O_BINARY, 0,
186 if (scratch_chan < 0)
187 perror_with_name (filename);
189 exec_bfd = bfd_fdopenr (scratch_pathname, gnutarget, scratch_chan);
191 error ("\"%s\": could not open as an executable file: %s",
192 scratch_pathname, bfd_errmsg (bfd_get_error ()));
193 if (!bfd_check_format (exec_bfd, bfd_object))
195 /* Make sure to close exec_bfd, or else "run" might try to use
198 error ("\"%s\": not in executable format: %s",
199 scratch_pathname, bfd_errmsg (bfd_get_error ()));
202 /* FIXME - This should only be run for RS6000, but the ifdef is a poor
203 way to accomplish. */
204 #ifdef IBM6000_TARGET
205 /* Setup initial vmap. */
207 map_vmap (exec_bfd, 0);
210 /* Make sure to close exec_bfd, or else "run" might try to use
213 error ("\"%s\": can't find the file sections: %s",
214 scratch_pathname, bfd_errmsg (bfd_get_error ()));
216 #endif /* IBM6000_TARGET */
218 if (build_section_table (exec_bfd, &exec_ops.to_sections,
219 &exec_ops.to_sections_end))
221 /* Make sure to close exec_bfd, or else "run" might try to use
224 error ("\"%s\": can't find the file sections: %s",
225 scratch_pathname, bfd_errmsg (bfd_get_error ()));
228 #ifdef NEED_TEXT_START_END
230 /* text_end is sometimes used for where to put call dummies. A
231 few ports use these for other purposes too. */
234 struct section_table *p;
236 /* Set text_start to the lowest address of the start of any
237 readonly code section and set text_end to the highest
238 address of the end of any readonly code section. */
239 /* FIXME: The comment above does not match the code. The code
240 checks for sections with are either code *or* readonly. */
242 text_start = ~(CORE_ADDR)0;
243 text_end = (CORE_ADDR)0;
244 for (p = exec_ops.to_sections; p < exec_ops.to_sections_end; p++)
245 if (bfd_get_section_flags (p->bfd, p->the_bfd_section)
246 & (SEC_CODE | SEC_READONLY))
248 if (text_start > p->addr)
249 text_start = p->addr;
250 if (text_end < p->endaddr)
251 text_end = p->endaddr;
258 set_endian_from_file (exec_bfd);
260 push_target (&exec_ops);
262 /* Tell display code (if any) about the changed file name. */
263 if (exec_file_display_hook)
264 (*exec_file_display_hook) (filename);
267 printf_unfiltered ("No exec file now.\n");
270 /* Set both the exec file and the symbol file, in one command.
271 What a novelty. Why did GDB go through four major releases before this
272 command was added? */
275 file_command (arg, from_tty)
279 /* FIXME, if we lose on reading the symbol file, we should revert
280 the exec file, but that's rough. */
281 exec_file_command (arg, from_tty);
282 symbol_file_command (arg, from_tty);
286 /* Locate all mappable sections of a BFD file.
287 table_pp_char is a char * to get it through bfd_map_over_sections;
288 we cast it back to its proper type. */
291 add_to_section_table (abfd, asect, table_pp_char)
296 struct section_table **table_pp = (struct section_table **)table_pp_char;
299 aflag = bfd_get_section_flags (abfd, asect);
300 if (!(aflag & SEC_ALLOC))
302 if (0 == bfd_section_size (abfd, asect))
304 (*table_pp)->bfd = abfd;
305 (*table_pp)->the_bfd_section = asect;
306 (*table_pp)->addr = bfd_section_vma (abfd, asect);
307 (*table_pp)->endaddr = (*table_pp)->addr + bfd_section_size (abfd, asect);
311 /* Builds a section table, given args BFD, SECTABLE_PTR, SECEND_PTR.
312 Returns 0 if OK, 1 on error. */
315 build_section_table (some_bfd, start, end)
317 struct section_table **start, **end;
321 count = bfd_count_sections (some_bfd);
324 *start = (struct section_table *) xmalloc (count * sizeof (**start));
326 bfd_map_over_sections (some_bfd, add_to_section_table, (char *)end);
327 if (*end > *start + count)
329 /* We could realloc the table, but it probably loses for most files. */
334 bfdsec_to_vmap(abfd, sect, arg3)
339 struct vmap_and_bfd *vmap_bfd = (struct vmap_and_bfd *) arg3;
342 vp = vmap_bfd->pvmap;
344 if ((bfd_get_section_flags (abfd, sect) & SEC_LOAD) == 0)
347 if (STREQ (bfd_section_name (abfd, sect), ".text"))
350 vp->tend = vp->tstart + bfd_section_size (abfd, sect);
352 /* When it comes to this adjustment value, in contrast to our previous
353 belief shared objects should behave the same as the main load segment.
354 This is the offset from the beginning of text section to the first
357 vp->tadj = sect->filepos - bfd_section_vma (abfd, sect);
359 else if (STREQ (bfd_section_name (abfd, sect), ".data"))
362 vp->dend = vp->dstart + bfd_section_size (abfd, sect);
364 /* Silently ignore other types of sections. (FIXME?) */
367 /* Make a vmap for ABFD which might be a member of the archive ARCH.
368 Return the new vmap. */
371 map_vmap (abfd, arch)
375 struct vmap_and_bfd vmap_bfd;
376 struct vmap *vp, **vpp;
378 vp = (struct vmap *) xmalloc (sizeof (*vp));
379 memset ((char *) vp, '\0', sizeof (*vp));
382 vp->name = bfd_get_filename (arch ? arch : abfd);
383 vp->member = arch ? bfd_get_filename (abfd) : "";
385 vmap_bfd.pbfd = arch;
387 bfd_map_over_sections (abfd, bfdsec_to_vmap, &vmap_bfd);
389 /* Find the end of the list and append. */
390 for (vpp = &vmap; *vpp; vpp = &(*vpp)->nxt)
397 /* Read or write the exec file.
399 Args are address within a BFD file, address within gdb address-space,
400 length, and a flag indicating whether to read or write.
404 0: We cannot handle this address and length.
405 > 0: We have handled N bytes starting at this address.
406 (If N == length, we did it all.) We might be able
407 to handle more bytes beyond this length, but no
409 < 0: We cannot handle this address, but if somebody
410 else handles (-N) bytes, we can start from there.
412 The same routine is used to handle both core and exec files;
413 we just tail-call it with more arguments to select between them. */
416 xfer_memory (memaddr, myaddr, len, write, target)
421 struct target_ops *target;
424 struct section_table *p;
425 CORE_ADDR nextsectaddr, memend;
426 boolean (*xfer_fn) PARAMS ((bfd *, sec_ptr, PTR, file_ptr, bfd_size_type));
431 memend = memaddr + len;
432 xfer_fn = write ? bfd_set_section_contents : bfd_get_section_contents;
433 nextsectaddr = memend;
435 for (p = target->to_sections; p < target->to_sections_end; p++)
437 if (p->addr <= memaddr)
438 if (p->endaddr >= memend)
440 /* Entire transfer is within this section. */
441 res = xfer_fn (p->bfd, p->the_bfd_section, myaddr,
442 memaddr - p->addr, len);
443 return (res != 0) ? len : 0;
445 else if (p->endaddr <= memaddr)
447 /* This section ends before the transfer starts. */
452 /* This section overlaps the transfer. Just do half. */
453 len = p->endaddr - memaddr;
454 res = xfer_fn (p->bfd, p->the_bfd_section, myaddr,
455 memaddr - p->addr, len);
456 return (res != 0) ? len : 0;
458 else if (p->addr < nextsectaddr)
459 nextsectaddr = p->addr;
462 if (nextsectaddr >= memend)
463 return 0; /* We can't help */
465 return - (nextsectaddr - memaddr); /* Next boundary where we can help */
469 #ifdef REG_STACK_SEGMENT
471 /* Pyramids and AM29000s have an extra segment in the virtual address space
472 for the (control) stack of register-window frames. The AM29000 folk
473 call it the "register stack" rather than the "memory stack". */
474 else if (memaddr >= reg_stack_start && memaddr < reg_stack_end)
476 i = min (len, reg_stack_end - memaddr);
477 fileptr = memaddr - reg_stack_start + reg_stack_offset;
478 wanna_xfer = coredata;
480 #endif /* REG_STACK_SEGMENT */
484 print_section_info (t, abfd)
485 struct target_ops *t;
488 struct section_table *p;
490 printf_filtered ("\t`%s', ", bfd_get_filename(abfd));
492 printf_filtered ("file type %s.\n", bfd_get_target(abfd));
493 if (abfd == exec_bfd)
495 printf_filtered ("\tEntry point: ");
496 print_address_numeric (bfd_get_start_address (abfd), 1, gdb_stdout);
497 printf_filtered ("\n");
499 for (p = t->to_sections; p < t->to_sections_end; p++)
501 /* FIXME-32x64 need a print_address_numeric with field width */
502 printf_filtered ("\t%s", local_hex_string_custom ((unsigned long) p->addr, "08l"));
503 printf_filtered (" - %s", local_hex_string_custom ((unsigned long) p->endaddr, "08l"));
505 printf_filtered (" @ %s",
506 local_hex_string_custom ((unsigned long) p->the_bfd_section->filepos, "08l"));
507 printf_filtered (" is %s", bfd_section_name (p->bfd, p->the_bfd_section));
510 printf_filtered (" in %s", bfd_get_filename (p->bfd));
512 printf_filtered ("\n");
518 struct target_ops *t;
520 print_section_info (t, exec_bfd);
526 printf_unfiltered ("\tMapping info for file `%s'.\n", vmap->name);
527 printf_unfiltered ("\t %8.8s %8.8s %8.8s %8.8s %8.8s %s\n",
528 "tstart", "tend", "dstart", "dend", "section",
531 for (vp = vmap; vp; vp = vp->nxt)
532 printf_unfiltered ("\t0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x %s%s%s%s\n",
533 vp->tstart, vp->tend, vp->dstart, vp->dend, vp->name,
534 *vp->member ? "(" : "", vp->member,
535 *vp->member ? ")" : "");
540 set_section_command (args, from_tty)
544 struct section_table *p;
547 unsigned long secaddr;
552 error ("Must specify section name and its virtual address");
554 /* Parse out section name */
555 for (secname = args; !isspace(*args); args++) ;
556 seclen = args - secname;
558 /* Parse out new virtual address */
559 secaddr = parse_and_eval_address (args);
561 for (p = exec_ops.to_sections; p < exec_ops.to_sections_end; p++) {
562 if (!strncmp (secname, bfd_section_name (exec_bfd, p->the_bfd_section), seclen)
563 && bfd_section_name (exec_bfd, p->the_bfd_section)[seclen] == '\0') {
564 offset = secaddr - p->addr;
566 p->endaddr += offset;
568 exec_files_info(&exec_ops);
572 if (seclen >= sizeof (secprint))
573 seclen = sizeof (secprint) - 1;
574 strncpy (secprint, secname, seclen);
575 secprint[seclen] = '\0';
576 error ("Section %s not found", secprint);
579 /* If mourn is being called in all the right places, this could be say
580 `gdb internal error' (since generic_mourn calls breakpoint_init_inferior). */
583 ignore (addr, contents)
590 struct target_ops exec_ops = {
591 "exec", /* to_shortname */
592 "Local exec file", /* to_longname */
593 "Use an executable file as a target.\n\
594 Specify the filename of the executable file.", /* to_doc */
595 exec_file_command, /* to_open */
596 exec_close, /* to_close */
597 find_default_attach, /* to_attach */
601 0, /* to_fetch_registers */
602 0, /* to_store_registers */
603 0, /* to_prepare_to_store */
604 xfer_memory, /* to_xfer_memory */
605 exec_files_info, /* to_files_info */
606 ignore, /* to_insert_breakpoint */
607 ignore, /* to_remove_breakpoint */
608 0, /* to_terminal_init */
609 0, /* to_terminal_inferior */
610 0, /* to_terminal_ours_for_output */
611 0, /* to_terminal_ours */
612 0, /* to_terminal_info */
615 0, /* to_lookup_symbol */
616 find_default_create_inferior, /* to_create_inferior */
617 0, /* to_mourn_inferior */
619 0, /* to_notice_signals */
620 0, /* to_thread_alive */
622 file_stratum, /* to_stratum */
624 0, /* to_has_all_memory */
625 1, /* to_has_memory */
626 0, /* to_has_stack */
627 0, /* to_has_registers */
628 0, /* to_has_execution */
630 0, /* to_sections_end */
631 OPS_MAGIC, /* to_magic */
637 struct cmd_list_element *c;
639 c = add_cmd ("file", class_files, file_command,
640 "Use FILE as program to be debugged.\n\
641 It is read for its symbols, for getting the contents of pure memory,\n\
642 and it is the program executed when you use the `run' command.\n\
643 If FILE cannot be found as specified, your execution directory path\n\
644 ($PATH) is searched for a command of that name.\n\
645 No arg means to have no executable file and no symbols.", &cmdlist);
646 c->completer = filename_completer;
648 c = add_cmd ("exec-file", class_files, exec_file_command,
649 "Use FILE as program for getting contents of pure memory.\n\
650 If FILE cannot be found as specified, your execution directory path\n\
651 is searched for a command of that name.\n\
652 No arg means have no executable file.", &cmdlist);
653 c->completer = filename_completer;
655 add_com ("section", class_files, set_section_command,
656 "Change the base address of section SECTION of the exec file to ADDR.\n\
657 This can be used if the exec file does not contain section addresses,\n\
658 (such as in the a.out format), or when the addresses specified in the\n\
659 file itself are wrong. Each section must be changed separately. The\n\
660 ``info files'' command lists all the sections and their addresses.");
663 (add_set_cmd ("write", class_support, var_boolean, (char *)&write_files,
664 "Set writing into executable and core files.",
668 add_target (&exec_ops);