OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gdb-7.2/] [gdb/] [exec.c] - Blame information for rev 854

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 330 jeremybenn
/* Work with executable files, for GDB.
2
 
3
   Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
4
   1998, 1999, 2000, 2001, 2002, 2003, 2007, 2008, 2009, 2010
5
   Free Software Foundation, Inc.
6
 
7
   This file is part of GDB.
8
 
9
   This program is free software; you can redistribute it and/or modify
10
   it under the terms of the GNU General Public License as published by
11
   the Free Software Foundation; either version 3 of the License, or
12
   (at your option) any later version.
13
 
14
   This program is distributed in the hope that it will be useful,
15
   but WITHOUT ANY WARRANTY; without even the implied warranty of
16
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
   GNU General Public License for more details.
18
 
19
   You should have received a copy of the GNU General Public License
20
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
21
 
22
#include "defs.h"
23
#include "frame.h"
24
#include "inferior.h"
25
#include "target.h"
26
#include "gdbcmd.h"
27
#include "language.h"
28
#include "symfile.h"
29
#include "objfiles.h"
30
#include "completer.h"
31
#include "value.h"
32
#include "exec.h"
33
#include "observer.h"
34
#include "arch-utils.h"
35
#include "gdbthread.h"
36
#include "progspace.h"
37
 
38
#include <fcntl.h>
39
#include "readline/readline.h"
40
#include "gdb_string.h"
41
 
42
#include "gdbcore.h"
43
 
44
#include <ctype.h>
45
#include "gdb_stat.h"
46
 
47
#include "xcoffsolib.h"
48
 
49
struct vmap *map_vmap (bfd *, bfd *);
50
 
51
void (*deprecated_file_changed_hook) (char *);
52
 
53
/* Prototypes for local functions */
54
 
55
static void file_command (char *, int);
56
 
57
static void set_section_command (char *, int);
58
 
59
static void exec_files_info (struct target_ops *);
60
 
61
static void init_exec_ops (void);
62
 
63
void _initialize_exec (void);
64
 
65
/* The target vector for executable files.  */
66
 
67
struct target_ops exec_ops;
68
 
69
/* True if the exec target is pushed on the stack.  */
70
static int using_exec_ops;
71
 
72
/* Whether to open exec and core files read-only or read-write.  */
73
 
74
int write_files = 0;
75
static void
76
show_write_files (struct ui_file *file, int from_tty,
77
                  struct cmd_list_element *c, const char *value)
78
{
79
  fprintf_filtered (file, _("Writing into executable and core files is %s.\n"),
80
                    value);
81
}
82
 
83
 
84
struct vmap *vmap;
85
 
86
static void
87
exec_open (char *args, int from_tty)
88
{
89
  target_preopen (from_tty);
90
  exec_file_attach (args, from_tty);
91
}
92
 
93
/* Close and clear exec_bfd.  If we end up with no target sections to
94
   read memory from, this unpushes the exec_ops target.  */
95
 
96
void
97
exec_close (void)
98
{
99
  if (exec_bfd)
100
    {
101
      bfd *abfd = exec_bfd;
102
      char *name = bfd_get_filename (abfd);
103
 
104
      gdb_bfd_close_or_warn (abfd);
105
      xfree (name);
106
 
107
      /* Removing target sections may close the exec_ops target.
108
         Clear exec_bfd before doing so to prevent recursion.  */
109
      exec_bfd = NULL;
110
      exec_bfd_mtime = 0;
111
 
112
      remove_target_sections (abfd);
113
    }
114
}
115
 
116
/* This is the target_close implementation.  Clears all target
117
   sections and closes all executable bfds from all program spaces.  */
118
 
