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