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. */
25 #include <sys/types.h>
26 #include <sys/param.h>
41 #include "libbfd.h" /* BFD internals (sigh!) FIXME */
43 /* Prototypes for local functions */
46 add_to_section_table
PARAMS ((bfd
*, sec_ptr
, PTR
));
49 file_command
PARAMS ((char *, int));
52 exec_close
PARAMS ((int));
54 struct section_table
*exec_sections
, *exec_sections_end
;
56 #define eq(s0, s1) !strcmp(s0, s1)
58 /* Whether to open exec and core files read-only or read-write. */
62 bfd
*exec_bfd
; /* needed by core.c */
64 extern char *getenv();
65 extern void child_create_inferior (), child_attach ();
66 extern void add_syms_addr_command ();
67 extern void symbol_file_command ();
68 static void exec_files_info();
71 * the vmap struct is used to describe the virtual address space of
72 * the target we are manipulating. The first entry is always the "exec"
73 * file. Subsequent entries correspond to other objects that are
74 * mapped into the address space of a process created from the "exec" file.
75 * These are either in response to exec()ing the file, in which case all
76 * shared libraries are loaded, or a "load" system call, followed by the
77 * user's issuance of a "load" command.
80 struct vmap
*nxt
; /* ^ to next in chain */
81 bfd
*bfd
; /* BFD for mappable object library */
82 char *name
; /* ^ to object file name */
83 char *member
; /* ^ to member name */
84 CORE_ADDR tstart
; /* virtual addr where member is mapped */
85 CORE_ADDR tend
; /* virtual upper bound of member */
86 CORE_ADDR tadj
; /* heuristically derived adjustment */
87 CORE_ADDR dstart
; /* virtual address of data start */
88 CORE_ADDR dend
; /* vitrual address of data end */
97 static struct vmap
*vmap
; /* current vmap */
99 extern struct target_ops exec_ops
;
102 /* exec_close - done with exec file, clean up all resources. */
105 exec_close(quitting
) {
106 register struct vmap
*vp
, *nxt
;
108 for (nxt
= vmap
; vp
= nxt
; ) {
111 free_named_symtabs(vp
->name
, vp
->member
); /* XXX */
120 * exec_file_command - handle the "exec" command, &c.
123 exec_file_command(filename
, from_tty
)
128 target_preopen(from_tty
);
129 unpush_target(&exec_ops
);
131 /* Now open and digest the file the user requested, if any. */
134 char *scratch_pathname
;
137 filename
= tilde_expand(filename
);
138 make_cleanup (free
, filename
);
140 scratch_chan
= openp(getenv("PATH"), 1, filename
, O_RDONLY
, 0
141 , &scratch_pathname
);
142 if (scratch_chan
< 0)
143 perror_with_name(filename
);
145 bfd
= bfd_fdopenr(scratch_pathname
, NULL
, scratch_chan
);
147 error("Could not open `%s' as an executable file: %s"
148 , scratch_pathname
, bfd_errmsg(bfd_error
));
150 /* make sure we have an object file */
152 if (!bfd_check_format(bfd
, bfd_object
))
153 error("\"%s\": not in executable format: %s."
154 , scratch_pathname
, bfd_errmsg(bfd_error
));
157 /* setup initial vmap */
161 error("Can't find the file sections in `%s': %s"
162 , bfd
->filename
, bfd_errmsg(bfd_error
));
166 if (build_section_table (exec_bfd
, &exec_sections
, &exec_sections_end
))
167 error ("Can't find the file sections in `%s': %s",
168 exec_bfd
->filename
, bfd_errmsg (bfd_error
));
170 /* make sure core, if present, matches */
173 push_target(&exec_ops
);
175 /* Tell display code(if any) about the changed file name. */
177 if (exec_file_display_hook
)
178 (*exec_file_display_hook
)(filename
);
181 exec_close(0); /* just in case */
183 printf("No exec file now.\n");
187 /* Set both the exec file and the symbol file, in one command. What a
188 * novelty. Why did GDB go through four major releases before this
192 file_command(arg
, from_tty
)
195 exec_file_command(arg
, from_tty
);
196 symbol_file_command(arg
, from_tty
);
199 /* Locate all mappable sections of a BFD file.
200 table_pp_char is a char * to get it through bfd_map_over_sections;
201 we cast it back to its proper type. */
204 add_to_section_table (abfd
, asect
, table_pp_char
)
209 struct section_table
**table_pp
= (struct section_table
**)table_pp_char
;
212 aflag
= bfd_get_section_flags (abfd
, asect
);
213 /* FIXME, we need to handle BSS segment here...it alloc's but doesn't load */
214 if (!(aflag
& SEC_LOAD
))
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 * lookup_symtab_bfd - find if we currently have any symbol tables from bfd
247 lookup_objfile_bfd(bfd
*bfd
) {
248 register struct objfile
*s
;
250 for (s
= object_files
; s
; s
= s
->next
)
258 sex_to_vmap(bfd
*bf
, sec_ptr sex
, struct vmap_and_bfd
*vmap_bfd
)
260 register struct vmap
*vp
, **vpp
;
261 register struct symtab
*syms
;
262 bfd
*arch
= vmap_bfd
->pbfd
;
263 vp
= vmap_bfd
->pvmap
;
265 if ((bfd_get_section_flags(bf
, sex
) & SEC_LOAD
) == 0)
268 if (!strcmp(bfd_section_name(bf
, sex
), ".text")) {
270 vp
->tend
= vp
->tstart
+ bfd_section_size(bf
, sex
);
272 /* This is quite a tacky way to recognize the `exec' load segment (rather
273 than shared libraries. You should use `arch' instead. FIXMEmgo */
275 vp
->tadj
= sex
->filepos
- bfd_section_vma(bf
, sex
);
280 else if (!strcmp(bfd_section_name(bf
, sex
), ".data")) {
282 vp
->dend
= vp
->dstart
+ bfd_section_size(bf
, sex
);
285 else if (!strcmp(bfd_section_name(bf
, sex
), ".bss")) /* FIXMEmgo */
286 printf ("bss section in exec! Don't know what the heck to do!\n");
289 /* Make a vmap for the BFD "bf", which might be a member of the archive
290 BFD "arch". If we have not yet read in symbols for this file, do so. */
292 map_vmap (bfd
*bf
, bfd
*arch
)
294 struct vmap_and_bfd vmap_bfd
;
295 struct vmap
*vp
, **vpp
;
298 vp
= (void*) xmalloc (sizeof (*vp
));
301 vp
->name
= bfd_get_filename(arch
? arch
: bf
);
302 vp
->member
= arch
? bfd_get_filename(bf
) : "";
304 vmap_bfd
.pbfd
= arch
;
306 bfd_map_over_sections (bf
, sex_to_vmap
, &vmap_bfd
);
308 obj
= lookup_objfile_bfd (bf
);
309 if (exec_bfd
&& !obj
) {
310 obj
= allocate_objfile (bf
, bfd_get_filename (bf
), 0);
311 syms_from_objfile (obj
, 0, 0, 0);
314 /* find the end of the list, and append. */
315 for (vpp
= &vmap
; *vpp
; vpp
= &(*vpp
)->nxt
)
320 /* Called via iterate_over_msymbols to relocate minimal symbols */
323 relocate_minimal_symbol (objfile
, msymbol
, arg1
, arg2
, arg3
)
324 struct objfile
*objfile
;
325 struct minimal_symbol
*msymbol
;
330 msymbol
-> address
+= (int) arg1
;
333 /* true, if symbol table and minimal symbol table are relocated. */
335 int symtab_relocated
= 0;
338 /* vmap_symtab - handle symbol translation on vmapping */
340 vmap_symtab(vp
, old_start
, vip
)
341 register struct vmap
*vp
;
345 register struct symtab
*s
;
346 register struct objfile
*objfile
;
349 * for each symbol table generated from the vp->bfd
351 for (objfile
= object_files
; objfile
!= NULL
; objfile
= objfile
-> next
)
353 for (s
= objfile
-> symtabs
; s
!= NULL
; s
= s
-> next
) {
355 /* skip over if this is not relocatable and doesn't have a line table */
356 if (s
->nonreloc
&& !LINETABLE (s
))
359 /* matching the symbol table's BFD and the *vp's BFD is hairy.
360 exec_file creates a seperate BFD for possibly the
361 same file as symbol_file.FIXME ALL THIS MUST BE RECTIFIED. */
363 if (objfile
->obfd
== vp
->bfd
) {
364 /* if they match, we luck out. */
366 } else if (vp
->member
[0]) {
367 /* no match, and member present, not this one. */
374 * no match, and no member. need to be sure.
376 io
= bfd_cache_lookup(objfile
->obfd
);
378 fatal("cannot find BFD's iostream for sym");
380 * see if we are referring to the same file
382 if (fstat(fileno(io
), &si
) < 0)
383 fatal("cannot fstat BFD for sym");
385 if (si
.st_dev
!= vip
->st_dev
386 || si
.st_ino
!= vip
->st_ino
)
390 if (vp
->tstart
!= old_start
)
391 vmap_symtab_1(s
, vp
, old_start
);
394 if (vp
->tstart
!= old_start
)
395 iterate_over_msymbols (relocate_minimal_symbol
,
396 (PTR
) (vp
->tstart
- old_start
),
397 (PTR
) NULL
, (PTR
) NULL
);
399 symtab_relocated
= 1;
403 fixup_misc_vector (int disp
)
406 for (ii
=0; ii
< misc_function_count
; ++ii
)
407 if (misc_function_vector
[ii
].address
< 0x10000000)
408 misc_function_vector
[ii
].address
+= disp
;
412 vmap_symtab_1(s
, vp
, old_start
)
413 register struct symtab
*s
;
414 register struct vmap
*vp
;
419 register struct linetable
*l
;
420 struct blockvector
*bv
;
421 register struct block
*b
;
423 register ulong reloc
, dreloc
;
425 if ((reloc
= vp
->tstart
- old_start
) == 0)
428 dreloc
= vp
->dstart
; /* data relocation */
431 * The line table must be relocated. This is only present for
432 * b.text sections, so only vp->text type maps need be considered.
436 for (i
= 0; i
< len
; i
++)
437 l
->item
[i
].pc
+= reloc
;
439 /* if this symbol table is not relocatable, only line table should
440 be relocated and the rest ignored. */
445 len
= BLOCKVECTOR_NBLOCKS(bv
);
447 for (i
= 0; i
< len
; i
++) {
448 b
= BLOCKVECTOR_BLOCK(bv
, i
);
450 BLOCK_START(b
) += reloc
;
451 BLOCK_END(b
) += reloc
;
453 blen
= BLOCK_NSYMS(b
);
454 for (j
= 0; j
< blen
; j
++) {
455 register struct symbol
*sym
;
457 sym
= BLOCK_SYM(b
, j
);
458 switch (SYMBOL_NAMESPACE(sym
)) {
459 case STRUCT_NAMESPACE
:
460 case UNDEF_NAMESPACE
:
463 case LABEL_NAMESPACE
:
468 switch (SYMBOL_CLASS(sym
)) {
470 case LOC_CONST_BYTES
:
484 SYMBOL_VALUE_ADDRESS(sym
) += reloc
;
488 SYMBOL_VALUE_ADDRESS(sym
) += dreloc
;
495 fatal("botched symbol class %x"
496 , SYMBOL_CLASS(sym
));
504 * add_vmap - add a new vmap entry based on ldinfo() information
507 register struct ld_info
*ldi
; {
511 mem
= ldi
->ldinfo_filename
+ strlen(ldi
->ldinfo_filename
) + 1;
512 bfd
= bfd_fdopenr(ldi
->ldinfo_filename
, NULL
, ldi
->ldinfo_fd
);
514 error("Could not open `%s' as an executable file: %s"
515 , ldi
->ldinfo_filename
, bfd_errmsg(bfd_error
));
518 /* make sure we have an object file */
520 if (bfd_check_format(bfd
, bfd_object
))
523 else if (bfd_check_format(bfd
, bfd_archive
)) {
526 * FIXME??? am I tossing BFDs? bfd?
528 while (last
= bfd_openr_next_archived_file(bfd
, last
))
529 if (eq(mem
, last
->filename
))
534 /* FIXME -- should be error */
535 warning("\"%s\": member \"%s\" missing.",
540 if (!bfd_check_format(last
, bfd_object
)) {
541 bfd_close(last
); /* XXX??? */
545 map_vmap (last
, bfd
);
550 /* FIXME -- should be error */
551 warning("\"%s\": not in executable format: %s."
552 , ldi
->ldinfo_filename
, bfd_errmsg(bfd_error
));
558 /* As well as symbol tables, exec_sections need relocation. Otherwise after
559 the inferior process terminates, symbol table is relocated but there is
560 no inferior process. Thus, we have to use `exec' bfd, rather than the inferior
561 process's memory space, when lookipng at symbols.
562 `exec_sections' need to be relocated only once though, as long as the exec
563 file was not changed.
568 if (execbfd
== exec_bfd
)
573 if (!vmap
|| !exec_sections
) {
574 printf ("WARNING: vmap not found in vmap_exec()!\n");
577 /* First exec section is `.text', second is `.data'. If this is changed,
578 then this routine will choke. Better you should check section names,
580 exec_sections
[0].addr
+= vmap
->tstart
;
581 exec_sections
[0].endaddr
+= vmap
->tstart
;
582 exec_sections
[1].addr
+= vmap
->dstart
;
583 exec_sections
[1].endaddr
+= vmap
->dstart
;
588 text_adjustment (abfd
)
592 static int adjustment
;
595 if (exec_bfd
== execbfd
)
598 sect
= bfd_get_section_by_name (abfd
, ".text");
600 adjustment
= sect
->filepos
- sect
->vma
;
602 adjustment
= 0x200; /* just a wild assumption */
609 * vmap_ldinfo - update VMAP info with ldinfo() information
612 * ldi - ^ to ldinfo() results.
615 register struct ld_info
*ldi
;
618 register struct vmap
*vp
;
619 register got_one
, retried
;
623 * for each *ldi, see if we have a corresponding *vp
624 * if so, update the mapping, and symbol table.
625 * if not, add an entry and symbol table.
628 char *name
= ldi
->ldinfo_filename
;
629 char *memb
= name
+ strlen(name
) + 1;
633 if (fstat(ldi
->ldinfo_fd
, &ii
) < 0)
634 fatal("cannot fstat(%d) on %s"
638 for (got_one
= 0, vp
= vmap
; vp
; vp
= vp
->nxt
) {
641 /* The filenames are not always sufficient to match on. */
643 && !eq(name
, vp
->name
))
644 || (memb
[0] && !eq(memb
, vp
->member
)))
647 /* totally opaque! */
648 io
= bfd_cache_lookup(vp
->bfd
);
650 fatal("cannot find BFD's iostream for %s"
653 /* see if we are referring to the same file */
654 if (fstat(fileno(io
), &vi
) < 0)
655 fatal("cannot fstat BFD for %s", vp
->name
);
657 if (ii
.st_dev
!= vi
.st_dev
|| ii
.st_ino
!= vi
.st_ino
)
661 close(ldi
->ldinfo_fd
);
665 /* found a corresponding VMAP. remap! */
668 vp
->tstart
= ldi
->ldinfo_textorg
;
669 vp
->tend
= vp
->tstart
+ ldi
->ldinfo_textsize
;
670 vp
->dstart
= ldi
->ldinfo_dataorg
;
671 vp
->dend
= vp
->dstart
+ ldi
->ldinfo_datasize
;
674 vp
->tstart
+= vp
->tadj
;
675 vp
->tend
+= vp
->tadj
;
678 /* relocate symbol table(s). */
679 vmap_symtab(vp
, ostart
, &vi
);
681 /* there may be more, so we don't break out of the loop. */
685 * if there was no matching *vp, we must perforce create
688 if (!got_one
&& !retried
) {
693 } while (ldi
->ldinfo_next
694 && (ldi
= (void *) (ldi
->ldinfo_next
+ (char *) ldi
)));
700 * vmap_inferior - print VMAP info for inferior
704 if (inferior_pid
== 0)
705 return 0; /* normal processing */
712 /* Read or write the exec file.
714 Args are address within exec file, address within gdb address-space,
715 length, and a flag indicating whether to read or write.
719 0: We cannot handle this address and length.
720 > 0: We have handled N bytes starting at this address.
721 (If N == length, we did it all.) We might be able
722 to handle more bytes beyond this length, but no
724 < 0: We cannot handle this address, but if somebody
725 else handles (-N) bytes, we can start from there.
727 The same routine is used to handle both core and exec files;
728 we just tail-call it with more arguments to select between them. */
731 xfer_memory (memaddr
, myaddr
, len
, write
, abfd
, sections
, sections_end
)
737 struct section_table
*sections
, *sections_end
;
740 struct section_table
*p
;
741 CORE_ADDR nextsectaddr
, memend
;
742 boolean (*xfer_fn
) ();
747 memend
= memaddr
+ len
;
748 xfer_fn
= write
? bfd_set_section_contents
: bfd_get_section_contents
;
749 nextsectaddr
= memend
;
751 for (p
= sections
; p
< sections_end
; p
++)
753 if (p
->addr
<= memaddr
)
754 if (p
->endaddr
>= memend
)
756 /* Entire transfer is within this section. */
757 res
= xfer_fn (abfd
, p
->sec_ptr
, myaddr
, memaddr
- p
->addr
, len
);
758 return (res
!= false)? len
: 0;
760 else if (p
->endaddr
<= memaddr
)
762 /* This section ends before the transfer starts. */
767 /* This section overlaps the transfer. Just do half. */
768 len
= p
->endaddr
- memaddr
;
769 res
= xfer_fn (abfd
, p
->sec_ptr
, myaddr
, memaddr
- p
->addr
, len
);
770 return (res
!= false)? len
: 0;
772 else if (p
->addr
< nextsectaddr
)
773 nextsectaddr
= p
->addr
;
776 if (nextsectaddr
>= memend
)
777 return 0; /* We can't help */
779 return - (nextsectaddr
- memaddr
); /* Next boundary where we can help */
782 /* The function called by target_xfer_memory via our target_ops */
785 exec_xfer_memory (memaddr
, myaddr
, len
, write
)
791 return xfer_memory (memaddr
, myaddr
, len
, write
,
792 exec_bfd
, exec_sections
, exec_sections_end
);
796 * exec_files_info - "info files" command processor
800 register struct vmap
*vp
= vmap
;
805 printf("\tMapping info for file `%s'.\n", vp
->name
);
806 printf("\t %8.8s %8.8s %8.8s %s\n"
807 , "start", "end", "section", "file(member)");
809 for (; vp
; vp
= vp
->nxt
)
810 printf("\t0x%8.8x 0x%8.8x %s%s%s%s\n"
814 , *vp
->member
? "(" : ""
816 , *vp
->member
? ")" : "");
820 /* Damon's implementation of set_section_command! It is based on the sex member
821 (which is a section pointer from vmap) of vmap.
822 We will not have multiple vmap entries (one for each section), rather transmit
823 text and data base offsets and fix them at the same time. Elimination of sex
824 entry in vmap make this function obsolute, use the one from exec.c.
825 Need further testing!! FIXMEmgo. */
828 set_section_command(args
, from_tty
)
831 register struct vmap
*vp
= vmap
;
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
++)
844 seclen
= args
- secname
;
846 /* Parse out new virtual address */
847 secaddr
= parse_and_eval_address(args
);
849 for (vp
= vmap
; vp
; vp
= vp
->nxt
) {
851 , bfd_section_name(vp
->bfd
, vp
->sex
), seclen
)
852 && bfd_section_name(vp
->bfd
, vp
->sex
)[seclen
] == '\0') {
853 offset
= secaddr
- vp
->tstart
;
854 vp
->tstart
+= offset
;
861 if (seclen
>= sizeof(secprint
))
862 seclen
= sizeof(secprint
) - 1;
863 strncpy(secprint
, secname
, seclen
);
864 secprint
[seclen
] = '\0';
865 error("Section %s not found", secprint
);
869 set_section_command (args
, from_tty
)
873 struct section_table
*p
;
876 unsigned long secaddr
;
881 error ("Must specify section name and its virtual address");
883 /* Parse out section name */
884 for (secname
= args
; !isspace(*args
); args
++) ;
885 seclen
= args
- secname
;
887 /* Parse out new virtual address */
888 secaddr
= parse_and_eval_address (args
);
890 for (p
= exec_sections
; p
< exec_sections_end
; p
++) {
891 if (!strncmp (secname
, bfd_section_name (exec_bfd
, p
->sec_ptr
), seclen
)
892 && bfd_section_name (exec_bfd
, p
->sec_ptr
)[seclen
] == '\0') {
893 offset
= secaddr
- p
->addr
;
895 p
->endaddr
+= offset
;
900 if (seclen
>= sizeof (secprint
))
901 seclen
= sizeof (secprint
) - 1;
902 strncpy (secprint
, secname
, seclen
);
903 secprint
[seclen
] = '\0';
904 error ("Section %s not found", secprint
);
909 struct target_ops exec_ops
= {
910 "exec", "Local exec file",
911 "Use an executable file as a target.\n\
912 Specify the filename of the executable file.",
913 exec_file_command
, exec_close
, /* open, close */
914 child_attach
, 0, 0, 0, /* attach, detach, resume, wait, */
915 0, 0, /* fetch_registers, store_registers, */
916 0, 0, 0, /* prepare_to_store, conv_to, conv_from, */
917 exec_xfer_memory
, exec_files_info
,
918 0, 0, /* insert_breakpoint, remove_breakpoint, */
919 0, 0, 0, 0, 0, /* terminal stuff */
920 0, 0, /* kill, load */
922 child_create_inferior
,
923 0, /* mourn_inferior */
924 file_stratum
, 0, /* next */
925 0, 1, 0, 0, 0, /* all mem, mem, stack, regs, exec */
926 0, 0, /* section pointers */
927 OPS_MAGIC
, /* Always the last thing */
935 add_com("file", class_files
, file_command
,
936 "Use FILE as program to be debugged.\n\
937 It is read for its symbols, for getting the contents of pure memory,\n\
938 and it is the program executed when you use the `run' command.\n\
939 If FILE cannot be found as specified, your execution directory path\n\
940 ($PATH) is searched for a command of that name.\n\
941 No arg means to have no executable file and no symbols.");
943 add_com("exec-file", class_files
, exec_file_command
,
944 "Use FILE as program for getting contents of pure memory.\n\
945 If FILE cannot be found as specified, your execution directory path\n\
946 is searched for a command of that name.\n\
947 No arg means have no executable file.");
949 add_com("section", class_files
, set_section_command
,
950 "Change the base address of section SECTION of the exec file to ADDR.\n\
951 This can be used if the exec file does not contain section addresses,\n\
952 (such as in the a.out format), or when the addresses specified in the\n\
953 file itself are wrong. Each section must be changed separately. The\n\
954 ``info files'' command lists all the sections and their addresses.");
956 add_target(&exec_ops
);
This page took 0.061773 seconds and 5 git commands to generate.