119
static void
120
exec_close_1 (int quitting)
121
{
122
  int need_symtab_cleanup = 0;
123
  struct vmap *vp, *nxt;
124
 
125
  using_exec_ops = 0;
126
 
127
  for (nxt = vmap; nxt != NULL;)
128
    {
129
      vp = nxt;
130
      nxt = vp->nxt;
131
 
132
      /* if there is an objfile associated with this bfd,
133
         free_objfile() will do proper cleanup of objfile *and* bfd. */
134
 
135
      if (vp->objfile)
136
        {
137
          free_objfile (vp->objfile);
138
          need_symtab_cleanup = 1;
139
        }
140
      else if (vp->bfd != exec_bfd)
141
        /* FIXME-leak: We should be freeing vp->name too, I think.  */
142
        gdb_bfd_close_or_warn (vp->bfd);
143
 
144
      xfree (vp);
145
    }
146
 
147
  vmap = NULL;
148
 
149
  {
150
    struct program_space *ss;
151
    struct cleanup *old_chain;
152
 
153
    old_chain = save_current_program_space ();
154
    ALL_PSPACES (ss)
155
    {
156
      set_current_program_space (ss);
157
 
158
      /* Delete all target sections.  */
159
      resize_section_table
160
        (current_target_sections,
161
         -resize_section_table (current_target_sections, 0));
162
 
163
      exec_close ();
164
    }
165
 
166
    do_cleanups (old_chain);
167
  }
168
}
169
 
170
void
171
exec_file_clear (int from_tty)
172
{
173
  /* Remove exec file.  */
174
  exec_close ();
175
 
176
  if (from_tty)
177
    printf_unfiltered (_("No executable file now.\n"));
178
}
179
 
180
/* Set FILENAME as the new exec file.
181
 
182
   This function is intended to be behave essentially the same
183
   as exec_file_command, except that the latter will detect when
184
   a target is being debugged, and will ask the user whether it
185
   should be shut down first.  (If the answer is "no", then the
186
   new file is ignored.)
187
 
188
   This file is used by exec_file_command, to do the work of opening
189
   and processing the exec file after any prompting has happened.
190
 
191
   And, it is used by child_attach, when the attach command was
192
   given a pid but not a exec pathname, and the attach command could
193
   figure out the pathname from the pid.  (In this case, we shouldn't
194
   ask the user whether the current target should be shut down --
195
   we're supplying the exec pathname late for good reason.)  */
196
 
