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