Fix many sins which will come up in 32 bit x 64 bit GDB, and
[deliverable/binutils-gdb.git] / gdb / xcoffexec.c
CommitLineData
41abdfbd 1/* Execute AIXcoff files, for GDB.
e17960fb 2 Copyright 1988, 1989, 1991, 1992 Free Software Foundation, Inc.
41abdfbd
JG
3 Derived from exec.c. Modified by IBM Corporation.
4 Donated by IBM Corporation and Cygnus Support.
5
6This file is part of GDB.
7
8This program is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation; either version 2 of the License, or
11(at your option) any later version.
12
13This program is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with this program; if not, write to the Free Software
20Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
21
22/* xcoff-exec - deal with executing XCOFF files. */
23
d747e0af
MT
24#include "defs.h"
25
41abdfbd
JG
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
41abdfbd
JG
34#include "frame.h"
35#include "inferior.h"
36#include "target.h"
37#include "gdbcmd.h"
38#include "gdbcore.h"
39#include "symfile.h"
5e2e79f8 40#include "objfiles.h"
41abdfbd
JG
41
42#include "libbfd.h" /* BFD internals (sigh!) FIXME */
2aefe6e4 43#include "bfd.h"
1eeba686 44#include "xcoffsolib.h"
41abdfbd 45
1ab3bf1b
JG
46/* Prototypes for local functions */
47
1ab3bf1b
JG
48static void
49file_command PARAMS ((char *, int));
50
51static void
52exec_close PARAMS ((int));
53
2aefe6e4
JK
54static struct vmap *
55map_vmap PARAMS ((bfd *, bfd *));
56
41abdfbd
JG
57struct section_table *exec_sections, *exec_sections_end;
58
41abdfbd
JG
59/* Whether to open exec and core files read-only or read-write. */
60
61int write_files = 0;
62
818de002
PB
63extern int info_verbose;
64
41abdfbd
JG
65bfd *exec_bfd; /* needed by core.c */
66
67extern char *getenv();
41abdfbd
JG
68extern void add_syms_addr_command ();
69extern void symbol_file_command ();
70static void exec_files_info();
1eeba686
PB
71
72struct vmap *vmap; /* current vmap */
41abdfbd
JG
73
74extern struct target_ops exec_ops;
75
76
77/* exec_close - done with exec file, clean up all resources. */
78
1ab3bf1b 79static void
818de002
PB
80exec_close(quitting)
81{
82 register struct vmap *vp, *nxt;
83 struct objfile *obj;
0eb22669 84 int need_symtab_cleanup = 0;
818de002
PB
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
2aefe6e4 93 if (vp->objfile)
0eb22669
PS
94 {
95 free_objfile (vp->objfile);
96 need_symtab_cleanup = 1;
97 }
818de002
PB
98 else
99 bfd_close(vp->bfd);
2aefe6e4
JK
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? */
818de002
PB
104 free_named_symtabs(vp->name);
105 free(vp);
106 }
107
108 vmap = 0;
507e4004 109
c161de74
JK
110 /* exec_bfd was already closed (the exec file has a vmap entry). */
111 exec_bfd = NULL;
112
507e4004
PB
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 }
0eb22669
PS
118
119 if (need_symtab_cleanup)
120 clear_symtab_users ();
41abdfbd
JG
121}
122
123/*
124 * exec_file_command - handle the "exec" command, &c.
125 */
126void
127exec_file_command(filename, from_tty)
128char *filename;
129{
41abdfbd 130 target_preopen(from_tty);
507e4004
PB
131
132 /* Remove any previous exec file. */
41abdfbd
JG
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);
1ab3bf1b 142 make_cleanup (free, filename);
41abdfbd 143
507e4004
PB
144 scratch_chan = openp(getenv("PATH"), 1, filename,
145 write_files? O_RDWR: O_RDONLY, 0,
146 &scratch_pathname);
41abdfbd
JG
147 if (scratch_chan < 0)
148 perror_with_name(filename);
149
0685d95f 150 exec_bfd = bfd_fdopenr(scratch_pathname, gnutarget, scratch_chan);
507e4004 151 if (!exec_bfd)
41abdfbd
JG
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
507e4004
PB
157 if (!bfd_check_format(exec_bfd, bfd_object))
158 error("\"%s\": not in executable format: %s.",
159 scratch_pathname, bfd_errmsg(bfd_error));
41abdfbd
JG
160
161
162 /* setup initial vmap */
163
507e4004 164 map_vmap (exec_bfd, 0);
41abdfbd 165 if (!vmap)
507e4004
PB
166 error("Can't find the file sections in `%s': %s",
167 exec_bfd->filename, bfd_errmsg(bfd_error));
41abdfbd 168
507e4004
PB
169 if (build_section_table (exec_bfd, &exec_ops.to_sections,
170 &exec_ops.to_sections_end))
41abdfbd
JG
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)
199b2450 187 printf_unfiltered("No exec file now.\n");
41abdfbd
JG
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 */
1ab3bf1b 195static void
41abdfbd
JG
196file_command(arg, from_tty)
197char *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
1ab3bf1b 207static void
41abdfbd
JG
208add_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;
507e4004
PB
220 if (0 == bfd_section_size (abfd, asect))
221 return;
222 (*table_pp)->bfd = abfd;
41abdfbd
JG
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
229int
230build_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)
0848ad1c 238 fatal ("aborting"); /* return 1? */
41abdfbd
JG
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)
0848ad1c 245 fatal ("aborting");
41abdfbd
JG
246 /* We could realloc the table, but it probably loses for most files. */
247 return 0;
248}
2aefe6e4 249\f
41abdfbd 250void
359a097f 251sex_to_vmap(bfd *bf, sec_ptr sex, PTR arg3)
41abdfbd 252{
359a097f 253 struct vmap_and_bfd *vmap_bfd = (struct vmap_and_bfd *)arg3;
41abdfbd
JG
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
2e4964ad 262 if (STREQ(bfd_section_name(bf, sex), ".text")) {
41abdfbd
JG
263 vp->tstart = 0;
264 vp->tend = vp->tstart + bfd_section_size(bf, sex);
265
507e4004
PB
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);
41abdfbd
JG
272 }
273
2e4964ad 274 else if (STREQ(bfd_section_name(bf, sex), ".data")) {
41abdfbd
JG
275 vp->dstart = 0;
276 vp->dend = vp->dstart + bfd_section_size(bf, sex);
277 }
278
2e4964ad 279 else if (STREQ(bfd_section_name(bf, sex), ".bss")) /* FIXMEmgo */
199b2450 280 printf_unfiltered ("bss section in exec! Don't know what the heck to do!\n");
41abdfbd
JG
281}
282
283/* Make a vmap for the BFD "bf", which might be a member of the archive
2aefe6e4
JK
284 BFD "arch". Return the new vmap. */
285struct vmap *
41abdfbd
JG
286map_vmap (bfd *bf, bfd *arch)
287{
288 struct vmap_and_bfd vmap_bfd;
289 struct vmap *vp, **vpp;
290 struct objfile *obj;
41abdfbd
JG
291
292 vp = (void*) xmalloc (sizeof (*vp));
4ed97c9a 293 memset (vp, '\0', sizeof (*vp));
41abdfbd
JG
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
41abdfbd
JG
303 /* find the end of the list, and append. */
304 for (vpp = &vmap; *vpp; vpp = &(*vpp)->nxt)
305 ;
306 *vpp = vp;
2aefe6e4
JK
307
308 return vp;
41abdfbd
JG
309}
310
507e4004 311
41abdfbd
JG
312/* vmap_symtab - handle symbol translation on vmapping */
313
3c02636b
JK
314static void
315vmap_symtab (vp)
316 register struct vmap *vp;
41abdfbd 317{
1ab3bf1b 318 register struct objfile *objfile;
3c02636b
JK
319 asection *textsec;
320 asection *datasec;
321 asection *bsssec;
4365c36c
JK
322 CORE_ADDR text_delta;
323 CORE_ADDR data_delta;
324 CORE_ADDR bss_delta;
3c02636b
JK
325 struct section_offsets *new_offsets;
326 int i;
1ab3bf1b 327
2aefe6e4
JK
328 objfile = vp->objfile;
329 if (objfile == NULL)
1ab3bf1b 330 {
2aefe6e4
JK
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 }
cbf15d9a 338
3c02636b
JK
339 new_offsets = alloca
340 (sizeof (struct section_offsets)
341 + sizeof (new_offsets->offsets) * objfile->num_sections);
556f3d90 342
3c02636b
JK
343 for (i = 0; i < objfile->num_sections; ++i)
344 ANOFFSET (new_offsets, i) = ANOFFSET (objfile->section_offsets, i);
1ab3bf1b 345
3c02636b 346 textsec = bfd_get_section_by_name (vp->bfd, ".text");
4365c36c
JK
347 text_delta =
348 vp->tstart - ANOFFSET (objfile->section_offsets, textsec->target_index);
3c02636b 349 ANOFFSET (new_offsets, textsec->target_index) = vp->tstart;
4365c36c 350
3c02636b 351 datasec = bfd_get_section_by_name (vp->bfd, ".data");
4365c36c
JK
352 data_delta =
353 vp->dstart - ANOFFSET (objfile->section_offsets, datasec->target_index);
3c02636b 354 ANOFFSET (new_offsets, datasec->target_index) = vp->dstart;
4365c36c 355
3c02636b 356 bsssec = bfd_get_section_by_name (vp->bfd, ".bss");
4365c36c
JK
357 bss_delta =
358 vp->dstart - ANOFFSET (objfile->section_offsets, bsssec->target_index);
3c02636b
JK
359 ANOFFSET (new_offsets, bsssec->target_index) = vp->dstart;
360
361 objfile_relocate (objfile, new_offsets);
4365c36c
JK
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 }
3c02636b 384
4365c36c 385 if (text_delta != 0)
3c02636b 386 /* breakpoints need to be relocated as well. */
4365c36c 387 fixup_breakpoints (0, TEXT_SEGMENT_BASE, text_delta);
41abdfbd
JG
388}
389
8112a711
JK
390/* Add symbols for an objfile. */
391static int
392objfile_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
2aefe6e4
JK
401static 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. */
409static struct vmap *
41abdfbd 410add_vmap(ldi)
2aefe6e4
JK
411 register struct ld_info *ldi;
412{
a71c0593 413 bfd *abfd, *last;
507e4004 414 register char *mem, *objname;
2aefe6e4
JK
415 struct objfile *obj;
416 struct vmap *vp;
507e4004
PB
417
418 /* This ldi structure was allocated using alloca() in
9b280a7f 419 xcoff_relocate_symtab(). Now we need to have persistent object
507e4004 420 and member names, so we should save them. */
41abdfbd
JG
421
422 mem = ldi->ldinfo_filename + strlen(ldi->ldinfo_filename) + 1;
507e4004
PB
423 mem = savestring (mem, strlen (mem));
424 objname = savestring (ldi->ldinfo_filename, strlen (ldi->ldinfo_filename));
425
2aefe6e4
JK
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. */
a71c0593 429 abfd = bfd_openr (objname, gnutarget);
2aefe6e4 430 else
a71c0593
FF
431 abfd = bfd_fdopenr(objname, gnutarget, ldi->ldinfo_fd);
432 if (!abfd)
507e4004
PB
433 error("Could not open `%s' as an executable file: %s",
434 objname, bfd_errmsg(bfd_error));
41abdfbd
JG
435
436
437 /* make sure we have an object file */
438
a71c0593
FF
439 if (bfd_check_format(abfd, bfd_object))
440 vp = map_vmap (abfd, 0);
41abdfbd 441
a71c0593 442 else if (bfd_check_format(abfd, bfd_archive)) {
41abdfbd
JG
443 last = 0;
444 /*
445 * FIXME??? am I tossing BFDs? bfd?
446 */
a71c0593 447 while (last = bfd_openr_next_archived_file(abfd, last))
2e4964ad 448 if (STREQ(mem, last->filename))
41abdfbd
JG
449 break;
450
451 if (!last) {
a71c0593 452 bfd_close(abfd);
507e4004 453 /* FIXME -- should be error */
a71c0593 454 warning("\"%s\": member \"%s\" missing.", abfd->filename, mem);
507e4004 455 return;
41abdfbd
JG
456 }
457
458 if (!bfd_check_format(last, bfd_object)) {
459 bfd_close(last); /* XXX??? */
460 goto obj_err;
461 }
462
a71c0593 463 vp = map_vmap (last, abfd);
41abdfbd
JG
464 }
465 else {
466 obj_err:
a71c0593 467 bfd_close(abfd);
2aefe6e4
JK
468 error ("\"%s\": not in executable format: %s.",
469 objname, bfd_errmsg(bfd_error));
470 /*NOTREACHED*/
41abdfbd 471 }
95171817 472 obj = allocate_objfile (vp->bfd, 0);
2aefe6e4
JK
473 vp->objfile = obj;
474
475#ifndef SOLIB_SYMBOLS_MANUAL
8112a711 476 if (catch_errors (objfile_symbol_add, (char *)obj,
9748446f
JK
477 "Error while reading shared library symbols:\n",
478 RETURN_MASK_ALL))
8112a711
JK
479 {
480 /* Note this is only done if symbol reading was successful. */
3c02636b 481 vmap_symtab (vp);
8112a711
JK
482 vp->loaded = 1;
483 }
2aefe6e4
JK
484#endif
485 return vp;
41abdfbd
JG
486}
487
488
507e4004
PB
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.
41abdfbd
JG
497*/
498vmap_exec ()
499{
500 static bfd *execbfd;
1e939db1
SG
501 int i;
502
41abdfbd
JG
503 if (execbfd == exec_bfd)
504 return;
505
506 execbfd = exec_bfd;
507
1e939db1
SG
508 if (!vmap || !exec_ops.to_sections)
509 error ("vmap_exec: vmap or exec_ops.to_sections == 0\n");
507e4004 510
1e939db1
SG
511 for (i=0; &exec_ops.to_sections[i] < exec_ops.to_sections_end; i++)
512 {
2e4964ad 513 if (STREQ(".text", exec_ops.to_sections[i].sec_ptr->name))
1e939db1
SG
514 {
515 exec_ops.to_sections[i].addr += vmap->tstart;
516 exec_ops.to_sections[i].endaddr += vmap->tstart;
517 }
2e4964ad 518 else if (STREQ(".data", exec_ops.to_sections[i].sec_ptr->name))
1e939db1
SG
519 {
520 exec_ops.to_sections[i].addr += vmap->dstart;
521 exec_ops.to_sections[i].endaddr += vmap->dstart;
522 }
523 }
41abdfbd
JG
524}
525
2aefe6e4
JK
526#if 0
527/* This was for the old, half-assed, core file support. */
41abdfbd
JG
528int
529text_adjustment (abfd)
530bfd *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}
2aefe6e4 547#endif
41abdfbd
JG
548
549/*
550 * vmap_ldinfo - update VMAP info with ldinfo() information
551 *
552 * Input:
553 * ldi - ^ to ldinfo() results.
554 */
555vmap_ldinfo(ldi)
556register 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);
578retry:
579 for (got_one = 0, vp = vmap; vp; vp = vp->nxt) {
1eeba686
PB
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. */
41abdfbd 589
9116f7c7 590 if ((name[0] == '/' && !STREQ(name, vp->name))
2e4964ad 591 || (memb[0] && !STREQ(memb, vp->member)))
1eeba686 592 continue;
41abdfbd 593
95171817 594 io = bfd_cache_lookup(vp->bfd); /* totally opaque! */
1eeba686
PB
595 if (!io)
596 fatal("cannot find BFD's iostream for %s", vp->name);
41abdfbd 597
1eeba686 598 /* see if we are referring to the same file */
41abdfbd 599
1eeba686
PB
600 if (fstat(fileno(io), &vi) < 0)
601 fatal("cannot fstat BFD for %s", vp->name);
41abdfbd 602
1eeba686
PB
603 if (ii.st_dev != vi.st_dev || ii.st_ino != vi.st_ino)
604 continue;
41abdfbd 605
1eeba686
PB
606 if (!retried)
607 close(ldi->ldinfo_fd);
41abdfbd 608
1eeba686 609 ++got_one;
41abdfbd 610
1eeba686
PB
611 /* found a corresponding VMAP. remap! */
612 ostart = vp->tstart;
41abdfbd 613
359a097f
JK
614 /* We can assume pointer == CORE_ADDR, this code is native only. */
615 vp->tstart = (CORE_ADDR) ldi->ldinfo_textorg;
1eeba686 616 vp->tend = vp->tstart + ldi->ldinfo_textsize;
359a097f 617 vp->dstart = (CORE_ADDR) ldi->ldinfo_dataorg;
1eeba686 618 vp->dend = vp->dstart + ldi->ldinfo_datasize;
41abdfbd 619
1eeba686
PB
620 if (vp->tadj) {
621 vp->tstart += vp->tadj;
622 vp->tend += vp->tadj;
623 }
624
625 /* relocate symbol table(s). */
3c02636b 626 vmap_symtab (vp);
41abdfbd 627
1eeba686 628 /* there may be more, so we don't break out of the loop. */
41abdfbd
JG
629 }
630
1eeba686
PB
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;
41abdfbd
JG
636 }
637 } while (ldi->ldinfo_next
638 && (ldi = (void *) (ldi->ldinfo_next + (char *) ldi)));
639
41abdfbd
JG
640}
641
642/*
643 * vmap_inferior - print VMAP info for inferior
644 */
645vmap_inferior() {
646
647 if (inferior_pid == 0)
507e4004 648 return 0; /* normal processing */
41abdfbd
JG
649
650 exec_files_info();
41abdfbd
JG
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
672int
818de002 673xfer_memory (memaddr, myaddr, len, write, target)
41abdfbd
JG
674 CORE_ADDR memaddr;
675 char *myaddr;
676 int len;
677 int write;
818de002 678 struct target_ops *target;
41abdfbd
JG
679{
680 boolean res;
681 struct section_table *p;
682 CORE_ADDR nextsectaddr, memend;
818de002 683 boolean (*xfer_fn) PARAMS ((bfd *, sec_ptr, PTR, file_ptr, bfd_size_type));
41abdfbd
JG
684
685 if (len <= 0)
0848ad1c 686 fatal ("aborting");
41abdfbd
JG
687
688 memend = memaddr + len;
689 xfer_fn = write? bfd_set_section_contents: bfd_get_section_contents;
690 nextsectaddr = memend;
691
818de002 692 for (p = target->to_sections; p < target->to_sections_end; p++)
41abdfbd
JG
693 {
694 if (p->addr <= memaddr)
695 if (p->endaddr >= memend)
696 {
697 /* Entire transfer is within this section. */
95171817 698 res = xfer_fn (p->bfd, p->sec_ptr, myaddr, memaddr - p->addr, len);
41abdfbd
JG
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;
95171817 710 res = xfer_fn (p->bfd, p->sec_ptr, myaddr, memaddr - p->addr, len);
41abdfbd
JG
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
818de002
PB
723void
724print_section_info (t, abfd)
725 struct target_ops *t;
726 bfd *abfd;
41abdfbd 727{
818de002 728 struct section_table *p;
41abdfbd 729
833e0d94 730 /* FIXME-32x64: Need a version of print_address_numeric with field width. */
818de002
PB
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++) {
5573d7d4
JK
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"));
818de002
PB
740 if (info_verbose)
741 printf_filtered (" @ %s",
5573d7d4 742 local_hex_string_custom ((unsigned long) p->sec_ptr->filepos, "08l"));
95171817
JK
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));
818de002
PB
746 }
747 printf_filtered ("\n");
748 }
818de002
PB
749}
750
507e4004 751
818de002
PB
752static void
753exec_files_info (t)
754 struct target_ops *t;
755{
507e4004
PB
756 register struct vmap *vp = vmap;
757
818de002 758 print_section_info (t, exec_bfd);
507e4004
PB
759
760 if (!vp)
761 return;
762
199b2450 763 printf_unfiltered("\tMapping info for file `%s'.\n", vp->name);
1eeba686 764
199b2450 765 printf_unfiltered("\t %8.8s %8.8s %8.8s %8.8s %8.8s %s\n",
1eeba686 766 "tstart", "tend", "dstart", "dend", "section", "file(member)");
507e4004
PB
767
768 for (; vp; vp = vp->nxt)
199b2450 769 printf_unfiltered("\t0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x %s%s%s%s\n",
1eeba686
PB
770 vp->tstart,
771 vp->tend,
772 vp->dstart,
773 vp->dend,
774 vp->name,
775 *vp->member ? "(" : "",
776 vp->member,
777 *vp->member ? ")" : "");
41abdfbd
JG
778}
779
780#ifdef DAMON
76b28d05 781/* Damon's implementation of set_section_command! It is based on the sex member
41abdfbd
JG
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.
76b28d05 786 Need further testing!! FIXMEmgo. */
41abdfbd
JG
787
788static void
789set_section_command(args, from_tty)
790char *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
95171817
JK
812 , bfd_section_name(vp->bfd, vp->sex), seclen)
813 && bfd_section_name(vp->bfd, vp->sex)[seclen] == '\0') {
41abdfbd
JG
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
829static void
830set_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
507e4004 851 for (p = exec_ops.to_sections; p < exec_ops.to_sections_end; p++) {
41abdfbd
JG
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;
507e4004
PB
857 if (from_tty)
858 exec_files_info(&exec_ops);
41abdfbd
JG
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
871struct target_ops exec_ops = {
872 "exec", "Local exec file",
873 "Use an executable file as a target.\n\
874Specify the filename of the executable file.",
875 exec_file_command, exec_close, /* open, close */
050d45c5 876 find_default_attach, 0, 0, 0, /* attach, detach, resume, wait, */
41abdfbd 877 0, 0, /* fetch_registers, store_registers, */
a03d4f8e 878 0, /* prepare_to_store */
818de002 879 xfer_memory, exec_files_info,
41abdfbd
JG
880 0, 0, /* insert_breakpoint, remove_breakpoint, */
881 0, 0, 0, 0, 0, /* terminal stuff */
882 0, 0, /* kill, load */
e17960fb 883 0, /* lookup sym */
050d45c5 884 find_default_create_inferior,
41abdfbd 885 0, /* mourn_inferior */
5ee4e16c 886 0, /* can_run */
3950a34e 887 0, /* notice_signals */
41abdfbd
JG
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};
2aefe6e4
JK
893\f
894/* Core file stuff. */
895
896/* Relocate symtabs and read in shared library info, based on symbols
897 from the core file. */
898void
899xcoff_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;
4cdcf3b9 913
2aefe6e4
JK
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
4cdcf3b9
JK
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
2aefe6e4
JK
925 ldinfo_sec = bfd_get_section_by_name (core_bfd, ".ldinfo");
926 if (ldinfo_sec == NULL)
927 {
928bfd_err:
199b2450 929 fprintf_filtered (gdb_stderr, "Couldn't get ldinfo from core file: %s\n",
2aefe6e4
JK
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;
41abdfbd 972
359a097f
JK
973 /* We can assume pointer == CORE_ADDR, this code is native only. */
974 vp->tstart = (CORE_ADDR) ldip->ldinfo_textorg;
2aefe6e4 975 vp->tend = vp->tstart + ldip->ldinfo_textsize;
359a097f 976 vp->dstart = (CORE_ADDR) ldip->ldinfo_dataorg;
2aefe6e4
JK
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. */
95171817
JK
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;
2aefe6e4
JK
1009 stp++;
1010
95171817
JK
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;
2aefe6e4
JK
1015 }
1016
3c02636b 1017 vmap_symtab (vp);
2aefe6e4 1018
359a097f
JK
1019 add_text_to_loadinfo ((CORE_ADDR)ldip->ldinfo_textorg,
1020 (CORE_ADDR)ldip->ldinfo_dataorg);
2aefe6e4
JK
1021 } while (ldip->ldinfo_next != 0);
1022 vmap_exec ();
1023 do_cleanups (old);
1024}
41abdfbd
JG
1025
1026void
1027_initialize_exec()
1028{
1029
1030 add_com("file", class_files, file_command,
1031 "Use FILE as program to be debugged.\n\
1032It is read for its symbols, for getting the contents of pure memory,\n\
1033and it is the program executed when you use the `run' command.\n\
1034If FILE cannot be found as specified, your execution directory path\n\
1035($PATH) is searched for a command of that name.\n\
1036No 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\
1040If FILE cannot be found as specified, your execution directory path\n\
1041is searched for a command of that name.\n\
1042No 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\
1046This 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\
1048file 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.259382 seconds and 4 git commands to generate.