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