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