1*ed0d50c3Schristos /* BFD back end for SCO5 core files (U-area and raw sections)
2*ed0d50c3Schristos    Copyright (C) 1998-2016 Free Software Foundation, Inc.
3*ed0d50c3Schristos    Written by Jouke Numan <jnuman@hiscom.nl>
4*ed0d50c3Schristos 
5*ed0d50c3Schristos    This file is part of BFD, the Binary File Descriptor library.
6*ed0d50c3Schristos 
7*ed0d50c3Schristos    This program is free software; you can redistribute it and/or modify
8*ed0d50c3Schristos    it under the terms of the GNU General Public License as published by
9*ed0d50c3Schristos    the Free Software Foundation; either version 3 of the License, or
10*ed0d50c3Schristos    (at your option) any later version.
11*ed0d50c3Schristos 
12*ed0d50c3Schristos    This program is distributed in the hope that it will be useful,
13*ed0d50c3Schristos    but WITHOUT ANY WARRANTY; without even the implied warranty of
14*ed0d50c3Schristos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*ed0d50c3Schristos    GNU General Public License for more details.
16*ed0d50c3Schristos 
17*ed0d50c3Schristos    You should have received a copy of the GNU General Public License
18*ed0d50c3Schristos    along with this program; if not, write to the Free Software
19*ed0d50c3Schristos    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20*ed0d50c3Schristos    MA 02110-1301, USA.  */
21*ed0d50c3Schristos 
22*ed0d50c3Schristos #include "sysdep.h"
23*ed0d50c3Schristos #include "bfd.h"
24*ed0d50c3Schristos #include "libbfd.h"
25*ed0d50c3Schristos #include "libaout.h"		/* BFD a.out internal data structures */
26*ed0d50c3Schristos 
27*ed0d50c3Schristos #include <stdio.h>
28*ed0d50c3Schristos #include <sys/types.h>
29*ed0d50c3Schristos #include <sys/param.h>
30*ed0d50c3Schristos #include <sys/dir.h>
31*ed0d50c3Schristos #include <signal.h>
32*ed0d50c3Schristos 
33*ed0d50c3Schristos #include <sys/user.h>		/* After a.out.h  */
34*ed0d50c3Schristos #ifdef SCO5_CORE
35*ed0d50c3Schristos #include <sys/paccess.h>
36*ed0d50c3Schristos #include <sys/region.h>
37*ed0d50c3Schristos #endif
38*ed0d50c3Schristos 
39*ed0d50c3Schristos struct sco5_core_struct
40*ed0d50c3Schristos {
41*ed0d50c3Schristos   struct user u;
42*ed0d50c3Schristos };
43*ed0d50c3Schristos 
44*ed0d50c3Schristos /* forward declarations */
45*ed0d50c3Schristos 
46*ed0d50c3Schristos #define sco5_core_file_matches_executable_p generic_core_file_matches_executable_p
47*ed0d50c3Schristos #define sco5_core_file_pid _bfd_nocore_core_file_pid
48*ed0d50c3Schristos 
49*ed0d50c3Schristos static asection *
50*ed0d50c3Schristos make_bfd_asection (bfd *abfd,
51*ed0d50c3Schristos 		   const char *name,
52*ed0d50c3Schristos 		   flagword flags,
53*ed0d50c3Schristos 		   bfd_size_type size,
54*ed0d50c3Schristos 		   bfd_vma vma,
55*ed0d50c3Schristos 		   file_ptr filepos)
56*ed0d50c3Schristos {
57*ed0d50c3Schristos   asection *asect;
58*ed0d50c3Schristos 
59*ed0d50c3Schristos   asect = bfd_make_section_anyway_with_flags (abfd, name, flags);
60*ed0d50c3Schristos   if (!asect)
61*ed0d50c3Schristos     return NULL;
62*ed0d50c3Schristos   asect->size = size;
63*ed0d50c3Schristos   asect->vma = vma;
64*ed0d50c3Schristos   asect->filepos = filepos;
65*ed0d50c3Schristos   asect->alignment_power = 2;
66*ed0d50c3Schristos 
67*ed0d50c3Schristos   return asect;
68*ed0d50c3Schristos }
69*ed0d50c3Schristos 
70*ed0d50c3Schristos static struct user *
71*ed0d50c3Schristos read_uarea (bfd *abfd, int filepos)
72*ed0d50c3Schristos {
73*ed0d50c3Schristos   struct sco5_core_struct *rawptr;
74*ed0d50c3Schristos   bfd_size_type amt = sizeof (struct sco5_core_struct);
75*ed0d50c3Schristos 
76*ed0d50c3Schristos   rawptr = (struct sco5_core_struct *) bfd_zmalloc (amt);
77*ed0d50c3Schristos   if (rawptr == NULL)
78*ed0d50c3Schristos     return NULL;
79*ed0d50c3Schristos 
80*ed0d50c3Schristos   abfd->tdata.sco5_core_data = rawptr;
81*ed0d50c3Schristos 
82*ed0d50c3Schristos   if (bfd_seek (abfd, (file_ptr) filepos, SEEK_SET) != 0
83*ed0d50c3Schristos       || bfd_bread ((void *) &rawptr->u, (bfd_size_type) sizeof rawptr->u,
84*ed0d50c3Schristos 		   abfd) != sizeof rawptr->u)
85*ed0d50c3Schristos     {
86*ed0d50c3Schristos       bfd_set_error (bfd_error_wrong_format);
87*ed0d50c3Schristos       return NULL;
88*ed0d50c3Schristos     }
89*ed0d50c3Schristos 
90*ed0d50c3Schristos   /* Sanity check perhaps??? */
91*ed0d50c3Schristos   if (rawptr->u.u_dsize > 0x1000000)    /* Remember, it's in pages...  */
92*ed0d50c3Schristos     {
93*ed0d50c3Schristos       bfd_set_error (bfd_error_wrong_format);
94*ed0d50c3Schristos       return NULL;
95*ed0d50c3Schristos     }
96*ed0d50c3Schristos   if (rawptr->u.u_ssize > 0x1000000)
97*ed0d50c3Schristos     {
98*ed0d50c3Schristos       bfd_set_error (bfd_error_wrong_format);
99*ed0d50c3Schristos       return NULL;
100*ed0d50c3Schristos     }
101*ed0d50c3Schristos   return &rawptr->u;
102*ed0d50c3Schristos }
103*ed0d50c3Schristos 
104*ed0d50c3Schristos const bfd_target *
105*ed0d50c3Schristos sco5_core_file_p (bfd *abfd)
106*ed0d50c3Schristos {
107*ed0d50c3Schristos   int coffset_siz, val, nsecs, cheadoffs;
108*ed0d50c3Schristos   int coresize;
109*ed0d50c3Schristos   struct user *u;
110*ed0d50c3Schristos   struct coreoffsets coffsets;
111*ed0d50c3Schristos   struct coresecthead chead;
112*ed0d50c3Schristos   char *secname;
113*ed0d50c3Schristos   flagword flags;
114*ed0d50c3Schristos 
115*ed0d50c3Schristos   /* Read coreoffsets region at end of core (see core(FP)).  */
116*ed0d50c3Schristos 
117*ed0d50c3Schristos   {
118*ed0d50c3Schristos     struct stat statbuf;
119*ed0d50c3Schristos 
120*ed0d50c3Schristos     if (bfd_stat (abfd, &statbuf) < 0)
121*ed0d50c3Schristos       return NULL;
122*ed0d50c3Schristos 
123*ed0d50c3Schristos     coresize = statbuf.st_size;
124*ed0d50c3Schristos   }
125*ed0d50c3Schristos   /* Last long in core is sizeof struct coreoffsets, read it */
126*ed0d50c3Schristos   if ((bfd_seek (abfd, (file_ptr) (coresize - sizeof coffset_siz),
127*ed0d50c3Schristos 		 SEEK_SET) != 0)
128*ed0d50c3Schristos       || bfd_bread ((void *) &coffset_siz, (bfd_size_type) sizeof coffset_siz,
129*ed0d50c3Schristos 		   abfd) != sizeof coffset_siz)
130*ed0d50c3Schristos     {
131*ed0d50c3Schristos       bfd_set_error (bfd_error_wrong_format);
132*ed0d50c3Schristos       return NULL;
133*ed0d50c3Schristos     }
134*ed0d50c3Schristos 
135*ed0d50c3Schristos   /* Use it to seek start of coreoffsets region, read it and determine
136*ed0d50c3Schristos      validity */
137*ed0d50c3Schristos   if ((bfd_seek (abfd, (file_ptr) (coresize - coffset_siz), SEEK_SET) != 0)
138*ed0d50c3Schristos       || (bfd_bread ((void *) &coffsets, (bfd_size_type) sizeof coffsets, abfd)
139*ed0d50c3Schristos 	  != sizeof coffsets)
140*ed0d50c3Schristos       || ((coffsets.u_info != 1) && (coffsets.u_info != C_VERSION)))
141*ed0d50c3Schristos     {
142*ed0d50c3Schristos       bfd_set_error (bfd_error_wrong_format);
143*ed0d50c3Schristos       return NULL;
144*ed0d50c3Schristos     }
145*ed0d50c3Schristos 
146*ed0d50c3Schristos   if (coffsets.u_info == 1)
147*ed0d50c3Schristos     {
148*ed0d50c3Schristos       /* Old version, no section heads, read info from user struct */
149*ed0d50c3Schristos 
150*ed0d50c3Schristos       u = read_uarea (abfd, coffsets.u_user);
151*ed0d50c3Schristos       if (! u)
152*ed0d50c3Schristos 	goto fail;
153*ed0d50c3Schristos 
154*ed0d50c3Schristos       if (!make_bfd_asection (abfd, ".reg", SEC_HAS_CONTENTS,
155*ed0d50c3Schristos 			      (bfd_size_type) coffsets.u_usize,
156*ed0d50c3Schristos 			      0 - (bfd_vma) u->u_ar0,
157*ed0d50c3Schristos 			      (file_ptr) coffsets.u_user))
158*ed0d50c3Schristos 	goto fail;
159*ed0d50c3Schristos 
160*ed0d50c3Schristos       if (!make_bfd_asection (abfd, ".data",
161*ed0d50c3Schristos 			      SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS,
162*ed0d50c3Schristos 			      ((bfd_size_type) u->u_exdata.ux_dsize
163*ed0d50c3Schristos 			       + u->u_exdata.ux_bsize),
164*ed0d50c3Schristos 			      (bfd_vma) u->u_exdata.ux_datorg,
165*ed0d50c3Schristos 			      (file_ptr) coffsets.u_data))
166*ed0d50c3Schristos 	goto fail;
167*ed0d50c3Schristos 
168*ed0d50c3Schristos       if (!make_bfd_asection (abfd, ".stack",
169*ed0d50c3Schristos 			      SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS,
170*ed0d50c3Schristos 			      (bfd_size_type) u->u_ssize * NBPC,
171*ed0d50c3Schristos 			      (bfd_vma) u->u_sub,
172*ed0d50c3Schristos 			      (file_ptr) coffsets.u_stack))
173*ed0d50c3Schristos 	goto fail;
174*ed0d50c3Schristos 
175*ed0d50c3Schristos       return abfd->xvec;		/* Done for version 1 */
176*ed0d50c3Schristos     }
177*ed0d50c3Schristos 
178*ed0d50c3Schristos   /* Immediately before coreoffsets region is a long with offset in core
179*ed0d50c3Schristos      to first coresecthead (CORES_OFFSETS), the long before this is the
180*ed0d50c3Schristos      number of section heads in the list. Read both longs and read the
181*ed0d50c3Schristos      coresecthead and check its validity */
182*ed0d50c3Schristos 
183*ed0d50c3Schristos   if ((bfd_seek (abfd,
184*ed0d50c3Schristos 		 (file_ptr) (coresize - coffset_siz - 2 * sizeof coffset_siz),
185*ed0d50c3Schristos 		 SEEK_SET) != 0)
186*ed0d50c3Schristos       || (bfd_bread ((void *) &nsecs, (bfd_size_type) sizeof nsecs, abfd)
187*ed0d50c3Schristos 	  != sizeof nsecs)
188*ed0d50c3Schristos       || (bfd_bread ((void *) &cheadoffs, (bfd_size_type) sizeof cheadoffs,
189*ed0d50c3Schristos 		    abfd) != sizeof cheadoffs)
190*ed0d50c3Schristos       || (bfd_seek (abfd, (file_ptr) cheadoffs, SEEK_SET) != 0)
191*ed0d50c3Schristos       || (bfd_bread ((void *) &chead, (bfd_size_type) sizeof chead, abfd)
192*ed0d50c3Schristos 	  != sizeof chead)
193*ed0d50c3Schristos       || (chead.cs_stype != CORES_OFFSETS)
194*ed0d50c3Schristos       || (chead.cs_x.csx_magic != COREMAGIC_NUMBER))
195*ed0d50c3Schristos     {
196*ed0d50c3Schristos       bfd_set_error (bfd_error_wrong_format);
197*ed0d50c3Schristos       goto fail;
198*ed0d50c3Schristos     }
199*ed0d50c3Schristos 
200*ed0d50c3Schristos   /* OK, we believe you.  You're a core file (sure, sure).  */
201*ed0d50c3Schristos 
202*ed0d50c3Schristos   /* Now loop over all regions and map them */
203*ed0d50c3Schristos   nsecs--;				/* We've seen CORES_OFFSETS already */
204*ed0d50c3Schristos   for (; nsecs; nsecs--)
205*ed0d50c3Schristos     {
206*ed0d50c3Schristos       if ((bfd_seek (abfd, (file_ptr) chead.cs_hseek, SEEK_SET) != 0)
207*ed0d50c3Schristos 	  || (bfd_bread ((void *) &chead, (bfd_size_type) sizeof chead, abfd)
208*ed0d50c3Schristos 	      != sizeof chead))
209*ed0d50c3Schristos 	{
210*ed0d50c3Schristos 	  bfd_set_error (bfd_error_wrong_format);
211*ed0d50c3Schristos 	  goto fail;
212*ed0d50c3Schristos 	}
213*ed0d50c3Schristos 
214*ed0d50c3Schristos       switch (chead.cs_stype)
215*ed0d50c3Schristos 	{
216*ed0d50c3Schristos 	case CORES_MAGIC:			/* Core header, check magic */
217*ed0d50c3Schristos 	  if (chead.cs_x.csx_magic != COREMAGIC_NUMBER)
218*ed0d50c3Schristos 	    {
219*ed0d50c3Schristos 	      bfd_set_error (bfd_error_wrong_format);
220*ed0d50c3Schristos 	      goto fail;
221*ed0d50c3Schristos 	    }
222*ed0d50c3Schristos 	  secname = NULL;
223*ed0d50c3Schristos 	  nsecs++;				/* MAGIC not in section cnt!*/
224*ed0d50c3Schristos 	  break;
225*ed0d50c3Schristos 	case CORES_UAREA:			/* U-area, read in tdata */
226*ed0d50c3Schristos 	  u = read_uarea (abfd, chead.cs_sseek);
227*ed0d50c3Schristos 	  if (! u)
228*ed0d50c3Schristos 	    goto fail;
229*ed0d50c3Schristos 
230*ed0d50c3Schristos 	  /* This is tricky.  As the "register section", we give them
231*ed0d50c3Schristos 	     the entire upage and stack.  u.u_ar0 points to where
232*ed0d50c3Schristos 	     "register 0" is stored.  There are two tricks with this,
233*ed0d50c3Schristos 	     though.  One is that the rest of the registers might be
234*ed0d50c3Schristos 	     at positive or negative (or both) displacements from
235*ed0d50c3Schristos 	     *u_ar0.  The other is that u_ar0 is sometimes an absolute
236*ed0d50c3Schristos 	     address in kernel memory, and on other systems it is an
237*ed0d50c3Schristos 	     offset from the beginning of the `struct user'.
238*ed0d50c3Schristos 
239*ed0d50c3Schristos 	     As a practical matter, we don't know where the registers
240*ed0d50c3Schristos 	     actually are, so we have to pass the whole area to GDB.
241*ed0d50c3Schristos 	     We encode the value of u_ar0 by setting the .regs section
242*ed0d50c3Schristos 	     up so that its virtual memory address 0 is at the place
243*ed0d50c3Schristos 	     pointed to by u_ar0 (by setting the vma of the start of
244*ed0d50c3Schristos 	     the section to -u_ar0).  GDB uses this info to locate the
245*ed0d50c3Schristos 	     regs, using minor trickery to get around the
246*ed0d50c3Schristos 	     offset-or-absolute-addr problem.  */
247*ed0d50c3Schristos 
248*ed0d50c3Schristos 	  chead.cs_vaddr = 0 - (bfd_vma) u->u_ar0;
249*ed0d50c3Schristos 
250*ed0d50c3Schristos 	  secname = ".reg";
251*ed0d50c3Schristos 	  flags = SEC_HAS_CONTENTS;
252*ed0d50c3Schristos 
253*ed0d50c3Schristos 	  break;
254*ed0d50c3Schristos 	case CORES_PREGION:			/* A program region, map it */
255*ed0d50c3Schristos 	  switch (chead.cs_x.csx_preg.csxp_rtyp)
256*ed0d50c3Schristos 	    {
257*ed0d50c3Schristos 	    case PT_DATA:
258*ed0d50c3Schristos 	      secname = ".data";	/* Data region.		 */
259*ed0d50c3Schristos 	      break;
260*ed0d50c3Schristos 	    case PT_STACK:
261*ed0d50c3Schristos 	      secname = ".stack";	/* Stack region.	 */
262*ed0d50c3Schristos 	      break;
263*ed0d50c3Schristos 	    case PT_SHMEM:
264*ed0d50c3Schristos 	      secname = ".shmem";	/* Shared memory	 */
265*ed0d50c3Schristos 	      break;
266*ed0d50c3Schristos 	    case PT_LIBDAT:
267*ed0d50c3Schristos 	      secname = ".libdat";	/* Shared library data	 */
268*ed0d50c3Schristos 	      break;
269*ed0d50c3Schristos 	    case PT_V86:
270*ed0d50c3Schristos 	      secname = ".virt86";	/* Virtual 8086 mode	 */
271*ed0d50c3Schristos 	      break;
272*ed0d50c3Schristos 	    case PT_SHFIL:
273*ed0d50c3Schristos 	      secname = ".mmfile";	/* Memory mapped file	 */
274*ed0d50c3Schristos 	      break;
275*ed0d50c3Schristos 	    case PT_XDATA0:
276*ed0d50c3Schristos 	      secname = ".Xdat0";	/* XENIX data region, virtual 0 */
277*ed0d50c3Schristos 	      break;
278*ed0d50c3Schristos 	    default:
279*ed0d50c3Schristos 	      secname = "";
280*ed0d50c3Schristos 	    }
281*ed0d50c3Schristos 	  flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS;
282*ed0d50c3Schristos 	  break;
283*ed0d50c3Schristos 	case CORES_PROC:			/* struct proc */
284*ed0d50c3Schristos 	case CORES_ITIMER:			/* interval timers */
285*ed0d50c3Schristos 	case CORES_SCOUTSNAME:			/* struct scoutsname */
286*ed0d50c3Schristos 	  secname = NULL;	/* Ignore these */
287*ed0d50c3Schristos 	  break;
288*ed0d50c3Schristos 	default:
289*ed0d50c3Schristos 	  (*_bfd_error_handler) ("Unhandled SCO core file section type %d\n",
290*ed0d50c3Schristos 				 chead.cs_stype);
291*ed0d50c3Schristos 	  continue;
292*ed0d50c3Schristos 	}
293*ed0d50c3Schristos 
294*ed0d50c3Schristos       if (secname
295*ed0d50c3Schristos 	  && !make_bfd_asection (abfd, secname, flags,
296*ed0d50c3Schristos 				 (bfd_size_type) chead.cs_vsize,
297*ed0d50c3Schristos 				 (bfd_vma) chead.cs_vaddr,
298*ed0d50c3Schristos 				 (file_ptr) chead.cs_sseek))
299*ed0d50c3Schristos 	goto fail;
300*ed0d50c3Schristos 
301*ed0d50c3Schristos     }
302*ed0d50c3Schristos 
303*ed0d50c3Schristos   return abfd->xvec;
304*ed0d50c3Schristos 
305*ed0d50c3Schristos  fail:
306*ed0d50c3Schristos   if (abfd->tdata.any)
307*ed0d50c3Schristos     {
308*ed0d50c3Schristos       bfd_release (abfd, abfd->tdata.any);
309*ed0d50c3Schristos       abfd->tdata.any = NULL;
310*ed0d50c3Schristos     }
311*ed0d50c3Schristos   bfd_section_list_clear (abfd);
312*ed0d50c3Schristos   return NULL;
313*ed0d50c3Schristos }
314*ed0d50c3Schristos 
315*ed0d50c3Schristos char *
316*ed0d50c3Schristos sco5_core_file_failing_command (bfd *abfd)
317*ed0d50c3Schristos {
318*ed0d50c3Schristos   char *com = abfd->tdata.sco5_core_data->u.u_comm;
319*ed0d50c3Schristos   if (*com)
320*ed0d50c3Schristos     return com;
321*ed0d50c3Schristos   else
322*ed0d50c3Schristos     return NULL;
323*ed0d50c3Schristos }
324*ed0d50c3Schristos 
325*ed0d50c3Schristos int
326*ed0d50c3Schristos sco5_core_file_failing_signal (bfd *ignore_abfd)
327*ed0d50c3Schristos {
328*ed0d50c3Schristos   return ((ignore_abfd->tdata.sco5_core_data->u.u_sysabort != 0)
329*ed0d50c3Schristos 	  ? ignore_abfd->tdata.sco5_core_data->u.u_sysabort
330*ed0d50c3Schristos 	  : -1);
331*ed0d50c3Schristos }
332*ed0d50c3Schristos 
333*ed0d50c3Schristos /* If somebody calls any byte-swapping routines, shoot them.  */
334*ed0d50c3Schristos static void
335*ed0d50c3Schristos swap_abort (void)
336*ed0d50c3Schristos {
337*ed0d50c3Schristos   abort (); /* This way doesn't require any declaration for ANSI to fuck up */
338*ed0d50c3Schristos }
339*ed0d50c3Schristos 
340*ed0d50c3Schristos #define	NO_GET ((bfd_vma (*) (const void *)) swap_abort)
341*ed0d50c3Schristos #define	NO_PUT ((void (*) (bfd_vma, void *)) swap_abort)
342*ed0d50c3Schristos #define	NO_GETS ((bfd_signed_vma (*) (const void *)) swap_abort)
343*ed0d50c3Schristos #define	NO_GET64 ((bfd_uint64_t (*) (const void *)) swap_abort)
344*ed0d50c3Schristos #define	NO_PUT64 ((void (*) (bfd_uint64_t, void *)) swap_abort)
345*ed0d50c3Schristos #define	NO_GETS64 ((bfd_int64_t (*) (const void *)) swap_abort)
346*ed0d50c3Schristos 
347*ed0d50c3Schristos const bfd_target core_sco5_vec =
348*ed0d50c3Schristos   {
349*ed0d50c3Schristos     "sco5-core",
350*ed0d50c3Schristos     bfd_target_unknown_flavour,
351*ed0d50c3Schristos     BFD_ENDIAN_LITTLE,	       /* target byte order */
352*ed0d50c3Schristos     BFD_ENDIAN_LITTLE,	       /* target headers byte order */
353*ed0d50c3Schristos     (HAS_RELOC | EXEC_P |	/* object flags */
354*ed0d50c3Schristos      HAS_LINENO | HAS_DEBUG |
355*ed0d50c3Schristos      HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
356*ed0d50c3Schristos     (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
357*ed0d50c3Schristos     0,				/* symbol prefix */
358*ed0d50c3Schristos     ' ',			/* ar_pad_char */
359*ed0d50c3Schristos     16,				/* ar_max_namelen */
360*ed0d50c3Schristos     0,				/* match priority.  */
361*ed0d50c3Schristos     NO_GET64, NO_GETS64, NO_PUT64,	/* 64 bit data */
362*ed0d50c3Schristos     NO_GET, NO_GETS, NO_PUT,		/* 32 bit data */
363*ed0d50c3Schristos     NO_GET, NO_GETS, NO_PUT,		/* 16 bit data */
364*ed0d50c3Schristos     NO_GET64, NO_GETS64, NO_PUT64,	/* 64 bit hdrs */
365*ed0d50c3Schristos     NO_GET, NO_GETS, NO_PUT,		/* 32 bit hdrs */
366*ed0d50c3Schristos     NO_GET, NO_GETS, NO_PUT,		/* 16 bit hdrs */
367*ed0d50c3Schristos 
368*ed0d50c3Schristos     {				/* bfd_check_format */
369*ed0d50c3Schristos       _bfd_dummy_target,		/* unknown format */
370*ed0d50c3Schristos       _bfd_dummy_target,		/* object file */
371*ed0d50c3Schristos       _bfd_dummy_target,		/* archive */
372*ed0d50c3Schristos       sco5_core_file_p			/* a core file */
373*ed0d50c3Schristos     },
374*ed0d50c3Schristos     {				/* bfd_set_format */
375*ed0d50c3Schristos       bfd_false, bfd_false,
376*ed0d50c3Schristos       bfd_false, bfd_false
377*ed0d50c3Schristos     },
378*ed0d50c3Schristos     {				/* bfd_write_contents */
379*ed0d50c3Schristos       bfd_false, bfd_false,
380*ed0d50c3Schristos       bfd_false, bfd_false
381*ed0d50c3Schristos     },
382*ed0d50c3Schristos 
383*ed0d50c3Schristos     BFD_JUMP_TABLE_GENERIC (_bfd_generic),
384*ed0d50c3Schristos     BFD_JUMP_TABLE_COPY (_bfd_generic),
385*ed0d50c3Schristos     BFD_JUMP_TABLE_CORE (sco5),
386*ed0d50c3Schristos     BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
387*ed0d50c3Schristos     BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols),
388*ed0d50c3Schristos     BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
389*ed0d50c3Schristos     BFD_JUMP_TABLE_WRITE (_bfd_generic),
390*ed0d50c3Schristos     BFD_JUMP_TABLE_LINK (_bfd_nolink),
391*ed0d50c3Schristos     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
392*ed0d50c3Schristos 
393*ed0d50c3Schristos     NULL,
394*ed0d50c3Schristos 
395*ed0d50c3Schristos     NULL			/* backend_data */
396*ed0d50c3Schristos   };
397