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