197
void
198
exec_file_attach (char *filename, int from_tty)
199
{
200
  /* Remove any previous exec file.  */
201
  exec_close ();
202
 
203
  /* Now open and digest the file the user requested, if any.  */
204
 
205
  if (!filename)
206
    {
207
      if (from_tty)
208
        printf_unfiltered (_("No executable file now.\n"));
209
 
210
      set_gdbarch_from_file (NULL);
211
    }
212
  else
213
    {
214
      struct cleanup *cleanups;
215
      char *scratch_pathname;
216
      int scratch_chan;
217
      struct target_section *sections = NULL, *sections_end = NULL;
218
      char **matching;
219
 
220
      scratch_chan = openp (getenv ("PATH"), OPF_TRY_CWD_FIRST, filename,
221
                   write_files ? O_RDWR | O_BINARY : O_RDONLY | O_BINARY,
222
                            &scratch_pathname);
223
#if defined(__GO32__) || defined(_WIN32) || defined(__CYGWIN__)
224
      if (scratch_chan < 0)
225
        {
226
          char *exename = alloca (strlen (filename) + 5);
227
 
228
          strcat (strcpy (exename, filename), ".exe");
229
          scratch_chan = openp (getenv ("PATH"), OPF_TRY_CWD_FIRST, exename,
230
             write_files ? O_RDWR | O_BINARY : O_RDONLY | O_BINARY,
231
             &scratch_pathname);
232
        }
233
#endif
234
      if (scratch_chan < 0)
235
        perror_with_name (filename);
236
      exec_bfd = bfd_fopen (scratch_pathname, gnutarget,
237
                            write_files ? FOPEN_RUB : FOPEN_RB,
238
                            scratch_chan);
239
 
240
      if (!exec_bfd)
241
        {
242
          close (scratch_chan);
243
          error (_("\"%s\": could not open as an executable file: %s"),
244
                 scratch_pathname, bfd_errmsg (bfd_get_error ()));
245
        }
246
 
247
      /* At this point, scratch_pathname and exec_bfd->name both point to the
248
         same malloc'd string.  However exec_close() will attempt to free it
249
         via the exec_bfd->name pointer, so we need to make another copy and
250
         leave exec_bfd as the new owner of the original copy. */
251
      scratch_pathname = xstrdup (scratch_pathname);
252
      cleanups = make_cleanup (xfree, scratch_pathname);
253
 
254
      if (!bfd_check_format_matches (exec_bfd, bfd_object, &matching))
255
        {
256
          /* Make sure to close exec_bfd, or else "run" might try to use
257
             it.  */
258
          exec_close ();
259
          error (_("\"%s\": not in executable format: %s"),
260
                 scratch_pathname,
261
                 gdb_bfd_errmsg (bfd_get_error (), matching));
262
        }
263
 
264
      /* FIXME - This should only be run for RS6000, but the ifdef is a poor
265
         way to accomplish.  */
266
#ifdef DEPRECATED_IBM6000_TARGET
267
      /* Setup initial vmap. */
268
 
269
      map_vmap (exec_bfd, 0);
270
      if (vmap == NULL)
271
        {
272
          /* Make sure to close exec_bfd, or else "run" might try to use
273
             it.  */
274
          exec_close ();
275
          error (_("\"%s\": can't find the file sections: %s"),
276
                 scratch_pathname, bfd_errmsg (bfd_get_error ()));
277
        }
278
#endif /* DEPRECATED_IBM6000_TARGET */
279
 
280
      if (build_section_table (exec_bfd, &sections, &sections_end))
281
        {
282
          /* Make sure to close exec_bfd, or else "run" might try to use
283
             it.  */
284
          exec_close ();
285
          error (_("\"%s\": can't find the file sections: %s"),
286
                 scratch_pathname, bfd_errmsg (bfd_get_error ()));
287
        }
288
 
289
      exec_bfd_mtime = bfd_get_mtime (exec_bfd);
290
 
291
      validate_files ();
292
 
293
      set_gdbarch_from_file (exec_bfd);
294
 
295
      /* Add the executable's sections to the current address spaces'
296
         list of sections.  This possibly pushes the exec_ops
297
         target.  */
298
      add_target_sections (sections, sections_end);
299
      xfree (sections);
300
 
301
      /* Tell display code (if any) about the changed file name.  */
302
      if (deprecated_exec_file_display_hook)
303
        (*deprecated_exec_file_display_hook) (filename);
304
 
305
      do_cleanups (cleanups);
306
    }
307
  bfd_cache_close_all ();
308
  observer_notify_executable_changed ();
309
}
310
 
311
/*  Process the first arg in ARGS as the new exec file.
312
 
313
   Note that we have to explicitly ignore additional args, since we can
314
   be called from file_command(), which also calls symbol_file_command()
315
   which can take multiple args.
316
 
317
   If ARGS is NULL, we just want to close the exec file. */
318
 
319
static void
320
exec_file_command (char *args, int from_tty)
321
{
322
  char **argv;
323
  char *filename;
324
 
325
  if (from_tty && target_has_execution
326
      && !query (_("A program is being debugged already.\n"
327
                   "Are you sure you want to change the file? ")))
328
    error (_("File not changed."));
329
 
330
  if (args)
331
    {
332
      struct cleanup *cleanups;
333
 
334
      /* Scan through the args and pick up the first non option arg
335
         as the filename.  */
336
 
337
      argv = gdb_buildargv (args);
338
      cleanups = make_cleanup_freeargv (argv);
339
 
340
      for (; (*argv != NULL) && (**argv == '-'); argv++)
341
        {;
342
        }
343
      if (*argv == NULL)
344
        error (_("No executable file name was specified"));
345
 
346
      filename = tilde_expand (*argv);
347
      make_cleanup (xfree, filename);
348
      exec_file_attach (filename, from_tty);
349
 
350
      do_cleanups (cleanups);
351
    }
352
  else
353
    exec_file_attach (NULL, from_tty);
354
}
355
 
356
/* Set both the exec file and the symbol file, in one command.
357
   What a novelty.  Why did GDB go through four major releases before this
358
   command was added?  */
359
 
