]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/rs6000-nat.c
* binutils.texi: Change --with-targets to --enable-targets.
[thirdparty/binutils-gdb.git] / gdb / rs6000-nat.c
CommitLineData
ef6f3a8b 1/* IBM RS/6000 native-dependent code for GDB, the GNU debugger.
df1e1074
PS
2 Copyright 1986, 1987, 1989, 1991, 1992, 1994, 1995
3 Free Software Foundation, Inc.
ef6f3a8b
RP
4
5This file is part of GDB.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
6c9638b4 19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
ef6f3a8b
RP
20
21#include "defs.h"
22#include "inferior.h"
23#include "target.h"
d87d7b10
SG
24#include "gdbcore.h"
25#include "xcoffsolib.h"
26#include "symfile.h"
27#include "objfiles.h"
886955e7 28#include "libbfd.h" /* For bfd_cache_lookup (FIXME) */
d87d7b10 29#include "bfd.h"
e2adc41a 30#include "gdb-stabs.h"
ef6f3a8b
RP
31
32#include <sys/ptrace.h>
33#include <sys/reg.h>
34
35#include <sys/param.h>
36#include <sys/dir.h>
37#include <sys/user.h>
38#include <signal.h>
39#include <sys/ioctl.h>
40#include <fcntl.h>
41
42#include <a.out.h>
43#include <sys/file.h>
2b576293 44#include "gdb_stat.h"
ef6f3a8b 45#include <sys/core.h>
d87d7b10 46#include <sys/ldr.h>
ef6f3a8b
RP
47
48extern int errno;
0c4b30ea 49
d87d7b10
SG
50extern struct vmap * map_vmap PARAMS ((bfd *bf, bfd *arch));
51
52extern struct target_ops exec_ops;
ef6f3a8b
RP
53
54static void
55exec_one_dummy_insn PARAMS ((void));
56
d87d7b10
SG
57extern void
58add_text_to_loadinfo PARAMS ((CORE_ADDR textaddr, CORE_ADDR dataaddr));
59
0c4b30ea
SS
60extern void
61fixup_breakpoints PARAMS ((CORE_ADDR low, CORE_ADDR high, CORE_ADDR delta));
62
ef6f3a8b
RP
63/* Conversion from gdb-to-system special purpose register numbers.. */
64
65static int special_regs[] = {
66 IAR, /* PC_REGNUM */
67 MSR, /* PS_REGNUM */
68 CR, /* CR_REGNUM */
69 LR, /* LR_REGNUM */
70 CTR, /* CTR_REGNUM */
71 XER, /* XER_REGNUM */
72 MQ /* MQ_REGNUM */
73};
74
75void
76fetch_inferior_registers (regno)
77 int regno;
78{
79 int ii;
80 extern char registers[];
81
82 if (regno < 0) { /* for all registers */
83
84 /* read 32 general purpose registers. */
85
86 for (ii=0; ii < 32; ++ii)
87 *(int*)&registers[REGISTER_BYTE (ii)] =
88 ptrace (PT_READ_GPR, inferior_pid, (PTRACE_ARG3_TYPE) ii, 0, 0);
89
90 /* read general purpose floating point registers. */
91
92 for (ii=0; ii < 32; ++ii)
93 ptrace (PT_READ_FPR, inferior_pid,
0c4b30ea 94 (PTRACE_ARG3_TYPE) &registers [REGISTER_BYTE (FP0_REGNUM+ii)],
ef6f3a8b
RP
95 FPR0+ii, 0);
96
97 /* read special registers. */
98 for (ii=0; ii <= LAST_SP_REGNUM-FIRST_SP_REGNUM; ++ii)
99 *(int*)&registers[REGISTER_BYTE (FIRST_SP_REGNUM+ii)] =
100 ptrace (PT_READ_GPR, inferior_pid, (PTRACE_ARG3_TYPE) special_regs[ii],
101 0, 0);
102
103 registers_fetched ();
104 return;
105 }
106
107 /* else an individual register is addressed. */
108
109 else if (regno < FP0_REGNUM) { /* a GPR */
110 *(int*)&registers[REGISTER_BYTE (regno)] =
111 ptrace (PT_READ_GPR, inferior_pid, (PTRACE_ARG3_TYPE) regno, 0, 0);
112 }
113 else if (regno <= FPLAST_REGNUM) { /* a FPR */
114 ptrace (PT_READ_FPR, inferior_pid,
0c4b30ea 115 (PTRACE_ARG3_TYPE) &registers [REGISTER_BYTE (regno)],
ef6f3a8b
RP
116 (regno-FP0_REGNUM+FPR0), 0);
117 }
118 else if (regno <= LAST_SP_REGNUM) { /* a special register */
119 *(int*)&registers[REGISTER_BYTE (regno)] =
120 ptrace (PT_READ_GPR, inferior_pid,
121 (PTRACE_ARG3_TYPE) special_regs[regno-FIRST_SP_REGNUM], 0, 0);
122 }
123 else
199b2450 124 fprintf_unfiltered (gdb_stderr, "gdb error: register no %d not implemented.\n", regno);
ef6f3a8b
RP
125
126 register_valid [regno] = 1;
127}
128
129/* Store our register values back into the inferior.
130 If REGNO is -1, do this for all registers.
131 Otherwise, REGNO specifies which register (so we can save time). */
132
133void
134store_inferior_registers (regno)
135 int regno;
136{
137 extern char registers[];
138
139 errno = 0;
140
0c4b30ea
SS
141 if (regno == -1)
142 { /* for all registers.. */
ef6f3a8b
RP
143 int ii;
144
145 /* execute one dummy instruction (which is a breakpoint) in inferior
146 process. So give kernel a chance to do internal house keeping.
147 Otherwise the following ptrace(2) calls will mess up user stack
148 since kernel will get confused about the bottom of the stack (%sp) */
149
150 exec_one_dummy_insn ();
151
152 /* write general purpose registers first! */
0c4b30ea
SS
153 for ( ii=GPR0; ii<=GPR31; ++ii)
154 {
155 ptrace (PT_WRITE_GPR, inferior_pid, (PTRACE_ARG3_TYPE) ii,
156 *(int*)&registers[REGISTER_BYTE (ii)], 0);
157 if (errno)
158 {
159 perror ("ptrace write_gpr");
160 errno = 0;
161 }
ef6f3a8b 162 }
ef6f3a8b
RP
163
164 /* write floating point registers now. */
0c4b30ea
SS
165 for ( ii=0; ii < 32; ++ii)
166 {
167 ptrace (PT_WRITE_FPR, inferior_pid,
ef6f3a8b 168 (PTRACE_ARG3_TYPE) &registers[REGISTER_BYTE (FP0_REGNUM+ii)],
0c4b30ea
SS
169 FPR0+ii, 0);
170 if (errno)
171 {
172 perror ("ptrace write_fpr");
173 errno = 0;
174 }
175 }
ef6f3a8b
RP
176
177 /* write special registers. */
0c4b30ea
SS
178 for (ii=0; ii <= LAST_SP_REGNUM-FIRST_SP_REGNUM; ++ii)
179 {
180 ptrace (PT_WRITE_GPR, inferior_pid,
181 (PTRACE_ARG3_TYPE) special_regs[ii],
182 *(int*)&registers[REGISTER_BYTE (FIRST_SP_REGNUM+ii)], 0);
183 if (errno)
184 {
185 perror ("ptrace write_gpr");
186 errno = 0;
187 }
ef6f3a8b 188 }
0c4b30ea 189 }
ef6f3a8b
RP
190
191 /* else, a specific register number is given... */
192
0c4b30ea
SS
193 else if (regno < FP0_REGNUM) /* a GPR */
194 {
195 ptrace (PT_WRITE_GPR, inferior_pid, (PTRACE_ARG3_TYPE) regno,
196 *(int*)&registers[REGISTER_BYTE (regno)], 0);
197 }
ef6f3a8b 198
0c4b30ea
SS
199 else if (regno <= FPLAST_REGNUM) /* a FPR */
200 {
201 ptrace (PT_WRITE_FPR, inferior_pid,
202 (PTRACE_ARG3_TYPE) &registers[REGISTER_BYTE (regno)],
203 regno - FP0_REGNUM + FPR0, 0);
204 }
ef6f3a8b 205
0c4b30ea
SS
206 else if (regno <= LAST_SP_REGNUM) /* a special register */
207 {
208 ptrace (PT_WRITE_GPR, inferior_pid,
209 (PTRACE_ARG3_TYPE) special_regs [regno-FIRST_SP_REGNUM],
210 *(int*)&registers[REGISTER_BYTE (regno)], 0);
211 }
ef6f3a8b
RP
212
213 else
199b2450 214 fprintf_unfiltered (gdb_stderr, "Gdb error: register no %d not implemented.\n", regno);
ef6f3a8b 215
0c4b30ea
SS
216 if (errno)
217 {
218 perror ("ptrace write");
219 errno = 0;
220 }
ef6f3a8b
RP
221}
222
223/* Execute one dummy breakpoint instruction. This way we give the kernel
224 a chance to do some housekeeping and update inferior's internal data,
225 including u_area. */
0c4b30ea 226
ef6f3a8b
RP
227static void
228exec_one_dummy_insn ()
229{
230#define DUMMY_INSN_ADDR (TEXT_SEGMENT_BASE)+0x200
231
0c4b30ea 232 char shadow_contents[BREAKPOINT_MAX]; /* Stash old bkpt addr contents */
ef6f3a8b
RP
233 unsigned int status, pid;
234
235 /* We plant one dummy breakpoint into DUMMY_INSN_ADDR address. We assume that
236 this address will never be executed again by the real code. */
237
0c4b30ea 238 target_insert_breakpoint (DUMMY_INSN_ADDR, shadow_contents);
ef6f3a8b
RP
239
240 errno = 0;
241 ptrace (PT_CONTINUE, inferior_pid, (PTRACE_ARG3_TYPE) DUMMY_INSN_ADDR, 0, 0);
242 if (errno)
243 perror ("pt_continue");
244
245 do {
246 pid = wait (&status);
247 } while (pid != inferior_pid);
248
0c4b30ea 249 target_remove_breakpoint (DUMMY_INSN_ADDR, shadow_contents);
ef6f3a8b
RP
250}
251
252void
253fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr)
254 char *core_reg_sect;
255 unsigned core_reg_size;
256 int which;
257 unsigned int reg_addr; /* Unused in this version */
258{
259 /* fetch GPRs and special registers from the first register section
260 in core bfd. */
0c4b30ea
SS
261 if (which == 0)
262 {
263 /* copy GPRs first. */
264 memcpy (registers, core_reg_sect, 32 * 4);
265
266 /* gdb's internal register template and bfd's register section layout
267 should share a common include file. FIXMEmgo */
268 /* then comes special registes. They are supposed to be in the same
269 order in gdb template and bfd `.reg' section. */
270 core_reg_sect += (32 * 4);
271 memcpy (&registers [REGISTER_BYTE (FIRST_SP_REGNUM)], core_reg_sect,
272 (LAST_SP_REGNUM - FIRST_SP_REGNUM + 1) * 4);
273 }
ef6f3a8b
RP
274
275 /* fetch floating point registers from register section 2 in core bfd. */
276 else if (which == 2)
ade40d31 277 memcpy (&registers [REGISTER_BYTE (FP0_REGNUM)], core_reg_sect, 32 * 8);
ef6f3a8b
RP
278
279 else
199b2450 280 fprintf_unfiltered (gdb_stderr, "Gdb error: unknown parameter to fetch_core_registers().\n");
ef6f3a8b 281}
d87d7b10 282\f
0c4b30ea 283/* handle symbol translation on vmapping */
d87d7b10
SG
284
285static void
286vmap_symtab (vp)
287 register struct vmap *vp;
288{
289 register struct objfile *objfile;
d87d7b10
SG
290 CORE_ADDR text_delta;
291 CORE_ADDR data_delta;
292 CORE_ADDR bss_delta;
293 struct section_offsets *new_offsets;
294 int i;
295
296 objfile = vp->objfile;
297 if (objfile == NULL)
298 {
299 /* OK, it's not an objfile we opened ourselves.
300 Currently, that can only happen with the exec file, so
301 relocate the symbols for the symfile. */
302 if (symfile_objfile == NULL)
303 return;
304 objfile = symfile_objfile;
305 }
306
307 new_offsets = alloca
308 (sizeof (struct section_offsets)
309 + sizeof (new_offsets->offsets) * objfile->num_sections);
310
311 for (i = 0; i < objfile->num_sections; ++i)
312 ANOFFSET (new_offsets, i) = ANOFFSET (objfile->section_offsets, i);
313
d87d7b10 314 text_delta =
e2adc41a
JK
315 vp->tstart - ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
316 ANOFFSET (new_offsets, SECT_OFF_TEXT) = vp->tstart;
d87d7b10 317
d87d7b10 318 data_delta =
e2adc41a
JK
319 vp->dstart - ANOFFSET (objfile->section_offsets, SECT_OFF_DATA);
320 ANOFFSET (new_offsets, SECT_OFF_DATA) = vp->dstart;
d87d7b10 321
d87d7b10 322 bss_delta =
e2adc41a
JK
323 vp->dstart - ANOFFSET (objfile->section_offsets, SECT_OFF_BSS);
324 ANOFFSET (new_offsets, SECT_OFF_BSS) = vp->dstart;
d87d7b10
SG
325
326 objfile_relocate (objfile, new_offsets);
d87d7b10
SG
327}
328\f
329/* Add symbols for an objfile. */
0c4b30ea 330
d87d7b10
SG
331static int
332objfile_symbol_add (arg)
333 char *arg;
334{
335 struct objfile *obj = (struct objfile *) arg;
0c4b30ea 336
d87d7b10
SG
337 syms_from_objfile (obj, 0, 0, 0);
338 new_symfile_objfile (obj, 0, 0);
339 return 1;
340}
341
342/* Add a new vmap entry based on ldinfo() information.
343
344 If ldi->ldinfo_fd is not valid (e.g. this struct ld_info is from a
345 core file), the caller should set it to -1, and we will open the file.
346
347 Return the vmap new entry. */
0c4b30ea 348
d87d7b10 349static struct vmap *
0c4b30ea 350add_vmap (ldi)
d87d7b10
SG
351 register struct ld_info *ldi;
352{
0c4b30ea
SS
353 bfd *abfd, *last;
354 register char *mem, *objname;
355 struct objfile *obj;
356 struct vmap *vp;
357
358 /* This ldi structure was allocated using alloca() in
359 xcoff_relocate_symtab(). Now we need to have persistent object
360 and member names, so we should save them. */
361
362 mem = ldi->ldinfo_filename + strlen (ldi->ldinfo_filename) + 1;
363 mem = savestring (mem, strlen (mem));
364 objname = savestring (ldi->ldinfo_filename, strlen (ldi->ldinfo_filename));
365
366 if (ldi->ldinfo_fd < 0)
367 /* Note that this opens it once for every member; a possible
368 enhancement would be to only open it once for every object. */
369 abfd = bfd_openr (objname, gnutarget);
370 else
371 abfd = bfd_fdopenr (objname, gnutarget, ldi->ldinfo_fd);
372 if (!abfd)
373 error ("Could not open `%s' as an executable file: %s",
374 objname, bfd_errmsg (bfd_get_error ()));
375
376 /* make sure we have an object file */
377
378 if (bfd_check_format (abfd, bfd_object))
379 vp = map_vmap (abfd, 0);
380
381 else if (bfd_check_format (abfd, bfd_archive))
382 {
383 last = 0;
384 /* FIXME??? am I tossing BFDs? bfd? */
385 while ((last = bfd_openr_next_archived_file (abfd, last)))
386 if (STREQ (mem, last->filename))
387 break;
388
389 if (!last)
390 {
391 bfd_close (abfd);
392 /* FIXME -- should be error */
393 warning ("\"%s\": member \"%s\" missing.", abfd->filename, mem);
394 return;
d87d7b10 395 }
0c4b30ea
SS
396
397 if (!bfd_check_format(last, bfd_object))
398 {
399 bfd_close (last); /* XXX??? */
400 goto obj_err;
d87d7b10 401 }
0c4b30ea
SS
402
403 vp = map_vmap (last, abfd);
404 }
405 else
406 {
407 obj_err:
408 bfd_close (abfd);
409 error ("\"%s\": not in executable format: %s.",
410 objname, bfd_errmsg (bfd_get_error ()));
411 /*NOTREACHED*/
412 }
413 obj = allocate_objfile (vp->bfd, 0);
414 vp->objfile = obj;
d87d7b10
SG
415
416#ifndef SOLIB_SYMBOLS_MANUAL
0c4b30ea
SS
417 if (catch_errors (objfile_symbol_add, (char *)obj,
418 "Error while reading shared library symbols:\n",
419 RETURN_MASK_ALL))
420 {
421 /* Note this is only done if symbol reading was successful. */
422 vmap_symtab (vp);
423 vp->loaded = 1;
424 }
d87d7b10 425#endif
0c4b30ea 426 return vp;
d87d7b10
SG
427}
428\f
0c4b30ea
SS
429/* update VMAP info with ldinfo() information
430 Input is ptr to ldinfo() results. */
d87d7b10
SG
431
432static void
0c4b30ea 433vmap_ldinfo (ldi)
d87d7b10
SG
434 register struct ld_info *ldi;
435{
436 struct stat ii, vi;
437 register struct vmap *vp;
88a5c3fc 438 int got_one, retried;
88a5c3fc 439 int got_exec_file;
d87d7b10 440
0c4b30ea
SS
441 /* For each *ldi, see if we have a corresponding *vp.
442 If so, update the mapping, and symbol table.
443 If not, add an entry and symbol table. */
d87d7b10 444
0c4b30ea
SS
445 do {
446 char *name = ldi->ldinfo_filename;
447 char *memb = name + strlen(name) + 1;
d87d7b10 448
0c4b30ea 449 retried = 0;
d87d7b10 450
0c4b30ea
SS
451 if (fstat (ldi->ldinfo_fd, &ii) < 0)
452 fatal ("cannot fstat(fd=%d) on %s", ldi->ldinfo_fd, name);
453 retry:
454 for (got_one = 0, vp = vmap; vp; vp = vp->nxt)
455 {
0c4b30ea
SS
456 /* First try to find a `vp', which is the same as in ldinfo.
457 If not the same, just continue and grep the next `vp'. If same,
458 relocate its tstart, tend, dstart, dend values. If no such `vp'
459 found, get out of this for loop, add this ldi entry as a new vmap
460 (add_vmap) and come back, fins its `vp' and so on... */
d87d7b10 461
0c4b30ea 462 /* The filenames are not always sufficient to match on. */
d87d7b10 463
0c4b30ea
SS
464 if ((name[0] == '/' && !STREQ(name, vp->name))
465 || (memb[0] && !STREQ(memb, vp->member)))
466 continue;
d87d7b10 467
0c4b30ea 468 /* See if we are referring to the same file. */
fb494327
JK
469 if (bfd_stat (vp->bfd, &vi) < 0)
470 /* An error here is innocuous, most likely meaning that
471 the file descriptor has become worthless.
472 FIXME: What does it mean for a file descriptor to become
473 "worthless"? What makes it happen? What error does it
474 produce (ENOENT? others?)? Should we at least provide
475 a warning? */
523ca9d0 476 continue;
d87d7b10 477
0c4b30ea
SS
478 if (ii.st_dev != vi.st_dev || ii.st_ino != vi.st_ino)
479 continue;
d87d7b10 480
0c4b30ea
SS
481 if (!retried)
482 close (ldi->ldinfo_fd);
d87d7b10 483
0c4b30ea 484 ++got_one;
d87d7b10 485
fb494327 486 /* Found a corresponding VMAP. Remap! */
d87d7b10 487
0c4b30ea
SS
488 /* We can assume pointer == CORE_ADDR, this code is native only. */
489 vp->tstart = (CORE_ADDR) ldi->ldinfo_textorg;
490 vp->tend = vp->tstart + ldi->ldinfo_textsize;
491 vp->dstart = (CORE_ADDR) ldi->ldinfo_dataorg;
492 vp->dend = vp->dstart + ldi->ldinfo_datasize;
d87d7b10 493
0c4b30ea
SS
494 if (vp->tadj)
495 {
d87d7b10
SG
496 vp->tstart += vp->tadj;
497 vp->tend += vp->tadj;
498 }
499
88a5c3fc
JK
500 /* The objfile is only NULL for the exec file. */
501 if (vp->objfile == NULL)
502 got_exec_file = 1;
503
fbc3f191
JL
504#ifdef DONT_RELOCATE_SYMFILE_OBJFILE
505 if (vp->objfile == symfile_objfile
506 || vp->objfile == NULL)
507 {
508 ldi->ldinfo_dataorg = 0;
509 vp->dstart = (CORE_ADDR) 0;
510 vp->dend = ldi->ldinfo_datasize;
511 }
512#endif
513
0c4b30ea
SS
514 /* relocate symbol table(s). */
515 vmap_symtab (vp);
d87d7b10 516
fb494327 517 /* There may be more, so we don't break out of the loop. */
0c4b30ea 518 }
d87d7b10 519
0c4b30ea
SS
520 /* if there was no matching *vp, we must perforce create the sucker(s) */
521 if (!got_one && !retried)
522 {
523 add_vmap (ldi);
524 ++retried;
525 goto retry;
526 }
d87d7b10
SG
527 } while (ldi->ldinfo_next
528 && (ldi = (void *) (ldi->ldinfo_next + (char *) ldi)));
529
8989d4fc
JK
530 /* If we don't find the symfile_objfile anywhere in the ldinfo, it
531 is unlikely that the symbol file is relocated to the proper
532 address. And we might have attached to a process which is
533 running a different copy of the same executable. */
88a5c3fc 534 if (symfile_objfile != NULL && !got_exec_file)
8989d4fc
JK
535 {
536 warning_begin ();
537 fputs_unfiltered ("Symbol file ", gdb_stderr);
538 fputs_unfiltered (symfile_objfile->name, gdb_stderr);
539 fputs_unfiltered ("\nis not mapped; discarding it.\n\
540If in fact that file has symbols which the mapped files listed by\n\
541\"info files\" lack, you can load symbols with the \"symbol-file\" or\n\
542\"add-symbol-file\" commands (note that you must take care of relocating\n\
543symbols to the proper address).\n", gdb_stderr);
544 free_objfile (symfile_objfile);
545 symfile_objfile = NULL;
546 }
e2adc41a 547 breakpoint_re_set ();
d87d7b10
SG
548}
549\f
550/* As well as symbol tables, exec_sections need relocation. After
551 the inferior process' termination, there will be a relocated symbol
552 table exist with no corresponding inferior process. At that time, we
553 need to use `exec' bfd, rather than the inferior process's memory space
554 to look up symbols.
555
556 `exec_sections' need to be relocated only once, as long as the exec
557 file remains unchanged.
558*/
559
560static void
561vmap_exec ()
562{
563 static bfd *execbfd;
564 int i;
565
566 if (execbfd == exec_bfd)
567 return;
568
569 execbfd = exec_bfd;
570
571 if (!vmap || !exec_ops.to_sections)
572 error ("vmap_exec: vmap or exec_ops.to_sections == 0\n");
573
574 for (i=0; &exec_ops.to_sections[i] < exec_ops.to_sections_end; i++)
575 {
94d4b713 576 if (STREQ(".text", exec_ops.to_sections[i].the_bfd_section->name))
d87d7b10
SG
577 {
578 exec_ops.to_sections[i].addr += vmap->tstart;
579 exec_ops.to_sections[i].endaddr += vmap->tstart;
580 }
94d4b713 581 else if (STREQ(".data", exec_ops.to_sections[i].the_bfd_section->name))
d87d7b10
SG
582 {
583 exec_ops.to_sections[i].addr += vmap->dstart;
584 exec_ops.to_sections[i].endaddr += vmap->dstart;
585 }
586 }
587}
588\f
589/* xcoff_relocate_symtab - hook for symbol table relocation.
590 also reads shared libraries.. */
591
0c4b30ea 592void
d87d7b10 593xcoff_relocate_symtab (pid)
0c4b30ea 594 unsigned int pid;
d87d7b10
SG
595{
596#define MAX_LOAD_SEGS 64 /* maximum number of load segments */
597
0c4b30ea 598 struct ld_info *ldi;
d87d7b10 599
0c4b30ea 600 ldi = (void *) alloca(MAX_LOAD_SEGS * sizeof (*ldi));
d87d7b10 601
0c4b30ea
SS
602 /* According to my humble theory, AIX has some timing problems and
603 when the user stack grows, kernel doesn't update stack info in time
604 and ptrace calls step on user stack. That is why we sleep here a little,
605 and give kernel to update its internals. */
d87d7b10 606
0c4b30ea 607 usleep (36000);
d87d7b10 608
0c4b30ea
SS
609 errno = 0;
610 ptrace (PT_LDINFO, pid, (PTRACE_ARG3_TYPE) ldi,
611 MAX_LOAD_SEGS * sizeof(*ldi), ldi);
612 if (errno)
613 perror_with_name ("ptrace ldinfo");
d87d7b10 614
0c4b30ea 615 vmap_ldinfo (ldi);
d87d7b10 616
0c4b30ea
SS
617 do {
618 /* We are allowed to assume CORE_ADDR == pointer. This code is
619 native only. */
620 add_text_to_loadinfo ((CORE_ADDR) ldi->ldinfo_textorg,
621 (CORE_ADDR) ldi->ldinfo_dataorg);
622 } while (ldi->ldinfo_next
623 && (ldi = (void *) (ldi->ldinfo_next + (char *) ldi)));
d87d7b10
SG
624
625#if 0
626 /* Now that we've jumbled things around, re-sort them. */
627 sort_minimal_symbols ();
628#endif
629
630 /* relocate the exec and core sections as well. */
631 vmap_exec ();
632}
633\f
634/* Core file stuff. */
635
636/* Relocate symtabs and read in shared library info, based on symbols
637 from the core file. */
0c4b30ea 638
d87d7b10 639void
9137a6f4
PS
640xcoff_relocate_core (target)
641 struct target_ops *target;
d87d7b10
SG
642{
643/* Offset of member MEMBER in a struct of type TYPE. */
644#ifndef offsetof
645#define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)
646#endif
647
648/* Size of a struct ld_info except for the variable-length filename. */
649#define LDINFO_SIZE (offsetof (struct ld_info, ldinfo_filename))
650
651 sec_ptr ldinfo_sec;
652 int offset = 0;
653 struct ld_info *ldip;
654 struct vmap *vp;
655
656 /* Allocated size of buffer. */
657 int buffer_size = LDINFO_SIZE;
658 char *buffer = xmalloc (buffer_size);
659 struct cleanup *old = make_cleanup (free_current_contents, &buffer);
660
661 /* FIXME, this restriction should not exist. For now, though I'll
662 avoid coredumps with error() pending a real fix. */
663 if (vmap == NULL)
664 error
665 ("Can't debug a core file without an executable file (on the RS/6000)");
666
667 ldinfo_sec = bfd_get_section_by_name (core_bfd, ".ldinfo");
668 if (ldinfo_sec == NULL)
669 {
0c4b30ea 670 bfd_err:
d87d7b10 671 fprintf_filtered (gdb_stderr, "Couldn't get ldinfo from core file: %s\n",
c4a081e1 672 bfd_errmsg (bfd_get_error ()));
d87d7b10
SG
673 do_cleanups (old);
674 return;
675 }
676 do
677 {
678 int i;
679 int names_found = 0;
680
681 /* Read in everything but the name. */
682 if (bfd_get_section_contents (core_bfd, ldinfo_sec, buffer,
683 offset, LDINFO_SIZE) == 0)
684 goto bfd_err;
685
686 /* Now the name. */
687 i = LDINFO_SIZE;
688 do
689 {
690 if (i == buffer_size)
691 {
692 buffer_size *= 2;
693 buffer = xrealloc (buffer, buffer_size);
694 }
695 if (bfd_get_section_contents (core_bfd, ldinfo_sec, &buffer[i],
696 offset + i, 1) == 0)
697 goto bfd_err;
698 if (buffer[i++] == '\0')
699 ++names_found;
700 } while (names_found < 2);
701
0c4b30ea 702 ldip = (struct ld_info *) buffer;
d87d7b10
SG
703
704 /* Can't use a file descriptor from the core file; need to open it. */
705 ldip->ldinfo_fd = -1;
706
707 /* The first ldinfo is for the exec file, allocated elsewhere. */
708 if (offset == 0)
709 vp = vmap;
710 else
711 vp = add_vmap (ldip);
712
713 offset += ldip->ldinfo_next;
714
715 /* We can assume pointer == CORE_ADDR, this code is native only. */
716 vp->tstart = (CORE_ADDR) ldip->ldinfo_textorg;
717 vp->tend = vp->tstart + ldip->ldinfo_textsize;
718 vp->dstart = (CORE_ADDR) ldip->ldinfo_dataorg;
719 vp->dend = vp->dstart + ldip->ldinfo_datasize;
720
df1e1074
PS
721#ifdef DONT_RELOCATE_SYMFILE_OBJFILE
722 if (vp == vmap)
723 {
724 vp->dstart = (CORE_ADDR) 0;
725 vp->dend = ldip->ldinfo_datasize;
726 }
727#endif
728
523ca9d0
SS
729 if (vp->tadj != 0)
730 {
731 vp->tstart += vp->tadj;
732 vp->tend += vp->tadj;
733 }
d87d7b10
SG
734
735 /* Unless this is the exec file,
736 add our sections to the section table for the core target. */
737 if (vp != vmap)
738 {
739 int count;
740 struct section_table *stp;
148070cc
JL
741 int update_coreops;
742
743 /* We must update the to_sections field in the core_ops structure
744 now to avoid dangling pointer dereferences. */
745 update_coreops = core_ops.to_sections === target->to_sections;
d87d7b10 746
9137a6f4 747 count = target->to_sections_end - target->to_sections;
d87d7b10 748 count += 2;
9137a6f4
PS
749 target->to_sections = (struct section_table *)
750 xrealloc (target->to_sections,
d87d7b10 751 sizeof (struct section_table) * count);
9137a6f4 752 target->to_sections_end = target->to_sections + count;
148070cc
JL
753
754 /* Update the to_sections field in the core_ops structure
755 if needed. */
756 if (update_coreops)
757 {
758 core_ops.to_sections = target->to_sections;
759 core_ops.to_sections_end = target->to_sections_end;
760 }
9137a6f4 761 stp = target->to_sections_end - 2;
d87d7b10
SG
762
763 /* "Why do we add bfd_section_vma?", I hear you cry.
764 Well, the start of the section in the file is actually
765 that far into the section as the struct vmap understands it.
766 So for text sections, bfd_section_vma tends to be 0x200,
767 and if vp->tstart is 0xd0002000, then the first byte of
768 the text section on disk corresponds to address 0xd0002200. */
769 stp->bfd = vp->bfd;
94d4b713
JK
770 stp->the_bfd_section = bfd_get_section_by_name (stp->bfd, ".text");
771 stp->addr = bfd_section_vma (stp->bfd, stp->the_bfd_section) + vp->tstart;
772 stp->endaddr = bfd_section_vma (stp->bfd, stp->the_bfd_section) + vp->tend;
d87d7b10
SG
773 stp++;
774
775 stp->bfd = vp->bfd;
94d4b713
JK
776 stp->the_bfd_section = bfd_get_section_by_name (stp->bfd, ".data");
777 stp->addr = bfd_section_vma (stp->bfd, stp->the_bfd_section) + vp->dstart;
778 stp->endaddr = bfd_section_vma (stp->bfd, stp->the_bfd_section) + vp->dend;
d87d7b10
SG
779 }
780
781 vmap_symtab (vp);
782
783 add_text_to_loadinfo ((CORE_ADDR)ldip->ldinfo_textorg,
784 (CORE_ADDR)ldip->ldinfo_dataorg);
785 } while (ldip->ldinfo_next != 0);
786 vmap_exec ();
e2adc41a 787 breakpoint_re_set ();
d87d7b10
SG
788 do_cleanups (old);
789}