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