360
static void
361
file_command (char *arg, int from_tty)
362
{
363
  /* FIXME, if we lose on reading the symbol file, we should revert
364
     the exec file, but that's rough.  */
365
  exec_file_command (arg, from_tty);
366
  symbol_file_command (arg, from_tty);
367
  if (deprecated_file_changed_hook)
368
    deprecated_file_changed_hook (arg);
369
}
370
 
371
 
372
/* Locate all mappable sections of a BFD file.
373
   table_pp_char is a char * to get it through bfd_map_over_sections;
374
   we cast it back to its proper type.  */
375
 
376
static void
377
add_to_section_table (bfd *abfd, struct bfd_section *asect,
378
                      void *table_pp_char)
379
{
380
  struct target_section **table_pp = (struct target_section **) table_pp_char;
381
  flagword aflag;
382
 
383
  /* Check the section flags, but do not discard zero-length sections, since
384
     some symbols may still be attached to this section.  For instance, we
385
     encountered on sparc-solaris 2.10 a shared library with an empty .bss
386
     section to which a symbol named "_end" was attached.  The address
387
     of this symbol still needs to be relocated.  */
388
  aflag = bfd_get_section_flags (abfd, asect);
389
  if (!(aflag & SEC_ALLOC))
390
    return;
391
 
392
  (*table_pp)->bfd = abfd;
393
  (*table_pp)->the_bfd_section = asect;
394
  (*table_pp)->addr = bfd_section_vma (abfd, asect);
395
  (*table_pp)->endaddr = (*table_pp)->addr + bfd_section_size (abfd, asect);
396
  (*table_pp)++;
397
}
398
 
399
int
400
resize_section_table (struct target_section_table *table, int num_added)
401
{
402
  struct target_section *old_value;
403
  int old_count;
404
  int new_count;
405
 
406
  old_value = table->sections;
407
  old_count = table->sections_end - table->sections;
408
 
409
  new_count = num_added + old_count;
410
 
411
  if (new_count)
412
    {
413
      table->sections = xrealloc (table->sections,
414
                                  sizeof (struct target_section) * new_count);
415
      table->sections_end = table->sections + new_count;
416
    }
417
  else
418
    {
419
      xfree (table->sections);
420
      table->sections = table->sections_end = NULL;
421
    }
422
 
423
  return old_count;
424
}
425
 
426
/* Builds a section table, given args BFD, SECTABLE_PTR, SECEND_PTR.
427
   Returns 0 if OK, 1 on error.  */
428
 
429
int
430
build_section_table (struct bfd *some_bfd, struct target_section **start,
431
                     struct target_section **end)
432
{
433
  unsigned count;
434
 
435
  count = bfd_count_sections (some_bfd);
436
  if (*start)
437
    xfree (* start);
438
  *start = (struct target_section *) xmalloc (count * sizeof (**start));
439
  *end = *start;
440
  bfd_map_over_sections (some_bfd, add_to_section_table, (char *) end);
441
  if (*end > *start + count)
442
    internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
443
  /* We could realloc the table, but it probably loses for most files.  */
444
  return 0;
445
}
446
 
447
/* Add the sections array defined by [SECTIONS..SECTIONS_END[ to the
448
   current set of target sections.  */
449
 
450
void
451
add_target_sections (struct target_section *sections,
452
                     struct target_section *sections_end)
453
{
454
  int count;
455
  struct target_section_table *table = current_target_sections;
456
 
457
  count = sections_end - sections;
458
 
459
  if (count > 0)
460
    {
461
      int space = resize_section_table (table, count);
462
 
463
      memcpy (table->sections + space,
464
              sections, count * sizeof (sections[0]));
465
 
466
      /* If these are the first file sections we can provide memory
467
         from, push the file_stratum target.  */
468
      if (!using_exec_ops)
469
        {
470
          using_exec_ops = 1;
471
          push_target (&exec_ops);
472
        }
473
    }
474
}
475
 
476
/* Remove all target sections taken from ABFD.  */
477
 
