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