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