Home | History | Annotate | Line # | Download | only in bfd
peicode.h revision 1.11
      1 /* Support for the generic parts of PE/PEI, for BFD.
      2    Copyright (C) 1995-2024 Free Software Foundation, Inc.
      3    Written by Cygnus Solutions.
      4 
      5    This file is part of BFD, the Binary File Descriptor library.
      6 
      7    This program is free software; you can redistribute it and/or modify
      8    it under the terms of the GNU General Public License as published by
      9    the Free Software Foundation; either version 3 of the License, or
     10    (at your option) any later version.
     11 
     12    This program is distributed in the hope that it will be useful,
     13    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15    GNU General Public License for more details.
     16 
     17    You should have received a copy of the GNU General Public License
     18    along with this program; if not, write to the Free Software
     19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     20    MA 02110-1301, USA.  */
     21 
     22 
     23 /* Most of this hacked by  Steve Chamberlain,
     24 			sac (at) cygnus.com
     25 
     26    PE/PEI rearrangement (and code added): Donn Terry
     27 				       Softway Systems, Inc.  */
     28 
     29 /* Hey look, some documentation [and in a place you expect to find it]!
     30 
     31    The main reference for the pei format is "Microsoft Portable Executable
     32    and Common Object File Format Specification 4.1".  Get it if you need to
     33    do some serious hacking on this code.
     34 
     35    Another reference:
     36    "Peering Inside the PE: A Tour of the Win32 Portable Executable
     37    File Format", MSJ 1994, Volume 9.
     38 
     39    The *sole* difference between the pe format and the pei format is that the
     40    latter has an MSDOS 2.0 .exe header on the front that prints the message
     41    "This app must be run under Windows." (or some such).
     42    (FIXME: Whether that statement is *really* true or not is unknown.
     43    Are there more subtle differences between pe and pei formats?
     44    For now assume there aren't.  If you find one, then for God sakes
     45    document it here!)
     46 
     47    The Microsoft docs use the word "image" instead of "executable" because
     48    the former can also refer to a DLL (shared library).  Confusion can arise
     49    because the `i' in `pei' also refers to "image".  The `pe' format can
     50    also create images (i.e. executables), it's just that to run on a win32
     51    system you need to use the pei format.
     52 
     53    FIXME: Please add more docs here so the next poor fool that has to hack
     54    on this code has a chance of getting something accomplished without
     55    wasting too much time.  */
     56 
     57 #include "libpei.h"
     58 
     59 static bool (*pe_saved_coff_bfd_print_private_bfd_data) (bfd *, void *) =
     60 #ifndef coff_bfd_print_private_bfd_data
     61      NULL;
     62 #else
     63      coff_bfd_print_private_bfd_data;
     64 #undef coff_bfd_print_private_bfd_data
     65 #endif
     66 
     67 static bool pe_print_private_bfd_data (bfd *, void *);
     68 #define coff_bfd_print_private_bfd_data pe_print_private_bfd_data
     69 
     70 static bool (*pe_saved_coff_bfd_copy_private_bfd_data) (bfd *, bfd *) =
     71 #ifndef coff_bfd_copy_private_bfd_data
     72      NULL;
     73 #else
     74      coff_bfd_copy_private_bfd_data;
     75 #undef coff_bfd_copy_private_bfd_data
     76 #endif
     77 
     78 static bool pe_bfd_copy_private_bfd_data (bfd *, bfd *);
     79 #define coff_bfd_copy_private_bfd_data pe_bfd_copy_private_bfd_data
     80 
     81 #define coff_mkobject	   pe_mkobject
     82 #define coff_mkobject_hook pe_mkobject_hook
     83 
     84 #ifdef COFF_IMAGE_WITH_PE
     85 /* This structure contains static variables used by the ILF code.  */
     86 typedef asection * asection_ptr;
     87 
     88 typedef struct
     89 {
     90   bfd *			abfd;
     91   bfd_byte *		data;
     92   struct bfd_in_memory * bim;
     93   unsigned short	magic;
     94 
     95   arelent *		reltab;
     96   unsigned int		relcount;
     97 
     98   coff_symbol_type *	sym_cache;
     99   coff_symbol_type *	sym_ptr;
    100   unsigned int		sym_index;
    101 
    102   unsigned int *	sym_table;
    103   unsigned int *	table_ptr;
    104 
    105   combined_entry_type * native_syms;
    106   combined_entry_type * native_ptr;
    107 
    108   coff_symbol_type **	sym_ptr_table;
    109   coff_symbol_type **	sym_ptr_ptr;
    110 
    111   unsigned int		sec_index;
    112 
    113   char *		string_table;
    114   char *		string_ptr;
    115   char *		end_string_ptr;
    116 
    117   SYMENT *		esym_table;
    118   SYMENT *		esym_ptr;
    119 
    120   struct internal_reloc * int_reltab;
    121 }
    122 pe_ILF_vars;
    123 #endif /* COFF_IMAGE_WITH_PE */
    124 
    125 bfd_cleanup coff_real_object_p
    126   (bfd *, unsigned, struct internal_filehdr *, struct internal_aouthdr *);
    127 
    128 #ifndef NO_COFF_RELOCS
    130 static void
    131 coff_swap_reloc_in (bfd * abfd, void * src, void * dst)
    132 {
    133   RELOC *reloc_src = (RELOC *) src;
    134   struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
    135 
    136   reloc_dst->r_vaddr  = H_GET_32 (abfd, reloc_src->r_vaddr);
    137   reloc_dst->r_symndx = H_GET_S32 (abfd, reloc_src->r_symndx);
    138   reloc_dst->r_type   = H_GET_16 (abfd, reloc_src->r_type);
    139 #ifdef SWAP_IN_RELOC_OFFSET
    140   reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET (abfd, reloc_src->r_offset);
    141 #endif
    142 }
    143 
    144 static unsigned int
    145 coff_swap_reloc_out (bfd * abfd, void * src, void * dst)
    146 {
    147   struct internal_reloc *reloc_src = (struct internal_reloc *) src;
    148   struct external_reloc *reloc_dst = (struct external_reloc *) dst;
    149 
    150   H_PUT_32 (abfd, reloc_src->r_vaddr, reloc_dst->r_vaddr);
    151   H_PUT_32 (abfd, reloc_src->r_symndx, reloc_dst->r_symndx);
    152   H_PUT_16 (abfd, reloc_src->r_type, reloc_dst->r_type);
    153 
    154 #ifdef SWAP_OUT_RELOC_OFFSET
    155   SWAP_OUT_RELOC_OFFSET (abfd, reloc_src->r_offset, reloc_dst->r_offset);
    156 #endif
    157 #ifdef SWAP_OUT_RELOC_EXTRA
    158   SWAP_OUT_RELOC_EXTRA (abfd, reloc_src, reloc_dst);
    159 #endif
    160   return RELSZ;
    161 }
    162 #endif /* not NO_COFF_RELOCS */
    163 
    164 #ifdef COFF_IMAGE_WITH_PE
    165 #undef FILHDR
    166 #define FILHDR struct external_PEI_IMAGE_hdr
    167 #endif
    168 
    169 static void
    170 coff_swap_filehdr_in (bfd * abfd, void * src, void * dst)
    171 {
    172   FILHDR *filehdr_src = (FILHDR *) src;
    173   struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
    174 
    175   filehdr_dst->f_magic  = H_GET_16 (abfd, filehdr_src->f_magic);
    176   filehdr_dst->f_nscns  = H_GET_16 (abfd, filehdr_src->f_nscns);
    177   filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat);
    178   filehdr_dst->f_nsyms  = H_GET_32 (abfd, filehdr_src->f_nsyms);
    179   filehdr_dst->f_flags  = H_GET_16 (abfd, filehdr_src->f_flags);
    180   filehdr_dst->f_symptr = H_GET_32 (abfd, filehdr_src->f_symptr);
    181 
    182   /* Other people's tools sometimes generate headers with an nsyms but
    183      a zero symptr.  */
    184   if (filehdr_dst->f_nsyms != 0 && filehdr_dst->f_symptr == 0)
    185     {
    186       filehdr_dst->f_nsyms = 0;
    187       filehdr_dst->f_flags |= F_LSYMS;
    188     }
    189 
    190   filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src-> f_opthdr);
    191 }
    192 
    193 #ifdef COFF_IMAGE_WITH_PE
    194 # define coff_swap_filehdr_out _bfd_XXi_only_swap_filehdr_out
    195 #elif defined COFF_WITH_peAArch64
    196 # define coff_swap_filehdr_out _bfd_XX_only_swap_filehdr_out
    197 #elif defined COFF_WITH_pex64
    198 # define coff_swap_filehdr_out _bfd_pex64_only_swap_filehdr_out
    199 #elif defined COFF_WITH_pep
    200 # define coff_swap_filehdr_out _bfd_pep_only_swap_filehdr_out
    201 #else
    202 # define coff_swap_filehdr_out _bfd_pe_only_swap_filehdr_out
    203 #endif
    204 
    205 static void
    206 coff_swap_scnhdr_in (bfd * abfd, void * ext, void * in)
    207 {
    208   SCNHDR *scnhdr_ext = (SCNHDR *) ext;
    209   struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
    210 
    211   memcpy (scnhdr_int->s_name, scnhdr_ext->s_name, sizeof (scnhdr_int->s_name));
    212 
    213   scnhdr_int->s_vaddr   = GET_SCNHDR_VADDR (abfd, scnhdr_ext->s_vaddr);
    214   scnhdr_int->s_paddr   = GET_SCNHDR_PADDR (abfd, scnhdr_ext->s_paddr);
    215   scnhdr_int->s_size    = GET_SCNHDR_SIZE (abfd, scnhdr_ext->s_size);
    216   scnhdr_int->s_scnptr  = GET_SCNHDR_SCNPTR (abfd, scnhdr_ext->s_scnptr);
    217   scnhdr_int->s_relptr  = GET_SCNHDR_RELPTR (abfd, scnhdr_ext->s_relptr);
    218   scnhdr_int->s_lnnoptr = GET_SCNHDR_LNNOPTR (abfd, scnhdr_ext->s_lnnoptr);
    219   scnhdr_int->s_flags   = H_GET_32 (abfd, scnhdr_ext->s_flags);
    220 
    221   /* MS handles overflow of line numbers by carrying into the reloc
    222      field (it appears).  Since it's supposed to be zero for PE
    223      *IMAGE* format, that's safe.  This is still a bit iffy.  */
    224 #ifdef COFF_IMAGE_WITH_PE
    225   scnhdr_int->s_nlnno = (H_GET_16 (abfd, scnhdr_ext->s_nlnno)
    226 			 + (H_GET_16 (abfd, scnhdr_ext->s_nreloc) << 16));
    227   scnhdr_int->s_nreloc = 0;
    228 #else
    229   scnhdr_int->s_nreloc = H_GET_16 (abfd, scnhdr_ext->s_nreloc);
    230   scnhdr_int->s_nlnno = H_GET_16 (abfd, scnhdr_ext->s_nlnno);
    231 #endif
    232 
    233   if (scnhdr_int->s_vaddr != 0)
    234     {
    235       scnhdr_int->s_vaddr += pe_data (abfd)->pe_opthdr.ImageBase;
    236       /* Do not cut upper 32-bits for 64-bit vma.  */
    237 #if !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64) && !defined(COFF_WITH_peRiscV64)
    238       scnhdr_int->s_vaddr &= 0xffffffff;
    239 #endif
    240     }
    241 
    242 #ifndef COFF_NO_HACK_SCNHDR_SIZE
    243   /* If this section holds uninitialized data and is from an object file
    244      or from an executable image that has not initialized the field,
    245      or if the image is an executable file and the physical size is padded,
    246      use the virtual size (stored in s_paddr) instead.  */
    247   if (scnhdr_int->s_paddr > 0
    248       && (((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0
    249 	   && (! bfd_pei_p (abfd) || scnhdr_int->s_size == 0))
    250 	  || (bfd_pei_p (abfd) && (scnhdr_int->s_size > scnhdr_int->s_paddr))))
    251   /* This code used to set scnhdr_int->s_paddr to 0.  However,
    252      coff_set_alignment_hook stores s_paddr in virt_size, which
    253      only works if it correctly holds the virtual size of the
    254      section.  */
    255     scnhdr_int->s_size = scnhdr_int->s_paddr;
    256 #endif
    257 }
    258 
    259 static bool
    260 pe_mkobject (bfd * abfd)
    261 {
    262   /* Some x86 code followed by an ascii string.  */
    263   static const char default_dos_message[64] = {
    264     0x0e, 0x1f, 0xba, 0x0e, 0x00, 0xb4, 0x09, 0xcd,
    265     0x21, 0xb8, 0x01, 0x4c, 0xcd, 0x21, 0x54, 0x68,
    266     0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72,
    267     0x61, 0x6d, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f,
    268     0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6e,
    269     0x20, 0x69, 0x6e, 0x20, 0x44, 0x4f, 0x53, 0x20,
    270     0x6d, 0x6f, 0x64, 0x65, 0x2e, 0x0d, 0x0d, 0x0a,
    271     0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    272 
    273   pe_data_type *pe = bfd_zalloc (abfd, sizeof (*pe));
    274   abfd->tdata.pe_obj_data = pe;
    275   if (pe == NULL)
    276     return false;
    277 
    278   pe->coff.pe = 1;
    279 
    280   /* in_reloc_p is architecture dependent.  */
    281   pe->in_reloc_p = in_reloc_p;
    282 
    283   memcpy (pe->dos_message, default_dos_message, sizeof (pe->dos_message));
    284 
    285   bfd_coff_long_section_names (abfd)
    286     = coff_backend_info (abfd)->_bfd_coff_long_section_names;
    287 
    288   return true;
    289 }
    290 
    291 /* Create the COFF backend specific information.  */
    292 
    293 static void *
    294 pe_mkobject_hook (bfd * abfd,
    295 		  void * filehdr,
    296 		  void * aouthdr ATTRIBUTE_UNUSED)
    297 {
    298   struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
    299   pe_data_type *pe;
    300 
    301   if (! pe_mkobject (abfd))
    302     return NULL;
    303 
    304   pe = pe_data (abfd);
    305   pe->coff.sym_filepos = internal_f->f_symptr;
    306   /* These members communicate important constants about the symbol
    307      table to GDB's symbol-reading code.  These `constants'
    308      unfortunately vary among coff implementations...  */
    309   pe->coff.local_n_btmask = N_BTMASK;
    310   pe->coff.local_n_btshft = N_BTSHFT;
    311   pe->coff.local_n_tmask = N_TMASK;
    312   pe->coff.local_n_tshift = N_TSHIFT;
    313   pe->coff.local_symesz = SYMESZ;
    314   pe->coff.local_auxesz = AUXESZ;
    315   pe->coff.local_linesz = LINESZ;
    316 
    317   pe->coff.timestamp = internal_f->f_timdat;
    318 
    319   obj_raw_syment_count (abfd) =
    320     obj_conv_table_size (abfd) =
    321       internal_f->f_nsyms;
    322 
    323   pe->real_flags = internal_f->f_flags;
    324 
    325   if ((internal_f->f_flags & F_DLL) != 0)
    326     pe->dll = 1;
    327 
    328   if ((internal_f->f_flags & IMAGE_FILE_DEBUG_STRIPPED) == 0)
    329     abfd->flags |= HAS_DEBUG;
    330 
    331 #ifdef COFF_IMAGE_WITH_PE
    332   if (aouthdr)
    333     pe->pe_opthdr = ((struct internal_aouthdr *) aouthdr)->pe;
    334 #endif
    335 
    336 #ifdef ARM
    337   if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
    338     coff_data (abfd) ->flags = 0;
    339 #endif
    340 
    341   memcpy (pe->dos_message, internal_f->pe.dos_message,
    342 	  sizeof (pe->dos_message));
    343 
    344   return (void *) pe;
    345 }
    346 
    347 static bool
    348 pe_print_private_bfd_data (bfd *abfd, void * vfile)
    349 {
    350   FILE *file = (FILE *) vfile;
    351 
    352   if (!_bfd_XX_print_private_bfd_data_common (abfd, vfile))
    353     return false;
    354 
    355   if (pe_saved_coff_bfd_print_private_bfd_data == NULL)
    356     return true;
    357 
    358   fputc ('\n', file);
    359 
    360   return pe_saved_coff_bfd_print_private_bfd_data (abfd, vfile);
    361 }
    362 
    363 /* Copy any private info we understand from the input bfd
    364    to the output bfd.  */
    365 
    366 static bool
    367 pe_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
    368 {
    369   /* PR binutils/716: Copy the large address aware flag.
    370      XXX: Should we be copying other flags or other fields in the pe_data()
    371      structure ?  */
    372   if (pe_data (obfd) != NULL
    373       && pe_data (ibfd) != NULL
    374       && pe_data (ibfd)->real_flags & IMAGE_FILE_LARGE_ADDRESS_AWARE)
    375     pe_data (obfd)->real_flags |= IMAGE_FILE_LARGE_ADDRESS_AWARE;
    376 
    377   if (!_bfd_XX_bfd_copy_private_bfd_data_common (ibfd, obfd))
    378     return false;
    379 
    380   if (pe_saved_coff_bfd_copy_private_bfd_data)
    381     return pe_saved_coff_bfd_copy_private_bfd_data (ibfd, obfd);
    382 
    383   return true;
    384 }
    385 
    386 #define coff_bfd_copy_private_section_data \
    387   _bfd_XX_bfd_copy_private_section_data
    388 
    389 #define coff_get_symbol_info _bfd_XX_get_symbol_info
    390 
    391 #ifdef COFF_IMAGE_WITH_PE
    392 
    393 /* Code to handle Microsoft's Import Library Format.
    395    Also known as LINK6 format.
    396    Documentation about this format can be found at:
    397 
    398    https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#import-library-format  */
    399 
    400 /* The following constants specify the sizes of the various data
    401    structures that we have to create in order to build a bfd describing
    402    an ILF object file.  The final "+ 1" in the definitions of SIZEOF_IDATA6
    403    and SIZEOF_IDATA7 below is to allow for the possibility that we might
    404    need a padding byte in order to ensure 16 bit alignment for the section's
    405    contents.
    406 
    407    The value for SIZEOF_ILF_STRINGS is computed as follows:
    408 
    409       There will be NUM_ILF_SECTIONS section symbols.  Allow 9 characters
    410       per symbol for their names (longest section name is .idata$x).
    411 
    412       There will be two symbols for the imported value, one the symbol name
    413       and one with _imp__ prefixed.  Allowing for the terminating nul's this
    414       is strlen (symbol_name) * 2 + 8 + 21 + strlen (source_dll).
    415 
    416       The strings in the string table must start STRING__SIZE_SIZE bytes into
    417       the table in order to for the string lookup code in coffgen/coffcode to
    418       work.  */
    419 #define NUM_ILF_RELOCS		8
    420 #define NUM_ILF_SECTIONS	6
    421 #define NUM_ILF_SYMS		(2 + NUM_ILF_SECTIONS)
    422 
    423 #define SIZEOF_ILF_SYMS		 (NUM_ILF_SYMS * sizeof (* vars.sym_cache))
    424 #define SIZEOF_ILF_SYM_TABLE	 (NUM_ILF_SYMS * sizeof (* vars.sym_table))
    425 #define SIZEOF_ILF_NATIVE_SYMS	 (NUM_ILF_SYMS * sizeof (* vars.native_syms))
    426 #define SIZEOF_ILF_SYM_PTR_TABLE (NUM_ILF_SYMS * sizeof (* vars.sym_ptr_table))
    427 #define SIZEOF_ILF_EXT_SYMS	 (NUM_ILF_SYMS * sizeof (* vars.esym_table))
    428 #define SIZEOF_ILF_RELOCS	 (NUM_ILF_RELOCS * sizeof (* vars.reltab))
    429 #define SIZEOF_ILF_INT_RELOCS	 (NUM_ILF_RELOCS * sizeof (* vars.int_reltab))
    430 #define SIZEOF_ILF_STRINGS	 (strlen (symbol_name) * 2 + 8 \
    431 					+ 21 + strlen (source_dll) \
    432 					+ NUM_ILF_SECTIONS * 9 \
    433 					+ STRING_SIZE_SIZE)
    434 #define SIZEOF_IDATA2		(5 * 4)
    435 
    436 /* For PEx64 idata4 & 5 have thumb size of 8 bytes.  */
    437 #if defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64)
    438 #define SIZEOF_IDATA4		(2 * 4)
    439 #define SIZEOF_IDATA5		(2 * 4)
    440 #else
    441 #define SIZEOF_IDATA4		(1 * 4)
    442 #define SIZEOF_IDATA5		(1 * 4)
    443 #endif
    444 
    445 #define SIZEOF_IDATA6		(2 + strlen (symbol_name) + 1 + 1)
    446 #define SIZEOF_IDATA7		(strlen (source_dll) + 1 + 1)
    447 #define SIZEOF_ILF_SECTIONS	(NUM_ILF_SECTIONS * sizeof (struct coff_section_tdata))
    448 
    449 #define ILF_DATA_SIZE				\
    450     + SIZEOF_ILF_SYMS				\
    451     + SIZEOF_ILF_SYM_TABLE			\
    452     + SIZEOF_ILF_NATIVE_SYMS			\
    453     + SIZEOF_ILF_SYM_PTR_TABLE			\
    454     + SIZEOF_ILF_EXT_SYMS			\
    455     + SIZEOF_ILF_RELOCS				\
    456     + SIZEOF_ILF_INT_RELOCS			\
    457     + SIZEOF_ILF_STRINGS			\
    458     + SIZEOF_IDATA2				\
    459     + SIZEOF_IDATA4				\
    460     + SIZEOF_IDATA5				\
    461     + SIZEOF_IDATA6				\
    462     + SIZEOF_IDATA7				\
    463     + SIZEOF_ILF_SECTIONS			\
    464     + MAX_TEXT_SECTION_SIZE
    465 
    466 /* Create an empty relocation against the given symbol.  */
    467 
    468 static void
    469 pe_ILF_make_a_symbol_reloc (pe_ILF_vars *		vars,
    470 			    bfd_vma			address,
    471 			    bfd_reloc_code_real_type	reloc,
    472 			    struct bfd_symbol **	sym,
    473 			    unsigned int		sym_index)
    474 {
    475   arelent * entry;
    476   struct internal_reloc * internal;
    477 
    478   entry = vars->reltab + vars->relcount;
    479   internal = vars->int_reltab + vars->relcount;
    480 
    481   entry->address     = address;
    482   entry->addend      = 0;
    483   entry->howto       = bfd_reloc_type_lookup (vars->abfd, reloc);
    484   entry->sym_ptr_ptr = sym;
    485 
    486   internal->r_vaddr  = address;
    487   internal->r_symndx = sym_index;
    488   internal->r_type   = entry->howto ? entry->howto->type : 0;
    489 
    490   vars->relcount ++;
    491 
    492   BFD_ASSERT (vars->relcount <= NUM_ILF_RELOCS);
    493 }
    494 
    495 /* Create an empty relocation against the given section.  */
    496 
    497 static void
    498 pe_ILF_make_a_reloc (pe_ILF_vars *	       vars,
    499 		     bfd_vma		       address,
    500 		     bfd_reloc_code_real_type  reloc,
    501 		     asection_ptr	       sec)
    502 {
    503   pe_ILF_make_a_symbol_reloc (vars, address, reloc, sec->symbol_ptr_ptr,
    504 			      coff_section_data (vars->abfd, sec)->i);
    505 }
    506 
    507 /* Move the queued relocs into the given section.  */
    508 
    509 static void
    510 pe_ILF_save_relocs (pe_ILF_vars * vars,
    511 		    asection_ptr  sec)
    512 {
    513   /* Make sure that there is somewhere to store the internal relocs.  */
    514   if (coff_section_data (vars->abfd, sec) == NULL)
    515     /* We should probably return an error indication here.  */
    516     abort ();
    517 
    518   coff_section_data (vars->abfd, sec)->relocs = vars->int_reltab;
    519 
    520   sec->relocation  = vars->reltab;
    521   sec->reloc_count = vars->relcount;
    522   sec->flags      |= SEC_RELOC;
    523 
    524   vars->reltab     += vars->relcount;
    525   vars->int_reltab += vars->relcount;
    526   vars->relcount   = 0;
    527 
    528   BFD_ASSERT ((bfd_byte *) vars->int_reltab < (bfd_byte *) vars->string_table);
    529 }
    530 
    531 /* Create a global symbol and add it to the relevant tables.  */
    532 
    533 static void
    534 pe_ILF_make_a_symbol (pe_ILF_vars *  vars,
    535 		      const char *   prefix,
    536 		      const char *   symbol_name,
    537 		      asection_ptr   section,
    538 		      flagword       extra_flags)
    539 {
    540   coff_symbol_type * sym;
    541   combined_entry_type * ent;
    542   SYMENT * esym;
    543   unsigned short sclass;
    544 
    545   if (extra_flags & BSF_LOCAL)
    546     sclass = C_STAT;
    547   else
    548     sclass = C_EXT;
    549 
    550 #ifdef THUMBPEMAGIC
    551   if (vars->magic == THUMBPEMAGIC)
    552     {
    553       if (extra_flags & BSF_FUNCTION)
    554 	sclass = C_THUMBEXTFUNC;
    555       else if (extra_flags & BSF_LOCAL)
    556 	sclass = C_THUMBSTAT;
    557       else
    558 	sclass = C_THUMBEXT;
    559     }
    560 #endif
    561 
    562   BFD_ASSERT (vars->sym_index < NUM_ILF_SYMS);
    563 
    564   sym = vars->sym_ptr;
    565   ent = vars->native_ptr;
    566   esym = vars->esym_ptr;
    567 
    568   /* Copy the symbol's name into the string table.  */
    569   int len = sprintf (vars->string_ptr, "%s%s", prefix, symbol_name);
    570 
    571   if (section == NULL)
    572     section = bfd_und_section_ptr;
    573 
    574   /* Initialise the external symbol.  */
    575   H_PUT_32 (vars->abfd, vars->string_ptr - vars->string_table,
    576 	    esym->e.e.e_offset);
    577   H_PUT_16 (vars->abfd, section->target_index, esym->e_scnum);
    578   esym->e_sclass[0] = sclass;
    579 
    580   /* The following initialisations are unnecessary - the memory is
    581      zero initialised.  They are just kept here as reminders.  */
    582 
    583   /* Initialise the internal symbol structure.  */
    584   ent->u.syment.n_sclass	  = sclass;
    585   ent->u.syment.n_scnum		  = section->target_index;
    586   ent->u.syment._n._n_n._n_offset = (uintptr_t) sym;
    587   ent->is_sym = true;
    588 
    589   sym->symbol.the_bfd = vars->abfd;
    590   sym->symbol.name    = vars->string_ptr;
    591   sym->symbol.flags   = BSF_EXPORT | BSF_GLOBAL | extra_flags;
    592   sym->symbol.section = section;
    593   sym->native	      = ent;
    594 
    595   * vars->table_ptr = vars->sym_index;
    596   * vars->sym_ptr_ptr = sym;
    597 
    598   /* Adjust pointers for the next symbol.  */
    599   vars->sym_index ++;
    600   vars->sym_ptr ++;
    601   vars->sym_ptr_ptr ++;
    602   vars->table_ptr ++;
    603   vars->native_ptr ++;
    604   vars->esym_ptr ++;
    605   vars->string_ptr += len + 1;
    606 
    607   BFD_ASSERT (vars->string_ptr < vars->end_string_ptr);
    608 }
    609 
    610 /* Create a section.  */
    611 
    612 static asection_ptr
    613 pe_ILF_make_a_section (pe_ILF_vars * vars,
    614 		       const char *  name,
    615 		       unsigned int  size,
    616 		       flagword      extra_flags)
    617 {
    618   asection_ptr sec;
    619   flagword     flags;
    620   intptr_t alignment;
    621 
    622   sec = bfd_make_section_old_way (vars->abfd, name);
    623   if (sec == NULL)
    624     return NULL;
    625 
    626   flags = SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_KEEP | SEC_IN_MEMORY;
    627 
    628   bfd_set_section_flags (sec, flags | extra_flags);
    629 
    630   bfd_set_section_alignment (sec, 2);
    631 
    632   /* Check that we will not run out of space.  */
    633   BFD_ASSERT (vars->data + size < vars->bim->buffer + vars->bim->size);
    634 
    635   /* Set the section size and contents.  The actual
    636      contents are filled in by our parent.  */
    637   bfd_set_section_size (sec, (bfd_size_type) size);
    638   sec->contents = vars->data;
    639   sec->target_index = vars->sec_index ++;
    640 
    641   /* Advance data pointer in the vars structure.  */
    642   vars->data += size;
    643 
    644   /* Skip the padding byte if it was not needed.
    645      The logic here is that if the string length is odd,
    646      then the entire string length, including the null byte,
    647      is even and so the extra, padding byte, is not needed.  */
    648   if (size & 1)
    649     vars->data --;
    650 
    651   /* PR 18758: See note in pe_ILF_buid_a_bfd.  We must make sure that we
    652      preserve host alignment requirements.  The BFD_ASSERTs in this
    653      functions will warn us if we run out of room, but we should
    654      already have enough padding built in to ILF_DATA_SIZE.  */
    655 #if GCC_VERSION >= 3000
    656   alignment = __alignof__ (struct coff_section_tdata);
    657 #else
    658   alignment = 8;
    659 #endif
    660   vars->data
    661     = (bfd_byte *) (((intptr_t) vars->data + alignment - 1) & -alignment);
    662 
    663   /* Create a coff_section_tdata structure for our use.  */
    664   sec->used_by_bfd = (struct coff_section_tdata *) vars->data;
    665   vars->data += sizeof (struct coff_section_tdata);
    666 
    667   BFD_ASSERT (vars->data <= vars->bim->buffer + vars->bim->size);
    668 
    669   /* Create a symbol to refer to this section.  */
    670   pe_ILF_make_a_symbol (vars, "", name, sec, BSF_LOCAL);
    671 
    672   /* Cache the index to the symbol in the coff_section_data structure.  */
    673   coff_section_data (vars->abfd, sec)->i = vars->sym_index - 1;
    674 
    675   return sec;
    676 }
    677 
    678 /* This structure contains the code that goes into the .text section
    679    in order to perform a jump into the DLL lookup table.  The entries
    680    in the table are index by the magic number used to represent the
    681    machine type in the PE file.  The contents of the data[] arrays in
    682    these entries are stolen from the jtab[] arrays in ld/pe-dll.c.
    683    The SIZE field says how many bytes in the DATA array are actually
    684    used.  The OFFSET field says where in the data array the address
    685    of the .idata$5 section should be placed.  */
    686 #define MAX_TEXT_SECTION_SIZE 32
    687 
    688 typedef struct
    689 {
    690   unsigned short magic;
    691   unsigned char  data[MAX_TEXT_SECTION_SIZE];
    692   unsigned int   size;
    693   unsigned int   offset;
    694 }
    695 jump_table;
    696 
    697 static const jump_table jtab[] =
    698 {
    699 #ifdef I386MAGIC
    700   { I386MAGIC,
    701     { 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90 },
    702     8, 2
    703   },
    704 #endif
    705 
    706 #ifdef AMD64MAGIC
    707   { AMD64MAGIC,
    708     { 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90 },
    709     8, 2
    710   },
    711 #endif
    712 
    713 #ifdef  MC68MAGIC
    714   { MC68MAGIC,
    715     { /* XXX fill me in */ },
    716     0, 0
    717   },
    718 #endif
    719 
    720 #ifdef  MIPS_ARCH_MAGIC_WINCE
    721   { MIPS_ARCH_MAGIC_WINCE,
    722     { 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
    723       0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 },
    724     16, 0
    725   },
    726 #endif
    727 
    728 #ifdef  SH_ARCH_MAGIC_WINCE
    729   { SH_ARCH_MAGIC_WINCE,
    730     { 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40,
    731       0x09, 0x00, 0x00, 0x00, 0x00, 0x00 },
    732     12, 8
    733   },
    734 #endif
    735 
    736 #ifdef AARCH64MAGIC
    737 /* We don't currently support jumping to DLLs, so if
    738    someone does try emit a runtime trap.  Through UDF #0.  */
    739   { AARCH64MAGIC,
    740     { 0x00, 0x00, 0x00, 0x00 },
    741     4, 0
    742   },
    743 
    744 #endif
    745 
    746 #ifdef  ARMPEMAGIC
    747   { ARMPEMAGIC,
    748     { 0x00, 0xc0, 0x9f, 0xe5, 0x00, 0xf0,
    749       0x9c, 0xe5, 0x00, 0x00, 0x00, 0x00},
    750     12, 8
    751   },
    752 #endif
    753 
    754 #ifdef  THUMBPEMAGIC
    755   { THUMBPEMAGIC,
    756     { 0x40, 0xb4, 0x02, 0x4e, 0x36, 0x68, 0xb4, 0x46,
    757       0x40, 0xbc, 0x60, 0x47, 0x00, 0x00, 0x00, 0x00 },
    758     16, 12
    759   },
    760 #endif
    761 
    762 #ifdef LOONGARCH64MAGIC
    763 /* We don't currently support jumping to DLLs, so if
    764    someone does try emit a runtime trap.  Through BREAK 0.  */
    765   { LOONGARCH64MAGIC,
    766     { 0x00, 0x00, 0x2a, 0x00 },
    767     4, 0
    768   },
    769 
    770 #endif
    771 
    772 #ifdef RISCV64MAGIC
    773   /* We don't currently support jumping to DLLs, so if
    774      someone does try emit a runtime trap.  Through EBREAK.  */
    775   { RISCV64MAGIC,
    776     { 0x73, 0x00, 0x10, 0x00 },
    777     4, 0
    778   },
    779 
    780 #endif
    781 
    782   { 0, { 0 }, 0, 0 }
    783 };
    784 
    785 #ifndef NUM_ENTRIES
    786 #define NUM_ENTRIES(a) (sizeof (a) / sizeof (a)[0])
    787 #endif
    788 
    789 /* Build a full BFD from the information supplied in a ILF object.  */
    790 
    791 static bool
    792 pe_ILF_build_a_bfd (bfd *	    abfd,
    793 		    unsigned int    magic,
    794 		    char *	    symbol_name,
    795 		    char *	    source_dll,
    796 		    unsigned int    ordinal,
    797 		    unsigned int    types)
    798 {
    799   bfd_byte *		   ptr;
    800   pe_ILF_vars		   vars;
    801   struct internal_filehdr  internal_f;
    802   unsigned int		   import_type;
    803   unsigned int		   import_name_type;
    804   asection_ptr		   id4, id5, id6 = NULL, text = NULL;
    805   coff_symbol_type **	   imp_sym;
    806   unsigned int		   imp_index;
    807   intptr_t alignment;
    808 
    809   /* Decode and verify the types field of the ILF structure.  */
    810   import_type = types & 0x3;
    811   import_name_type = (types & 0x1c) >> 2;
    812 
    813   switch (import_type)
    814     {
    815     case IMPORT_CODE:
    816     case IMPORT_DATA:
    817       break;
    818 
    819     case IMPORT_CONST:
    820       /* XXX code yet to be written.  */
    821       /* xgettext:c-format */
    822       _bfd_error_handler (_("%pB: unhandled import type; %x"),
    823 			  abfd, import_type);
    824       return false;
    825 
    826     default:
    827       /* xgettext:c-format */
    828       _bfd_error_handler (_("%pB: unrecognized import type; %x"),
    829 			  abfd, import_type);
    830       return false;
    831     }
    832 
    833   switch (import_name_type)
    834     {
    835     case IMPORT_ORDINAL:
    836     case IMPORT_NAME:
    837     case IMPORT_NAME_NOPREFIX:
    838     case IMPORT_NAME_UNDECORATE:
    839       break;
    840 
    841     default:
    842       /* xgettext:c-format */
    843       _bfd_error_handler (_("%pB: unrecognized import name type; %x"),
    844 			  abfd, import_name_type);
    845       return false;
    846     }
    847 
    848   /* Initialise local variables.
    849 
    850      Note these are kept in a structure rather than being
    851      declared as statics since bfd frowns on global variables.
    852 
    853      We are going to construct the contents of the BFD in memory,
    854      so allocate all the space that we will need right now.  */
    855   vars.bim
    856     = (struct bfd_in_memory *) bfd_malloc ((bfd_size_type) sizeof (*vars.bim));
    857   if (vars.bim == NULL)
    858     return false;
    859 
    860   ptr = (bfd_byte *) bfd_zmalloc ((bfd_size_type) ILF_DATA_SIZE);
    861   vars.bim->buffer = ptr;
    862   vars.bim->size   = ILF_DATA_SIZE;
    863   if (ptr == NULL)
    864     goto error_return;
    865 
    866   /* Initialise the pointers to regions of the memory and the
    867      other contents of the pe_ILF_vars structure as well.  */
    868   vars.sym_cache = (coff_symbol_type *) ptr;
    869   vars.sym_ptr   = (coff_symbol_type *) ptr;
    870   vars.sym_index = 0;
    871   ptr += SIZEOF_ILF_SYMS;
    872 
    873   vars.sym_table = (unsigned int *) ptr;
    874   vars.table_ptr = (unsigned int *) ptr;
    875   ptr += SIZEOF_ILF_SYM_TABLE;
    876 
    877   vars.native_syms = (combined_entry_type *) ptr;
    878   vars.native_ptr  = (combined_entry_type *) ptr;
    879   ptr += SIZEOF_ILF_NATIVE_SYMS;
    880 
    881   vars.sym_ptr_table = (coff_symbol_type **) ptr;
    882   vars.sym_ptr_ptr   = (coff_symbol_type **) ptr;
    883   ptr += SIZEOF_ILF_SYM_PTR_TABLE;
    884 
    885   vars.esym_table = (SYMENT *) ptr;
    886   vars.esym_ptr   = (SYMENT *) ptr;
    887   ptr += SIZEOF_ILF_EXT_SYMS;
    888 
    889   vars.reltab   = (arelent *) ptr;
    890   vars.relcount = 0;
    891   ptr += SIZEOF_ILF_RELOCS;
    892 
    893   vars.int_reltab  = (struct internal_reloc *) ptr;
    894   ptr += SIZEOF_ILF_INT_RELOCS;
    895 
    896   vars.string_table = (char *) ptr;
    897   vars.string_ptr   = (char *) ptr + STRING_SIZE_SIZE;
    898   ptr += SIZEOF_ILF_STRINGS;
    899   vars.end_string_ptr = (char *) ptr;
    900 
    901   /* The remaining space in bim->buffer is used
    902      by the pe_ILF_make_a_section() function.  */
    903 
    904   /* PR 18758: Make sure that the data area is sufficiently aligned for
    905      struct coff_section_tdata.  __alignof__ is a gcc extension, hence
    906      the test of GCC_VERSION.  For other compilers we assume 8 byte
    907      alignment.  */
    908 #if GCC_VERSION >= 3000
    909   alignment = __alignof__ (struct coff_section_tdata);
    910 #else
    911   alignment = 8;
    912 #endif
    913   ptr = (bfd_byte *) (((intptr_t) ptr + alignment - 1) & -alignment);
    914 
    915   vars.data = ptr;
    916   vars.abfd = abfd;
    917   vars.sec_index = 0;
    918   vars.magic = magic;
    919 
    920   /* Create the initial .idata$<n> sections:
    921      [.idata$2:  Import Directory Table -- not needed]
    922      .idata$4:  Import Lookup Table
    923      .idata$5:  Import Address Table
    924 
    925      Note we do not create a .idata$3 section as this is
    926      created for us by the linker script.  */
    927   id4 = pe_ILF_make_a_section (& vars, ".idata$4", SIZEOF_IDATA4, 0);
    928   id5 = pe_ILF_make_a_section (& vars, ".idata$5", SIZEOF_IDATA5, 0);
    929   if (id4 == NULL || id5 == NULL)
    930     goto error_return;
    931 
    932   /* Fill in the contents of these sections.  */
    933   if (import_name_type == IMPORT_ORDINAL)
    934     {
    935       if (ordinal == 0)
    936 	/* See PR 20907 for a reproducer.  */
    937 	goto error_return;
    938 
    939 #if defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) || defined(COFF_WITH_peLoongArch64) || defined (COFF_WITH_peRiscV64)
    940       ((unsigned int *) id4->contents)[0] = ordinal;
    941       ((unsigned int *) id4->contents)[1] = 0x80000000;
    942       ((unsigned int *) id5->contents)[0] = ordinal;
    943       ((unsigned int *) id5->contents)[1] = 0x80000000;
    944 #else
    945       * (unsigned int *) id4->contents = ordinal | 0x80000000;
    946       * (unsigned int *) id5->contents = ordinal | 0x80000000;
    947 #endif
    948     }
    949   else
    950     {
    951       char * symbol;
    952       unsigned int len;
    953 
    954       /* Create .idata$6 - the Hint Name Table.  */
    955       id6 = pe_ILF_make_a_section (& vars, ".idata$6", SIZEOF_IDATA6, 0);
    956       if (id6 == NULL)
    957 	goto error_return;
    958 
    959       /* If necessary, trim the import symbol name.  */
    960       symbol = symbol_name;
    961 
    962       /* As used by MS compiler, '_', '@', and '?' are alternative
    963 	 forms of USER_LABEL_PREFIX, with '?' for c++ mangled names,
    964 	 '@' used for fastcall (in C),  '_' everywhere else.  Only one
    965 	 of these is used for a symbol.  We strip this leading char for
    966 	 IMPORT_NAME_NOPREFIX and IMPORT_NAME_UNDECORATE as per the
    967 	 PE COFF 6.0 spec (section 8.3, Import Name Type).  */
    968 
    969       if (import_name_type != IMPORT_NAME)
    970 	{
    971 	  char c = symbol[0];
    972 
    973 	  /* Check that we don't remove for targets with empty
    974 	     USER_LABEL_PREFIX the leading underscore.  */
    975 	  if ((c == '_' && abfd->xvec->symbol_leading_char != 0)
    976 	      || c == '@' || c == '?')
    977 	    symbol++;
    978 	}
    979 
    980       len = strlen (symbol);
    981       if (import_name_type == IMPORT_NAME_UNDECORATE)
    982 	{
    983 	  /* Truncate at the first '@'.  */
    984 	  char *at = strchr (symbol, '@');
    985 
    986 	  if (at != NULL)
    987 	    len = at - symbol;
    988 	}
    989 
    990       id6->contents[0] = ordinal & 0xff;
    991       id6->contents[1] = ordinal >> 8;
    992 
    993       memcpy ((char *) id6->contents + 2, symbol, len);
    994       id6->contents[len + 2] = '\0';
    995     }
    996 
    997   if (import_name_type != IMPORT_ORDINAL)
    998     {
    999       pe_ILF_make_a_reloc (&vars, (bfd_vma) 0, BFD_RELOC_RVA, id6);
   1000       pe_ILF_save_relocs (&vars, id4);
   1001 
   1002       pe_ILF_make_a_reloc (&vars, (bfd_vma) 0, BFD_RELOC_RVA, id6);
   1003       pe_ILF_save_relocs (&vars, id5);
   1004     }
   1005 
   1006   /* Create an import symbol.  */
   1007   pe_ILF_make_a_symbol (& vars, "__imp_", symbol_name, id5, 0);
   1008   imp_sym   = vars.sym_ptr_ptr - 1;
   1009   imp_index = vars.sym_index - 1;
   1010 
   1011   /* Create extra sections depending upon the type of import we are dealing with.  */
   1012   switch (import_type)
   1013     {
   1014       int i;
   1015 
   1016     case IMPORT_CODE:
   1017       /* CODE functions are special, in that they get a trampoline that
   1018 	 jumps to the main import symbol.  Create a .text section to hold it.
   1019 	 First we need to look up its contents in the jump table.  */
   1020       for (i = NUM_ENTRIES (jtab); i--;)
   1021 	{
   1022 	  if (jtab[i].size == 0)
   1023 	    continue;
   1024 	  if (jtab[i].magic == magic)
   1025 	    break;
   1026 	}
   1027       /* If we did not find a matching entry something is wrong.  */
   1028       if (i < 0)
   1029 	abort ();
   1030 
   1031       /* Create the .text section.  */
   1032       text = pe_ILF_make_a_section (& vars, ".text", jtab[i].size, SEC_CODE);
   1033       if (text == NULL)
   1034 	goto error_return;
   1035 
   1036       /* Copy in the jump code.  */
   1037       memcpy (text->contents, jtab[i].data, jtab[i].size);
   1038 
   1039       /* Create a reloc for the data in the text section.  */
   1040 #ifdef MIPS_ARCH_MAGIC_WINCE
   1041       if (magic == MIPS_ARCH_MAGIC_WINCE)
   1042 	{
   1043 	  pe_ILF_make_a_symbol_reloc (&vars, (bfd_vma) 0, BFD_RELOC_HI16_S,
   1044 				      (struct bfd_symbol **) imp_sym,
   1045 				      imp_index);
   1046 	  pe_ILF_make_a_reloc (&vars, (bfd_vma) 0, BFD_RELOC_LO16, text);
   1047 	  pe_ILF_make_a_symbol_reloc (&vars, (bfd_vma) 4, BFD_RELOC_LO16,
   1048 				      (struct bfd_symbol **) imp_sym,
   1049 				      imp_index);
   1050 	}
   1051       else
   1052 #endif
   1053 #ifdef AMD64MAGIC
   1054       if (magic == AMD64MAGIC)
   1055 	{
   1056 	  pe_ILF_make_a_symbol_reloc (&vars, (bfd_vma) jtab[i].offset,
   1057 				      BFD_RELOC_32_PCREL, (asymbol **) imp_sym,
   1058 				      imp_index);
   1059 	}
   1060       else
   1061 #endif
   1062 	pe_ILF_make_a_symbol_reloc (&vars, (bfd_vma) jtab[i].offset,
   1063 				    BFD_RELOC_32, (asymbol **) imp_sym,
   1064 				    imp_index);
   1065 
   1066       pe_ILF_save_relocs (& vars, text);
   1067       break;
   1068 
   1069     case IMPORT_DATA:
   1070       break;
   1071 
   1072     default:
   1073       /* XXX code not yet written.  */
   1074       abort ();
   1075     }
   1076 
   1077   /* Now create a symbol describing the imported value.  */
   1078   switch (import_type)
   1079     {
   1080     case IMPORT_CODE:
   1081       pe_ILF_make_a_symbol (& vars, "", symbol_name, text,
   1082 			    BSF_NOT_AT_END | BSF_FUNCTION);
   1083 
   1084       break;
   1085 
   1086     case IMPORT_DATA:
   1087       /* Nothing to do here.  */
   1088       break;
   1089 
   1090     default:
   1091       /* XXX code not yet written.  */
   1092       abort ();
   1093     }
   1094 
   1095   /* Create an import symbol for the DLL, without the .dll suffix.  */
   1096   ptr = (bfd_byte *) strrchr (source_dll, '.');
   1097   if (ptr)
   1098     * ptr = 0;
   1099   pe_ILF_make_a_symbol (& vars, "__IMPORT_DESCRIPTOR_", source_dll, NULL, 0);
   1100   if (ptr)
   1101     * ptr = '.';
   1102 
   1103   /* Initialise the bfd.  */
   1104   memset (& internal_f, 0, sizeof (internal_f));
   1105 
   1106   internal_f.f_magic  = magic;
   1107   internal_f.f_symptr = 0;
   1108   internal_f.f_nsyms  = 0;
   1109   internal_f.f_flags  = F_AR32WR | F_LNNO; /* XXX is this correct ?  */
   1110 
   1111   if (   ! bfd_set_start_address (abfd, (bfd_vma) 0)
   1112       || ! bfd_coff_set_arch_mach_hook (abfd, & internal_f))
   1113     goto error_return;
   1114 
   1115   if (bfd_coff_mkobject_hook (abfd, (void *) & internal_f, NULL) == NULL)
   1116     goto error_return;
   1117 
   1118   obj_pe (abfd) = true;
   1119 #ifdef THUMBPEMAGIC
   1120   if (vars.magic == THUMBPEMAGIC)
   1121     /* Stop some linker warnings about thumb code not supporting interworking.  */
   1122     coff_data (abfd)->flags |= F_INTERWORK | F_INTERWORK_SET;
   1123 #endif
   1124 
   1125   /* Switch from file contents to memory contents.  */
   1126   bfd_cache_close (abfd);
   1127 
   1128   abfd->iostream = (void *) vars.bim;
   1129   abfd->flags |= BFD_IN_MEMORY | HAS_SYMS;
   1130   abfd->iovec = &_bfd_memory_iovec;
   1131   abfd->where = 0;
   1132   abfd->origin = 0;
   1133   abfd->size = 0;
   1134   obj_sym_filepos (abfd) = 0;
   1135 
   1136   /* Point the bfd at the symbol table.  */
   1137   obj_symbols (abfd) = vars.sym_cache;
   1138   abfd->symcount = vars.sym_index;
   1139 
   1140   obj_raw_syments (abfd) = vars.native_syms;
   1141   obj_raw_syment_count (abfd) = vars.sym_index;
   1142 
   1143   obj_coff_external_syms (abfd) = (void *) vars.esym_table;
   1144   obj_coff_keep_syms (abfd) = true;
   1145 
   1146   obj_convert (abfd) = vars.sym_table;
   1147   obj_conv_table_size (abfd) = vars.sym_index;
   1148 
   1149   obj_coff_strings (abfd) = vars.string_table;
   1150   obj_coff_strings_len (abfd) = vars.string_ptr - vars.string_table;
   1151   obj_coff_keep_strings (abfd) = true;
   1152 
   1153   return true;
   1154 
   1155  error_return:
   1156   free (vars.bim->buffer);
   1157   free (vars.bim);
   1158   return false;
   1159 }
   1160 
   1161 /* Cleanup function, returned from check_format hook.  */
   1162 
   1163 static void
   1164 pe_ILF_cleanup (bfd *abfd)
   1165 {
   1166   coff_object_cleanup (abfd);
   1167 
   1168   struct bfd_in_memory *bim = abfd->iostream;
   1169   free (bim->buffer);
   1170   free (bim);
   1171   abfd->iostream = NULL;
   1172 }
   1173 
   1174 /* We have detected an Import Library Format archive element.
   1175    Decode the element and return the appropriate target.  */
   1176 
   1177 static bfd_cleanup
   1178 pe_ILF_object_p (bfd * abfd)
   1179 {
   1180   bfd_byte	  buffer[14];
   1181   bfd_byte *	  ptr;
   1182   char *	  symbol_name;
   1183   char *	  source_dll;
   1184   unsigned int	  machine;
   1185   bfd_size_type	  size;
   1186   unsigned int	  ordinal;
   1187   unsigned int	  types;
   1188   unsigned int	  magic;
   1189 
   1190   /* Upon entry the first six bytes of the ILF header have
   1191      already been read.  Now read the rest of the header.  */
   1192   if (bfd_read (buffer, 14, abfd) != 14)
   1193     return NULL;
   1194 
   1195   ptr = buffer;
   1196 
   1197   machine = H_GET_16 (abfd, ptr);
   1198   ptr += 2;
   1199 
   1200   /* Check that the machine type is recognised.  */
   1201   magic = 0;
   1202 
   1203   switch (machine)
   1204     {
   1205     case IMAGE_FILE_MACHINE_UNKNOWN:
   1206     case IMAGE_FILE_MACHINE_ALPHA:
   1207     case IMAGE_FILE_MACHINE_ALPHA64:
   1208     case IMAGE_FILE_MACHINE_IA64:
   1209       break;
   1210 
   1211     case IMAGE_FILE_MACHINE_I386:
   1212 #ifdef I386MAGIC
   1213       magic = I386MAGIC;
   1214 #endif
   1215       break;
   1216 
   1217     case IMAGE_FILE_MACHINE_AMD64:
   1218 #ifdef AMD64MAGIC
   1219       magic = AMD64MAGIC;
   1220 #endif
   1221       break;
   1222 
   1223     case IMAGE_FILE_MACHINE_R3000:
   1224     case IMAGE_FILE_MACHINE_R4000:
   1225     case IMAGE_FILE_MACHINE_R10000:
   1226 
   1227     case IMAGE_FILE_MACHINE_MIPS16:
   1228     case IMAGE_FILE_MACHINE_MIPSFPU:
   1229     case IMAGE_FILE_MACHINE_MIPSFPU16:
   1230 #ifdef MIPS_ARCH_MAGIC_WINCE
   1231       magic = MIPS_ARCH_MAGIC_WINCE;
   1232 #endif
   1233       break;
   1234 
   1235     case IMAGE_FILE_MACHINE_SH3:
   1236     case IMAGE_FILE_MACHINE_SH4:
   1237 #ifdef SH_ARCH_MAGIC_WINCE
   1238       magic = SH_ARCH_MAGIC_WINCE;
   1239 #endif
   1240       break;
   1241 
   1242     case IMAGE_FILE_MACHINE_ARM:
   1243 #ifdef ARMPEMAGIC
   1244       magic = ARMPEMAGIC;
   1245 #endif
   1246       break;
   1247 
   1248     case IMAGE_FILE_MACHINE_ARM64:
   1249 #ifdef AARCH64MAGIC
   1250       magic = AARCH64MAGIC;
   1251 #endif
   1252       break;
   1253 
   1254     case IMAGE_FILE_MACHINE_LOONGARCH64:
   1255 #ifdef LOONGARCH64MAGIC
   1256       magic = LOONGARCH64MAGIC;
   1257 #endif
   1258       break;
   1259 
   1260     case IMAGE_FILE_MACHINE_RISCV64:
   1261 #ifdef RISCV64MAGIC
   1262       magic = RISCV64MAGIC;
   1263 #endif
   1264       break;
   1265 
   1266     case IMAGE_FILE_MACHINE_THUMB:
   1267 #ifdef THUMBPEMAGIC
   1268       {
   1269 	extern const bfd_target TARGET_LITTLE_SYM;
   1270 
   1271 	if (abfd->xvec == & TARGET_LITTLE_SYM)
   1272 	  magic = THUMBPEMAGIC;
   1273       }
   1274 #endif
   1275       break;
   1276 
   1277     case IMAGE_FILE_MACHINE_POWERPC:
   1278       /* We no longer support PowerPC.  */
   1279     default:
   1280       _bfd_error_handler
   1281 	/* xgettext:c-format */
   1282 	(_("%pB: unrecognised machine type (0x%x)"
   1283 	   " in Import Library Format archive"),
   1284 	 abfd, machine);
   1285       bfd_set_error (bfd_error_malformed_archive);
   1286 
   1287       return NULL;
   1288       break;
   1289     }
   1290 
   1291   if (magic == 0)
   1292     {
   1293       _bfd_error_handler
   1294 	/* xgettext:c-format */
   1295 	(_("%pB: recognised but unhandled machine type (0x%x)"
   1296 	   " in Import Library Format archive"),
   1297 	 abfd, machine);
   1298       bfd_set_error (bfd_error_wrong_format);
   1299 
   1300       return NULL;
   1301     }
   1302 
   1303   /* We do not bother to check the date.
   1304      date = H_GET_32 (abfd, ptr);  */
   1305   ptr += 4;
   1306 
   1307   size = H_GET_32 (abfd, ptr);
   1308   ptr += 4;
   1309 
   1310   if (size == 0)
   1311     {
   1312       _bfd_error_handler
   1313 	(_("%pB: size field is zero in Import Library Format header"), abfd);
   1314       bfd_set_error (bfd_error_malformed_archive);
   1315 
   1316       return NULL;
   1317     }
   1318 
   1319   ordinal = H_GET_16 (abfd, ptr);
   1320   ptr += 2;
   1321 
   1322   types = H_GET_16 (abfd, ptr);
   1323   /* ptr += 2; */
   1324 
   1325   /* Now read in the two strings that follow.  */
   1326   ptr = (bfd_byte *) _bfd_alloc_and_read (abfd, size, size);
   1327   if (ptr == NULL)
   1328     return NULL;
   1329 
   1330   symbol_name = (char *) ptr;
   1331   /* See PR 20905 for an example of where the strnlen is necessary.  */
   1332   source_dll  = symbol_name + strnlen (symbol_name, size - 1) + 1;
   1333 
   1334   /* Verify that the strings are null terminated.  */
   1335   if (ptr[size - 1] != 0
   1336       || (bfd_size_type) ((bfd_byte *) source_dll - ptr) >= size)
   1337     {
   1338       _bfd_error_handler
   1339 	(_("%pB: string not null terminated in ILF object file"), abfd);
   1340       bfd_set_error (bfd_error_malformed_archive);
   1341       bfd_release (abfd, ptr);
   1342       return NULL;
   1343     }
   1344 
   1345   /* Now construct the bfd.  */
   1346   if (! pe_ILF_build_a_bfd (abfd, magic, symbol_name,
   1347 			    source_dll, ordinal, types))
   1348     {
   1349       bfd_release (abfd, ptr);
   1350       return NULL;
   1351     }
   1352 
   1353   return pe_ILF_cleanup;
   1354 }
   1355 
   1356 static void
   1357 pe_bfd_read_buildid (bfd *abfd)
   1358 {
   1359   pe_data_type *pe = pe_data (abfd);
   1360   struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
   1361   asection *section;
   1362   bfd_byte *data = 0;
   1363   bfd_size_type dataoff;
   1364   unsigned int i;
   1365   bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress;
   1366   bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size;
   1367 
   1368   if (size == 0)
   1369     return;
   1370 
   1371   addr += extra->ImageBase;
   1372 
   1373   /* Search for the section containing the DebugDirectory.  */
   1374   for (section = abfd->sections; section != NULL; section = section->next)
   1375     {
   1376       if ((addr >= section->vma) && (addr < (section->vma + section->size)))
   1377 	break;
   1378     }
   1379 
   1380   if (section == NULL)
   1381     return;
   1382 
   1383   if (!(section->flags & SEC_HAS_CONTENTS))
   1384     return;
   1385 
   1386   dataoff = addr - section->vma;
   1387 
   1388   /* PR 20605 and 22373: Make sure that the data is really there.
   1389      Note - since we are dealing with unsigned quantities we have
   1390      to be careful to check for potential overflows.  */
   1391   if (dataoff >= section->size
   1392       || size > section->size - dataoff)
   1393     {
   1394       _bfd_error_handler
   1395 	(_("%pB: error: debug data ends beyond end of debug directory"),
   1396 	 abfd);
   1397       return;
   1398     }
   1399 
   1400   /* Read the whole section. */
   1401   if (!bfd_malloc_and_get_section (abfd, section, &data))
   1402     {
   1403       free (data);
   1404       return;
   1405     }
   1406 
   1407   /* Search for a CodeView entry in the DebugDirectory */
   1408   for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
   1409     {
   1410       struct external_IMAGE_DEBUG_DIRECTORY *ext
   1411 	= &((struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff))[i];
   1412       struct internal_IMAGE_DEBUG_DIRECTORY idd;
   1413 
   1414       _bfd_XXi_swap_debugdir_in (abfd, ext, &idd);
   1415 
   1416       if (idd.Type == PE_IMAGE_DEBUG_TYPE_CODEVIEW)
   1417 	{
   1418 	  char buffer[256 + 1];
   1419 	  CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer;
   1420 
   1421 	  /*
   1422 	    The debug entry doesn't have to have to be in a section, in which
   1423 	    case AddressOfRawData is 0, so always use PointerToRawData.
   1424 	  */
   1425 	  if (_bfd_XXi_slurp_codeview_record (abfd,
   1426 					      (file_ptr) idd.PointerToRawData,
   1427 					      idd.SizeOfData, cvinfo, NULL))
   1428 	    {
   1429 	      struct bfd_build_id* build_id = bfd_alloc (abfd,
   1430 			 sizeof (struct bfd_build_id) + cvinfo->SignatureLength);
   1431 	      if (build_id)
   1432 		{
   1433 		  build_id->size = cvinfo->SignatureLength;
   1434 		  memcpy(build_id->data,  cvinfo->Signature,
   1435 			 cvinfo->SignatureLength);
   1436 		  abfd->build_id = build_id;
   1437 		}
   1438 	    }
   1439 	  break;
   1440 	}
   1441     }
   1442 
   1443   free (data);
   1444 }
   1445 
   1446 static bfd_cleanup
   1447 pe_bfd_object_p (bfd * abfd)
   1448 {
   1449   bfd_byte buffer[6];
   1450   struct external_DOS_hdr dos_hdr;
   1451   struct external_PEI_IMAGE_hdr image_hdr;
   1452   struct internal_filehdr internal_f;
   1453   struct internal_aouthdr internal_a;
   1454   bfd_size_type opt_hdr_size;
   1455   file_ptr offset;
   1456   bfd_cleanup result;
   1457 
   1458   /* Detect if this a Microsoft Import Library Format element.  */
   1459   /* First read the beginning of the header.  */
   1460   if (bfd_seek (abfd, 0, SEEK_SET) != 0
   1461       || bfd_read (buffer, 6, abfd) != 6)
   1462     {
   1463       if (bfd_get_error () != bfd_error_system_call)
   1464 	bfd_set_error (bfd_error_wrong_format);
   1465       return NULL;
   1466     }
   1467 
   1468   /* Then check the magic and the version (only 0 is supported).  */
   1469   if (H_GET_32 (abfd, buffer) == 0xffff0000
   1470       && H_GET_16 (abfd, buffer + 4) == 0)
   1471     return pe_ILF_object_p (abfd);
   1472 
   1473   if (bfd_seek (abfd, 0, SEEK_SET) != 0
   1474       || bfd_read (&dos_hdr, sizeof (dos_hdr), abfd) != sizeof (dos_hdr))
   1475     {
   1476       if (bfd_get_error () != bfd_error_system_call)
   1477 	bfd_set_error (bfd_error_wrong_format);
   1478       return NULL;
   1479     }
   1480 
   1481   /* There are really two magic numbers involved; the magic number
   1482      that says this is a NT executable (PEI) and the magic number that
   1483      determines the architecture.  The former is IMAGE_DOS_SIGNATURE, stored in
   1484      the e_magic field.  The latter is stored in the f_magic field.
   1485      If the NT magic number isn't valid, the architecture magic number
   1486      could be mimicked by some other field (specifically, the number
   1487      of relocs in section 3).  Since this routine can only be called
   1488      correctly for a PEI file, check the e_magic number here, and, if
   1489      it doesn't match, clobber the f_magic number so that we don't get
   1490      a false match.  */
   1491   if (H_GET_16 (abfd, dos_hdr.e_magic) != IMAGE_DOS_SIGNATURE)
   1492     {
   1493       bfd_set_error (bfd_error_wrong_format);
   1494       return NULL;
   1495     }
   1496 
   1497   offset = H_GET_32 (abfd, dos_hdr.e_lfanew);
   1498   if (bfd_seek (abfd, offset, SEEK_SET) != 0
   1499       || bfd_read (&image_hdr, sizeof (image_hdr), abfd) != sizeof (image_hdr))
   1500     {
   1501       if (bfd_get_error () != bfd_error_system_call)
   1502 	bfd_set_error (bfd_error_wrong_format);
   1503       return NULL;
   1504     }
   1505 
   1506   if (H_GET_32 (abfd, image_hdr.nt_signature) != 0x4550)
   1507     {
   1508       bfd_set_error (bfd_error_wrong_format);
   1509       return NULL;
   1510     }
   1511 
   1512   /* Swap file header, so that we get the location for calling
   1513      real_object_p.  */
   1514   bfd_coff_swap_filehdr_in (abfd, &image_hdr, &internal_f);
   1515 
   1516   if (! bfd_coff_bad_format_hook (abfd, &internal_f)
   1517       || internal_f.f_opthdr > bfd_coff_aoutsz (abfd))
   1518     {
   1519       bfd_set_error (bfd_error_wrong_format);
   1520       return NULL;
   1521     }
   1522 
   1523   memcpy (internal_f.pe.dos_message, dos_hdr.dos_message,
   1524 	  sizeof (internal_f.pe.dos_message));
   1525 
   1526   /* Read the optional header, which has variable size.  */
   1527   opt_hdr_size = internal_f.f_opthdr;
   1528 
   1529   if (opt_hdr_size != 0)
   1530     {
   1531       bfd_size_type amt = opt_hdr_size;
   1532       bfd_byte * opthdr;
   1533 
   1534       /* PR 17521 file: 230-131433-0.004.  */
   1535       if (amt < sizeof (PEAOUTHDR))
   1536 	amt = sizeof (PEAOUTHDR);
   1537 
   1538       opthdr = _bfd_alloc_and_read (abfd, amt, opt_hdr_size);
   1539       if (opthdr == NULL)
   1540 	return NULL;
   1541       if (amt > opt_hdr_size)
   1542 	memset (opthdr + opt_hdr_size, 0, amt - opt_hdr_size);
   1543 
   1544       bfd_coff_swap_aouthdr_in (abfd, opthdr, &internal_a);
   1545 
   1546       struct internal_extra_pe_aouthdr *a = &internal_a.pe;
   1547 
   1548 #ifdef ARM
   1549       /* Use Subsystem to distinguish between pei-arm-little and
   1550 	 pei-arm-wince-little.  */
   1551 #ifdef WINCE
   1552       if (a->Subsystem != IMAGE_SUBSYSTEM_WINDOWS_CE_GUI)
   1553 #else
   1554       if (a->Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CE_GUI)
   1555 #endif
   1556 	{
   1557 	  bfd_set_error (bfd_error_wrong_format);
   1558 	  return NULL;
   1559 	}
   1560 #endif
   1561 
   1562       if ((a->SectionAlignment & -a->SectionAlignment) != a->SectionAlignment
   1563 	  || a->SectionAlignment >= 0x80000000)
   1564 	{
   1565 	  _bfd_error_handler (_("%pB: adjusting invalid SectionAlignment"),
   1566 				abfd);
   1567 	  a->SectionAlignment &= -a->SectionAlignment;
   1568 	  if (a->SectionAlignment >= 0x80000000)
   1569 	    a->SectionAlignment = 0x40000000;
   1570 	}
   1571 
   1572       if ((a->FileAlignment & -a->FileAlignment) != a->FileAlignment
   1573 	  || a->FileAlignment > a->SectionAlignment)
   1574 	{
   1575 	  _bfd_error_handler (_("%pB: adjusting invalid FileAlignment"),
   1576 			      abfd);
   1577 	  a->FileAlignment &= -a->FileAlignment;
   1578 	  if (a->FileAlignment > a->SectionAlignment)
   1579 	    a->FileAlignment = a->SectionAlignment;
   1580 	}
   1581 
   1582       if (a->NumberOfRvaAndSizes > IMAGE_NUMBEROF_DIRECTORY_ENTRIES)
   1583 	_bfd_error_handler (_("%pB: invalid NumberOfRvaAndSizes"), abfd);
   1584     }
   1585 
   1586   result = coff_real_object_p (abfd, internal_f.f_nscns, &internal_f,
   1587 			       (opt_hdr_size != 0
   1588 				? &internal_a
   1589 				: (struct internal_aouthdr *) NULL));
   1590 
   1591   if (result)
   1592     {
   1593       /* Now the whole header has been processed, see if there is a build-id */
   1594       pe_bfd_read_buildid(abfd);
   1595     }
   1596 
   1597   return result;
   1598 }
   1599 
   1600 #define coff_object_p pe_bfd_object_p
   1601 #endif /* COFF_IMAGE_WITH_PE */
   1602