478
void
479
remove_target_sections (bfd *abfd)
480
{
481
  struct target_section *src, *dest;
482
  struct target_section_table *table = current_target_sections;
483
 
484
  dest = table->sections;
485
  for (src = table->sections; src < table->sections_end; src++)
486
    if (src->bfd != abfd)
487
      {
488
        /* Keep this section.  */
489
        if (dest < src)
490
          *dest = *src;
491
        dest++;
492
      }
493
 
494
  /* If we've dropped any sections, resize the section table.  */
495
  if (dest < src)
496
    {
497
      int old_count;
498
 
499
      old_count = resize_section_table (table, dest - src);
500
 
501
      /* If we don't have any more sections to read memory from,
502
         remove the file_stratum target from the stack.  */
503
      if (old_count + (dest - src) == 0)
504
        {
505
          struct program_space *pspace;
506
 
507
          ALL_PSPACES (pspace)
508
            if (pspace->target_sections.sections
509
                != pspace->target_sections.sections_end)
510
              return;
511
 
512
          unpush_target (&exec_ops);
513
        }
514
    }
515
}
516
 
517
 
518
static void
519
bfdsec_to_vmap (struct bfd *abfd, struct bfd_section *sect, void *arg3)
520
{
521
  struct vmap_and_bfd *vmap_bfd = (struct vmap_and_bfd *) arg3;
522
  struct vmap *vp;
523
 
524
  vp = vmap_bfd->pvmap;
525
 
526
  if ((bfd_get_section_flags (abfd, sect) & SEC_LOAD) == 0)
527
    return;
528
 
529
  if (strcmp (bfd_section_name (abfd, sect), ".text") == 0)
530
    {
531
      vp->tstart = bfd_section_vma (abfd, sect);
532
      vp->tend = vp->tstart + bfd_section_size (abfd, sect);
533
      vp->tvma = bfd_section_vma (abfd, sect);
534
      vp->toffs = sect->filepos;
535
    }
536
  else if (strcmp (bfd_section_name (abfd, sect), ".data") == 0)
537
    {
538
      vp->dstart = bfd_section_vma (abfd, sect);
539
      vp->dend = vp->dstart + bfd_section_size (abfd, sect);
540
      vp->dvma = bfd_section_vma (abfd, sect);
541
    }
542
  /* Silently ignore other types of sections. (FIXME?)  */
543
}
544
 
545
/* Make a vmap for ABFD which might be a member of the archive ARCH.
546
   Return the new vmap.  */
547
 
548
struct vmap *
549
map_vmap (bfd *abfd, bfd *arch)
550
{
551
  struct vmap_and_bfd vmap_bfd;
552
  struct vmap *vp, **vpp;
553
 
554
  vp = (struct vmap *) xmalloc (sizeof (*vp));
555
  memset ((char *) vp, '\0', sizeof (*vp));
556
  vp->nxt = 0;
557
  vp->bfd = abfd;
558
  vp->name = bfd_get_filename (arch ? arch : abfd);
559
  vp->member = arch ? bfd_get_filename (abfd) : "";
560
 
561
  vmap_bfd.pbfd = arch;
562
  vmap_bfd.pvmap = vp;
563
  bfd_map_over_sections (abfd, bfdsec_to_vmap, &vmap_bfd);
564
 
565
  /* Find the end of the list and append. */
566
  for (vpp = &vmap; *vpp; vpp = &(*vpp)->nxt)
567
    ;
568
  *vpp = vp;
569
 
570
  return vp;
571
}
572
 
573
 
574
int
575
section_table_xfer_memory_partial (gdb_byte *readbuf, const gdb_byte *writebuf,
576
                                   ULONGEST offset, LONGEST len,
577
                                   struct target_section *sections,
578
                                   struct target_section *sections_end,
579
                                   const char *section_name)
