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