]> Git Repo - binutils.git/blob - gdb/xcoffexec.c
* xcoffexec.c (vmap_ldinfo): Fix "/" for '/' typo, reported
[binutils.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 "xcoffsolib.h"
44
45 /* Prototypes for local functions */
46
47 static void
48 file_command PARAMS ((char *, int));
49
50 static void
51 exec_close PARAMS ((int));
52
53 struct section_table *exec_sections, *exec_sections_end;
54
55 /* Whether to open exec and core files read-only or read-write.  */
56
57 int write_files = 0;
58
59 extern int info_verbose;
60
61 bfd *exec_bfd;                  /* needed by core.c     */
62
63 extern char *getenv();
64 extern void add_syms_addr_command ();
65 extern void symbol_file_command ();
66 static void exec_files_info();
67 extern struct objfile *lookup_objfile_bfd ();
68
69 #if 0
70 /*
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.
78  */
79 struct vmap {
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          */
89 };
90
91
92 struct vmap_and_bfd {
93   bfd *pbfd;
94   struct vmap *pvmap;
95 };
96
97 static struct vmap *vmap;       /* current vmap                         */
98 #endif /* 0 */
99
100 struct vmap *vmap;              /* current vmap */
101
102 extern struct target_ops exec_ops;
103
104
105 /* exec_close - done with exec file, clean up all resources. */
106
107 static void
108 exec_close(quitting)
109 {
110   register struct vmap *vp, *nxt;
111   struct objfile *obj;
112   
113   for (nxt = vmap; vp = nxt; )
114     {
115       nxt = vp->nxt;
116
117       /* if there is an objfile associated with this bfd,
118          free_objfile() will do proper cleanup of objfile *and* bfd. */
119                    
120       if (obj = lookup_objfile_bfd (vp->bfd))
121         free_objfile (obj);
122       else
123         bfd_close(vp->bfd);
124       
125       free_named_symtabs(vp->name);
126       free(vp);
127     }
128   
129   vmap = 0;
130
131   if (exec_bfd) {
132     bfd_close (exec_bfd);
133     exec_bfd = NULL;
134   }
135   if (exec_ops.to_sections) {
136     free (exec_ops.to_sections);
137     exec_ops.to_sections = NULL;
138     exec_ops.to_sections_end = NULL;
139   }
140 }
141
142 /*
143  * exec_file_command -  handle the "exec" command, &c.
144  */
145 void
146 exec_file_command(filename, from_tty)
147 char *filename;
148 {
149   target_preopen(from_tty);
150
151   /* Remove any previous exec file.  */
152   unpush_target(&exec_ops);
153
154   /* Now open and digest the file the user requested, if any. */
155
156   if (filename) {
157         char *scratch_pathname;
158         int scratch_chan;
159       
160         filename = tilde_expand(filename);
161         make_cleanup (free, filename);
162       
163         scratch_chan = openp(getenv("PATH"), 1, filename,
164                              write_files? O_RDWR: O_RDONLY, 0,
165                              &scratch_pathname);
166         if (scratch_chan < 0)
167           perror_with_name(filename);
168
169         exec_bfd = bfd_fdopenr(scratch_pathname, NULL, scratch_chan);
170         if (!exec_bfd)
171           error("Could not open `%s' as an executable file: %s"
172                       , scratch_pathname, bfd_errmsg(bfd_error));
173
174         /* make sure we have an object file */
175
176         if (!bfd_check_format(exec_bfd, bfd_object))
177                 error("\"%s\": not in executable format: %s.",
178                       scratch_pathname, bfd_errmsg(bfd_error));
179
180
181         /* setup initial vmap */
182
183         map_vmap (exec_bfd, 0);
184         if (!vmap)
185                 error("Can't find the file sections in `%s': %s",
186                       exec_bfd->filename, bfd_errmsg(bfd_error));
187
188         if (build_section_table (exec_bfd, &exec_ops.to_sections,
189                                 &exec_ops.to_sections_end))
190           error ("Can't find the file sections in `%s': %s", 
191                 exec_bfd->filename, bfd_errmsg (bfd_error));
192
193         /* make sure core, if present, matches */
194         validate_files();
195
196         push_target(&exec_ops);
197
198         /* Tell display code(if any) about the changed file name. */
199
200         if (exec_file_display_hook)
201                 (*exec_file_display_hook)(filename);
202   } 
203   else {
204         exec_close(0);  /* just in case */
205         if (from_tty)
206           printf("No exec file now.\n");
207   }
208 }
209
210 /* Set both the exec file and the symbol file, in one command.  What a
211  * novelty.  Why did GDB go through four major releases before this
212  * command was added?
213  */
214 static void
215 file_command(arg, from_tty)
216 char *arg; {
217
218         exec_file_command(arg, from_tty);
219         symbol_file_command(arg, from_tty);
220 }
221
222 /* Locate all mappable sections of a BFD file. 
223    table_pp_char is a char * to get it through bfd_map_over_sections;
224    we cast it back to its proper type.  */
225
226 static void
227 add_to_section_table (abfd, asect, table_pp_char)
228      bfd *abfd;
229      sec_ptr asect;
230      char *table_pp_char;
231 {
232   struct section_table **table_pp = (struct section_table **)table_pp_char;
233   flagword aflag;
234
235   aflag = bfd_get_section_flags (abfd, asect);
236   /* FIXME, we need to handle BSS segment here...it alloc's but doesn't load */
237   if (!(aflag & SEC_LOAD))
238     return;
239   if (0 == bfd_section_size (abfd, asect))
240     return;
241   (*table_pp)->bfd = abfd;
242   (*table_pp)->sec_ptr = asect;
243   (*table_pp)->addr = bfd_section_vma (abfd, asect);
244   (*table_pp)->endaddr = (*table_pp)->addr + bfd_section_size (abfd, asect);
245   (*table_pp)++;
246 }
247
248 int
249 build_section_table (some_bfd, start, end)
250      bfd *some_bfd;
251      struct section_table **start, **end;
252 {
253   unsigned count;
254
255   count = bfd_count_sections (some_bfd);
256   if (count == 0)
257     abort();    /* return 1? */
258   if (*start)
259     free (*start);
260   *start = (struct section_table *) xmalloc (count * sizeof (**start));
261   *end = *start;
262   bfd_map_over_sections (some_bfd, add_to_section_table, (char *)end);
263   if (*end > *start + count)
264     abort();
265   /* We could realloc the table, but it probably loses for most files.  */
266   return 0;
267 }
268
269 /*
270  * lookup_symtab_bfd -  find if we currently have any symbol tables from bfd
271  */
272 struct objfile *
273 lookup_objfile_bfd(bfd *bfd) {
274         register struct objfile *s;
275
276         for (s = object_files; s; s = s->next)
277                 if (s->obfd == bfd)
278                         return s;
279         return 0;
280 }
281
282
283 void
284 sex_to_vmap(bfd *bf, sec_ptr sex, struct vmap_and_bfd *vmap_bfd) 
285 {
286   register struct vmap *vp, **vpp;
287   register struct symtab *syms;
288   bfd *arch = vmap_bfd->pbfd;
289   vp = vmap_bfd->pvmap;
290
291   if ((bfd_get_section_flags(bf, sex) & SEC_LOAD) == 0)
292     return;
293
294   if (STREQ(bfd_section_name(bf, sex), ".text")) {
295     vp->tstart = 0;
296     vp->tend   = vp->tstart + bfd_section_size(bf, sex);
297
298     /* When it comes to this adjustment value, in contrast to our previous
299        belief shared objects should behave the same as the main load segment.
300        This is the offset from the beginning of text section to the first
301        real instruction. */
302
303     vp->tadj = sex->filepos - bfd_section_vma(bf, sex);
304   }
305
306   else if (STREQ(bfd_section_name(bf, sex), ".data")) {
307     vp->dstart = 0;
308     vp->dend   = vp->dstart + bfd_section_size(bf, sex);
309   }
310
311   else if (STREQ(bfd_section_name(bf, sex), ".bss"))    /* FIXMEmgo */
312     printf ("bss section in exec! Don't know what the heck to do!\n");
313 }
314
315 /* Make a vmap for the BFD "bf", which might be a member of the archive
316    BFD "arch".  If we have not yet read in symbols for this file, do so.  */
317
318 map_vmap (bfd *bf, bfd *arch)
319 {
320   struct vmap_and_bfd vmap_bfd;
321   struct vmap *vp, **vpp;
322   struct objfile *obj;
323
324   vp = (void*) xmalloc (sizeof (*vp));
325   bzero (vp, sizeof (*vp));
326   vp->nxt = 0;
327   vp->bfd = bf;
328   vp->name = bfd_get_filename(arch ? arch : bf);
329   vp->member = arch ? bfd_get_filename(bf) : "";
330   
331   vmap_bfd.pbfd = arch;
332   vmap_bfd.pvmap = vp;
333   bfd_map_over_sections (bf, sex_to_vmap, &vmap_bfd);
334
335 #if 0
336   /* This is only needed if we want to load shared libraries no matter what.
337      Since we provide the choice of incremental loading of shared objects
338      now, we do not have to load them as default anymore. */
339     
340   obj = lookup_objfile_bfd (bf);
341   if (exec_bfd && !obj) {
342     obj = allocate_objfile (bf, 0);
343
344     syms_from_objfile (obj, 0, 0, 0);
345     new_symfile_objfile (obj, 0, 0);
346   }
347 #endif
348
349   /* find the end of the list, and append. */
350   for (vpp = &vmap; *vpp; vpp = &(*vpp)->nxt)
351   ;
352   *vpp = vp;
353 }
354
355
356 /* true, if symbol table and minimal symbol table are relocated. */
357
358 int symtab_relocated = 0;
359
360
361 /*  vmap_symtab -       handle symbol translation on vmapping */
362
363 vmap_symtab(vp, old_start, vip)
364 register struct vmap *vp;
365 CORE_ADDR old_start;
366 struct stat *vip; 
367 {
368   register struct symtab *s;
369   register struct objfile *objfile;
370   register struct minimal_symbol *msymbol;
371   
372   /*
373    * for each symbol table generated from the vp->bfd
374    */
375   ALL_OBJFILES (objfile)
376     {
377       for (s = objfile -> symtabs; s != NULL; s = s -> next) {
378         
379         /* skip over if this is not relocatable and doesn't have a line table */
380         if (s->nonreloc && !LINETABLE (s))
381           continue;
382         
383         /* matching the symbol table's BFD and the *vp's BFD is hairy.
384            exec_file creates a seperate BFD for possibly the
385            same file as symbol_file.FIXME ALL THIS MUST BE RECTIFIED. */
386         
387         if (objfile->obfd == vp->bfd) {
388           /* if they match, we luck out. */
389           ;
390         } else if (vp->member[0]) {
391           /* no match, and member present, not this one. */
392           continue;
393         } else if (vip) {
394           /* No match, and no member. need to be sure.
395              If we were given a stat structure, see if the open file
396              underlying this BFD matches.  */
397           struct stat si;
398           FILE *io;
399           
400           io = bfd_cache_lookup(objfile->obfd);
401           if (!io)
402             fatal("cannot find BFD's iostream for sym");
403
404           /* see if we are referring to the same file */
405           if (fstat(fileno(io), &si) < 0)
406             fatal("cannot fstat BFD for sym");
407           
408           if ((si.st_dev != vip->st_dev
409               || si.st_ino != vip->st_ino))
410             continue;
411         } else {
412           continue;     /* No stat struct: no way to match it */
413         }
414
415         if (vp->tstart != old_start) {
416
417           /* Once we find a relocation base address for one of the symtabs
418              in this objfile, it will be the same for all symtabs in this
419              objfile. Clean this algorithm. FIXME. */
420
421           for (; s; s = s->next)
422             if (!s->nonreloc || LINETABLE(s))
423                 vmap_symtab_1(s, vp, old_start);
424
425 #if 0 
426           Himm.., recently we nullified trampoline entry names in order not
427           to confuse them with real symbols.  Appearently this turned into a
428           problem, and msymbol vector did not get relocated properly.  If
429           msymbols have to have non-null names, then we should name
430           trampoline entries with empty strings. 
431
432           ALL_MSYMBOLS (objfile, msymbol)
433 #else
434           for (msymbol = objfile->msymbols;
435                SYMBOL_NAME (msymbol) || SYMBOL_VALUE_ADDRESS (msymbol);
436                (msymbol)++)
437 #endif
438               if (SYMBOL_VALUE_ADDRESS (msymbol) < TEXT_SEGMENT_BASE)
439                 SYMBOL_VALUE_ADDRESS (msymbol) += vp->tstart - old_start;
440
441            break;
442         }
443       }
444     }
445
446   if (vp->tstart != old_start) {
447     /* breakpoints need to be relocated as well. */
448     fixup_breakpoints (0, TEXT_SEGMENT_BASE, vp->tstart - old_start);
449   }
450   
451   symtab_relocated = 1;
452 }
453
454
455 vmap_symtab_1(s, vp, old_start)
456 register struct symtab *s;
457 register struct vmap *vp;
458 CORE_ADDR old_start; 
459 {
460     register int i, j;
461     int len, blen;
462     register struct linetable *l;
463     struct blockvector *bv;
464     register struct block *b;
465     int depth;
466     register ulong reloc, dreloc;
467     
468     if ((reloc = vp->tstart - old_start) == 0)
469         return;
470
471     dreloc = vp->dstart;                        /* data relocation */
472
473     /*
474      * The line table must be relocated.  This is only present for
475      * .text sections, so only vp->text type maps need be considered.
476      */
477     l = LINETABLE (s);
478     if (l) {
479       len = l->nitems;
480       for (i = 0; i < len; i++)
481         l->item[i].pc += reloc;
482     }
483
484     /* if this symbol table is not relocatable, only line table should
485        be relocated and the rest ignored. */
486     if (s->nonreloc)
487       return;
488     
489     bv  = BLOCKVECTOR(s);
490     len = BLOCKVECTOR_NBLOCKS(bv);
491     
492     for (i = 0; i < len; i++) {
493         b = BLOCKVECTOR_BLOCK(bv, i);
494         
495         BLOCK_START(b) += reloc;
496         BLOCK_END(b)   += reloc;
497         
498         blen = BLOCK_NSYMS(b);
499         for (j = 0; j < blen; j++) {
500             register struct symbol *sym;
501             
502             sym = BLOCK_SYM(b, j);
503             switch (SYMBOL_NAMESPACE(sym)) {
504               case STRUCT_NAMESPACE:
505               case UNDEF_NAMESPACE:
506                 continue;
507                 
508               case LABEL_NAMESPACE:
509               case VAR_NAMESPACE:
510                 break;
511             }
512             
513             switch (SYMBOL_CLASS(sym)) {
514               case LOC_CONST:
515               case LOC_CONST_BYTES:
516               case LOC_LOCAL:
517               case LOC_REGISTER:
518               case LOC_ARG:
519               case LOC_LOCAL_ARG:
520               case LOC_REF_ARG:
521               case LOC_REGPARM:
522               case LOC_TYPEDEF:
523                 continue;
524                 
525 #ifdef FIXME
526               case LOC_EXTERNAL:
527 #endif
528               case LOC_LABEL:
529                 SYMBOL_VALUE_ADDRESS(sym) += reloc;
530                 break;
531
532               case LOC_STATIC:
533                 SYMBOL_VALUE_ADDRESS(sym) += dreloc;
534                 break;
535
536               case LOC_BLOCK:
537                 break;
538                 
539               default:
540                 fatal("botched symbol class %x"
541                       , SYMBOL_CLASS(sym));
542                 break;
543             }
544         }
545     }
546 }
547
548 /*
549  * add_vmap -   add a new vmap entry based on ldinfo() information
550  */
551 add_vmap(ldi)
552 register struct ld_info *ldi; {
553         bfd *bfd, *last;
554         register char *mem, *objname;
555
556         /* This ldi structure was allocated using alloca() in 
557            xcoff_relocate_symtab(). Now we need to have persistent object 
558            and member names, so we should save them. */
559
560         mem = ldi->ldinfo_filename + strlen(ldi->ldinfo_filename) + 1;
561         mem = savestring (mem, strlen (mem));
562         objname = savestring (ldi->ldinfo_filename, strlen (ldi->ldinfo_filename));
563
564         bfd = bfd_fdopenr(objname, NULL, ldi->ldinfo_fd);
565         if (!bfd)
566           error("Could not open `%s' as an executable file: %s",
567                                         objname, bfd_errmsg(bfd_error));
568
569
570         /* make sure we have an object file */
571
572         if (bfd_check_format(bfd, bfd_object))
573           map_vmap (bfd, 0);
574
575         else if (bfd_check_format(bfd, bfd_archive)) {
576                 last = 0;
577                 /*
578                  * FIXME??? am I tossing BFDs?  bfd?
579                  */
580                 while (last = bfd_openr_next_archived_file(bfd, last))
581                         if (STREQ(mem, last->filename))
582                                 break;
583
584                 if (!last) {
585                   bfd_close(bfd);
586                   /* FIXME -- should be error */
587                   warning("\"%s\": member \"%s\" missing.", bfd->filename, mem);
588                   return;
589                 }
590
591                 if (!bfd_check_format(last, bfd_object)) {
592                         bfd_close(last);        /* XXX???       */
593                         goto obj_err;
594                 }
595
596                 map_vmap (last, bfd);
597         }
598         else {
599             obj_err:
600                 bfd_close(bfd);
601 /* FIXME -- should be error */
602                 warning("\"%s\": not in executable format: %s."
603                       , objname, bfd_errmsg(bfd_error));
604                 return;
605         }
606 }
607
608
609 /* As well as symbol tables, exec_sections need relocation. After
610    the inferior process' termination, there will be a relocated symbol
611    table exist with no corresponding inferior process. At that time, we
612    need to use `exec' bfd, rather than the inferior process's memory space
613    to look up symbols.
614
615    `exec_sections' need to be relocated only once, as long as the exec
616    file remains unchanged.
617 */
618 vmap_exec ()
619 {
620   static bfd *execbfd;
621   int i;
622
623   if (execbfd == exec_bfd)
624     return;
625
626   execbfd = exec_bfd;
627
628   if (!vmap || !exec_ops.to_sections)
629     error ("vmap_exec: vmap or exec_ops.to_sections == 0\n");
630
631   for (i=0; &exec_ops.to_sections[i] < exec_ops.to_sections_end; i++)
632     {
633       if (STREQ(".text", exec_ops.to_sections[i].sec_ptr->name))
634         {
635           exec_ops.to_sections[i].addr += vmap->tstart;
636           exec_ops.to_sections[i].endaddr += vmap->tstart;
637         }
638       else if (STREQ(".data", exec_ops.to_sections[i].sec_ptr->name))
639         {
640           exec_ops.to_sections[i].addr += vmap->dstart;
641           exec_ops.to_sections[i].endaddr += vmap->dstart;
642         }
643     }
644 }
645
646
647 int
648 text_adjustment (abfd)
649 bfd *abfd;
650 {
651   static bfd *execbfd;
652   static int adjustment;
653   sec_ptr  sect;
654
655   if (exec_bfd == execbfd)
656     return adjustment;
657
658   sect = bfd_get_section_by_name (abfd, ".text");
659   if (sect)
660     adjustment = sect->filepos - sect->vma;
661   else
662     adjustment = 0x200;                         /* just a wild assumption */
663
664   return adjustment;
665 }
666
667
668 /*
669  * vmap_ldinfo -        update VMAP info with ldinfo() information
670  *
671  * Input:
672  *      ldi     -       ^ to ldinfo() results.
673  */
674 vmap_ldinfo(ldi)
675 register struct ld_info *ldi;
676 {
677   struct stat ii, vi;
678   register struct vmap *vp;
679   register got_one, retried;
680   CORE_ADDR ostart;
681
682   /*
683    * for each *ldi, see if we have a corresponding *vp
684    *    if so, update the mapping, and symbol table.
685    *    if not, add an entry and symbol table.
686    */
687   do {
688         char *name = ldi->ldinfo_filename;
689         char *memb = name + strlen(name) + 1;
690
691         retried = 0;
692
693         if (fstat(ldi->ldinfo_fd, &ii) < 0)
694                 fatal("cannot fstat(%d) on %s"
695                       , ldi->ldinfo_fd
696                       , name);
697 retry:
698         for (got_one = 0, vp = vmap; vp; vp = vp->nxt) {
699           FILE *io;
700
701           /* First try to find a `vp', which is the same as in ldinfo.
702              If not the same, just continue and grep the next `vp'. If same,
703              relocate its tstart, tend, dstart, dend values. If no such `vp'
704              found, get out of this for loop, add this ldi entry as a new vmap
705              (add_vmap) and come back, fins its `vp' and so on... */
706
707           /* The filenames are not always sufficient to match on. */
708
709           if ((name[0] == '/' && !STREQ(name, vp->name))
710                 || (memb[0] && !STREQ(memb, vp->member)))
711             continue;
712
713           io = bfd_cache_lookup(vp->bfd);               /* totally opaque! */
714           if (!io)
715             fatal("cannot find BFD's iostream for %s", vp->name);
716
717           /* see if we are referring to the same file */
718
719           if (fstat(fileno(io), &vi) < 0)
720             fatal("cannot fstat BFD for %s", vp->name);
721
722           if (ii.st_dev != vi.st_dev || ii.st_ino != vi.st_ino)
723             continue;
724
725           if (!retried)
726             close(ldi->ldinfo_fd);
727
728           ++got_one;
729
730           /* found a corresponding VMAP. remap! */
731           ostart = vp->tstart;
732
733           vp->tstart = ldi->ldinfo_textorg;
734           vp->tend   = vp->tstart + ldi->ldinfo_textsize;
735           vp->dstart = ldi->ldinfo_dataorg;
736           vp->dend   = vp->dstart + ldi->ldinfo_datasize;
737
738           if (vp->tadj) {
739             vp->tstart += vp->tadj;
740             vp->tend   += vp->tadj;
741           }
742
743           /* relocate symbol table(s). */
744           vmap_symtab(vp, ostart, &vi);
745
746           /* there may be more, so we don't break out of the loop. */
747         }
748
749         /* if there was no matching *vp, we must perforce create the sucker(s) */
750         if (!got_one && !retried) {
751           add_vmap(ldi);
752           ++retried;
753           goto retry;
754         }
755   } while (ldi->ldinfo_next
756          && (ldi = (void *) (ldi->ldinfo_next + (char *) ldi)));
757
758 }
759
760 /*
761  * vmap_inferior -      print VMAP info for inferior
762  */
763 vmap_inferior() {
764
765         if (inferior_pid == 0)
766           return 0;                             /* normal processing    */
767
768         exec_files_info();
769         return 1;
770 }
771
772 /* Read or write the exec file.
773
774    Args are address within exec file, address within gdb address-space,
775    length, and a flag indicating whether to read or write.
776
777    Result is a length:
778
779         0:    We cannot handle this address and length.
780         > 0:  We have handled N bytes starting at this address.
781               (If N == length, we did it all.)  We might be able
782               to handle more bytes beyond this length, but no
783               promises.
784         < 0:  We cannot handle this address, but if somebody
785               else handles (-N) bytes, we can start from there.
786
787     The same routine is used to handle both core and exec files;
788     we just tail-call it with more arguments to select between them.  */
789
790 int
791 xfer_memory (memaddr, myaddr, len, write, target)
792      CORE_ADDR memaddr;
793      char *myaddr;
794      int len;
795      int write;
796      struct target_ops *target;
797 {
798   boolean res;
799   struct section_table *p;
800   CORE_ADDR nextsectaddr, memend;
801   boolean (*xfer_fn) PARAMS ((bfd *, sec_ptr, PTR, file_ptr, bfd_size_type));
802
803   if (len <= 0)
804     abort();
805
806   memend = memaddr + len;
807   xfer_fn = write? bfd_set_section_contents: bfd_get_section_contents;
808   nextsectaddr = memend;
809
810   for (p = target->to_sections; p < target->to_sections_end; p++)
811     {
812       if (p->addr <= memaddr)
813         if (p->endaddr >= memend)
814           {
815             /* Entire transfer is within this section.  */
816             res = xfer_fn (p->bfd, p->sec_ptr, myaddr, memaddr - p->addr, len);
817             return (res != false)? len: 0;
818           }
819         else if (p->endaddr <= memaddr)
820           {
821             /* This section ends before the transfer starts.  */
822             continue;
823           }
824         else 
825           {
826             /* This section overlaps the transfer.  Just do half.  */
827             len = p->endaddr - memaddr;
828             res = xfer_fn (p->bfd, p->sec_ptr, myaddr, memaddr - p->addr, len);
829             return (res != false)? len: 0;
830           }
831       else if (p->addr < nextsectaddr)
832         nextsectaddr = p->addr;
833     }
834
835   if (nextsectaddr >= memend)
836     return 0;                           /* We can't help */
837   else
838     return - (nextsectaddr - memaddr);  /* Next boundary where we can help */
839 }
840
841 void
842 print_section_info (t, abfd)
843   struct target_ops *t;
844   bfd *abfd;
845 {
846   struct section_table *p;
847
848   printf_filtered ("\t`%s', ", bfd_get_filename(abfd));
849   wrap_here ("        ");
850   printf_filtered ("file type %s.\n", bfd_get_target(abfd));
851
852   for (p = t->to_sections; p < t->to_sections_end; p++) {
853     printf_filtered ("\t%s", local_hex_string_custom (p->addr, "08"));
854     printf_filtered (" - %s", local_hex_string_custom (p->endaddr, "08"));
855     if (info_verbose)
856       printf_filtered (" @ %s",
857                        local_hex_string_custom (p->sec_ptr->filepos, "08"));
858     printf_filtered (" is %s", bfd_section_name (p->bfd, p->sec_ptr));
859     if (p->bfd != abfd) {
860       printf_filtered (" in %s", bfd_get_filename (p->bfd));
861     }
862     printf_filtered ("\n");
863   }
864 }
865
866
867 static void
868 exec_files_info (t)
869   struct target_ops *t;
870 {
871   register struct vmap *vp = vmap;
872
873   print_section_info (t, exec_bfd);
874
875   if (!vp)
876     return;
877
878   printf("\tMapping info for file `%s'.\n", vp->name);
879
880   printf("\t  %8.8s   %8.8s   %8.8s   %8.8s %8.8s %s\n",
881     "tstart", "tend", "dstart", "dend", "section", "file(member)");
882
883   for (; vp; vp = vp->nxt)
884      printf("\t0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x %s%s%s%s\n",
885         vp->tstart,
886         vp->tend,
887         vp->dstart,
888         vp->dend,
889         vp->name,
890         *vp->member ? "(" : "",
891         vp->member,
892         *vp->member ? ")" : "");
893 }
894
895 #ifdef DAMON
896 /*  Damon's implementation of set_section_command! It is based on the sex member
897   (which is a section pointer from vmap) of vmap.
898   We will not have multiple vmap entries (one for each section), rather transmit
899   text and data base offsets and fix them at the same time. Elimination of sex
900   entry in vmap make this function obsolute, use the one from exec.c. 
901   Need further testing!!        FIXMEmgo.  */
902
903 static void
904 set_section_command(args, from_tty)
905 char *args; 
906 {
907         register struct vmap *vp = vmap;
908         char *secname;
909         unsigned seclen;
910         unsigned long secaddr;
911         char secprint[100];
912         long offset;
913
914         if (args == 0)
915                 error("Must specify section name and its virtual address");
916
917         /* Parse out section name */
918         for (secname = args; !isspace(*args); args++)
919                 ;
920         seclen = args - secname;
921
922         /* Parse out new virtual address */
923         secaddr = parse_and_eval_address(args);
924
925         for (vp = vmap; vp; vp = vp->nxt) {
926                 if (!strncmp(secname
927                              , bfd_section_name(vp->bfd, vp->sex), seclen)
928                     && bfd_section_name(vp->bfd, vp->sex)[seclen] == '\0') {
929                         offset = secaddr - vp->tstart;
930                         vp->tstart += offset;
931                         vp->tend   += offset;
932                         exec_files_info();
933                         return;
934                 }
935         } 
936
937         if (seclen >= sizeof(secprint))
938                 seclen = sizeof(secprint) - 1;
939         strncpy(secprint, secname, seclen);
940         secprint[seclen] = '\0';
941         error("Section %s not found", secprint);
942 }
943 #else
944 static void
945 set_section_command (args, from_tty)
946      char *args;
947      int from_tty;
948 {
949   struct section_table *p;
950   char *secname;
951   unsigned seclen;
952   unsigned long secaddr;
953   char secprint[100];
954   long offset;
955
956   if (args == 0)
957     error ("Must specify section name and its virtual address");
958
959   /* Parse out section name */
960   for (secname = args; !isspace(*args); args++) ;
961   seclen = args - secname;
962
963   /* Parse out new virtual address */
964   secaddr = parse_and_eval_address (args);
965
966   for (p = exec_ops.to_sections; p < exec_ops.to_sections_end; p++) {
967     if (!strncmp (secname, bfd_section_name (exec_bfd, p->sec_ptr), seclen)
968         && bfd_section_name (exec_bfd, p->sec_ptr)[seclen] == '\0') {
969       offset = secaddr - p->addr;
970       p->addr += offset;
971       p->endaddr += offset;
972       if (from_tty)
973         exec_files_info(&exec_ops);
974       return;
975     }
976   } 
977   if (seclen >= sizeof (secprint))
978     seclen = sizeof (secprint) - 1;
979   strncpy (secprint, secname, seclen);
980   secprint[seclen] = '\0';
981   error ("Section %s not found", secprint);
982 }
983
984 #endif /* !DAMON */
985
986 struct target_ops exec_ops = {
987         "exec", "Local exec file",
988         "Use an executable file as a target.\n\
989 Specify the filename of the executable file.",
990         exec_file_command, exec_close, /* open, close */
991         find_default_attach, 0, 0, 0, /* attach, detach, resume, wait, */
992         0, 0, /* fetch_registers, store_registers, */
993         0, /* prepare_to_store */
994         xfer_memory, exec_files_info,
995         0, 0, /* insert_breakpoint, remove_breakpoint, */
996         0, 0, 0, 0, 0, /* terminal stuff */
997         0, 0, /* kill, load */
998         0, /* lookup sym */
999         find_default_create_inferior,
1000         0, /* mourn_inferior */
1001         0, /* can_run */
1002         0, /* notice_signals */
1003         file_stratum, 0, /* next */
1004         0, 1, 0, 0, 0,  /* all mem, mem, stack, regs, exec */
1005         0, 0,                   /* section pointers */
1006         OPS_MAGIC,              /* Always the last thing */
1007 };
1008
1009
1010 void
1011 _initialize_exec()
1012 {
1013
1014   add_com("file", class_files, file_command,
1015            "Use FILE as program to be debugged.\n\
1016 It is read for its symbols, for getting the contents of pure memory,\n\
1017 and it is the program executed when you use the `run' command.\n\
1018 If FILE cannot be found as specified, your execution directory path\n\
1019 ($PATH) is searched for a command of that name.\n\
1020 No arg means to have no executable file and no symbols.");
1021
1022   add_com("exec-file", class_files, exec_file_command,
1023            "Use FILE as program for getting contents of pure memory.\n\
1024 If FILE cannot be found as specified, your execution directory path\n\
1025 is searched for a command of that name.\n\
1026 No arg means have no executable file.");
1027
1028   add_com("section", class_files, set_section_command,
1029    "Change the base address of section SECTION of the exec file to ADDR.\n\
1030 This can be used if the exec file does not contain section addresses,\n\
1031 (such as in the a.out format), or when the addresses specified in the\n\
1032 file itself are wrong.  Each section must be changed separately.  The\n\
1033 ``info files'' command lists all the sections and their addresses.");
1034
1035   add_target(&exec_ops);
1036 }
This page took 0.084283 seconds and 4 git commands to generate.