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;
85 for (nxt = vmap; vp = nxt; )
89 /* if there is an objfile associated with this bfd,
90 free_objfile() will do proper cleanup of objfile *and* bfd. */
93 free_objfile (vp->objfile);
97 /* FIXME: This routine is #if 0'd in symfile.c. What should we
98 be doing here? Should we just free everything in
99 vp->objfile->symtabs? Should free_objfile do that? */
100 free_named_symtabs(vp->name);
106 /* exec_bfd was already closed (the exec file has a vmap entry). */
109 if (exec_ops.to_sections) {
110 free (exec_ops.to_sections);
111 exec_ops.to_sections = NULL;
112 exec_ops.to_sections_end = NULL;
117 * exec_file_command - handle the "exec" command, &c.
120 exec_file_command(filename, from_tty)
123 target_preopen(from_tty);
125 /* Remove any previous exec file. */
126 unpush_target(&exec_ops);
128 /* Now open and digest the file the user requested, if any. */
131 char *scratch_pathname;
134 filename = tilde_expand(filename);
135 make_cleanup (free, filename);
137 scratch_chan = openp(getenv("PATH"), 1, filename,
138 write_files? O_RDWR: O_RDONLY, 0,
140 if (scratch_chan < 0)
141 perror_with_name(filename);
143 exec_bfd = bfd_fdopenr(scratch_pathname, NULL, scratch_chan);
145 error("Could not open `%s' as an executable file: %s"
146 , scratch_pathname, bfd_errmsg(bfd_error));
148 /* make sure we have an object file */
150 if (!bfd_check_format(exec_bfd, bfd_object))
151 error("\"%s\": not in executable format: %s.",
152 scratch_pathname, bfd_errmsg(bfd_error));
155 /* setup initial vmap */
157 map_vmap (exec_bfd, 0);
159 error("Can't find the file sections in `%s': %s",
160 exec_bfd->filename, bfd_errmsg(bfd_error));
162 if (build_section_table (exec_bfd, &exec_ops.to_sections,
163 &exec_ops.to_sections_end))
164 error ("Can't find the file sections in `%s': %s",
165 exec_bfd->filename, bfd_errmsg (bfd_error));
167 /* make sure core, if present, matches */
170 push_target(&exec_ops);
172 /* Tell display code(if any) about the changed file name. */
174 if (exec_file_display_hook)
175 (*exec_file_display_hook)(filename);
178 exec_close(0); /* just in case */
180 printf("No exec file now.\n");
184 /* Set both the exec file and the symbol file, in one command. What a
185 * novelty. Why did GDB go through four major releases before this
189 file_command(arg, from_tty)
192 exec_file_command(arg, from_tty);
193 symbol_file_command(arg, from_tty);
196 /* Locate all mappable sections of a BFD file.
197 table_pp_char is a char * to get it through bfd_map_over_sections;
198 we cast it back to its proper type. */
201 add_to_section_table (abfd, asect, table_pp_char)
206 struct section_table **table_pp = (struct section_table **)table_pp_char;
209 aflag = bfd_get_section_flags (abfd, asect);
210 /* FIXME, we need to handle BSS segment here...it alloc's but doesn't load */
211 if (!(aflag & SEC_LOAD))
213 if (0 == bfd_section_size (abfd, asect))
215 (*table_pp)->bfd = abfd;
216 (*table_pp)->sec_ptr = asect;
217 (*table_pp)->addr = bfd_section_vma (abfd, asect);
218 (*table_pp)->endaddr = (*table_pp)->addr + bfd_section_size (abfd, asect);
223 build_section_table (some_bfd, start, end)
225 struct section_table **start, **end;
229 count = bfd_count_sections (some_bfd);
231 abort(); /* return 1? */
234 *start = (struct section_table *) xmalloc (count * sizeof (**start));
236 bfd_map_over_sections (some_bfd, add_to_section_table, (char *)end);
237 if (*end > *start + count)
239 /* We could realloc the table, but it probably loses for most files. */
244 sex_to_vmap(bfd *bf, sec_ptr sex, struct vmap_and_bfd *vmap_bfd)
246 register struct vmap *vp, **vpp;
247 register struct symtab *syms;
248 bfd *arch = vmap_bfd->pbfd;
249 vp = vmap_bfd->pvmap;
251 if ((bfd_get_section_flags(bf, sex) & SEC_LOAD) == 0)
254 if (STREQ(bfd_section_name(bf, sex), ".text")) {
256 vp->tend = vp->tstart + bfd_section_size(bf, sex);
258 /* When it comes to this adjustment value, in contrast to our previous
259 belief shared objects should behave the same as the main load segment.
260 This is the offset from the beginning of text section to the first
263 vp->tadj = sex->filepos - bfd_section_vma(bf, sex);
266 else if (STREQ(bfd_section_name(bf, sex), ".data")) {
268 vp->dend = vp->dstart + bfd_section_size(bf, sex);
271 else if (STREQ(bfd_section_name(bf, sex), ".bss")) /* FIXMEmgo */
272 printf ("bss section in exec! Don't know what the heck to do!\n");
275 /* Make a vmap for the BFD "bf", which might be a member of the archive
276 BFD "arch". Return the new vmap. */
278 map_vmap (bfd *bf, bfd *arch)
280 struct vmap_and_bfd vmap_bfd;
281 struct vmap *vp, **vpp;
284 vp = (void*) xmalloc (sizeof (*vp));
285 bzero (vp, sizeof (*vp));
288 vp->name = bfd_get_filename(arch ? arch : bf);
289 vp->member = arch ? bfd_get_filename(bf) : "";
291 vmap_bfd.pbfd = arch;
293 bfd_map_over_sections (bf, sex_to_vmap, &vmap_bfd);
295 /* find the end of the list, and append. */
296 for (vpp = &vmap; *vpp; vpp = &(*vpp)->nxt)
304 /* true, if symbol table and minimal symbol table are relocated. */
306 int symtab_relocated = 0;
309 /* vmap_symtab - handle symbol translation on vmapping */
311 vmap_symtab(vp, old_start, vip)
312 register struct vmap *vp;
316 register struct symtab *s;
317 register struct objfile *objfile;
318 register struct minimal_symbol *msymbol;
320 objfile = vp->objfile;
323 /* OK, it's not an objfile we opened ourselves.
324 Currently, that can only happen with the exec file, so
325 relocate the symbols for the symfile. */
326 if (symfile_objfile == NULL)
328 objfile = symfile_objfile;
331 s = objfile->symtabs;
333 if (vp->tstart != old_start) {
335 /* Once we find a relocation base address for one of the symtabs
336 in this objfile, it will be the same for all symtabs in this
337 objfile. Clean this algorithm. FIXME. */
339 for (; s; s = s->next)
340 if (!s->nonreloc || LINETABLE(s))
341 vmap_symtab_1(s, vp, old_start);
344 /* I believe trampoline entries now have a name like
345 <trampoline>. In any event, if something needs to be changed,
346 it should be changed in ALL_MSYMBOLS, so it works everywhere. */
348 Himm.., recently we nullified trampoline entry names in order not
349 to confuse them with real symbols. Appearently this turned into a
350 problem, and msymbol vector did not get relocated properly. If
351 msymbols have to have non-null names, then we should name
352 trampoline entries with empty strings. */
354 ALL_MSYMBOLS (objfile, msymbol)
356 for (msymbol = objfile->msymbols;
357 SYMBOL_NAME (msymbol) || SYMBOL_VALUE_ADDRESS (msymbol);
360 if (SYMBOL_VALUE_ADDRESS (msymbol) < TEXT_SEGMENT_BASE)
361 SYMBOL_VALUE_ADDRESS (msymbol) += vp->tstart - old_start;
365 if (vp->tstart != old_start) {
366 /* breakpoints need to be relocated as well. */
367 fixup_breakpoints (0, TEXT_SEGMENT_BASE, vp->tstart - old_start);
370 symtab_relocated = 1;
374 vmap_symtab_1(s, vp, old_start)
375 register struct symtab *s;
376 register struct vmap *vp;
381 register struct linetable *l;
382 struct blockvector *bv;
383 register struct block *b;
385 register ulong reloc, dreloc;
387 if ((reloc = vp->tstart - old_start) == 0)
390 dreloc = vp->dstart; /* data relocation */
393 * The line table must be relocated. This is only present for
394 * .text sections, so only vp->text type maps need be considered.
399 for (i = 0; i < len; i++)
400 l->item[i].pc += reloc;
403 /* if this symbol table is not relocatable, only line table should
404 be relocated and the rest ignored. */
409 len = BLOCKVECTOR_NBLOCKS(bv);
411 for (i = 0; i < len; i++) {
412 b = BLOCKVECTOR_BLOCK(bv, i);
414 BLOCK_START(b) += reloc;
415 BLOCK_END(b) += reloc;
417 blen = BLOCK_NSYMS(b);
418 for (j = 0; j < blen; j++) {
419 register struct symbol *sym;
421 sym = BLOCK_SYM(b, j);
422 switch (SYMBOL_NAMESPACE(sym)) {
423 case STRUCT_NAMESPACE:
424 case UNDEF_NAMESPACE:
427 case LABEL_NAMESPACE:
432 switch (SYMBOL_CLASS(sym)) {
434 case LOC_CONST_BYTES:
448 SYMBOL_VALUE_ADDRESS(sym) += reloc;
452 SYMBOL_VALUE_ADDRESS(sym) += dreloc;
459 fatal("botched symbol class %x"
460 , SYMBOL_CLASS(sym));
467 /* Add symbols for an objfile. */
469 objfile_symbol_add (arg)
472 struct objfile *obj = (struct objfile *) arg;
473 syms_from_objfile (obj, 0, 0, 0);
474 new_symfile_objfile (obj, 0, 0);
478 static struct vmap *add_vmap PARAMS ((struct ld_info *));
480 /* Add a new vmap entry based on ldinfo() information.
482 If ldi->ldinfo_fd is not valid (e.g. this struct ld_info is from a
483 core file), the caller should set it to -1, and we will open the file.
485 Return the vmap new entry. */
488 register struct ld_info *ldi;
491 register char *mem, *objname;
495 /* This ldi structure was allocated using alloca() in
496 xcoff_relocate_symtab(). Now we need to have persistent object
497 and member names, so we should save them. */
499 mem = ldi->ldinfo_filename + strlen(ldi->ldinfo_filename) + 1;
500 mem = savestring (mem, strlen (mem));
501 objname = savestring (ldi->ldinfo_filename, strlen (ldi->ldinfo_filename));
503 if (ldi->ldinfo_fd < 0)
504 /* Note that this opens it once for every member; a possible
505 enhancement would be to only open it once for every object. */
506 bfd = bfd_openr (objname, NULL);
508 bfd = bfd_fdopenr(objname, NULL, ldi->ldinfo_fd);
510 error("Could not open `%s' as an executable file: %s",
511 objname, bfd_errmsg(bfd_error));
514 /* make sure we have an object file */
516 if (bfd_check_format(bfd, bfd_object))
517 vp = map_vmap (bfd, 0);
519 else if (bfd_check_format(bfd, bfd_archive)) {
522 * FIXME??? am I tossing BFDs? bfd?
524 while (last = bfd_openr_next_archived_file(bfd, last))
525 if (STREQ(mem, last->filename))
530 /* FIXME -- should be error */
531 warning("\"%s\": member \"%s\" missing.", bfd->filename, mem);
535 if (!bfd_check_format(last, bfd_object)) {
536 bfd_close(last); /* XXX??? */
540 vp = map_vmap (last, bfd);
545 error ("\"%s\": not in executable format: %s.",
546 objname, bfd_errmsg(bfd_error));
549 obj = allocate_objfile (vp->bfd, 0);
552 #ifndef SOLIB_SYMBOLS_MANUAL
553 if (catch_errors (objfile_symbol_add, (char *)obj,
554 "Error while reading shared library symbols:\n"))
556 /* Note this is only done if symbol reading was successful. */
557 vmap_symtab (vp, 0, 0);
565 /* As well as symbol tables, exec_sections need relocation. After
566 the inferior process' termination, there will be a relocated symbol
567 table exist with no corresponding inferior process. At that time, we
568 need to use `exec' bfd, rather than the inferior process's memory space
571 `exec_sections' need to be relocated only once, as long as the exec
572 file remains unchanged.
579 if (execbfd == exec_bfd)
584 if (!vmap || !exec_ops.to_sections)
585 error ("vmap_exec: vmap or exec_ops.to_sections == 0\n");
587 for (i=0; &exec_ops.to_sections[i] < exec_ops.to_sections_end; i++)
589 if (STREQ(".text", exec_ops.to_sections[i].sec_ptr->name))
591 exec_ops.to_sections[i].addr += vmap->tstart;
592 exec_ops.to_sections[i].endaddr += vmap->tstart;
594 else if (STREQ(".data", exec_ops.to_sections[i].sec_ptr->name))
596 exec_ops.to_sections[i].addr += vmap->dstart;
597 exec_ops.to_sections[i].endaddr += vmap->dstart;
603 /* This was for the old, half-assed, core file support. */
605 text_adjustment (abfd)
609 static int adjustment;
612 if (exec_bfd == execbfd)
615 sect = bfd_get_section_by_name (abfd, ".text");
617 adjustment = sect->filepos - sect->vma;
619 adjustment = 0x200; /* just a wild assumption */
626 * vmap_ldinfo - update VMAP info with ldinfo() information
629 * ldi - ^ to ldinfo() results.
632 register struct ld_info *ldi;
635 register struct vmap *vp;
636 register got_one, retried;
640 * for each *ldi, see if we have a corresponding *vp
641 * if so, update the mapping, and symbol table.
642 * if not, add an entry and symbol table.
645 char *name = ldi->ldinfo_filename;
646 char *memb = name + strlen(name) + 1;
650 if (fstat(ldi->ldinfo_fd, &ii) < 0)
651 fatal("cannot fstat(%d) on %s"
655 for (got_one = 0, vp = vmap; vp; vp = vp->nxt) {
658 /* First try to find a `vp', which is the same as in ldinfo.
659 If not the same, just continue and grep the next `vp'. If same,
660 relocate its tstart, tend, dstart, dend values. If no such `vp'
661 found, get out of this for loop, add this ldi entry as a new vmap
662 (add_vmap) and come back, fins its `vp' and so on... */
664 /* The filenames are not always sufficient to match on. */
666 if ((name[0] == '/' && !STREQ(name, vp->name))
667 || (memb[0] && !STREQ(memb, vp->member)))
670 io = bfd_cache_lookup(vp->bfd); /* totally opaque! */
672 fatal("cannot find BFD's iostream for %s", vp->name);
674 /* see if we are referring to the same file */
676 if (fstat(fileno(io), &vi) < 0)
677 fatal("cannot fstat BFD for %s", vp->name);
679 if (ii.st_dev != vi.st_dev || ii.st_ino != vi.st_ino)
683 close(ldi->ldinfo_fd);
687 /* found a corresponding VMAP. remap! */
690 vp->tstart = ldi->ldinfo_textorg;
691 vp->tend = vp->tstart + ldi->ldinfo_textsize;
692 vp->dstart = ldi->ldinfo_dataorg;
693 vp->dend = vp->dstart + ldi->ldinfo_datasize;
696 vp->tstart += vp->tadj;
697 vp->tend += vp->tadj;
700 /* relocate symbol table(s). */
701 vmap_symtab(vp, ostart, &vi);
703 /* there may be more, so we don't break out of the loop. */
706 /* if there was no matching *vp, we must perforce create the sucker(s) */
707 if (!got_one && !retried) {
712 } while (ldi->ldinfo_next
713 && (ldi = (void *) (ldi->ldinfo_next + (char *) ldi)));
718 * vmap_inferior - print VMAP info for inferior
722 if (inferior_pid == 0)
723 return 0; /* normal processing */
729 /* Read or write the exec file.
731 Args are address within exec file, address within gdb address-space,
732 length, and a flag indicating whether to read or write.
736 0: We cannot handle this address and length.
737 > 0: We have handled N bytes starting at this address.
738 (If N == length, we did it all.) We might be able
739 to handle more bytes beyond this length, but no
741 < 0: We cannot handle this address, but if somebody
742 else handles (-N) bytes, we can start from there.
744 The same routine is used to handle both core and exec files;
745 we just tail-call it with more arguments to select between them. */
748 xfer_memory (memaddr, myaddr, len, write, target)
753 struct target_ops *target;
756 struct section_table *p;
757 CORE_ADDR nextsectaddr, memend;
758 boolean (*xfer_fn) PARAMS ((bfd *, sec_ptr, PTR, file_ptr, bfd_size_type));
763 memend = memaddr + len;
764 xfer_fn = write? bfd_set_section_contents: bfd_get_section_contents;
765 nextsectaddr = memend;
767 for (p = target->to_sections; p < target->to_sections_end; p++)
769 if (p->addr <= memaddr)
770 if (p->endaddr >= memend)
772 /* Entire transfer is within this section. */
773 res = xfer_fn (p->bfd, p->sec_ptr, myaddr, memaddr - p->addr, len);
774 return (res != false)? len: 0;
776 else if (p->endaddr <= memaddr)
778 /* This section ends before the transfer starts. */
783 /* This section overlaps the transfer. Just do half. */
784 len = p->endaddr - memaddr;
785 res = xfer_fn (p->bfd, p->sec_ptr, myaddr, memaddr - p->addr, len);
786 return (res != false)? len: 0;
788 else if (p->addr < nextsectaddr)
789 nextsectaddr = p->addr;
792 if (nextsectaddr >= memend)
793 return 0; /* We can't help */
795 return - (nextsectaddr - memaddr); /* Next boundary where we can help */
799 print_section_info (t, abfd)
800 struct target_ops *t;
803 struct section_table *p;
805 printf_filtered ("\t`%s', ", bfd_get_filename(abfd));
807 printf_filtered ("file type %s.\n", bfd_get_target(abfd));
809 for (p = t->to_sections; p < t->to_sections_end; p++) {
810 printf_filtered ("\t%s", local_hex_string_custom (p->addr, "08"));
811 printf_filtered (" - %s", local_hex_string_custom (p->endaddr, "08"));
813 printf_filtered (" @ %s",
814 local_hex_string_custom (p->sec_ptr->filepos, "08"));
815 printf_filtered (" is %s", bfd_section_name (p->bfd, p->sec_ptr));
816 if (p->bfd != abfd) {
817 printf_filtered (" in %s", bfd_get_filename (p->bfd));
819 printf_filtered ("\n");
826 struct target_ops *t;
828 register struct vmap *vp = vmap;
830 print_section_info (t, exec_bfd);
835 printf("\tMapping info for file `%s'.\n", vp->name);
837 printf("\t %8.8s %8.8s %8.8s %8.8s %8.8s %s\n",
838 "tstart", "tend", "dstart", "dend", "section", "file(member)");
840 for (; vp; vp = vp->nxt)
841 printf("\t0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x %s%s%s%s\n",
847 *vp->member ? "(" : "",
849 *vp->member ? ")" : "");
853 /* Damon's implementation of set_section_command! It is based on the sex member
854 (which is a section pointer from vmap) of vmap.
855 We will not have multiple vmap entries (one for each section), rather transmit
856 text and data base offsets and fix them at the same time. Elimination of sex
857 entry in vmap make this function obsolute, use the one from exec.c.
858 Need further testing!! FIXMEmgo. */
861 set_section_command(args, from_tty)
864 register struct vmap *vp = vmap;
867 unsigned long secaddr;
872 error("Must specify section name and its virtual address");
874 /* Parse out section name */
875 for (secname = args; !isspace(*args); args++)
877 seclen = args - secname;
879 /* Parse out new virtual address */
880 secaddr = parse_and_eval_address(args);
882 for (vp = vmap; vp; vp = vp->nxt) {
884 , bfd_section_name(vp->bfd, vp->sex), seclen)
885 && bfd_section_name(vp->bfd, vp->sex)[seclen] == '\0') {
886 offset = secaddr - vp->tstart;
887 vp->tstart += offset;
894 if (seclen >= sizeof(secprint))
895 seclen = sizeof(secprint) - 1;
896 strncpy(secprint, secname, seclen);
897 secprint[seclen] = '\0';
898 error("Section %s not found", secprint);
902 set_section_command (args, from_tty)
906 struct section_table *p;
909 unsigned long secaddr;
914 error ("Must specify section name and its virtual address");
916 /* Parse out section name */
917 for (secname = args; !isspace(*args); args++) ;
918 seclen = args - secname;
920 /* Parse out new virtual address */
921 secaddr = parse_and_eval_address (args);
923 for (p = exec_ops.to_sections; p < exec_ops.to_sections_end; p++) {
924 if (!strncmp (secname, bfd_section_name (exec_bfd, p->sec_ptr), seclen)
925 && bfd_section_name (exec_bfd, p->sec_ptr)[seclen] == '\0') {
926 offset = secaddr - p->addr;
928 p->endaddr += offset;
930 exec_files_info(&exec_ops);
934 if (seclen >= sizeof (secprint))
935 seclen = sizeof (secprint) - 1;
936 strncpy (secprint, secname, seclen);
937 secprint[seclen] = '\0';
938 error ("Section %s not found", secprint);
943 struct target_ops exec_ops = {
944 "exec", "Local exec file",
945 "Use an executable file as a target.\n\
946 Specify the filename of the executable file.",
947 exec_file_command, exec_close, /* open, close */
948 find_default_attach, 0, 0, 0, /* attach, detach, resume, wait, */
949 0, 0, /* fetch_registers, store_registers, */
950 0, /* prepare_to_store */
951 xfer_memory, exec_files_info,
952 0, 0, /* insert_breakpoint, remove_breakpoint, */
953 0, 0, 0, 0, 0, /* terminal stuff */
954 0, 0, /* kill, load */
956 find_default_create_inferior,
957 0, /* mourn_inferior */
959 0, /* notice_signals */
960 file_stratum, 0, /* next */
961 0, 1, 0, 0, 0, /* all mem, mem, stack, regs, exec */
962 0, 0, /* section pointers */
963 OPS_MAGIC, /* Always the last thing */
966 /* Core file stuff. */
968 /* Relocate symtabs and read in shared library info, based on symbols
969 from the core file. */
971 xcoff_relocate_core ()
973 /* Offset of member MEMBER in a struct of type TYPE. */
975 #define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)
978 /* Size of a struct ld_info except for the variable-length filename. */
979 #define LDINFO_SIZE (offsetof (struct ld_info, ldinfo_filename))
983 struct ld_info *ldip;
986 /* Allocated size of buffer. */
987 int buffer_size = LDINFO_SIZE;
988 char *buffer = xmalloc (buffer_size);
989 struct cleanup *old = make_cleanup (free_current_contents, &buffer);
991 ldinfo_sec = bfd_get_section_by_name (core_bfd, ".ldinfo");
992 if (ldinfo_sec == NULL)
995 fprintf_filtered (stderr, "Couldn't get ldinfo from core file: %s\n",
996 bfd_errmsg (bfd_error));
1003 int names_found = 0;
1005 /* Read in everything but the name. */
1006 if (bfd_get_section_contents (core_bfd, ldinfo_sec, buffer,
1007 offset, LDINFO_SIZE) == 0)
1014 if (i == buffer_size)
1017 buffer = xrealloc (buffer, buffer_size);
1019 if (bfd_get_section_contents (core_bfd, ldinfo_sec, &buffer[i],
1020 offset + i, 1) == 0)
1022 if (buffer[i++] == '\0')
1024 } while (names_found < 2);
1026 ldip = (struct ld_info *)buffer;
1028 /* Can't use a file descriptor from the core file; need to open it. */
1029 ldip->ldinfo_fd = -1;
1031 /* The first ldinfo is for the exec file, allocated elsewhere. */
1035 vp = add_vmap (ldip);
1037 offset += ldip->ldinfo_next;
1039 vp->tstart = ldip->ldinfo_textorg;
1040 vp->tend = vp->tstart + ldip->ldinfo_textsize;
1041 vp->dstart = ldip->ldinfo_dataorg;
1042 vp->dend = vp->dstart + ldip->ldinfo_datasize;
1044 if (vp->tadj != 0) {
1045 vp->tstart += vp->tadj;
1046 vp->tend += vp->tadj;
1049 /* Unless this is the exec file,
1050 add our sections to the section table for the core target. */
1054 struct section_table *stp;
1056 count = core_ops.to_sections_end - core_ops.to_sections;
1058 core_ops.to_sections = (struct section_table *)
1059 xrealloc (core_ops.to_sections,
1060 sizeof (struct section_table) * count);
1061 core_ops.to_sections_end = core_ops.to_sections + count;
1062 stp = core_ops.to_sections_end - 2;
1064 /* "Why do we add bfd_section_vma?", I hear you cry.
1065 Well, the start of the section in the file is actually
1066 that far into the section as the struct vmap understands it.
1067 So for text sections, bfd_section_vma tends to be 0x200,
1068 and if vp->tstart is 0xd0002000, then the first byte of
1069 the text section on disk corresponds to address 0xd0002200. */
1071 stp->sec_ptr = bfd_get_section_by_name (stp->bfd, ".text");
1072 stp->addr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->tstart;
1073 stp->endaddr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->tend;
1077 stp->sec_ptr = bfd_get_section_by_name (stp->bfd, ".data");
1078 stp->addr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->dstart;
1079 stp->endaddr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->dend;
1082 vmap_symtab (vp, 0, 0);
1084 add_text_to_loadinfo (ldip->ldinfo_textorg, ldip->ldinfo_dataorg);
1085 } while (ldip->ldinfo_next != 0);
1094 add_com("file", class_files, file_command,
1095 "Use FILE as program to be debugged.\n\
1096 It is read for its symbols, for getting the contents of pure memory,\n\
1097 and it is the program executed when you use the `run' command.\n\
1098 If FILE cannot be found as specified, your execution directory path\n\
1099 ($PATH) is searched for a command of that name.\n\
1100 No arg means to have no executable file and no symbols.");
1102 add_com("exec-file", class_files, exec_file_command,
1103 "Use FILE as program for getting contents of pure memory.\n\
1104 If FILE cannot be found as specified, your execution directory path\n\
1105 is searched for a command of that name.\n\
1106 No arg means have no executable file.");
1108 add_com("section", class_files, set_section_command,
1109 "Change the base address of section SECTION of the exec file to ADDR.\n\
1110 This can be used if the exec file does not contain section addresses,\n\
1111 (such as in the a.out format), or when the addresses specified in the\n\
1112 file itself are wrong. Each section must be changed separately. The\n\
1113 ``info files'' command lists all the sections and their addresses.");
1115 add_target(&exec_ops);