580
{
581
  int res;
582
  struct target_section *p;
583
  ULONGEST memaddr = offset;
584
  ULONGEST memend = memaddr + len;
585
 
586
  if (len <= 0)
587
    internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
588
 
589
  for (p = sections; p < sections_end; p++)
590
    {
591
      if (section_name && strcmp (section_name, p->the_bfd_section->name) != 0)
592
        continue;               /* not the section we need */
593
      if (memaddr >= p->addr)
594
        {
595
          if (memend <= p->endaddr)
596
            {
597
              /* Entire transfer is within this section.  */
598
              if (writebuf)
599
                res = bfd_set_section_contents (p->bfd, p->the_bfd_section,
600
                                                writebuf, memaddr - p->addr,
601
                                                len);
602
              else
603
                res = bfd_get_section_contents (p->bfd, p->the_bfd_section,
604
                                                readbuf, memaddr - p->addr,
605
                                                len);
606
              return (res != 0) ? len : 0;
607
            }
608
          else if (memaddr >= p->endaddr)
609
            {
610
              /* This section ends before the transfer starts.  */
611
              continue;
612
            }
613
          else
614
            {
615
              /* This section overlaps the transfer.  Just do half.  */
616
              len = p->endaddr - memaddr;
617
              if (writebuf)
618
                res = bfd_set_section_contents (p->bfd, p->the_bfd_section,
619
                                                writebuf, memaddr - p->addr,
620
                                                len);
621
              else
622
                res = bfd_get_section_contents (p->bfd, p->the_bfd_section,
623
                                                readbuf, memaddr - p->addr,
624
                                                len);
625
              return (res != 0) ? len : 0;
626
            }
627
        }
628
    }
629
 
630
  return 0;                      /* We can't help */
631
}
632
 
633
struct target_section_table *
634
exec_get_section_table (struct target_ops *ops)
635
{
636
  return current_target_sections;
637
}
638
 
639
static LONGEST
640
exec_xfer_partial (struct target_ops *ops, enum target_object object,
641
                   const char *annex, gdb_byte *readbuf,
642
                   const gdb_byte *writebuf,
643
                   ULONGEST offset, LONGEST len)
644
{
645
  struct target_section_table *table = target_get_section_table (ops);
646
 
647
  if (object == TARGET_OBJECT_MEMORY)
648
    return section_table_xfer_memory_partial (readbuf, writebuf,
649
                                              offset, len,
650
                                              table->sections,
651
                                              table->sections_end,
652
                                              NULL);
653
  else
654
    return -1;
655
}
656
 
657
 
658
void
659
print_section_info (struct target_section_table *t, bfd *abfd)
660
{
661
  struct gdbarch *gdbarch = gdbarch_from_bfd (abfd);
662
  struct target_section *p;
663
  /* FIXME: 16 is not wide enough when gdbarch_addr_bit > 64.  */
664
  int wid = gdbarch_addr_bit (gdbarch) <= 32 ? 8 : 16;
665
 
666
  printf_filtered ("\t`%s', ", bfd_get_filename (abfd));
667
  wrap_here ("        ");
668
  printf_filtered (_("file type %s.\n"), bfd_get_target (abfd));
669
  if (abfd == exec_bfd)
670
    {
671
      /* gcc-3.4 does not like the initialization in <p == t->sections_end>.  */
672
      bfd_vma displacement = 0;
673
      bfd_vma entry_point;
674
 
675
      for (p = t->sections; p < t->sections_end; p++)
676
        {
677
          asection *asect = p->the_bfd_section;
678
 
679
          if ((bfd_get_section_flags (abfd, asect) & (SEC_ALLOC | SEC_LOAD))
680
              != (SEC_ALLOC | SEC_LOAD))
681
            continue;
682
 
683
          if (bfd_get_section_vma (abfd, asect) <= abfd->start_address
684
              && abfd->start_address < (bfd_get_section_vma (abfd, asect)
685
                                        + bfd_get_section_size (asect)))
686
            {
687
              displacement = p->addr - bfd_get_section_vma (abfd, asect);
688
              break;
689
            }
690
        }
691
      if (p == t->sections_end)
692
        warning (_("Cannot find section for the entry point of %s.\n"),
693
                 bfd_get_filename (abfd));
694
 
695
      entry_point = gdbarch_addr_bits_remove (gdbarch,
696
                                              bfd_get_start_address (abfd)
697
                                                + displacement);
698
      printf_filtered (_("\tEntry point: %s\n"),
699
                       paddress (gdbarch, entry_point));
700
    }
701
  for (p = t->sections; p < t->sections_end; p++)
702
    {
703
      printf_filtered ("\t%s", hex_string_custom (p->addr, wid));
704
      printf_filtered (" - %s", hex_string_custom (p->endaddr, wid));
705
 
706
      /* FIXME: A format of "08l" is not wide enough for file offsets
707
         larger than 4GB.  OTOH, making it "016l" isn't desirable either
708
         since most output will then be much wider than necessary.  It
709
         may make sense to test the size of the file and choose the
710
         format string accordingly.  */
711
      /* FIXME: i18n: Need to rewrite this sentence.  */
712
      if (info_verbose)
713
        printf_filtered (" @ %s",
714
                         hex_string_custom (p->the_bfd_section->filepos, 8));
715
      printf_filtered (" is %s", bfd_section_name (p->bfd, p->the_bfd_section));
716
      if (p->bfd != abfd)
717
        printf_filtered (" in %s", bfd_get_filename (p->bfd));
718
      printf_filtered ("\n");
719
    }
720
}
721
 
