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