]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - bfd/rs6000-core.c
This commit was generated by cvs2svn to track changes on a CVS vendor
[thirdparty/binutils-gdb.git] / bfd / rs6000-core.c
1 /* IBM RS/6000 "XCOFF" back-end for BFD.
2 Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 2000
3 Free Software Foundation, Inc.
4 FIXME: Can someone provide a transliteration of this name into ASCII?
5 Using the following chars caused a compiler warning on HIUX (so I replaced
6 them with octal escapes), and isn't useful without an understanding of what
7 character set it is.
8 Written by Metin G. Ozisik, Mimi Ph\373\364ng-Th\345o V\365,
9 and John Gilmore.
10 Archive support from Damon A. Permezel.
11 Contributed by IBM Corporation and Cygnus Support.
12
13 This file is part of BFD, the Binary File Descriptor library.
14
15 This program is free software; you can redistribute it and/or modify
16 it under the terms of the GNU General Public License as published by
17 the Free Software Foundation; either version 2 of the License, or
18 (at your option) any later version.
19
20 This program is distributed in the hope that it will be useful,
21 but WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 GNU General Public License for more details.
24
25 You should have received a copy of the GNU General Public License
26 along with this program; if not, write to the Free Software
27 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
28
29 /* This port currently only handles reading object files, except when
30 compiled on an RS/6000 host. -- no archive support, no core files.
31 In all cases, it does not support writing.
32
33 This is in a separate file from coff-rs6000.c, because it includes
34 system include files that conflict with coff/rs6000.h.
35 */
36
37 /* Internalcoff.h and coffcode.h modify themselves based on this flag. */
38 #define RS6000COFF_C 1
39
40 /* The AIX 4.1 kernel is obviously compiled with -D_LONG_LONG, so
41 we have to define _LONG_LONG for older versions of gcc to get the
42 proper alignments in the user structure. */
43 #if defined(_AIX41) && !defined(_LONG_LONG)
44 #define _LONG_LONG
45 #endif
46
47 #include "bfd.h"
48 #include "sysdep.h"
49 #include "libbfd.h"
50
51 #ifdef AIX_CORE
52
53 /* AOUTHDR is defined by the above. We need another defn of it, from the
54 system include files. Punt the old one and get us a new name for the
55 typedef in the system include files. */
56 #ifdef AOUTHDR
57 #undef AOUTHDR
58 #endif
59 #define AOUTHDR second_AOUTHDR
60
61 #undef SCNHDR
62
63
64 /* ------------------------------------------------------------------------ */
65 /* Support for core file stuff.. */
66 /* ------------------------------------------------------------------------ */
67
68 #include <sys/user.h>
69 #define __LDINFO_PTRACE32__ /* for __ld_info32 */
70 #define __LDINFO_PTRACE64__ /* for __ld_info64 */
71 #include <sys/ldr.h>
72 #include <sys/core.h>
73 #include <sys/systemcfg.h>
74
75 #define core_hdr(bfd) ((CoreHdr *) bfd->tdata.any)
76
77 /* AIX 4.1 changed the names and locations of a few items in the core file.
78 AIX 4.3 defined an entirely new structure, core_dumpx, but kept support for
79 the previous 4.1 structure, core_dump.
80
81 AIX_CORE_DUMPX_CORE is defined (by configure) on AIX 4.3+, and
82 CORE_VERSION_1 is defined (by AIX core.h) as 2 on AIX 4.3+ and as 1 on AIX
83 4.1 and 4.2. AIX pre-4.1 (aka 3.x) either doesn't define CORE_VERSION_1
84 or else defines it as 0. */
85
86 #if defined(CORE_VERSION_1) && !CORE_VERSION_1
87 # undef CORE_VERSION_1
88 #endif
89
90 /* The following union and macros allow this module to compile on all AIX
91 versions and to handle both core_dumpx and core_dump on 4.3+. CNEW_*()
92 and COLD_*() macros respectively retrieve core_dumpx and core_dump
93 values. */
94
95 /* Union of 32-bit and 64-bit versions of ld_info. */
96
97 typedef union {
98 #ifdef __ld_info32
99 struct __ld_info32 l32;
100 struct __ld_info64 l64;
101 #else
102 struct ld_info l32;
103 struct ld_info l64;
104 #endif
105 } LdInfo;
106
107 /* Union of old and new core dump structures. */
108
109 typedef union {
110 #ifdef AIX_CORE_DUMPX_CORE
111 struct core_dumpx new; /* new AIX 4.3+ core dump */
112 #else
113 struct core_dump new; /* for simpler coding */
114 #endif
115 struct core_dump old; /* old AIX 4.2- core dump, still used on
116 4.3+ with appropriate SMIT config */
117 } CoreHdr;
118
119 /* Union of old and new vm_info structures. */
120
121 #ifdef CORE_VERSION_1
122 typedef union {
123 #ifdef AIX_CORE_DUMPX_CORE
124 struct vm_infox new;
125 #else
126 struct vm_info new;
127 #endif
128 struct vm_info old;
129 } VmInfo;
130 #endif
131
132 /* Return whether CoreHdr C is in new or old format. */
133
134 #ifdef AIX_CORE_DUMPX_CORE
135 # define CORE_NEW(c) (!(c).old.c_entries)
136 #else
137 # define CORE_NEW(c) 0
138 #endif
139
140 /* Return the c_stackorg field from struct core_dumpx C. */
141
142 #ifdef AIX_CORE_DUMPX_CORE
143 # define CNEW_STACKORG(c) (c).c_stackorg
144 #else
145 # define CNEW_STACKORG(c) 0
146 #endif
147
148 /* Return the offset to the loader region from struct core_dump C. */
149
150 #ifdef AIX_CORE_DUMPX_CORE
151 # define CNEW_LOADER(c) (c).c_loader
152 #else
153 # define CNEW_LOADER(c) 0
154 #endif
155
156 /* Return the offset to the loader region from struct core_dump C. */
157
158 #define COLD_LOADER(c) (c).c_tab
159
160 /* Return the c_lsize field from struct core_dumpx C. */
161
162 #ifdef AIX_CORE_DUMPX_CORE
163 # define CNEW_LSIZE(c) (c).c_lsize
164 #else
165 # define CNEW_LSIZE(c) 0
166 #endif
167
168 /* Return the c_dataorg field from struct core_dumpx C. */
169
170 #ifdef AIX_CORE_DUMPX_CORE
171 # define CNEW_DATAORG(c) (c).c_dataorg
172 #else
173 # define CNEW_DATAORG(c) 0
174 #endif
175
176 /* Return the c_datasize field from struct core_dumpx C. */
177
178 #ifdef AIX_CORE_DUMPX_CORE
179 # define CNEW_DATASIZE(c) (c).c_datasize
180 #else
181 # define CNEW_DATASIZE(c) 0
182 #endif
183
184 /* Return the c_impl field from struct core_dumpx C. */
185
186 #ifdef AIX_CORE_DUMPX_CORE
187 # define CNEW_IMPL(c) (c).c_impl
188 #else
189 # define CNEW_IMPL(c) 0
190 #endif
191
192 /* Return the command string from struct core_dumpx C. */
193
194 #ifdef AIX_CORE_DUMPX_CORE
195 # define CNEW_COMM(c) (c).c_u.U_proc.pi_comm
196 #else
197 # define CNEW_COMM(c) 0
198 #endif
199
200 /* Return the command string from struct core_dump C. */
201
202 #ifdef CORE_VERSION_1
203 # define COLD_COMM(c) (c).c_u.U_comm
204 #else
205 # define COLD_COMM(c) (c).c_u.u_comm
206 #endif
207
208 /* Return the struct __context64 pointer from struct core_dumpx C. */
209
210 #ifdef AIX_CORE_DUMPX_CORE
211 # define CNEW_CONTEXT64(c) (c).c_flt.hctx.r64
212 #else
213 # define CNEW_CONTEXT64(c) c
214 #endif
215
216 /* Return the struct mstsave pointer from struct core_dumpx C. */
217
218 #ifdef AIX_CORE_DUMPX_CORE
219 # define CNEW_MSTSAVE(c) (c).c_flt.hctx.r32
220 #else
221 # define CNEW_MSTSAVE(c) c
222 #endif
223
224 /* Return the struct mstsave pointer from struct core_dump C. */
225
226 #ifdef CORE_VERSION_1
227 # define COLD_MSTSAVE(c) (c).c_mst
228 #else
229 # define COLD_MSTSAVE(c) (c).c_u.u_save
230 #endif
231
232 /* Return whether struct core_dumpx is from a 64-bit process. */
233
234 #ifdef AIX_CORE_DUMPX_CORE
235 # define CNEW_PROC64(c) IS_PROC64(&(c).c_u.U_proc)
236 #else
237 # define CNEW_PROC64(c) 0
238 #endif
239
240 /* Magic end-of-stack addresses for old core dumps. This is _very_ fragile,
241 but I don't see any easy way to get that info right now. */
242
243 #ifdef CORE_VERSION_1
244 # define COLD_STACKEND 0x2ff23000
245 #else
246 # define COLD_STACKEND 0x2ff80000
247 #endif
248
249 /* Size of the leading portion that old and new core dump structures have in
250 common. */
251 #define CORE_COMMONSZ ((int)&((struct core_dump *)0)->c_entries + \
252 sizeof (((struct core_dump *)0)->c_entries))
253
254 /* Try to read into CORE the header from the core file associated with ABFD.
255 Return success. */
256
257 static boolean
258 read_hdr (bfd *abfd, CoreHdr *core)
259 {
260 bfd_size_type size;
261
262 if (bfd_seek (abfd, 0, SEEK_SET) != 0)
263 return false;
264
265 /* Read the leading portion that old and new core dump structures have in
266 common. */
267 if (bfd_read (core, CORE_COMMONSZ, 1, abfd) != CORE_COMMONSZ)
268 return false;
269
270 /* Read the trailing portion of the structure. */
271 size = CORE_NEW (*core) ? sizeof (core->new) : sizeof (core->old)
272 - CORE_COMMONSZ;
273 return bfd_read ((char *)core + CORE_COMMONSZ, size, 1, abfd) == size;
274 }
275
276 static asection *
277 make_bfd_asection (abfd, name, flags, _raw_size, vma, filepos)
278 bfd *abfd;
279 CONST char *name;
280 flagword flags;
281 bfd_size_type _raw_size;
282 bfd_vma vma;
283 file_ptr filepos;
284 {
285 asection *asect;
286
287 asect = bfd_make_section_anyway (abfd, name);
288 if (!asect)
289 return NULL;
290
291 asect->flags = flags;
292 asect->_raw_size = _raw_size;
293 asect->vma = vma;
294 asect->filepos = filepos;
295 asect->alignment_power = 8;
296
297 return asect;
298 }
299
300 /* Decide if a given bfd represents a `core' file or not. There really is no
301 magic number or anything like, in rs6000coff. */
302
303 const bfd_target *
304 rs6000coff_core_p (abfd)
305 bfd *abfd;
306 {
307 CoreHdr core;
308 struct stat statbuf;
309 bfd_size_type size;
310 char *tmpptr;
311
312 /* Values from new and old core structures. */
313 int c_flag;
314 file_ptr c_stack, c_regoff, c_loader;
315 bfd_size_type c_size, c_regsize, c_lsize;
316 bfd_vma c_stackend;
317 void *c_regptr;
318 int proc64;
319
320 if (!read_hdr (abfd, &core))
321 {
322 if (bfd_get_error () != bfd_error_system_call)
323 bfd_set_error (bfd_error_wrong_format);
324 return NULL;
325 }
326
327 /* Copy fields from new or old core structure. */
328 if (CORE_NEW (core))
329 {
330 c_flag = core.new.c_flag;
331 c_stack = (file_ptr) core.new.c_stack;
332 c_size = core.new.c_size;
333 c_stackend = CNEW_STACKORG (core.new) + c_size;
334 c_lsize = CNEW_LSIZE (core.new);
335 c_loader = CNEW_LOADER (core.new);
336 proc64 = CNEW_PROC64 (core.new);
337 }
338 else
339 {
340 c_flag = core.old.c_flag;
341 c_stack = (file_ptr) core.old.c_stack;
342 c_size = core.old.c_size;
343 c_stackend = COLD_STACKEND;
344 c_lsize = 0x7ffffff;
345 c_loader = (file_ptr) COLD_LOADER (core.old);
346 proc64 = 0;
347 }
348
349 if (proc64)
350 {
351 c_regsize = sizeof (CNEW_CONTEXT64 (core.new));
352 c_regptr = &CNEW_CONTEXT64 (core.new);
353 }
354 else if (CORE_NEW (core))
355 {
356 c_regsize = sizeof (CNEW_MSTSAVE (core.new));
357 c_regptr = &CNEW_MSTSAVE (core.new);
358 }
359 else
360 {
361 c_regsize = sizeof (COLD_MSTSAVE (core.old));
362 c_regptr = &COLD_MSTSAVE (core.old);
363 }
364 c_regoff = (char *)c_regptr - (char *)&core;
365
366 if (bfd_stat (abfd, &statbuf) < 0)
367 {
368 bfd_set_error (bfd_error_system_call);
369 return NULL;
370 }
371
372 /* If the core file ulimit is too small, the system will first
373 omit the data segment, then omit the stack, then decline to
374 dump core altogether (as far as I know UBLOCK_VALID and LE_VALID
375 are always set) (this is based on experimentation on AIX 3.2).
376 Now, the thing is that GDB users will be surprised
377 if segments just silently don't appear (well, maybe they would
378 think to check "info files", I don't know).
379
380 For the data segment, we have no choice but to keep going if it's
381 not there, since the default behavior is not to dump it (regardless
382 of the ulimit, it's based on SA_FULLDUMP). But for the stack segment,
383 if it's not there, we refuse to have anything to do with this core
384 file. The usefulness of a core dump without a stack segment is pretty
385 limited anyway. */
386
387 if (!(c_flag & UBLOCK_VALID)
388 || !(c_flag & LE_VALID))
389 {
390 bfd_set_error (bfd_error_wrong_format);
391 return NULL;
392 }
393
394 if (!(c_flag & USTACK_VALID))
395 {
396 bfd_set_error (bfd_error_file_truncated);
397 return NULL;
398 }
399
400 /* Don't check the core file size for a full core, AIX 4.1 includes
401 additional shared library sections in a full core. */
402 if (!(c_flag & (FULL_CORE | CORE_TRUNC)))
403 {
404 /* If the size is wrong, it means we're misinterpreting something. */
405 if (c_stack + (file_ptr) c_size != statbuf.st_size)
406 {
407 bfd_set_error (bfd_error_wrong_format);
408 return NULL;
409 }
410 }
411
412 /* Sanity check on the c_tab field. */
413 if (!CORE_NEW (core) && (c_loader < (file_ptr) sizeof core.old ||
414 c_loader >= statbuf.st_size ||
415 c_loader >= c_stack))
416 {
417 bfd_set_error (bfd_error_wrong_format);
418 return NULL;
419 }
420
421 /* Issue warning if the core file was truncated during writing. */
422 if (c_flag & CORE_TRUNC)
423 (*_bfd_error_handler) (_("%s: warning core file truncated"),
424 bfd_get_filename (abfd));
425
426 /* Allocate core file header. */
427 size = CORE_NEW (core) ? sizeof (core.new) : sizeof (core.old);
428 tmpptr = (char*) bfd_zalloc (abfd, size);
429 if (!tmpptr)
430 return NULL;
431
432 /* Copy core file header. */
433 memcpy (tmpptr, &core, size);
434 set_tdata (abfd, tmpptr);
435
436 /* Set architecture. */
437 if (CORE_NEW (core))
438 {
439 enum bfd_architecture arch;
440 unsigned long mach;
441
442 switch (CNEW_IMPL (core.new))
443 {
444 case POWER_RS1:
445 case POWER_RSC:
446 case POWER_RS2:
447 arch = bfd_arch_rs6000;
448 mach = bfd_mach_rs6k;
449 break;
450 default:
451 arch = bfd_arch_powerpc;
452 mach = bfd_mach_ppc;
453 break;
454 }
455 bfd_default_set_arch_mach (abfd, arch, mach);
456 }
457
458 /* .stack section. */
459 if (!make_bfd_asection (abfd, ".stack",
460 SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS,
461 c_size, c_stackend - c_size, c_stack))
462 return NULL;
463
464 /* .reg section for all registers. */
465 if (!make_bfd_asection (abfd, ".reg",
466 SEC_HAS_CONTENTS,
467 c_regsize, (bfd_vma) 0, c_regoff))
468 return NULL;
469
470 /* .ldinfo section.
471 To actually find out how long this section is in this particular
472 core dump would require going down the whole list of struct ld_info's.
473 See if we can just fake it. */
474 if (!make_bfd_asection (abfd, ".ldinfo",
475 SEC_HAS_CONTENTS,
476 c_lsize, (bfd_vma) 0, c_loader))
477 return NULL;
478
479 #ifndef CORE_VERSION_1
480 /* .data section if present.
481 AIX 3 dumps the complete data section and sets FULL_CORE if the
482 ulimit is large enough, otherwise the data section is omitted.
483 AIX 4 sets FULL_CORE even if the core file is truncated, we have
484 to examine core.c_datasize below to find out the actual size of
485 the .data section. */
486 if (c_flag & FULL_CORE)
487 {
488 if (!make_bfd_asection (abfd, ".data",
489 SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS,
490 (bfd_size_type) core.old.c_u.u_dsize,
491 (bfd_vma)
492 CDATA_ADDR (core.old.c_u.u_dsize),
493 c_stack + c_size))
494 return NULL;
495 }
496 #endif
497
498 #ifdef CORE_VERSION_1
499 /* AIX 4 adds data sections from loaded objects to the core file,
500 which can be found by examining ldinfo, and anonymously mmapped
501 regions. */
502 {
503 LdInfo ldinfo;
504 bfd_size_type ldi_datasize;
505 file_ptr ldi_core;
506 uint ldi_next;
507 bfd_vma ldi_dataorg;
508
509 /* Fields from new and old core structures. */
510 bfd_size_type c_datasize, c_vmregions;
511 file_ptr c_data, c_vmm;
512
513 if (CORE_NEW (core))
514 {
515 c_datasize = CNEW_DATASIZE (core.new);
516 c_data = (file_ptr) core.new.c_data;
517 c_vmregions = core.new.c_vmregions;
518 c_vmm = (file_ptr) core.new.c_vmm;
519 }
520 else
521 {
522 c_datasize = core.old.c_datasize;
523 c_data = (file_ptr) core.old.c_data;
524 c_vmregions = core.old.c_vmregions;
525 c_vmm = (file_ptr) core.old.c_vmm;
526 }
527
528 /* .data section from executable. */
529 if (c_datasize)
530 {
531 if (!make_bfd_asection (abfd, ".data",
532 SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS,
533 c_datasize,
534 (bfd_vma) CDATA_ADDR (c_datasize),
535 c_data))
536 return NULL;
537 }
538
539 /* .data sections from loaded objects. */
540 if (proc64)
541 size = (int)((LdInfo *)0)->l64.ldinfo_filename;
542 else
543 size = (int)((LdInfo *)0)->l32.ldinfo_filename;
544
545 while (1)
546 {
547 if (bfd_seek (abfd, c_loader, SEEK_SET) != 0)
548 return NULL;
549 if (bfd_read (&ldinfo, size, 1, abfd) != size)
550 return NULL;
551
552 if (proc64)
553 {
554 ldi_core = ldinfo.l64.ldinfo_core;
555 ldi_datasize = ldinfo.l64.ldinfo_datasize;
556 ldi_dataorg = (bfd_vma) ldinfo.l64.ldinfo_dataorg;
557 ldi_next = ldinfo.l64.ldinfo_next;
558 }
559 else
560 {
561 ldi_core = ldinfo.l32.ldinfo_core;
562 ldi_datasize = ldinfo.l32.ldinfo_datasize;
563 ldi_dataorg = (bfd_vma)(long) ldinfo.l32.ldinfo_dataorg;
564 ldi_next = ldinfo.l32.ldinfo_next;
565 }
566
567 if (ldi_core)
568 if (!make_bfd_asection (abfd, ".data",
569 SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS,
570 ldi_datasize, ldi_dataorg, ldi_core))
571 return NULL;
572
573 if (ldi_next == 0)
574 break;
575 c_loader += ldi_next;
576 }
577
578 /* .vmdata sections from anonymously mmapped regions. */
579 if (c_vmregions)
580 {
581 bfd_size_type i;
582
583 if (bfd_seek (abfd, c_vmm, SEEK_SET) != 0)
584 return NULL;
585
586 for (i = 0; i < c_vmregions; i++)
587 {
588 VmInfo vminfo;
589 bfd_size_type vminfo_size;
590 file_ptr vminfo_offset;
591 bfd_vma vminfo_addr;
592
593 size = CORE_NEW (core) ? sizeof (vminfo.new) : sizeof (vminfo.old);
594 if (bfd_read (&vminfo, size, 1, abfd) != size)
595 return NULL;
596
597 if (CORE_NEW (core))
598 {
599 vminfo_addr = (bfd_vma) vminfo.new.vminfo_addr;
600 vminfo_size = vminfo.new.vminfo_size;
601 vminfo_offset = vminfo.new.vminfo_offset;
602 }
603 else
604 {
605 vminfo_addr = (bfd_vma)(long) vminfo.old.vminfo_addr;
606 vminfo_size = vminfo.old.vminfo_size;
607 vminfo_offset = vminfo.old.vminfo_offset;
608 }
609
610 if (vminfo_offset)
611 if (!make_bfd_asection (abfd, ".vmdata",
612 SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS,
613 vminfo_size, vminfo_addr,
614 vminfo_offset))
615 return NULL;
616 }
617 }
618 }
619 #endif
620
621 return abfd->xvec; /* this is garbage for now. */
622 }
623
624
625
626 /* return `true' if given core is from the given executable.. */
627 boolean
628 rs6000coff_core_file_matches_executable_p (core_bfd, exec_bfd)
629 bfd *core_bfd;
630 bfd *exec_bfd;
631 {
632 CoreHdr core;
633 bfd_size_type size;
634 char *path, *s;
635 size_t alloc;
636 const char *str1, *str2;
637 boolean ret;
638 file_ptr c_loader;
639
640 if (!read_hdr (core_bfd, &core))
641 return false;
642
643 if (CORE_NEW (core))
644 c_loader = CNEW_LOADER (core.new);
645 else
646 c_loader = (file_ptr) COLD_LOADER (core.old);
647
648 if (CORE_NEW (core) && CNEW_PROC64 (core.new))
649 size = (int)((LdInfo *)0)->l64.ldinfo_filename;
650 else
651 size = (int)((LdInfo *)0)->l32.ldinfo_filename;
652
653 if (bfd_seek (core_bfd, c_loader + size, SEEK_SET) != 0)
654 return false;
655
656 alloc = 100;
657 path = bfd_malloc (alloc);
658 if (path == NULL)
659 return false;
660 s = path;
661
662 while (1)
663 {
664 if (bfd_read (s, 1, 1, core_bfd) != 1)
665 {
666 free (path);
667 return false;
668 }
669 if (*s == '\0')
670 break;
671 ++s;
672 if (s == path + alloc)
673 {
674 char *n;
675
676 alloc *= 2;
677 n = bfd_realloc (path, alloc);
678 if (n == NULL)
679 {
680 free (path);
681 return false;
682 }
683 s = n + (path - s);
684 path = n;
685 }
686 }
687
688 str1 = strrchr (path, '/');
689 str2 = strrchr (exec_bfd->filename, '/');
690
691 /* step over character '/' */
692 str1 = str1 != NULL ? str1 + 1 : path;
693 str2 = str2 != NULL ? str2 + 1 : exec_bfd->filename;
694
695 if (strcmp (str1, str2) == 0)
696 ret = true;
697 else
698 ret = false;
699
700 free (path);
701
702 return ret;
703 }
704
705 char *
706 rs6000coff_core_file_failing_command (abfd)
707 bfd *abfd;
708 {
709 CoreHdr *core = core_hdr (abfd);
710 char *com = CORE_NEW (*core) ?
711 CNEW_COMM (core->new) : COLD_COMM (core->old);
712
713 if (*com)
714 return com;
715 else
716 return 0;
717 }
718
719 int
720 rs6000coff_core_file_failing_signal (abfd)
721 bfd *abfd;
722 {
723 CoreHdr *core = core_hdr (abfd);
724 return CORE_NEW (*core) ? core->new.c_signo : core->old.c_signo;
725 }
726
727 #endif /* AIX_CORE */