722
static void
723
exec_files_info (struct target_ops *t)
724
{
725
  print_section_info (current_target_sections, exec_bfd);
726
 
727
  if (vmap)
728
    {
729
      int addr_size = gdbarch_addr_bit (target_gdbarch) / 8;
730
      struct vmap *vp;
731
 
732
      printf_unfiltered (_("\tMapping info for file `%s'.\n"), vmap->name);
733
      printf_unfiltered ("\t  %*s   %*s   %*s   %*s %8.8s %s\n",
734
                         addr_size * 2, "tstart",
735
                         addr_size * 2, "tend",
736
                         addr_size * 2, "dstart",
737
                         addr_size * 2, "dend",
738
                         "section",
739
                         "file(member)");
740
 
741
      for (vp = vmap; vp; vp = vp->nxt)
742
        printf_unfiltered ("\t0x%s 0x%s 0x%s 0x%s %s%s%s%s\n",
743
                           phex (vp->tstart, addr_size),
744
                           phex (vp->tend, addr_size),
745
                           phex (vp->dstart, addr_size),
746
                           phex (vp->dend, addr_size),
747
                           vp->name,
748
                           *vp->member ? "(" : "", vp->member,
749
                           *vp->member ? ")" : "");
750
    }
751
}
752
 
753
static void
754
set_section_command (char *args, int from_tty)
755
{
756
  struct target_section *p;
757
  char *secname;
758
  unsigned seclen;
759
  unsigned long secaddr;
760
  char secprint[100];
761
  long offset;
762
  struct target_section_table *table;
763
 
764
  if (args == 0)
765
    error (_("Must specify section name and its virtual address"));
766
 
767
  /* Parse out section name */
768
  for (secname = args; !isspace (*args); args++);
769
  seclen = args - secname;
770
 
771
  /* Parse out new virtual address */
772
  secaddr = parse_and_eval_address (args);
773
 
774
  table = current_target_sections;
775
  for (p = table->sections; p < table->sections_end; p++)
776
    {
777
      if (!strncmp (secname, bfd_section_name (exec_bfd, p->the_bfd_section), seclen)
778
          && bfd_section_name (exec_bfd, p->the_bfd_section)[seclen] == '\0')
779
        {
780
          offset = secaddr - p->addr;
781
          p->addr += offset;
782
          p->endaddr += offset;
783
          if (from_tty)
784
            exec_files_info (&exec_ops);
785
          return;
786
        }
787
    }
788
  if (seclen >= sizeof (secprint))
789
    seclen = sizeof (secprint) - 1;
790
  strncpy (secprint, secname, seclen);
791
  secprint[seclen] = '\0';
792
  error (_("Section %s not found"), secprint);
793
}
794
 
795
/* If we can find a section in FILENAME with BFD index INDEX, adjust
796
   it to ADDRESS.  */
797
 
798
void
799
exec_set_section_address (const char *filename, int index, CORE_ADDR address)
800
{
801
  struct target_section *p;
802
  struct target_section_table *table;
803
 
804
  table = current_target_sections;
805
  for (p = table->sections; p < table->sections_end; p++)
806
    {
807
      if (strcmp (filename, p->bfd->filename) == 0
808
          && index == p->the_bfd_section->index)
809
        {
810
          p->endaddr += address - p->addr;
811
          p->addr = address;
812
        }
813
    }
814
}
815
 
