1 /* Execute AIXcoff files, for GDB.
2 Copyright 1988, 1989, 1991, 1992 Free Software Foundation, Inc.
3 Derived from exec.c. Modified by IBM Corporation.
4 Donated by IBM Corporation and Cygnus Support.
6 This file is part of GDB.
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
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
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.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
22 /* xcoff-exec - deal with executing XCOFF files. */
26 #include <sys/types.h>
27 #include <sys/param.h>
42 #include "libbfd.h" /* BFD internals (sigh!) FIXME */
44 #include "xcoffsolib.h"
46 /* Prototypes for local functions */
49 file_command PARAMS ((char *, int));
52 exec_close PARAMS ((int));
55 map_vmap PARAMS ((bfd *, bfd *));
57 struct section_table *exec_sections, *exec_sections_end;
59 /* Whether to open exec and core files read-only or read-write. */
63 extern int info_verbose;
65 bfd *exec_bfd; /* needed by core.c */
67 extern char *getenv();
68 extern void add_syms_addr_command ();
69 extern void symbol_file_command ();
70 static void exec_files_info();
72 struct vmap *vmap; /* current vmap */
74 extern struct target_ops exec_ops;
77 /* exec_close - done with exec file, clean up all resources. */
82 register struct vmap *vp, *nxt;
84 int need_symtab_cleanup = 0;
86 for (nxt = vmap; vp = nxt; )
90 /* if there is an objfile associated with this bfd,
91 free_objfile() will do proper cleanup of objfile *and* bfd. */
95 free_objfile (vp->objfile);
96 need_symtab_cleanup = 1;
101 /* FIXME: This routine is #if 0'd in symfile.c. What should we
102 be doing here? Should we just free everything in
103 vp->objfile->symtabs? Should free_objfile do that? */
104 free_named_symtabs(vp->name);
110 /* exec_bfd was already closed (the exec file has a vmap entry). */
113 if (exec_ops.to_sections) {
114 free (exec_ops.to_sections);
115 exec_ops.to_sections = NULL;
116 exec_ops.to_sections_end = NULL;
119 if (need_symtab_cleanup)
120 clear_symtab_users ();
124 * exec_file_command - handle the "exec" command, &c.
127 exec_file_command(filename, from_tty)
130 target_preopen(from_tty);
132 /* Remove any previous exec file. */
133 unpush_target(&exec_ops);
135 /* Now open and digest the file the user requested, if any. */
138 char *scratch_pathname;
141 filename = tilde_expand(filename);
142 make_cleanup (free, filename);
144 scratch_chan = openp(getenv("PATH"), 1, filename,
145 write_files? O_RDWR: O_RDONLY, 0,
147 if (scratch_chan < 0)
148 perror_with_name(filename);
150 exec_bfd = bfd_fdopenr(scratch_pathname, gnutarget, scratch_chan);
152 error("Could not open `%s' as an executable file: %s"
153 , scratch_pathname, bfd_errmsg(bfd_error));
155 /* make sure we have an object file */
157 if (!bfd_check_format(exec_bfd, bfd_object))
158 error("\"%s\": not in executable format: %s.",
159 scratch_pathname, bfd_errmsg(bfd_error));
162 /* setup initial vmap */
164 map_vmap (exec_bfd, 0);
166 error("Can't find the file sections in `%s': %s",
167 exec_bfd->filename, bfd_errmsg(bfd_error));
169 if (build_section_table (exec_bfd, &exec_ops.to_sections,
170 &exec_ops.to_sections_end))
171 error ("Can't find the file sections in `%s': %s",
172 exec_bfd->filename, bfd_errmsg (bfd_error));
174 /* make sure core, if present, matches */
177 push_target(&exec_ops);
179 /* Tell display code(if any) about the changed file name. */
181 if (exec_file_display_hook)
182 (*exec_file_display_hook)(filename);
185 exec_close(0); /* just in case */
187 printf("No exec file now.\n");
191 /* Set both the exec file and the symbol file, in one command. What a
192 * novelty. Why did GDB go through four major releases before this
196 file_command(arg, from_tty)
199 exec_file_command(arg, from_tty);
200 symbol_file_command(arg, from_tty);
203 /* Locate all mappable sections of a BFD file.
204 table_pp_char is a char * to get it through bfd_map_over_sections;
205 we cast it back to its proper type. */
208 add_to_section_table (abfd, asect, table_pp_char)
213 struct section_table **table_pp = (struct section_table **)table_pp_char;
216 aflag = bfd_get_section_flags (abfd, asect);
217 /* FIXME, we need to handle BSS segment here...it alloc's but doesn't load */
218 if (!(aflag & SEC_LOAD))
220 if (0 == bfd_section_size (abfd, asect))
222 (*table_pp)->bfd = abfd;
223 (*table_pp)->sec_ptr = asect;
224 (*table_pp)->addr = bfd_section_vma (abfd, asect);
225 (*table_pp)->endaddr = (*table_pp)->addr + bfd_section_size (abfd, asect);
230 build_section_table (some_bfd, start, end)
232 struct section_table **start, **end;
236 count = bfd_count_sections (some_bfd);
238 fatal ("aborting"); /* return 1? */
241 *start = (struct section_table *) xmalloc (count * sizeof (**start));
243 bfd_map_over_sections (some_bfd, add_to_section_table, (char *)end);
244 if (*end > *start + count)
246 /* We could realloc the table, but it probably loses for most files. */
251 sex_to_vmap(bfd *bf, sec_ptr sex, PTR arg3)
253 struct vmap_and_bfd *vmap_bfd = (struct vmap_and_bfd *)arg3;
254 register struct vmap *vp, **vpp;
255 register struct symtab *syms;
256 bfd *arch = vmap_bfd->pbfd;
257 vp = vmap_bfd->pvmap;
259 if ((bfd_get_section_flags(bf, sex) & SEC_LOAD) == 0)
262 if (STREQ(bfd_section_name(bf, sex), ".text")) {
264 vp->tend = vp->tstart + bfd_section_size(bf, sex);
266 /* When it comes to this adjustment value, in contrast to our previous
267 belief shared objects should behave the same as the main load segment.
268 This is the offset from the beginning of text section to the first
271 vp->tadj = sex->filepos - bfd_section_vma(bf, sex);
274 else if (STREQ(bfd_section_name(bf, sex), ".data")) {
276 vp->dend = vp->dstart + bfd_section_size(bf, sex);
279 else if (STREQ(bfd_section_name(bf, sex), ".bss")) /* FIXMEmgo */
280 printf ("bss section in exec! Don't know what the heck to do!\n");
283 /* Make a vmap for the BFD "bf", which might be a member of the archive
284 BFD "arch". Return the new vmap. */
286 map_vmap (bfd *bf, bfd *arch)
288 struct vmap_and_bfd vmap_bfd;
289 struct vmap *vp, **vpp;
292 vp = (void*) xmalloc (sizeof (*vp));
293 memset (vp, '\0', sizeof (*vp));
296 vp->name = bfd_get_filename(arch ? arch : bf);
297 vp->member = arch ? bfd_get_filename(bf) : "";
299 vmap_bfd.pbfd = arch;
301 bfd_map_over_sections (bf, sex_to_vmap, &vmap_bfd);
303 /* find the end of the list, and append. */
304 for (vpp = &vmap; *vpp; vpp = &(*vpp)->nxt)
312 /* vmap_symtab - handle symbol translation on vmapping */
316 register struct vmap *vp;
318 register struct objfile *objfile;
322 CORE_ADDR text_delta;
323 CORE_ADDR data_delta;
325 struct section_offsets *new_offsets;
328 objfile = vp->objfile;
331 /* OK, it's not an objfile we opened ourselves.
332 Currently, that can only happen with the exec file, so
333 relocate the symbols for the symfile. */
334 if (symfile_objfile == NULL)
336 objfile = symfile_objfile;
340 (sizeof (struct section_offsets)
341 + sizeof (new_offsets->offsets) * objfile->num_sections);
343 for (i = 0; i < objfile->num_sections; ++i)
344 ANOFFSET (new_offsets, i) = ANOFFSET (objfile->section_offsets, i);
346 textsec = bfd_get_section_by_name (vp->bfd, ".text");
348 vp->tstart - ANOFFSET (objfile->section_offsets, textsec->target_index);
349 ANOFFSET (new_offsets, textsec->target_index) = vp->tstart;
351 datasec = bfd_get_section_by_name (vp->bfd, ".data");
353 vp->dstart - ANOFFSET (objfile->section_offsets, datasec->target_index);
354 ANOFFSET (new_offsets, datasec->target_index) = vp->dstart;
356 bsssec = bfd_get_section_by_name (vp->bfd, ".bss");
358 vp->dstart - ANOFFSET (objfile->section_offsets, bsssec->target_index);
359 ANOFFSET (new_offsets, bsssec->target_index) = vp->dstart;
361 objfile_relocate (objfile, new_offsets);
364 struct obj_section *s;
365 for (s = objfile->sections; s < objfile->sections_end; ++s)
367 if (s->sec_ptr->target_index == textsec->target_index)
369 s->addr += text_delta;
370 s->endaddr += text_delta;
372 else if (s->sec_ptr->target_index == datasec->target_index)
374 s->addr += data_delta;
375 s->endaddr += data_delta;
377 else if (s->sec_ptr->target_index == bsssec->target_index)
379 s->addr += bss_delta;
380 s->endaddr += bss_delta;
386 /* breakpoints need to be relocated as well. */
387 fixup_breakpoints (0, TEXT_SEGMENT_BASE, text_delta);
390 /* Add symbols for an objfile. */
392 objfile_symbol_add (arg)
395 struct objfile *obj = (struct objfile *) arg;
396 syms_from_objfile (obj, 0, 0, 0);
397 new_symfile_objfile (obj, 0, 0);
401 static struct vmap *add_vmap PARAMS ((struct ld_info *));
403 /* Add a new vmap entry based on ldinfo() information.
405 If ldi->ldinfo_fd is not valid (e.g. this struct ld_info is from a
406 core file), the caller should set it to -1, and we will open the file.
408 Return the vmap new entry. */
411 register struct ld_info *ldi;
414 register char *mem, *objname;
418 /* This ldi structure was allocated using alloca() in
419 xcoff_relocate_symtab(). Now we need to have persistent object
420 and member names, so we should save them. */
422 mem = ldi->ldinfo_filename + strlen(ldi->ldinfo_filename) + 1;
423 mem = savestring (mem, strlen (mem));
424 objname = savestring (ldi->ldinfo_filename, strlen (ldi->ldinfo_filename));
426 if (ldi->ldinfo_fd < 0)
427 /* Note that this opens it once for every member; a possible
428 enhancement would be to only open it once for every object. */
429 bfd = bfd_openr (objname, gnutarget);
431 bfd = bfd_fdopenr(objname, gnutarget, ldi->ldinfo_fd);
433 error("Could not open `%s' as an executable file: %s",
434 objname, bfd_errmsg(bfd_error));
437 /* make sure we have an object file */
439 if (bfd_check_format(bfd, bfd_object))
440 vp = map_vmap (bfd, 0);
442 else if (bfd_check_format(bfd, bfd_archive)) {
445 * FIXME??? am I tossing BFDs? bfd?
447 while (last = bfd_openr_next_archived_file(bfd, last))
448 if (STREQ(mem, last->filename))
453 /* FIXME -- should be error */
454 warning("\"%s\": member \"%s\" missing.", bfd->filename, mem);
458 if (!bfd_check_format(last, bfd_object)) {
459 bfd_close(last); /* XXX??? */
463 vp = map_vmap (last, bfd);
468 error ("\"%s\": not in executable format: %s.",
469 objname, bfd_errmsg(bfd_error));
472 obj = allocate_objfile (vp->bfd, 0);
475 #ifndef SOLIB_SYMBOLS_MANUAL
476 if (catch_errors (objfile_symbol_add, (char *)obj,
477 "Error while reading shared library symbols:\n",
480 /* Note this is only done if symbol reading was successful. */
489 /* As well as symbol tables, exec_sections need relocation. After
490 the inferior process' termination, there will be a relocated symbol
491 table exist with no corresponding inferior process. At that time, we
492 need to use `exec' bfd, rather than the inferior process's memory space
495 `exec_sections' need to be relocated only once, as long as the exec
496 file remains unchanged.
503 if (execbfd == exec_bfd)
508 if (!vmap || !exec_ops.to_sections)
509 error ("vmap_exec: vmap or exec_ops.to_sections == 0\n");
511 for (i=0; &exec_ops.to_sections[i] < exec_ops.to_sections_end; i++)
513 if (STREQ(".text", exec_ops.to_sections[i].sec_ptr->name))
515 exec_ops.to_sections[i].addr += vmap->tstart;
516 exec_ops.to_sections[i].endaddr += vmap->tstart;
518 else if (STREQ(".data", exec_ops.to_sections[i].sec_ptr->name))
520 exec_ops.to_sections[i].addr += vmap->dstart;
521 exec_ops.to_sections[i].endaddr += vmap->dstart;
527 /* This was for the old, half-assed, core file support. */
529 text_adjustment (abfd)
533 static int adjustment;
536 if (exec_bfd == execbfd)
539 sect = bfd_get_section_by_name (abfd, ".text");
541 adjustment = sect->filepos - sect->vma;
543 adjustment = 0x200; /* just a wild assumption */
550 * vmap_ldinfo - update VMAP info with ldinfo() information
553 * ldi - ^ to ldinfo() results.
556 register struct ld_info *ldi;
559 register struct vmap *vp;
560 register got_one, retried;
564 * for each *ldi, see if we have a corresponding *vp
565 * if so, update the mapping, and symbol table.
566 * if not, add an entry and symbol table.
569 char *name = ldi->ldinfo_filename;
570 char *memb = name + strlen(name) + 1;
574 if (fstat(ldi->ldinfo_fd, &ii) < 0)
575 fatal("cannot fstat(%d) on %s"
579 for (got_one = 0, vp = vmap; vp; vp = vp->nxt) {
582 /* First try to find a `vp', which is the same as in ldinfo.
583 If not the same, just continue and grep the next `vp'. If same,
584 relocate its tstart, tend, dstart, dend values. If no such `vp'
585 found, get out of this for loop, add this ldi entry as a new vmap
586 (add_vmap) and come back, fins its `vp' and so on... */
588 /* The filenames are not always sufficient to match on. */
590 if ((name[0] == '/' && !STREQ(name, vp->name))
591 || (memb[0] && !STREQ(memb, vp->member)))
594 io = bfd_cache_lookup(vp->bfd); /* totally opaque! */
596 fatal("cannot find BFD's iostream for %s", vp->name);
598 /* see if we are referring to the same file */
600 if (fstat(fileno(io), &vi) < 0)
601 fatal("cannot fstat BFD for %s", vp->name);
603 if (ii.st_dev != vi.st_dev || ii.st_ino != vi.st_ino)
607 close(ldi->ldinfo_fd);
611 /* found a corresponding VMAP. remap! */
614 /* We can assume pointer == CORE_ADDR, this code is native only. */
615 vp->tstart = (CORE_ADDR) ldi->ldinfo_textorg;
616 vp->tend = vp->tstart + ldi->ldinfo_textsize;
617 vp->dstart = (CORE_ADDR) ldi->ldinfo_dataorg;
618 vp->dend = vp->dstart + ldi->ldinfo_datasize;
621 vp->tstart += vp->tadj;
622 vp->tend += vp->tadj;
625 /* relocate symbol table(s). */
628 /* there may be more, so we don't break out of the loop. */
631 /* if there was no matching *vp, we must perforce create the sucker(s) */
632 if (!got_one && !retried) {
637 } while (ldi->ldinfo_next
638 && (ldi = (void *) (ldi->ldinfo_next + (char *) ldi)));
643 * vmap_inferior - print VMAP info for inferior
647 if (inferior_pid == 0)
648 return 0; /* normal processing */
654 /* Read or write the exec file.
656 Args are address within exec file, address within gdb address-space,
657 length, and a flag indicating whether to read or write.
661 0: We cannot handle this address and length.
662 > 0: We have handled N bytes starting at this address.
663 (If N == length, we did it all.) We might be able
664 to handle more bytes beyond this length, but no
666 < 0: We cannot handle this address, but if somebody
667 else handles (-N) bytes, we can start from there.
669 The same routine is used to handle both core and exec files;
670 we just tail-call it with more arguments to select between them. */
673 xfer_memory (memaddr, myaddr, len, write, target)
678 struct target_ops *target;
681 struct section_table *p;
682 CORE_ADDR nextsectaddr, memend;
683 boolean (*xfer_fn) PARAMS ((bfd *, sec_ptr, PTR, file_ptr, bfd_size_type));
688 memend = memaddr + len;
689 xfer_fn = write? bfd_set_section_contents: bfd_get_section_contents;
690 nextsectaddr = memend;
692 for (p = target->to_sections; p < target->to_sections_end; p++)
694 if (p->addr <= memaddr)
695 if (p->endaddr >= memend)
697 /* Entire transfer is within this section. */
698 res = xfer_fn (p->bfd, p->sec_ptr, myaddr, memaddr - p->addr, len);
699 return (res != false)? len: 0;
701 else if (p->endaddr <= memaddr)
703 /* This section ends before the transfer starts. */
708 /* This section overlaps the transfer. Just do half. */
709 len = p->endaddr - memaddr;
710 res = xfer_fn (p->bfd, p->sec_ptr, myaddr, memaddr - p->addr, len);
711 return (res != false)? len: 0;
713 else if (p->addr < nextsectaddr)
714 nextsectaddr = p->addr;
717 if (nextsectaddr >= memend)
718 return 0; /* We can't help */
720 return - (nextsectaddr - memaddr); /* Next boundary where we can help */
724 print_section_info (t, abfd)
725 struct target_ops *t;
728 struct section_table *p;
730 printf_filtered ("\t`%s', ", bfd_get_filename(abfd));
732 printf_filtered ("file type %s.\n", bfd_get_target(abfd));
734 for (p = t->to_sections; p < t->to_sections_end; p++) {
735 printf_filtered ("\t%s", local_hex_string_custom (p->addr, "08"));
736 printf_filtered (" - %s", local_hex_string_custom (p->endaddr, "08"));
738 printf_filtered (" @ %s",
739 local_hex_string_custom (p->sec_ptr->filepos, "08"));
740 printf_filtered (" is %s", bfd_section_name (p->bfd, p->sec_ptr));
741 if (p->bfd != abfd) {
742 printf_filtered (" in %s", bfd_get_filename (p->bfd));
744 printf_filtered ("\n");
751 struct target_ops *t;
753 register struct vmap *vp = vmap;
755 print_section_info (t, exec_bfd);
760 printf("\tMapping info for file `%s'.\n", vp->name);
762 printf("\t %8.8s %8.8s %8.8s %8.8s %8.8s %s\n",
763 "tstart", "tend", "dstart", "dend", "section", "file(member)");
765 for (; vp; vp = vp->nxt)
766 printf("\t0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x %s%s%s%s\n",
772 *vp->member ? "(" : "",
774 *vp->member ? ")" : "");
778 /* Damon's implementation of set_section_command! It is based on the sex member
779 (which is a section pointer from vmap) of vmap.
780 We will not have multiple vmap entries (one for each section), rather transmit
781 text and data base offsets and fix them at the same time. Elimination of sex
782 entry in vmap make this function obsolute, use the one from exec.c.
783 Need further testing!! FIXMEmgo. */
786 set_section_command(args, from_tty)
789 register struct vmap *vp = vmap;
792 unsigned long secaddr;
797 error("Must specify section name and its virtual address");
799 /* Parse out section name */
800 for (secname = args; !isspace(*args); args++)
802 seclen = args - secname;
804 /* Parse out new virtual address */
805 secaddr = parse_and_eval_address(args);
807 for (vp = vmap; vp; vp = vp->nxt) {
809 , bfd_section_name(vp->bfd, vp->sex), seclen)
810 && bfd_section_name(vp->bfd, vp->sex)[seclen] == '\0') {
811 offset = secaddr - vp->tstart;
812 vp->tstart += offset;
819 if (seclen >= sizeof(secprint))
820 seclen = sizeof(secprint) - 1;
821 strncpy(secprint, secname, seclen);
822 secprint[seclen] = '\0';
823 error("Section %s not found", secprint);
827 set_section_command (args, from_tty)
831 struct section_table *p;
834 unsigned long secaddr;
839 error ("Must specify section name and its virtual address");
841 /* Parse out section name */
842 for (secname = args; !isspace(*args); args++) ;
843 seclen = args - secname;
845 /* Parse out new virtual address */
846 secaddr = parse_and_eval_address (args);
848 for (p = exec_ops.to_sections; p < exec_ops.to_sections_end; p++) {
849 if (!strncmp (secname, bfd_section_name (exec_bfd, p->sec_ptr), seclen)
850 && bfd_section_name (exec_bfd, p->sec_ptr)[seclen] == '\0') {
851 offset = secaddr - p->addr;
853 p->endaddr += offset;
855 exec_files_info(&exec_ops);
859 if (seclen >= sizeof (secprint))
860 seclen = sizeof (secprint) - 1;
861 strncpy (secprint, secname, seclen);
862 secprint[seclen] = '\0';
863 error ("Section %s not found", secprint);
868 struct target_ops exec_ops = {
869 "exec", "Local exec file",
870 "Use an executable file as a target.\n\
871 Specify the filename of the executable file.",
872 exec_file_command, exec_close, /* open, close */
873 find_default_attach, 0, 0, 0, /* attach, detach, resume, wait, */
874 0, 0, /* fetch_registers, store_registers, */
875 0, /* prepare_to_store */
876 xfer_memory, exec_files_info,
877 0, 0, /* insert_breakpoint, remove_breakpoint, */
878 0, 0, 0, 0, 0, /* terminal stuff */
879 0, 0, /* kill, load */
881 find_default_create_inferior,
882 0, /* mourn_inferior */
884 0, /* notice_signals */
885 file_stratum, 0, /* next */
886 0, 1, 0, 0, 0, /* all mem, mem, stack, regs, exec */
887 0, 0, /* section pointers */
888 OPS_MAGIC, /* Always the last thing */
891 /* Core file stuff. */
893 /* Relocate symtabs and read in shared library info, based on symbols
894 from the core file. */
896 xcoff_relocate_core ()
898 /* Offset of member MEMBER in a struct of type TYPE. */
900 #define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)
903 /* Size of a struct ld_info except for the variable-length filename. */
904 #define LDINFO_SIZE (offsetof (struct ld_info, ldinfo_filename))
908 struct ld_info *ldip;
911 /* Allocated size of buffer. */
912 int buffer_size = LDINFO_SIZE;
913 char *buffer = xmalloc (buffer_size);
914 struct cleanup *old = make_cleanup (free_current_contents, &buffer);
916 /* FIXME, this restriction should not exist. For now, though I'll
917 avoid coredumps with error() pending a real fix. */
920 ("Can't debug a core file without an executable file (on the RS/6000)");
922 ldinfo_sec = bfd_get_section_by_name (core_bfd, ".ldinfo");
923 if (ldinfo_sec == NULL)
926 fprintf_filtered (stderr, "Couldn't get ldinfo from core file: %s\n",
927 bfd_errmsg (bfd_error));
936 /* Read in everything but the name. */
937 if (bfd_get_section_contents (core_bfd, ldinfo_sec, buffer,
938 offset, LDINFO_SIZE) == 0)
945 if (i == buffer_size)
948 buffer = xrealloc (buffer, buffer_size);
950 if (bfd_get_section_contents (core_bfd, ldinfo_sec, &buffer[i],
953 if (buffer[i++] == '\0')
955 } while (names_found < 2);
957 ldip = (struct ld_info *)buffer;
959 /* Can't use a file descriptor from the core file; need to open it. */
960 ldip->ldinfo_fd = -1;
962 /* The first ldinfo is for the exec file, allocated elsewhere. */
966 vp = add_vmap (ldip);
968 offset += ldip->ldinfo_next;
970 /* We can assume pointer == CORE_ADDR, this code is native only. */
971 vp->tstart = (CORE_ADDR) ldip->ldinfo_textorg;
972 vp->tend = vp->tstart + ldip->ldinfo_textsize;
973 vp->dstart = (CORE_ADDR) ldip->ldinfo_dataorg;
974 vp->dend = vp->dstart + ldip->ldinfo_datasize;
977 vp->tstart += vp->tadj;
978 vp->tend += vp->tadj;
981 /* Unless this is the exec file,
982 add our sections to the section table for the core target. */
986 struct section_table *stp;
988 count = core_ops.to_sections_end - core_ops.to_sections;
990 core_ops.to_sections = (struct section_table *)
991 xrealloc (core_ops.to_sections,
992 sizeof (struct section_table) * count);
993 core_ops.to_sections_end = core_ops.to_sections + count;
994 stp = core_ops.to_sections_end - 2;
996 /* "Why do we add bfd_section_vma?", I hear you cry.
997 Well, the start of the section in the file is actually
998 that far into the section as the struct vmap understands it.
999 So for text sections, bfd_section_vma tends to be 0x200,
1000 and if vp->tstart is 0xd0002000, then the first byte of
1001 the text section on disk corresponds to address 0xd0002200. */
1003 stp->sec_ptr = bfd_get_section_by_name (stp->bfd, ".text");
1004 stp->addr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->tstart;
1005 stp->endaddr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->tend;
1009 stp->sec_ptr = bfd_get_section_by_name (stp->bfd, ".data");
1010 stp->addr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->dstart;
1011 stp->endaddr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->dend;
1016 add_text_to_loadinfo ((CORE_ADDR)ldip->ldinfo_textorg,
1017 (CORE_ADDR)ldip->ldinfo_dataorg);
1018 } while (ldip->ldinfo_next != 0);
1027 add_com("file", class_files, file_command,
1028 "Use FILE as program to be debugged.\n\
1029 It is read for its symbols, for getting the contents of pure memory,\n\
1030 and it is the program executed when you use the `run' command.\n\
1031 If FILE cannot be found as specified, your execution directory path\n\
1032 ($PATH) is searched for a command of that name.\n\
1033 No arg means to have no executable file and no symbols.");
1035 add_com("exec-file", class_files, exec_file_command,
1036 "Use FILE as program for getting contents of pure memory.\n\
1037 If FILE cannot be found as specified, your execution directory path\n\
1038 is searched for a command of that name.\n\
1039 No arg means have no executable file.");
1041 add_com("section", class_files, set_section_command,
1042 "Change the base address of section SECTION of the exec file to ADDR.\n\
1043 This can be used if the exec file does not contain section addresses,\n\
1044 (such as in the a.out format), or when the addresses specified in the\n\
1045 file itself are wrong. Each section must be changed separately. The\n\
1046 ``info files'' command lists all the sections and their addresses.");
1048 add_target(&exec_ops);