* config/m68k/monitor.mt (TDEPFILE): Add remote-es.o.
[deliverable/binutils-gdb.git] / gdb / xcoffexec.c
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.
5
6 This file is part of GDB.
7
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.
12
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.
17
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. */
21
22 /* xcoff-exec - deal with executing XCOFF files. */
23
24 #include "defs.h"
25
26 #include <sys/types.h>
27 #include <sys/param.h>
28 #include <fcntl.h>
29 #include <string.h>
30 #include <ctype.h>
31 #include <sys/stat.h>
32 #include <sys/ldr.h>
33
34 #include "frame.h"
35 #include "inferior.h"
36 #include "target.h"
37 #include "gdbcmd.h"
38 #include "gdbcore.h"
39 #include "symfile.h"
40 #include "objfiles.h"
41
42 #include "libbfd.h" /* BFD internals (sigh!) FIXME */
43 #include "bfd.h"
44 #include "xcoffsolib.h"
45
46 /* Prototypes for local functions */
47
48 static void
49 file_command PARAMS ((char *, int));
50
51 static void
52 exec_close PARAMS ((int));
53
54 static struct vmap *
55 map_vmap PARAMS ((bfd *, bfd *));
56
57 struct section_table *exec_sections, *exec_sections_end;
58
59 /* Whether to open exec and core files read-only or read-write. */
60
61 int write_files = 0;
62
63 extern int info_verbose;
64
65 bfd *exec_bfd; /* needed by core.c */
66
67 extern char *getenv();
68 extern void add_syms_addr_command ();
69 extern void symbol_file_command ();
70 static void exec_files_info();
71
72 struct vmap *vmap; /* current vmap */
73
74 extern struct target_ops exec_ops;
75
76
77 /* exec_close - done with exec file, clean up all resources. */
78
79 static void
80 exec_close(quitting)
81 {
82 register struct vmap *vp, *nxt;
83 struct objfile *obj;
84 int need_symtab_cleanup = 0;
85
86 for (nxt = vmap; vp = nxt; )
87 {
88 nxt = vp->nxt;
89
90 /* if there is an objfile associated with this bfd,
91 free_objfile() will do proper cleanup of objfile *and* bfd. */
92
93 if (vp->objfile)
94 {
95 free_objfile (vp->objfile);
96 need_symtab_cleanup = 1;
97 }
98 else
99 bfd_close(vp->bfd);
100
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);
105 free(vp);
106 }
107
108 vmap = 0;
109
110 /* exec_bfd was already closed (the exec file has a vmap entry). */
111 exec_bfd = NULL;
112
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;
117 }
118
119 if (need_symtab_cleanup)
120 clear_symtab_users ();
121 }
122
123 /*
124 * exec_file_command - handle the "exec" command, &c.
125 */
126 void
127 exec_file_command(filename, from_tty)
128 char *filename;
129 {
130 target_preopen(from_tty);
131
132 /* Remove any previous exec file. */
133 unpush_target(&exec_ops);
134
135 /* Now open and digest the file the user requested, if any. */
136
137 if (filename) {
138 char *scratch_pathname;
139 int scratch_chan;
140
141 filename = tilde_expand(filename);
142 make_cleanup (free, filename);
143
144 scratch_chan = openp(getenv("PATH"), 1, filename,
145 write_files? O_RDWR: O_RDONLY, 0,
146 &scratch_pathname);
147 if (scratch_chan < 0)
148 perror_with_name(filename);
149
150 exec_bfd = bfd_fdopenr(scratch_pathname, gnutarget, scratch_chan);
151 if (!exec_bfd)
152 error("Could not open `%s' as an executable file: %s"
153 , scratch_pathname, bfd_errmsg(bfd_error));
154
155 /* make sure we have an object file */
156
157 if (!bfd_check_format(exec_bfd, bfd_object))
158 error("\"%s\": not in executable format: %s.",
159 scratch_pathname, bfd_errmsg(bfd_error));
160
161
162 /* setup initial vmap */
163
164 map_vmap (exec_bfd, 0);
165 if (!vmap)
166 error("Can't find the file sections in `%s': %s",
167 exec_bfd->filename, bfd_errmsg(bfd_error));
168
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));
173
174 /* make sure core, if present, matches */
175 validate_files();
176
177 push_target(&exec_ops);
178
179 /* Tell display code(if any) about the changed file name. */
180
181 if (exec_file_display_hook)
182 (*exec_file_display_hook)(filename);
183 }
184 else {
185 exec_close(0); /* just in case */
186 if (from_tty)
187 printf_unfiltered("No exec file now.\n");
188 }
189 }
190
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
193 * command was added?
194 */
195 static void
196 file_command(arg, from_tty)
197 char *arg; {
198
199 exec_file_command(arg, from_tty);
200 symbol_file_command(arg, from_tty);
201 }
202
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. */
206
207 static void
208 add_to_section_table (abfd, asect, table_pp_char)
209 bfd *abfd;
210 sec_ptr asect;
211 char *table_pp_char;
212 {
213 struct section_table **table_pp = (struct section_table **)table_pp_char;
214 flagword aflag;
215
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))
219 return;
220 if (0 == bfd_section_size (abfd, asect))
221 return;
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);
226 (*table_pp)++;
227 }
228
229 int
230 build_section_table (some_bfd, start, end)
231 bfd *some_bfd;
232 struct section_table **start, **end;
233 {
234 unsigned count;
235
236 count = bfd_count_sections (some_bfd);
237 if (count == 0)
238 fatal ("aborting"); /* return 1? */
239 if (*start)
240 free (*start);
241 *start = (struct section_table *) xmalloc (count * sizeof (**start));
242 *end = *start;
243 bfd_map_over_sections (some_bfd, add_to_section_table, (char *)end);
244 if (*end > *start + count)
245 fatal ("aborting");
246 /* We could realloc the table, but it probably loses for most files. */
247 return 0;
248 }
249 \f
250 void
251 sex_to_vmap(bfd *bf, sec_ptr sex, PTR arg3)
252 {
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;
258
259 if ((bfd_get_section_flags(bf, sex) & SEC_LOAD) == 0)
260 return;
261
262 if (STREQ(bfd_section_name(bf, sex), ".text")) {
263 vp->tstart = 0;
264 vp->tend = vp->tstart + bfd_section_size(bf, sex);
265
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
269 real instruction. */
270
271 vp->tadj = sex->filepos - bfd_section_vma(bf, sex);
272 }
273
274 else if (STREQ(bfd_section_name(bf, sex), ".data")) {
275 vp->dstart = 0;
276 vp->dend = vp->dstart + bfd_section_size(bf, sex);
277 }
278
279 else if (STREQ(bfd_section_name(bf, sex), ".bss")) /* FIXMEmgo */
280 printf_unfiltered ("bss section in exec! Don't know what the heck to do!\n");
281 }
282
283 /* Make a vmap for the BFD "bf", which might be a member of the archive
284 BFD "arch". Return the new vmap. */
285 struct vmap *
286 map_vmap (bfd *bf, bfd *arch)
287 {
288 struct vmap_and_bfd vmap_bfd;
289 struct vmap *vp, **vpp;
290 struct objfile *obj;
291
292 vp = (void*) xmalloc (sizeof (*vp));
293 memset (vp, '\0', sizeof (*vp));
294 vp->nxt = 0;
295 vp->bfd = bf;
296 vp->name = bfd_get_filename(arch ? arch : bf);
297 vp->member = arch ? bfd_get_filename(bf) : "";
298
299 vmap_bfd.pbfd = arch;
300 vmap_bfd.pvmap = vp;
301 bfd_map_over_sections (bf, sex_to_vmap, &vmap_bfd);
302
303 /* find the end of the list, and append. */
304 for (vpp = &vmap; *vpp; vpp = &(*vpp)->nxt)
305 ;
306 *vpp = vp;
307
308 return vp;
309 }
310
311
312 /* vmap_symtab - handle symbol translation on vmapping */
313
314 static void
315 vmap_symtab (vp)
316 register struct vmap *vp;
317 {
318 register struct objfile *objfile;
319 asection *textsec;
320 asection *datasec;
321 asection *bsssec;
322 CORE_ADDR text_delta;
323 CORE_ADDR data_delta;
324 CORE_ADDR bss_delta;
325 struct section_offsets *new_offsets;
326 int i;
327
328 objfile = vp->objfile;
329 if (objfile == NULL)
330 {
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)
335 return;
336 objfile = symfile_objfile;
337 }
338
339 new_offsets = alloca
340 (sizeof (struct section_offsets)
341 + sizeof (new_offsets->offsets) * objfile->num_sections);
342
343 for (i = 0; i < objfile->num_sections; ++i)
344 ANOFFSET (new_offsets, i) = ANOFFSET (objfile->section_offsets, i);
345
346 textsec = bfd_get_section_by_name (vp->bfd, ".text");
347 text_delta =
348 vp->tstart - ANOFFSET (objfile->section_offsets, textsec->target_index);
349 ANOFFSET (new_offsets, textsec->target_index) = vp->tstart;
350
351 datasec = bfd_get_section_by_name (vp->bfd, ".data");
352 data_delta =
353 vp->dstart - ANOFFSET (objfile->section_offsets, datasec->target_index);
354 ANOFFSET (new_offsets, datasec->target_index) = vp->dstart;
355
356 bsssec = bfd_get_section_by_name (vp->bfd, ".bss");
357 bss_delta =
358 vp->dstart - ANOFFSET (objfile->section_offsets, bsssec->target_index);
359 ANOFFSET (new_offsets, bsssec->target_index) = vp->dstart;
360
361 objfile_relocate (objfile, new_offsets);
362
363 {
364 struct obj_section *s;
365 for (s = objfile->sections; s < objfile->sections_end; ++s)
366 {
367 if (s->sec_ptr->target_index == textsec->target_index)
368 {
369 s->addr += text_delta;
370 s->endaddr += text_delta;
371 }
372 else if (s->sec_ptr->target_index == datasec->target_index)
373 {
374 s->addr += data_delta;
375 s->endaddr += data_delta;
376 }
377 else if (s->sec_ptr->target_index == bsssec->target_index)
378 {
379 s->addr += bss_delta;
380 s->endaddr += bss_delta;
381 }
382 }
383 }
384
385 if (text_delta != 0)
386 /* breakpoints need to be relocated as well. */
387 fixup_breakpoints (0, TEXT_SEGMENT_BASE, text_delta);
388 }
389
390 /* Add symbols for an objfile. */
391 static int
392 objfile_symbol_add (arg)
393 char *arg;
394 {
395 struct objfile *obj = (struct objfile *) arg;
396 syms_from_objfile (obj, 0, 0, 0);
397 new_symfile_objfile (obj, 0, 0);
398 return 1;
399 }
400
401 static struct vmap *add_vmap PARAMS ((struct ld_info *));
402
403 /* Add a new vmap entry based on ldinfo() information.
404
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.
407
408 Return the vmap new entry. */
409 static struct vmap *
410 add_vmap(ldi)
411 register struct ld_info *ldi;
412 {
413 bfd *abfd, *last;
414 register char *mem, *objname;
415 struct objfile *obj;
416 struct vmap *vp;
417
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. */
421
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));
425
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 abfd = bfd_openr (objname, gnutarget);
430 else
431 abfd = bfd_fdopenr(objname, gnutarget, ldi->ldinfo_fd);
432 if (!abfd)
433 error("Could not open `%s' as an executable file: %s",
434 objname, bfd_errmsg(bfd_error));
435
436
437 /* make sure we have an object file */
438
439 if (bfd_check_format(abfd, bfd_object))
440 vp = map_vmap (abfd, 0);
441
442 else if (bfd_check_format(abfd, bfd_archive)) {
443 last = 0;
444 /*
445 * FIXME??? am I tossing BFDs? bfd?
446 */
447 while (last = bfd_openr_next_archived_file(abfd, last))
448 if (STREQ(mem, last->filename))
449 break;
450
451 if (!last) {
452 bfd_close(abfd);
453 /* FIXME -- should be error */
454 warning("\"%s\": member \"%s\" missing.", abfd->filename, mem);
455 return;
456 }
457
458 if (!bfd_check_format(last, bfd_object)) {
459 bfd_close(last); /* XXX??? */
460 goto obj_err;
461 }
462
463 vp = map_vmap (last, abfd);
464 }
465 else {
466 obj_err:
467 bfd_close(abfd);
468 error ("\"%s\": not in executable format: %s.",
469 objname, bfd_errmsg(bfd_error));
470 /*NOTREACHED*/
471 }
472 obj = allocate_objfile (vp->bfd, 0);
473 vp->objfile = obj;
474
475 #ifndef SOLIB_SYMBOLS_MANUAL
476 if (catch_errors (objfile_symbol_add, (char *)obj,
477 "Error while reading shared library symbols:\n",
478 RETURN_MASK_ALL))
479 {
480 /* Note this is only done if symbol reading was successful. */
481 vmap_symtab (vp);
482 vp->loaded = 1;
483 }
484 #endif
485 return vp;
486 }
487
488
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
493 to look up symbols.
494
495 `exec_sections' need to be relocated only once, as long as the exec
496 file remains unchanged.
497 */
498 vmap_exec ()
499 {
500 static bfd *execbfd;
501 int i;
502
503 if (execbfd == exec_bfd)
504 return;
505
506 execbfd = exec_bfd;
507
508 if (!vmap || !exec_ops.to_sections)
509 error ("vmap_exec: vmap or exec_ops.to_sections == 0\n");
510
511 for (i=0; &exec_ops.to_sections[i] < exec_ops.to_sections_end; i++)
512 {
513 if (STREQ(".text", exec_ops.to_sections[i].sec_ptr->name))
514 {
515 exec_ops.to_sections[i].addr += vmap->tstart;
516 exec_ops.to_sections[i].endaddr += vmap->tstart;
517 }
518 else if (STREQ(".data", exec_ops.to_sections[i].sec_ptr->name))
519 {
520 exec_ops.to_sections[i].addr += vmap->dstart;
521 exec_ops.to_sections[i].endaddr += vmap->dstart;
522 }
523 }
524 }
525
526 #if 0
527 /* This was for the old, half-assed, core file support. */
528 int
529 text_adjustment (abfd)
530 bfd *abfd;
531 {
532 static bfd *execbfd;
533 static int adjustment;
534 sec_ptr sect;
535
536 if (exec_bfd == execbfd)
537 return adjustment;
538
539 sect = bfd_get_section_by_name (abfd, ".text");
540 if (sect)
541 adjustment = sect->filepos - sect->vma;
542 else
543 adjustment = 0x200; /* just a wild assumption */
544
545 return adjustment;
546 }
547 #endif
548
549 /*
550 * vmap_ldinfo - update VMAP info with ldinfo() information
551 *
552 * Input:
553 * ldi - ^ to ldinfo() results.
554 */
555 vmap_ldinfo(ldi)
556 register struct ld_info *ldi;
557 {
558 struct stat ii, vi;
559 register struct vmap *vp;
560 register got_one, retried;
561 CORE_ADDR ostart;
562
563 /*
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.
567 */
568 do {
569 char *name = ldi->ldinfo_filename;
570 char *memb = name + strlen(name) + 1;
571
572 retried = 0;
573
574 if (fstat(ldi->ldinfo_fd, &ii) < 0)
575 fatal("cannot fstat(%d) on %s"
576 , ldi->ldinfo_fd
577 , name);
578 retry:
579 for (got_one = 0, vp = vmap; vp; vp = vp->nxt) {
580 FILE *io;
581
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... */
587
588 /* The filenames are not always sufficient to match on. */
589
590 if ((name[0] == '/' && !STREQ(name, vp->name))
591 || (memb[0] && !STREQ(memb, vp->member)))
592 continue;
593
594 io = bfd_cache_lookup(vp->bfd); /* totally opaque! */
595 if (!io)
596 fatal("cannot find BFD's iostream for %s", vp->name);
597
598 /* see if we are referring to the same file */
599
600 if (fstat(fileno(io), &vi) < 0)
601 fatal("cannot fstat BFD for %s", vp->name);
602
603 if (ii.st_dev != vi.st_dev || ii.st_ino != vi.st_ino)
604 continue;
605
606 if (!retried)
607 close(ldi->ldinfo_fd);
608
609 ++got_one;
610
611 /* found a corresponding VMAP. remap! */
612 ostart = vp->tstart;
613
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;
619
620 if (vp->tadj) {
621 vp->tstart += vp->tadj;
622 vp->tend += vp->tadj;
623 }
624
625 /* relocate symbol table(s). */
626 vmap_symtab (vp);
627
628 /* there may be more, so we don't break out of the loop. */
629 }
630
631 /* if there was no matching *vp, we must perforce create the sucker(s) */
632 if (!got_one && !retried) {
633 add_vmap(ldi);
634 ++retried;
635 goto retry;
636 }
637 } while (ldi->ldinfo_next
638 && (ldi = (void *) (ldi->ldinfo_next + (char *) ldi)));
639
640 }
641
642 /*
643 * vmap_inferior - print VMAP info for inferior
644 */
645 vmap_inferior() {
646
647 if (inferior_pid == 0)
648 return 0; /* normal processing */
649
650 exec_files_info();
651 return 1;
652 }
653
654 /* Read or write the exec file.
655
656 Args are address within exec file, address within gdb address-space,
657 length, and a flag indicating whether to read or write.
658
659 Result is a length:
660
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
665 promises.
666 < 0: We cannot handle this address, but if somebody
667 else handles (-N) bytes, we can start from there.
668
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. */
671
672 int
673 xfer_memory (memaddr, myaddr, len, write, target)
674 CORE_ADDR memaddr;
675 char *myaddr;
676 int len;
677 int write;
678 struct target_ops *target;
679 {
680 boolean res;
681 struct section_table *p;
682 CORE_ADDR nextsectaddr, memend;
683 boolean (*xfer_fn) PARAMS ((bfd *, sec_ptr, PTR, file_ptr, bfd_size_type));
684
685 if (len <= 0)
686 fatal ("aborting");
687
688 memend = memaddr + len;
689 xfer_fn = write? bfd_set_section_contents: bfd_get_section_contents;
690 nextsectaddr = memend;
691
692 for (p = target->to_sections; p < target->to_sections_end; p++)
693 {
694 if (p->addr <= memaddr)
695 if (p->endaddr >= memend)
696 {
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;
700 }
701 else if (p->endaddr <= memaddr)
702 {
703 /* This section ends before the transfer starts. */
704 continue;
705 }
706 else
707 {
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;
712 }
713 else if (p->addr < nextsectaddr)
714 nextsectaddr = p->addr;
715 }
716
717 if (nextsectaddr >= memend)
718 return 0; /* We can't help */
719 else
720 return - (nextsectaddr - memaddr); /* Next boundary where we can help */
721 }
722
723 void
724 print_section_info (t, abfd)
725 struct target_ops *t;
726 bfd *abfd;
727 {
728 struct section_table *p;
729
730 /* FIXME-32x64: Need a version of print_address_numeric with field width. */
731 printf_filtered ("\t`%s', ", bfd_get_filename(abfd));
732 wrap_here (" ");
733 printf_filtered ("file type %s.\n", bfd_get_target(abfd));
734
735 for (p = t->to_sections; p < t->to_sections_end; p++) {
736 printf_filtered ("\t%s",
737 local_hex_string_custom ((unsigned long) p->addr, "08l"));
738 printf_filtered (" - %s",
739 local_hex_string_custom ((unsigned long) p->endaddr, "08l"));
740 if (info_verbose)
741 printf_filtered (" @ %s",
742 local_hex_string_custom ((unsigned long) p->sec_ptr->filepos, "08l"));
743 printf_filtered (" is %s", bfd_section_name (p->bfd, p->sec_ptr));
744 if (p->bfd != abfd) {
745 printf_filtered (" in %s", bfd_get_filename (p->bfd));
746 }
747 printf_filtered ("\n");
748 }
749 }
750
751
752 static void
753 exec_files_info (t)
754 struct target_ops *t;
755 {
756 register struct vmap *vp = vmap;
757
758 print_section_info (t, exec_bfd);
759
760 if (!vp)
761 return;
762
763 printf_unfiltered("\tMapping info for file `%s'.\n", vp->name);
764
765 printf_unfiltered("\t %8.8s %8.8s %8.8s %8.8s %8.8s %s\n",
766 "tstart", "tend", "dstart", "dend", "section", "file(member)");
767
768 for (; vp; vp = vp->nxt)
769 printf_unfiltered("\t0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x %s%s%s%s\n",
770 vp->tstart,
771 vp->tend,
772 vp->dstart,
773 vp->dend,
774 vp->name,
775 *vp->member ? "(" : "",
776 vp->member,
777 *vp->member ? ")" : "");
778 }
779
780 #ifdef DAMON
781 /* Damon's implementation of set_section_command! It is based on the sex member
782 (which is a section pointer from vmap) of vmap.
783 We will not have multiple vmap entries (one for each section), rather transmit
784 text and data base offsets and fix them at the same time. Elimination of sex
785 entry in vmap make this function obsolute, use the one from exec.c.
786 Need further testing!! FIXMEmgo. */
787
788 static void
789 set_section_command(args, from_tty)
790 char *args;
791 {
792 register struct vmap *vp = vmap;
793 char *secname;
794 unsigned seclen;
795 unsigned long secaddr;
796 char secprint[100];
797 long offset;
798
799 if (args == 0)
800 error("Must specify section name and its virtual address");
801
802 /* Parse out section name */
803 for (secname = args; !isspace(*args); args++)
804 ;
805 seclen = args - secname;
806
807 /* Parse out new virtual address */
808 secaddr = parse_and_eval_address(args);
809
810 for (vp = vmap; vp; vp = vp->nxt) {
811 if (!strncmp(secname
812 , bfd_section_name(vp->bfd, vp->sex), seclen)
813 && bfd_section_name(vp->bfd, vp->sex)[seclen] == '\0') {
814 offset = secaddr - vp->tstart;
815 vp->tstart += offset;
816 vp->tend += offset;
817 exec_files_info();
818 return;
819 }
820 }
821
822 if (seclen >= sizeof(secprint))
823 seclen = sizeof(secprint) - 1;
824 strncpy(secprint, secname, seclen);
825 secprint[seclen] = '\0';
826 error("Section %s not found", secprint);
827 }
828 #else
829 static void
830 set_section_command (args, from_tty)
831 char *args;
832 int from_tty;
833 {
834 struct section_table *p;
835 char *secname;
836 unsigned seclen;
837 unsigned long secaddr;
838 char secprint[100];
839 long offset;
840
841 if (args == 0)
842 error ("Must specify section name and its virtual address");
843
844 /* Parse out section name */
845 for (secname = args; !isspace(*args); args++) ;
846 seclen = args - secname;
847
848 /* Parse out new virtual address */
849 secaddr = parse_and_eval_address (args);
850
851 for (p = exec_ops.to_sections; p < exec_ops.to_sections_end; p++) {
852 if (!strncmp (secname, bfd_section_name (exec_bfd, p->sec_ptr), seclen)
853 && bfd_section_name (exec_bfd, p->sec_ptr)[seclen] == '\0') {
854 offset = secaddr - p->addr;
855 p->addr += offset;
856 p->endaddr += offset;
857 if (from_tty)
858 exec_files_info(&exec_ops);
859 return;
860 }
861 }
862 if (seclen >= sizeof (secprint))
863 seclen = sizeof (secprint) - 1;
864 strncpy (secprint, secname, seclen);
865 secprint[seclen] = '\0';
866 error ("Section %s not found", secprint);
867 }
868
869 #endif /* !DAMON */
870
871 struct target_ops exec_ops = {
872 "exec", "Local exec file",
873 "Use an executable file as a target.\n\
874 Specify the filename of the executable file.",
875 exec_file_command, exec_close, /* open, close */
876 find_default_attach, 0, 0, 0, /* attach, detach, resume, wait, */
877 0, 0, /* fetch_registers, store_registers, */
878 0, /* prepare_to_store */
879 xfer_memory, exec_files_info,
880 0, 0, /* insert_breakpoint, remove_breakpoint, */
881 0, 0, 0, 0, 0, /* terminal stuff */
882 0, 0, /* kill, load */
883 0, /* lookup sym */
884 find_default_create_inferior,
885 0, /* mourn_inferior */
886 0, /* can_run */
887 0, /* notice_signals */
888 file_stratum, 0, /* next */
889 0, 1, 0, 0, 0, /* all mem, mem, stack, regs, exec */
890 0, 0, /* section pointers */
891 OPS_MAGIC, /* Always the last thing */
892 };
893 \f
894 /* Core file stuff. */
895
896 /* Relocate symtabs and read in shared library info, based on symbols
897 from the core file. */
898 void
899 xcoff_relocate_core ()
900 {
901 /* Offset of member MEMBER in a struct of type TYPE. */
902 #ifndef offsetof
903 #define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)
904 #endif
905
906 /* Size of a struct ld_info except for the variable-length filename. */
907 #define LDINFO_SIZE (offsetof (struct ld_info, ldinfo_filename))
908
909 sec_ptr ldinfo_sec;
910 int offset = 0;
911 struct ld_info *ldip;
912 struct vmap *vp;
913
914 /* Allocated size of buffer. */
915 int buffer_size = LDINFO_SIZE;
916 char *buffer = xmalloc (buffer_size);
917 struct cleanup *old = make_cleanup (free_current_contents, &buffer);
918
919 /* FIXME, this restriction should not exist. For now, though I'll
920 avoid coredumps with error() pending a real fix. */
921 if (vmap == NULL)
922 error
923 ("Can't debug a core file without an executable file (on the RS/6000)");
924
925 ldinfo_sec = bfd_get_section_by_name (core_bfd, ".ldinfo");
926 if (ldinfo_sec == NULL)
927 {
928 bfd_err:
929 fprintf_filtered (gdb_stderr, "Couldn't get ldinfo from core file: %s\n",
930 bfd_errmsg (bfd_error));
931 do_cleanups (old);
932 return;
933 }
934 do
935 {
936 int i;
937 int names_found = 0;
938
939 /* Read in everything but the name. */
940 if (bfd_get_section_contents (core_bfd, ldinfo_sec, buffer,
941 offset, LDINFO_SIZE) == 0)
942 goto bfd_err;
943
944 /* Now the name. */
945 i = LDINFO_SIZE;
946 do
947 {
948 if (i == buffer_size)
949 {
950 buffer_size *= 2;
951 buffer = xrealloc (buffer, buffer_size);
952 }
953 if (bfd_get_section_contents (core_bfd, ldinfo_sec, &buffer[i],
954 offset + i, 1) == 0)
955 goto bfd_err;
956 if (buffer[i++] == '\0')
957 ++names_found;
958 } while (names_found < 2);
959
960 ldip = (struct ld_info *)buffer;
961
962 /* Can't use a file descriptor from the core file; need to open it. */
963 ldip->ldinfo_fd = -1;
964
965 /* The first ldinfo is for the exec file, allocated elsewhere. */
966 if (offset == 0)
967 vp = vmap;
968 else
969 vp = add_vmap (ldip);
970
971 offset += ldip->ldinfo_next;
972
973 /* We can assume pointer == CORE_ADDR, this code is native only. */
974 vp->tstart = (CORE_ADDR) ldip->ldinfo_textorg;
975 vp->tend = vp->tstart + ldip->ldinfo_textsize;
976 vp->dstart = (CORE_ADDR) ldip->ldinfo_dataorg;
977 vp->dend = vp->dstart + ldip->ldinfo_datasize;
978
979 if (vp->tadj != 0) {
980 vp->tstart += vp->tadj;
981 vp->tend += vp->tadj;
982 }
983
984 /* Unless this is the exec file,
985 add our sections to the section table for the core target. */
986 if (vp != vmap)
987 {
988 int count;
989 struct section_table *stp;
990
991 count = core_ops.to_sections_end - core_ops.to_sections;
992 count += 2;
993 core_ops.to_sections = (struct section_table *)
994 xrealloc (core_ops.to_sections,
995 sizeof (struct section_table) * count);
996 core_ops.to_sections_end = core_ops.to_sections + count;
997 stp = core_ops.to_sections_end - 2;
998
999 /* "Why do we add bfd_section_vma?", I hear you cry.
1000 Well, the start of the section in the file is actually
1001 that far into the section as the struct vmap understands it.
1002 So for text sections, bfd_section_vma tends to be 0x200,
1003 and if vp->tstart is 0xd0002000, then the first byte of
1004 the text section on disk corresponds to address 0xd0002200. */
1005 stp->bfd = vp->bfd;
1006 stp->sec_ptr = bfd_get_section_by_name (stp->bfd, ".text");
1007 stp->addr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->tstart;
1008 stp->endaddr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->tend;
1009 stp++;
1010
1011 stp->bfd = vp->bfd;
1012 stp->sec_ptr = bfd_get_section_by_name (stp->bfd, ".data");
1013 stp->addr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->dstart;
1014 stp->endaddr = bfd_section_vma (stp->bfd, stp->sec_ptr) + vp->dend;
1015 }
1016
1017 vmap_symtab (vp);
1018
1019 add_text_to_loadinfo ((CORE_ADDR)ldip->ldinfo_textorg,
1020 (CORE_ADDR)ldip->ldinfo_dataorg);
1021 } while (ldip->ldinfo_next != 0);
1022 vmap_exec ();
1023 do_cleanups (old);
1024 }
1025
1026 void
1027 _initialize_exec()
1028 {
1029
1030 add_com("file", class_files, file_command,
1031 "Use FILE as program to be debugged.\n\
1032 It is read for its symbols, for getting the contents of pure memory,\n\
1033 and it is the program executed when you use the `run' command.\n\
1034 If FILE cannot be found as specified, your execution directory path\n\
1035 ($PATH) is searched for a command of that name.\n\
1036 No arg means to have no executable file and no symbols.");
1037
1038 add_com("exec-file", class_files, exec_file_command,
1039 "Use FILE as program for getting contents of pure memory.\n\
1040 If FILE cannot be found as specified, your execution directory path\n\
1041 is searched for a command of that name.\n\
1042 No arg means have no executable file.");
1043
1044 add_com("section", class_files, set_section_command,
1045 "Change the base address of section SECTION of the exec file to ADDR.\n\
1046 This can be used if the exec file does not contain section addresses,\n\
1047 (such as in the a.out format), or when the addresses specified in the\n\
1048 file itself are wrong. Each section must be changed separately. The\n\
1049 ``info files'' command lists all the sections and their addresses.");
1050
1051 add_target(&exec_ops);
1052 }
This page took 0.049682 seconds and 4 git commands to generate.