816
/* If mourn is being called in all the right places, this could be say
817
   `gdb internal error' (since generic_mourn calls
818
   breakpoint_init_inferior).  */
819
 
820
static int
821
ignore (struct gdbarch *gdbarch, struct bp_target_info *bp_tgt)
822
{
823
  return 0;
824
}
825
 
826
static int
827
exec_has_memory (struct target_ops *ops)
828
{
829
  /* We can provide memory if we have any file/target sections to read
830
     from.  */
831
  return (current_target_sections->sections
832
          != current_target_sections->sections_end);
833
}
834
 
835
/* Find mapped memory. */
836
 
837
extern void
838
exec_set_find_memory_regions (int (*func) (int (*) (CORE_ADDR,
839
                                                    unsigned long,
840
                                                    int, int, int,
841
                                                    void *),
842
                                           void *))
843
{
844
  exec_ops.to_find_memory_regions = func;
845
}
846
 
847
static char *exec_make_note_section (bfd *, int *);
848
 
849
/* Fill in the exec file target vector.  Very few entries need to be
850
   defined.  */
851
 
852
static void
853
init_exec_ops (void)
854
{
855
  exec_ops.to_shortname = "exec";
856
  exec_ops.to_longname = "Local exec file";
857
  exec_ops.to_doc = "Use an executable file as a target.\n\
858
Specify the filename of the executable file.";
859
  exec_ops.to_open = exec_open;
860
  exec_ops.to_close = exec_close_1;
861
  exec_ops.to_attach = find_default_attach;
862
  exec_ops.to_xfer_partial = exec_xfer_partial;
863
  exec_ops.to_get_section_table = exec_get_section_table;
864
  exec_ops.to_files_info = exec_files_info;
865
  exec_ops.to_insert_breakpoint = ignore;
866
  exec_ops.to_remove_breakpoint = ignore;
867
  exec_ops.to_create_inferior = find_default_create_inferior;
868
  exec_ops.to_stratum = file_stratum;
869
  exec_ops.to_has_memory = exec_has_memory;
870
  exec_ops.to_make_corefile_notes = exec_make_note_section;
871
  exec_ops.to_magic = OPS_MAGIC;
872
}
873
 
874
void
875
_initialize_exec (void)
876
{
877
  struct cmd_list_element *c;
878
 
879
  init_exec_ops ();
880
 
881
  if (!dbx_commands)
882
    {
883
      c = add_cmd ("file", class_files, file_command, _("\
884
Use FILE as program to be debugged.\n\
885
It is read for its symbols, for getting the contents of pure memory,\n\
886
and it is the program executed when you use the `run' command.\n\
887
If FILE cannot be found as specified, your execution directory path\n\
888
($PATH) is searched for a command of that name.\n\
889
No arg means to have no executable file and no symbols."), &cmdlist);
890
      set_cmd_completer (c, filename_completer);
891
    }
892
 
893
  c = add_cmd ("exec-file", class_files, exec_file_command, _("\
894
Use FILE as program for getting contents of pure memory.\n\
895
If FILE cannot be found as specified, your execution directory path\n\
896
is searched for a command of that name.\n\
897
No arg means have no executable file."), &cmdlist);
898
  set_cmd_completer (c, filename_completer);
899
 
900
  add_com ("section", class_files, set_section_command, _("\
901
Change the base address of section SECTION of the exec file to ADDR.\n\
902
This can be used if the exec file does not contain section addresses,\n\
903
(such as in the a.out format), or when the addresses specified in the\n\
904
file itself are wrong.  Each section must be changed separately.  The\n\
905
``info files'' command lists all the sections and their addresses."));
906
 
907
  add_setshow_boolean_cmd ("write", class_support, &write_files, _("\
908
Set writing into executable and core files."), _("\
909
Show writing into executable and core files."), NULL,
910
                           NULL,
911
                           show_write_files,
912
                           &setlist, &showlist);
913
 
914
  add_target (&exec_ops);
915
}
916
 
917
static char *
918
exec_make_note_section (bfd *obfd, int *note_size)
919
{
920
  error (_("Can't create a corefile"));
921
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.