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