xref: /openbsd-src/gnu/usr.bin/binutils/bfd/peicode.h (revision b2ea75c1b17e1a9a339660e7ed45cd24946b230e)
1 /* Support for the generic parts of PE/PEI, for BFD.
2    Copyright 1995, 1996, 1997, 1998, 1999, 2000 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 2 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20 
21 /*
22 Most of this hacked by  Steve Chamberlain,
23 			sac@cygnus.com
24 
25 PE/PEI rearrangement (and code added): Donn Terry
26                                        Softway Systems, Inc.
27 */
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 
58 #include "libpei.h"
59 
60 static boolean (*pe_saved_coff_bfd_print_private_bfd_data)
61     PARAMS ((bfd *, PTR)) =
62 #ifndef coff_bfd_print_private_bfd_data
63      NULL;
64 #else
65      coff_bfd_print_private_bfd_data;
66 #undef coff_bfd_print_private_bfd_data
67 #endif
68 
69 static boolean pe_print_private_bfd_data PARAMS ((bfd *, PTR));
70 #define coff_bfd_print_private_bfd_data pe_print_private_bfd_data
71 
72 
73 static boolean (*pe_saved_coff_bfd_copy_private_bfd_data)
74     PARAMS ((bfd *, bfd *)) =
75 #ifndef coff_bfd_copy_private_bfd_data
76      NULL;
77 #else
78      coff_bfd_copy_private_bfd_data;
79 #undef coff_bfd_copy_private_bfd_data
80 #endif
81 
82 static boolean pe_bfd_copy_private_bfd_data PARAMS ((bfd *, bfd *));
83 #define coff_bfd_copy_private_bfd_data pe_bfd_copy_private_bfd_data
84 
85 #define coff_mkobject      pe_mkobject
86 #define coff_mkobject_hook pe_mkobject_hook
87 
88 #ifndef NO_COFF_RELOCS
89 static void coff_swap_reloc_in PARAMS ((bfd *, PTR, PTR));
90 static unsigned int coff_swap_reloc_out PARAMS ((bfd *, PTR, PTR));
91 #endif
92 static void coff_swap_filehdr_in PARAMS ((bfd *, PTR, PTR));
93 static void coff_swap_scnhdr_in PARAMS ((bfd *, PTR, PTR));
94 static boolean pe_mkobject PARAMS ((bfd *));
95 static PTR pe_mkobject_hook PARAMS ((bfd *, PTR, PTR));
96 
97 #ifdef COFF_IMAGE_WITH_PE
98 /* This structure contains static variables used by the ILF code.  */
99 typedef asection * asection_ptr;
100 
101 typedef struct
102 {
103   bfd *			abfd;
104   bfd_byte *		data;
105   struct bfd_in_memory * bim;
106   unsigned short        magic;
107 
108   arelent *		reltab;
109   unsigned int 		relcount;
110 
111   coff_symbol_type * 	sym_cache;
112   coff_symbol_type * 	sym_ptr;
113   unsigned int       	sym_index;
114 
115   unsigned int * 	sym_table;
116   unsigned int * 	table_ptr;
117 
118   combined_entry_type * native_syms;
119   combined_entry_type * native_ptr;
120 
121   coff_symbol_type **	sym_ptr_table;
122   coff_symbol_type **	sym_ptr_ptr;
123 
124   unsigned int		sec_index;
125 
126   char *                string_table;
127   char *                string_ptr;
128   char *		end_string_ptr;
129 
130   SYMENT *              esym_table;
131   SYMENT *              esym_ptr;
132 
133   struct internal_reloc * int_reltab;
134 }
135 pe_ILF_vars;
136 
137 static asection_ptr       pe_ILF_make_a_section   PARAMS ((pe_ILF_vars *, const char *, unsigned int, flagword));
138 static void               pe_ILF_make_a_reloc     PARAMS ((pe_ILF_vars *, bfd_vma, bfd_reloc_code_real_type, asection_ptr));
139 static void               pe_ILF_make_a_symbol    PARAMS ((pe_ILF_vars *, const char *, const char *, asection_ptr, flagword));
140 static void               pe_ILF_save_relocs      PARAMS ((pe_ILF_vars *, asection_ptr));
141 static void		  pe_ILF_make_a_symbol_reloc  PARAMS ((pe_ILF_vars *, bfd_vma, bfd_reloc_code_real_type,	   struct symbol_cache_entry **, unsigned int));
142 static boolean            pe_ILF_build_a_bfd      PARAMS ((bfd *, unsigned short, bfd_byte *, bfd_byte *, unsigned int, unsigned int));
143 static const bfd_target * pe_ILF_object_p         PARAMS ((bfd *));
144 static const bfd_target * pe_bfd_object_p 	  PARAMS ((bfd *));
145 #endif /* COFF_IMAGE_WITH_PE */
146 
147 /**********************************************************************/
148 
149 #ifndef NO_COFF_RELOCS
150 static void
151 coff_swap_reloc_in (abfd, src, dst)
152      bfd *abfd;
153      PTR src;
154      PTR dst;
155 {
156   RELOC *reloc_src = (RELOC *) src;
157   struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
158 
159   reloc_dst->r_vaddr = bfd_h_get_32(abfd, (bfd_byte *)reloc_src->r_vaddr);
160   reloc_dst->r_symndx = bfd_h_get_signed_32(abfd, (bfd_byte *) reloc_src->r_symndx);
161 
162   reloc_dst->r_type = bfd_h_get_16(abfd, (bfd_byte *) reloc_src->r_type);
163 
164 #ifdef SWAP_IN_RELOC_OFFSET
165   reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET(abfd,
166 					     (bfd_byte *) reloc_src->r_offset);
167 #endif
168 }
169 
170 
171 static unsigned int
172 coff_swap_reloc_out (abfd, src, dst)
173      bfd       *abfd;
174      PTR	src;
175      PTR	dst;
176 {
177   struct internal_reloc *reloc_src = (struct internal_reloc *)src;
178   struct external_reloc *reloc_dst = (struct external_reloc *)dst;
179   bfd_h_put_32(abfd, reloc_src->r_vaddr, (bfd_byte *) reloc_dst->r_vaddr);
180   bfd_h_put_32(abfd, reloc_src->r_symndx, (bfd_byte *) reloc_dst->r_symndx);
181 
182   bfd_h_put_16(abfd, reloc_src->r_type, (bfd_byte *)
183 	       reloc_dst->r_type);
184 
185 #ifdef SWAP_OUT_RELOC_OFFSET
186   SWAP_OUT_RELOC_OFFSET(abfd,
187 			reloc_src->r_offset,
188 			(bfd_byte *) reloc_dst->r_offset);
189 #endif
190 #ifdef SWAP_OUT_RELOC_EXTRA
191   SWAP_OUT_RELOC_EXTRA(abfd,reloc_src, reloc_dst);
192 #endif
193   return RELSZ;
194 }
195 #endif /* not NO_COFF_RELOCS */
196 
197 static void
198 coff_swap_filehdr_in (abfd, src, dst)
199      bfd            *abfd;
200      PTR	     src;
201      PTR	     dst;
202 {
203   FILHDR *filehdr_src = (FILHDR *) src;
204   struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
205   filehdr_dst->f_magic = bfd_h_get_16(abfd, (bfd_byte *) filehdr_src->f_magic);
206   filehdr_dst->f_nscns = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_nscns);
207   filehdr_dst->f_timdat = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_timdat);
208 
209   filehdr_dst->f_nsyms = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_nsyms);
210   filehdr_dst->f_flags = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_flags);
211   filehdr_dst->f_symptr = bfd_h_get_32 (abfd, (bfd_byte *) filehdr_src->f_symptr);
212 
213 #ifdef COFF_IMAGE_WITH_PE
214   /* There are really two magic numbers involved; the magic number
215      that says this is a NT executable (PEI) and the magic number that
216      determines the architecture.  The former is DOSMAGIC, stored in
217      the e_magic field.  The latter is stored in the f_magic field.
218      If the NT magic number isn't valid, the architecture magic number
219      could be mimicked by some other field (specifically, the number
220      of relocs in section 3).  Since this routine can only be called
221      correctly for a PEI file, check the e_magic number here, and, if
222      it doesn't match, clobber the f_magic number so that we don't get
223      a false match.  */
224   if (bfd_h_get_16 (abfd, (bfd_byte *) filehdr_src->e_magic) != DOSMAGIC)
225     filehdr_dst->f_magic = -1;
226 #endif
227 
228   /* Other people's tools sometimes generate headers with an nsyms but
229      a zero symptr.  */
230   if (filehdr_dst->f_nsyms != 0 && filehdr_dst->f_symptr == 0)
231     {
232       filehdr_dst->f_nsyms = 0;
233       filehdr_dst->f_flags |= F_LSYMS;
234     }
235 
236   filehdr_dst->f_opthdr = bfd_h_get_16(abfd,
237 				       (bfd_byte *)filehdr_src-> f_opthdr);
238 }
239 
240 #ifdef COFF_IMAGE_WITH_PE
241 #define coff_swap_filehdr_out _bfd_pei_only_swap_filehdr_out
242 #else
243 #define coff_swap_filehdr_out _bfd_pe_only_swap_filehdr_out
244 #endif
245 
246 
247 static void
248 coff_swap_scnhdr_in (abfd, ext, in)
249      bfd            *abfd;
250      PTR	     ext;
251      PTR	     in;
252 {
253   SCNHDR *scnhdr_ext = (SCNHDR *) ext;
254   struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
255 
256   memcpy(scnhdr_int->s_name, scnhdr_ext->s_name, sizeof(scnhdr_int->s_name));
257   scnhdr_int->s_vaddr =
258     GET_SCNHDR_VADDR (abfd, (bfd_byte *) scnhdr_ext->s_vaddr);
259   scnhdr_int->s_paddr =
260     GET_SCNHDR_PADDR (abfd, (bfd_byte *) scnhdr_ext->s_paddr);
261   scnhdr_int->s_size =
262     GET_SCNHDR_SIZE (abfd, (bfd_byte *) scnhdr_ext->s_size);
263   scnhdr_int->s_scnptr =
264     GET_SCNHDR_SCNPTR (abfd, (bfd_byte *) scnhdr_ext->s_scnptr);
265   scnhdr_int->s_relptr =
266     GET_SCNHDR_RELPTR (abfd, (bfd_byte *) scnhdr_ext->s_relptr);
267   scnhdr_int->s_lnnoptr =
268     GET_SCNHDR_LNNOPTR (abfd, (bfd_byte *) scnhdr_ext->s_lnnoptr);
269   scnhdr_int->s_flags = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_flags);
270 
271   /* MS handles overflow of line numbers by carrying into the reloc
272      field (it appears).  Since it's supposed to be zero for PE
273      *IMAGE* format, that's safe.  This is still a bit iffy.  */
274 #ifdef COFF_IMAGE_WITH_PE
275   scnhdr_int->s_nlnno =
276     (bfd_h_get_16 (abfd, (bfd_byte *) scnhdr_ext->s_nlnno)
277      + (bfd_h_get_16 (abfd, (bfd_byte *) scnhdr_ext->s_nreloc) << 16));
278   scnhdr_int->s_nreloc = 0;
279 #else
280   scnhdr_int->s_nreloc = bfd_h_get_16 (abfd,
281 				       (bfd_byte *) scnhdr_ext->s_nreloc);
282   scnhdr_int->s_nlnno = bfd_h_get_16 (abfd,
283 				      (bfd_byte *) scnhdr_ext->s_nlnno);
284 #endif
285 
286   if (scnhdr_int->s_vaddr != 0)
287     {
288       scnhdr_int->s_vaddr += pe_data (abfd)->pe_opthdr.ImageBase;
289       scnhdr_int->s_vaddr &= 0xffffffff;
290     }
291 
292 #ifndef COFF_NO_HACK_SCNHDR_SIZE
293   /* If this section holds uninitialized data, use the virtual size
294      (stored in s_paddr) instead of the physical size.  */
295   if ((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0)
296     {
297       scnhdr_int->s_size = scnhdr_int->s_paddr;
298       /* This code used to set scnhdr_int->s_paddr to 0.  However,
299          coff_set_alignment_hook stores s_paddr in virt_size, which
300          only works if it correctly holds the virtual size of the
301          section.  */
302     }
303 #endif
304 }
305 
306 static boolean
307 pe_mkobject (abfd)
308      bfd * abfd;
309 {
310   pe_data_type *pe;
311   abfd->tdata.pe_obj_data =
312     (struct pe_tdata *) bfd_zalloc (abfd, sizeof (pe_data_type));
313 
314   if (abfd->tdata.pe_obj_data == 0)
315     return false;
316 
317   pe = pe_data (abfd);
318 
319   pe->coff.pe = 1;
320 
321   /* in_reloc_p is architecture dependent.  */
322   pe->in_reloc_p = in_reloc_p;
323   return true;
324 }
325 
326 /* Create the COFF backend specific information.  */
327 static PTR
328 pe_mkobject_hook (abfd, filehdr, aouthdr)
329      bfd * abfd;
330      PTR filehdr;
331      PTR aouthdr ATTRIBUTE_UNUSED;
332 {
333   struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
334   pe_data_type *pe;
335 
336   if (pe_mkobject (abfd) == false)
337     return NULL;
338 
339   pe = pe_data (abfd);
340   pe->coff.sym_filepos = internal_f->f_symptr;
341   /* These members communicate important constants about the symbol
342      table to GDB's symbol-reading code.  These `constants'
343      unfortunately vary among coff implementations...  */
344   pe->coff.local_n_btmask = N_BTMASK;
345   pe->coff.local_n_btshft = N_BTSHFT;
346   pe->coff.local_n_tmask = N_TMASK;
347   pe->coff.local_n_tshift = N_TSHIFT;
348   pe->coff.local_symesz = SYMESZ;
349   pe->coff.local_auxesz = AUXESZ;
350   pe->coff.local_linesz = LINESZ;
351 
352   pe->coff.timestamp = internal_f->f_timdat;
353 
354   obj_raw_syment_count (abfd) =
355     obj_conv_table_size (abfd) =
356       internal_f->f_nsyms;
357 
358   pe->real_flags = internal_f->f_flags;
359 
360   if ((internal_f->f_flags & F_DLL) != 0)
361     pe->dll = 1;
362 
363   if ((internal_f->f_flags & IMAGE_FILE_DEBUG_STRIPPED) == 0)
364     abfd->flags |= HAS_DEBUG;
365 
366 #ifdef COFF_IMAGE_WITH_PE
367   if (aouthdr)
368     pe->pe_opthdr = ((struct internal_aouthdr *)aouthdr)->pe;
369 #endif
370 
371 #ifdef ARM
372   if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
373     coff_data (abfd) ->flags = 0;
374 #endif
375 
376   return (PTR) pe;
377 }
378 
379 static boolean
380 pe_print_private_bfd_data (abfd, vfile)
381      bfd *abfd;
382      PTR vfile;
383 {
384   FILE *file = (FILE *) vfile;
385 
386   if (!_bfd_pe_print_private_bfd_data_common (abfd, vfile))
387     return false;
388 
389   if (pe_saved_coff_bfd_print_private_bfd_data != NULL)
390     {
391       fputc ('\n', file);
392 
393       return pe_saved_coff_bfd_print_private_bfd_data (abfd, vfile);
394     }
395 
396   return true;
397 }
398 
399 /* Copy any private info we understand from the input bfd
400    to the output bfd.  */
401 
402 static boolean
403 pe_bfd_copy_private_bfd_data (ibfd, obfd)
404      bfd *ibfd, *obfd;
405 {
406   if (!_bfd_pe_bfd_copy_private_bfd_data_common (ibfd, obfd))
407     return false;
408 
409   if (pe_saved_coff_bfd_copy_private_bfd_data)
410     return pe_saved_coff_bfd_copy_private_bfd_data (ibfd, obfd);
411 
412   return true;
413 }
414 
415 #define coff_bfd_copy_private_section_data \
416   _bfd_pe_bfd_copy_private_section_data
417 
418 #define coff_get_symbol_info _bfd_pe_get_symbol_info
419 
420 #ifdef COFF_IMAGE_WITH_PE
421 
422 /* Code to handle Microsoft's Image Library Format.
423    Also known as LINK6 format.
424    Documentation about this format can be found at:
425 
426    http://msdn.microsoft.com/library/specs/pecoff_section8.htm  */
427 
428 /* The following constants specify the sizes of the various data
429    structures that we have to create in order to build a bfd describing
430    an ILF object file.  The final "+ 1" in the definitions of SIZEOF_IDATA6
431    and SIZEOF_IDATA7 below is to allow for the possibility that we might
432    need a padding byte in order to ensure 16 bit alignment for the section's
433    contents.
434 
435    The value for SIZEOF_ILF_STRINGS is computed as follows:
436 
437       There will be NUM_ILF_SECTIONS section symbols.  Allow 9 characters
438       per symbol for their names (longest section name is .idata$x).
439 
440       There will be two symbols for the imported value, one the symbol name
441       and one with _imp__ prefixed.  Allowing for the terminating nul's this
442       is strlen (symbol_name) * 2 + 8 + 21 + strlen (source_dll).
443 
444       The strings in the string table must start STRING__SIZE_SIZE bytes into
445       the table in order to for the string lookup code in coffgen/coffcode to
446       work.  */
447 #define NUM_ILF_RELOCS		8
448 #define NUM_ILF_SECTIONS        6
449 #define NUM_ILF_SYMS 		(2 + NUM_ILF_SECTIONS)
450 
451 #define SIZEOF_ILF_SYMS		(NUM_ILF_SYMS * sizeof (* vars.sym_cache))
452 #define SIZEOF_ILF_SYM_TABLE	(NUM_ILF_SYMS * sizeof (* vars.sym_table))
453 #define SIZEOF_ILF_NATIVE_SYMS	(NUM_ILF_SYMS * sizeof (* vars.native_syms))
454 #define SIZEOF_ILF_SYM_PTR_TABLE (NUM_ILF_SYMS * sizeof (* vars.sym_ptr_table))
455 #define SIZEOF_ILF_EXT_SYMS	(NUM_ILF_SYMS * sizeof (* vars.esym_table))
456 #define SIZEOF_ILF_RELOCS	(NUM_ILF_RELOCS * sizeof (* vars.reltab))
457 #define SIZEOF_ILF_INT_RELOCS	(NUM_ILF_RELOCS * sizeof (* vars.int_reltab))
458 #define SIZEOF_ILF_STRINGS	(strlen (symbol_name) * 2 + 8 \
459 					+ 21 + strlen (source_dll) \
460 					+ NUM_ILF_SECTIONS * 9 \
461 					+ STRING_SIZE_SIZE)
462 #define SIZEOF_IDATA2		(5 * 4)
463 #define SIZEOF_IDATA4		(1 * 4)
464 #define SIZEOF_IDATA5		(1 * 4)
465 #define SIZEOF_IDATA6		(2 + strlen (symbol_name) + 1 + 1)
466 #define SIZEOF_IDATA7		(strlen (source_dll) + 1 + 1)
467 #define SIZEOF_ILF_SECTIONS     (NUM_ILF_SECTIONS * sizeof (struct coff_section_tdata))
468 
469 #define ILF_DATA_SIZE				\
470       sizeof (* vars.bim)			\
471     + SIZEOF_ILF_SYMS				\
472     + SIZEOF_ILF_SYM_TABLE			\
473     + SIZEOF_ILF_NATIVE_SYMS			\
474     + SIZEOF_ILF_SYM_PTR_TABLE			\
475     + SIZEOF_ILF_EXT_SYMS			\
476     + SIZEOF_ILF_RELOCS				\
477     + SIZEOF_ILF_INT_RELOCS			\
478     + SIZEOF_ILF_STRINGS			\
479     + SIZEOF_IDATA2				\
480     + SIZEOF_IDATA4				\
481     + SIZEOF_IDATA5				\
482     + SIZEOF_IDATA6				\
483     + SIZEOF_IDATA7				\
484     + SIZEOF_ILF_SECTIONS			\
485     + MAX_TEXT_SECTION_SIZE
486 
487 
488 /* Create an empty relocation against the given symbol.  */
489 static void
490 pe_ILF_make_a_symbol_reloc (pe_ILF_vars *                 vars,
491 			    bfd_vma                       address,
492 			    bfd_reloc_code_real_type      reloc,
493 			    struct symbol_cache_entry **  sym,
494 			    unsigned int                  sym_index)
495 {
496   arelent * entry;
497   struct internal_reloc * internal;
498 
499   entry = vars->reltab + vars->relcount;
500   internal = vars->int_reltab + vars->relcount;
501 
502   entry->address     = address;
503   entry->addend      = 0;
504   entry->howto       = bfd_reloc_type_lookup (vars->abfd, reloc);
505   entry->sym_ptr_ptr = sym;
506 
507   internal->r_vaddr  = address;
508   internal->r_symndx = sym_index;
509   internal->r_type   = entry->howto->type;
510 #if 0  /* These fields do not need to be initialised.  */
511   internal->r_size   = 0;
512   internal->r_extern = 0;
513   internal->r_offset = 0;
514 #endif
515 
516   vars->relcount ++;
517 
518   BFD_ASSERT (vars->relcount <= NUM_ILF_RELOCS);
519 }
520 
521 /* Create an empty relocation against the given section.  */
522 static void
523 pe_ILF_make_a_reloc (pe_ILF_vars *             vars,
524 		     bfd_vma                   address,
525 		     bfd_reloc_code_real_type  reloc,
526 		     asection_ptr              sec)
527 {
528   pe_ILF_make_a_symbol_reloc (vars, address, reloc, sec->symbol_ptr_ptr,
529 			      coff_section_data (vars->abfd, sec)->i);
530 }
531 
532 /* Move the queued relocs into the given section.  */
533 static void
534 pe_ILF_save_relocs (pe_ILF_vars * vars,
535 		    asection_ptr  sec)
536 {
537   /* Make sure that there is somewhere to store the internal relocs.  */
538   if (coff_section_data (vars->abfd, sec) == NULL)
539     /* We should probably return an error indication here.  */
540     abort ();
541 
542   coff_section_data (vars->abfd, sec)->relocs = vars->int_reltab;
543   coff_section_data (vars->abfd, sec)->keep_relocs = true;
544 
545   sec->relocation  = vars->reltab;
546   sec->reloc_count = vars->relcount;
547   sec->flags      |= SEC_RELOC;
548 
549   vars->reltab     += vars->relcount;
550   vars->int_reltab += vars->relcount;
551   vars->relcount   = 0;
552 
553   BFD_ASSERT ((bfd_byte *)vars->int_reltab < (bfd_byte *)vars->string_table);
554 }
555 
556 /* Create a global symbol and add it to the relevant tables.  */
557 static void
558 pe_ILF_make_a_symbol (pe_ILF_vars *  vars,
559 		      const char *   prefix,
560 		      const char *   symbol_name,
561 		      asection_ptr   section,
562 		      flagword       extra_flags)
563 {
564   coff_symbol_type * sym;
565   combined_entry_type * ent;
566   SYMENT * esym;
567   unsigned short sclass;
568 
569   if (extra_flags & BSF_LOCAL)
570     sclass = C_STAT;
571   else
572     sclass = C_EXT;
573 
574 #ifdef THUMBPEMAGIC
575   if (vars->magic == THUMBPEMAGIC)
576     {
577       if (extra_flags & BSF_FUNCTION)
578 	sclass = C_THUMBEXTFUNC;
579       else if (extra_flags & BSF_LOCAL)
580 	sclass = C_THUMBSTAT;
581       else
582 	sclass = C_THUMBEXT;
583     }
584 #endif
585 
586   BFD_ASSERT (vars->sym_index < NUM_ILF_SYMS);
587 
588   sym = vars->sym_ptr;
589   ent = vars->native_ptr;
590   esym = vars->esym_ptr;
591 
592   /* Copy the symbol's name into the string table.  */
593   sprintf (vars->string_ptr, "%s%s", prefix, symbol_name);
594 
595   if (section == NULL)
596     section = (asection_ptr) & bfd_und_section;
597 
598   /* Initialise the external symbol.  */
599   bfd_h_put_32 (vars->abfd, vars->string_ptr - vars->string_table, (bfd_byte *) esym->e.e.e_offset);
600   bfd_h_put_16 (vars->abfd, section->target_index, (bfd_byte *) esym->e_scnum);
601   esym->e_sclass[0] = sclass;
602 
603   /* The following initialisations are unnecessary - the memory is
604      zero initialised.  They are just kept here as reminders.  */
605 #if 0
606   esym->e.e.e_zeroes = 0;
607   esym->e_value = 0;
608   esym->e_type = T_NULL;
609   esym->e_numaux = 0;
610 #endif
611 
612   /* Initialise the internal symbol structure.  */
613   ent->u.syment.n_sclass          = sclass;
614   ent->u.syment.n_scnum           = section->target_index;
615   ent->u.syment._n._n_n._n_offset = (long) sym;
616 
617 #if 0 /* See comment above.  */
618   ent->u.syment.n_value  = 0;
619   ent->u.syment.n_flags  = 0;
620   ent->u.syment.n_type   = T_NULL;
621   ent->u.syment.n_numaux = 0;
622   ent->fix_value         = 0;
623 #endif
624 
625   sym->symbol.the_bfd = vars->abfd;
626   sym->symbol.name    = vars->string_ptr;
627   sym->symbol.flags   = BSF_EXPORT | BSF_GLOBAL | extra_flags;
628   sym->symbol.section = section;
629   sym->native         = ent;
630 
631 #if 0 /* See comment above.  */
632   sym->symbol.value   = 0;
633   sym->symbol.udata.i = 0;
634   sym->done_lineno    = false;
635   sym->lineno         = NULL;
636 #endif
637 
638   * vars->table_ptr = vars->sym_index;
639   * vars->sym_ptr_ptr = sym;
640 
641   /* Adjust pointers for the next symbol.  */
642   vars->sym_index ++;
643   vars->sym_ptr ++;
644   vars->sym_ptr_ptr ++;
645   vars->table_ptr ++;
646   vars->native_ptr ++;
647   vars->esym_ptr ++;
648   vars->string_ptr += strlen (symbol_name) + strlen (prefix) + 1;
649 
650   BFD_ASSERT (vars->string_ptr < vars->end_string_ptr);
651 }
652 
653 /* Create a section.  */
654 static asection_ptr
655 pe_ILF_make_a_section (pe_ILF_vars * vars,
656 		       const char *  name,
657 		       unsigned int  size,
658 		       flagword      extra_flags)
659 {
660   asection_ptr sec;
661   flagword     flags;
662 
663   sec = bfd_make_section_old_way (vars->abfd, name);
664   if (sec == NULL)
665     return NULL;
666 
667   flags = SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_KEEP | SEC_IN_MEMORY;
668 
669   bfd_set_section_flags (vars->abfd, sec, flags | extra_flags);
670 
671   bfd_set_section_alignment (vars->abfd, sec, 2);
672 
673   /* Check that we will not run out of space.  */
674   BFD_ASSERT (vars->data + size < vars->bim->buffer + vars->bim->size);
675 
676   /* Set the section size and contents.  The actual
677      contents are filled in by our parent.  */
678   bfd_set_section_size (vars->abfd, sec, size);
679   sec->contents = vars->data;
680   sec->target_index = vars->sec_index ++;
681 
682   /* Advance data pointer in the vars structure.  */
683   vars->data += size;
684 
685   /* Skip the padding byte if it was not needed.
686      The logic here is that if the string length is odd,
687      then the entire string length, including the null byte,
688      is even and so the extra, padding byte, is not needed.  */
689   if (size & 1)
690     vars->data --;
691 
692   /* Create a coff_section_tdata structure for our use.  */
693   sec->used_by_bfd = (struct coff_section_tdata *) vars->data;
694   vars->data += sizeof (struct coff_section_tdata);
695 
696   BFD_ASSERT (vars->data <= vars->bim->buffer + vars->bim->size);
697 
698   /* Create a symbol to refer to this section.  */
699   pe_ILF_make_a_symbol (vars, "", name, sec, BSF_LOCAL);
700 
701   /* Cache the index to the symbol in the coff_section_data structure.  */
702   coff_section_data (vars->abfd, sec)->i = vars->sym_index - 1;
703 
704   return sec;
705 }
706 
707 /* This structure contains the code that goes into the .text section
708    in order to perform a jump into the DLL lookup table.  The entries
709    in the table are index by the magic number used to represent the
710    machine type in the PE file.  The contents of the data[] arrays in
711    these entries are stolen from the jtab[] arrays in ld/pe-dll.c.
712    The SIZE field says how many bytes in the DATA array are actually
713    used.  The OFFSET field says where in the data array the address
714    of the .idata$5 section should be placed.  */
715 #define MAX_TEXT_SECTION_SIZE 32
716 
717 typedef struct
718 {
719   unsigned short magic;
720   unsigned char  data[MAX_TEXT_SECTION_SIZE];
721   unsigned int   size;
722   unsigned int   offset;
723 }
724 jump_table;
725 
726 static jump_table jtab[] =
727 {
728 #ifdef I386MAGIC
729   { I386MAGIC,
730     { 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90 },
731     8, 2
732   },
733 #endif
734 
735 #ifdef  MC68MAGIC
736   { MC68MAGIC, { /* XXX fill me in */ }, 0, 0 },
737 #endif
738 #ifdef  MIPS_ARCH_MAGIC_WINCE
739   { MIPS_ARCH_MAGIC_WINCE,
740     { 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
741       0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 },
742     16, 0
743   },
744 #endif
745 
746 #ifdef  SH_ARCH_MAGIC_WINCE
747   { SH_ARCH_MAGIC_WINCE,
748     { 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40,
749       0x09, 0x00, 0x00, 0x00, 0x00, 0x00 },
750     12, 8
751   },
752 #endif
753 
754 #ifdef  ARMPEMAGIC
755   { ARMPEMAGIC,
756     { 0x00, 0xc0, 0x9f, 0xe5, 0x00, 0xf0,
757       0x9c, 0xe5, 0x00, 0x00, 0x00, 0x00},
758     12, 8
759   },
760 #endif
761 
762 #ifdef  THUMBPEMAGIC
763   { THUMBPEMAGIC,
764     { 0x40, 0xb4, 0x02, 0x4e, 0x36, 0x68, 0xb4, 0x46,
765       0x40, 0xbc, 0x60, 0x47, 0x00, 0x00, 0x00, 0x00 },
766     16, 12
767   },
768 #endif
769   { 0, { 0 }, 0, 0 }
770 };
771 
772 #ifndef NUM_ENTRIES
773 #define NUM_ENTRIES(a) (sizeof (a) / sizeof (a)[0])
774 #endif
775 
776 /* Build a full BFD from the information supplied in a ILF object.  */
777 static boolean
778 pe_ILF_build_a_bfd (bfd *           abfd,
779 		    unsigned short  magic,
780 		    bfd_byte *      symbol_name,
781 		    bfd_byte *      source_dll,
782 		    unsigned int    ordinal,
783 		    unsigned int    types)
784 {
785   bfd_byte *               ptr;
786   pe_ILF_vars              vars;
787   struct internal_filehdr  internal_f;
788   unsigned int             import_type;
789   unsigned int             import_name_type;
790   asection_ptr             id4, id5, id6 = NULL, text = NULL;
791   coff_symbol_type **      imp_sym;
792   unsigned int             imp_index;
793 
794   /* Decode and verify the types field of the ILF structure.  */
795   import_type = types & 0x3;
796   import_name_type = (types & 0x1c) >> 2;
797 
798   switch (import_type)
799     {
800     case IMPORT_CODE:
801     case IMPORT_DATA:
802       break;
803 
804     case IMPORT_CONST:
805       /* XXX code yet to be written.  */
806       _bfd_error_handler (_("%s: Unhandled import type; %x"),
807 			  bfd_get_filename (abfd), import_type);
808       return false;
809 
810     default:
811       _bfd_error_handler (_("%s: Unrecognised import type; %x"),
812 			  bfd_get_filename (abfd), import_type);
813       return false;
814     }
815 
816   switch (import_name_type)
817     {
818     case IMPORT_ORDINAL:
819     case IMPORT_NAME:
820     case IMPORT_NAME_NOPREFIX:
821     case IMPORT_NAME_UNDECORATE:
822       break;
823 
824     default:
825       _bfd_error_handler (_("%s: Unrecognised import name type; %x"),
826 			  bfd_get_filename (abfd), import_name_type);
827       return false;
828     }
829 
830   /* Initialise local variables.
831 
832      Note these are kept in a structure rather than being
833      declared as statics since bfd frowns on global variables.
834 
835      We are going to construct the contents of the BFD in memory,
836      so allocate all the space that we will need right now.  */
837   ptr = bfd_zalloc (abfd, ILF_DATA_SIZE);
838   if (ptr == NULL)
839     return false;
840 
841   /* Create a bfd_in_memory structure.  */
842   vars.bim = (struct bfd_in_memory *) ptr;
843   vars.bim->buffer = ptr;
844   vars.bim->size   = ILF_DATA_SIZE;
845   ptr += sizeof (* vars.bim);
846 
847   /* Initialise the pointers to regions of the memory and the
848      other contents of the pe_ILF_vars structure as well.  */
849   vars.sym_cache = (coff_symbol_type *) ptr;
850   vars.sym_ptr   = (coff_symbol_type *) ptr;
851   vars.sym_index = 0;
852   ptr += SIZEOF_ILF_SYMS;
853 
854   vars.sym_table = (unsigned int *) ptr;
855   vars.table_ptr = (unsigned int *) ptr;
856   ptr += SIZEOF_ILF_SYM_TABLE;
857 
858   vars.native_syms = (combined_entry_type *) ptr;
859   vars.native_ptr  = (combined_entry_type *) ptr;
860   ptr += SIZEOF_ILF_NATIVE_SYMS;
861 
862   vars.sym_ptr_table = (coff_symbol_type **) ptr;
863   vars.sym_ptr_ptr   = (coff_symbol_type **) ptr;
864   ptr += SIZEOF_ILF_SYM_PTR_TABLE;
865 
866   vars.esym_table = (SYMENT *) ptr;
867   vars.esym_ptr   = (SYMENT *) ptr;
868   ptr += SIZEOF_ILF_EXT_SYMS;
869 
870   vars.reltab   = (arelent *) ptr;
871   vars.relcount = 0;
872   ptr += SIZEOF_ILF_RELOCS;
873 
874   vars.int_reltab  = (struct internal_reloc *) ptr;
875   ptr += SIZEOF_ILF_INT_RELOCS;
876 
877   vars.string_table = ptr;
878   vars.string_ptr   = ptr + STRING_SIZE_SIZE;
879   ptr += SIZEOF_ILF_STRINGS;
880   vars.end_string_ptr = ptr;
881 
882   /* The remaining space in bim->buffer is used
883      by the pe_ILF_make_a_section() function.  */
884   vars.data = ptr;
885   vars.abfd = abfd;
886   vars.sec_index = 0;
887   vars.magic = magic;
888 
889   /* Create the initial .idata$<n> sections:
890      [.idata$2:  Import Directory Table -- not needed]
891      .idata$4:  Import Lookup Table
892      .idata$5:  Import Address Table
893 
894      Note we do not create a .idata$3 section as this is
895      created for us by the linker script.  */
896   id4 = pe_ILF_make_a_section (& vars, ".idata$4", SIZEOF_IDATA4, 0);
897   id5 = pe_ILF_make_a_section (& vars, ".idata$5", SIZEOF_IDATA5, 0);
898   if (id4 == NULL || id5 == NULL)
899     return false;
900 
901   /* Fill in the contents of these sections.  */
902   if (import_name_type == IMPORT_ORDINAL)
903     {
904       if (ordinal == 0)
905 	/* XXX - treat as IMPORT_NAME ??? */
906 	abort ();
907 
908       * (unsigned int *) id4->contents = ordinal | 0x80000000UL;
909       * (unsigned int *) id5->contents = ordinal | 0x80000000UL;
910     }
911   else
912     {
913       char * symbol;
914 
915       /* Create .idata$6 - the Hint Name Table.  */
916       id6 = pe_ILF_make_a_section (& vars, ".idata$6", SIZEOF_IDATA6, 0);
917       if (id6 == NULL)
918 	return false;
919 
920       /* If necessary, trim the import symbol name.  */
921       symbol = symbol_name;
922 
923       if (import_name_type != IMPORT_NAME)
924 	/* Skip any prefix in symbol_name.  */
925 	while (*symbol == '@' || * symbol == '?' || * symbol == '_')
926 	  ++ symbol;
927 
928       if (import_name_type == IMPORT_NAME_UNDECORATE)
929 	{
930 	  /* Truncate at the first '@'  */
931 	  while (* symbol != 0 && * symbol != '@')
932 	    symbol ++;
933 
934 	  * symbol = 0;
935 	}
936 
937       id6->contents[0] = ordinal & 0xff;
938       id6->contents[1] = ordinal >> 8;
939 
940       strcpy (id6->contents + 2, symbol);
941     }
942 
943   if (import_name_type != IMPORT_ORDINAL)
944     {
945       pe_ILF_make_a_reloc (& vars, 0, BFD_RELOC_RVA, id6);
946       pe_ILF_save_relocs (& vars, id4);
947 
948       pe_ILF_make_a_reloc (& vars, 0, BFD_RELOC_RVA, id6);
949       pe_ILF_save_relocs (& vars, id5);
950     }
951 
952   /* Create extra sections depending upon the type of import we are dealing with.  */
953   switch (import_type)
954     {
955       int i;
956 
957     case IMPORT_CODE:
958       /* Create a .text section.
959 	 First we need to look up its contents in the jump table.  */
960       for (i = NUM_ENTRIES (jtab); i--;)
961 	{
962 	  if (jtab[i].size == 0)
963 	    continue;
964 	  if (jtab[i].magic == magic)
965 	    break;
966 	}
967       /* If we did not find a matching entry something is wrong.  */
968       if (i < 0)
969 	abort ();
970 
971       /* Create the .text section.  */
972       text = pe_ILF_make_a_section (& vars, ".text", jtab[i].size, SEC_CODE);
973       if (text == NULL)
974 	return false;
975 
976       /* Copy in the jump code.  */
977       memcpy (text->contents, jtab[i].data, jtab[i].size);
978 
979       /* Create an import symbol.  */
980       pe_ILF_make_a_symbol (& vars, "__imp_", symbol_name, id5, 0);
981       imp_sym   = vars.sym_ptr_ptr - 1;
982       imp_index = vars.sym_index - 1;
983 
984       /* Create a reloc for the data in the text section.  */
985 #ifdef MIPS_ARCH_MAGIC_WINCE
986       if (magic == MIPS_ARCH_MAGIC_WINCE)
987 	{
988 	  pe_ILF_make_a_symbol_reloc (& vars, 0, BFD_RELOC_HI16_S,
989 				      (asection **) imp_sym, imp_index);
990 	  pe_ILF_make_a_reloc (& vars, 0, BFD_RELOC_LO16, text);
991 	  pe_ILF_make_a_symbol_reloc (& vars, 4, BFD_RELOC_LO16,
992 				      (asection **) imp_sym, imp_index);
993 	}
994       else
995 #endif
996 	pe_ILF_make_a_symbol_reloc (& vars, jtab[i].offset, BFD_RELOC_32,
997 				    (asymbol **) imp_sym, imp_index);
998 
999       pe_ILF_save_relocs (& vars, text);
1000       break;
1001 
1002     case IMPORT_DATA:
1003       break;
1004 
1005     default:
1006       /* XXX code not yet written.  */
1007       abort ();
1008     }
1009 
1010   /* Initialise the bfd.  */
1011   memset (& internal_f, 0, sizeof (internal_f));
1012 
1013   internal_f.f_magic  = magic;
1014   internal_f.f_symptr = 0;
1015   internal_f.f_nsyms  = 0;
1016   internal_f.f_flags  = F_AR32WR | F_LNNO; /* XXX is this correct ?  */
1017 
1018   if (   ! bfd_set_start_address (abfd, 0)
1019       || ! bfd_coff_set_arch_mach_hook (abfd, & internal_f))
1020     return false;
1021 
1022   if (bfd_coff_mkobject_hook (abfd, (PTR) & internal_f, NULL) == NULL)
1023     return false;
1024 
1025   coff_data (abfd)->pe = 1;
1026 #ifdef THUMBPEMAGIC
1027   if (vars.magic == THUMBPEMAGIC)
1028     /* Stop some linker warnings about thumb code not supporting interworking.  */
1029     coff_data (abfd)->flags |= F_INTERWORK | F_INTERWORK_SET;
1030 #endif
1031 
1032   /* Switch from file contents to memory contents.  */
1033   bfd_cache_close (abfd);
1034 
1035   abfd->iostream = (PTR) vars.bim;
1036   abfd->flags |= BFD_IN_MEMORY /* | HAS_LOCALS */;
1037   abfd->where = 0;
1038   obj_sym_filepos (abfd) = 0;
1039 
1040   /* Now create a symbol describing the imported value.  */
1041   switch (import_type)
1042     {
1043       bfd_byte * ptr;
1044 
1045     case IMPORT_CODE:
1046       pe_ILF_make_a_symbol (& vars, "", symbol_name, text,
1047 			    BSF_NOT_AT_END | BSF_FUNCTION);
1048 
1049       /* Create an import symbol for the DLL, without the
1050        .dll suffix.  */
1051       ptr = strrchr (source_dll, '.');
1052       if (ptr)
1053 	* ptr = 0;
1054       pe_ILF_make_a_symbol (& vars, "__IMPORT_DESCRIPTOR_", source_dll, NULL, 0);
1055       if (ptr)
1056 	* ptr = '.';
1057       break;
1058 
1059     case IMPORT_DATA:
1060       /* Nothing to do here.  */
1061       break;
1062 
1063     default:
1064       /* XXX code not yet written.  */
1065       abort ();
1066     }
1067 
1068   /* Point the bfd at the symbol table.  */
1069   obj_symbols (abfd) = vars.sym_cache;
1070   bfd_get_symcount (abfd) = vars.sym_index;
1071 
1072   obj_raw_syments (abfd) = vars.native_syms;
1073   obj_raw_syment_count (abfd) = vars.sym_index;
1074 
1075   obj_coff_external_syms (abfd) = (PTR) vars.esym_table;
1076   obj_coff_keep_syms (abfd) = true;
1077 
1078   obj_convert (abfd) = vars.sym_table;
1079   obj_conv_table_size (abfd) = vars.sym_index;
1080 
1081   obj_coff_strings (abfd) = vars.string_table;
1082   obj_coff_keep_strings (abfd) = true;
1083 
1084   abfd->flags |= HAS_SYMS;
1085 
1086   return true;
1087 }
1088 
1089 /* We have detected a Image Library Format archive element.
1090    Decode the element and return the appropriate target.  */
1091 static const bfd_target *
1092 pe_ILF_object_p (bfd * abfd)
1093 {
1094   bfd_byte        buffer[16];
1095   bfd_byte *      ptr;
1096   bfd_byte *      symbol_name;
1097   bfd_byte *      source_dll;
1098   unsigned int    machine;
1099   unsigned long   size;
1100   unsigned int    ordinal;
1101   unsigned int    types;
1102   unsigned short  magic;
1103 
1104   /* Upon entry the first four buyes of the ILF header have
1105       already been read.  Now read the rest of the header.  */
1106   if (bfd_read (buffer, 1, 16, abfd) != 16)
1107     return NULL;
1108 
1109   ptr = buffer;
1110 
1111   /*  We do not bother to check the version number.
1112       version = bfd_h_get_16 (abfd, ptr);  */
1113   ptr += 2;
1114 
1115   machine = bfd_h_get_16 (abfd, ptr);
1116   ptr += 2;
1117 
1118   /* Check that the machine type is recognised.  */
1119   magic = 0;
1120 
1121   switch (machine)
1122     {
1123     case IMAGE_FILE_MACHINE_UNKNOWN:
1124     case IMAGE_FILE_MACHINE_ALPHA:
1125     case IMAGE_FILE_MACHINE_ALPHA64:
1126     case IMAGE_FILE_MACHINE_IA64:
1127       break;
1128 
1129     case IMAGE_FILE_MACHINE_I386:
1130 #ifdef I386MAGIC
1131       magic = I386MAGIC;
1132 #endif
1133       break;
1134 
1135     case IMAGE_FILE_MACHINE_M68K:
1136 #ifdef MC68AGIC
1137       magic = MC68MAGIC;
1138 #endif
1139       break;
1140 
1141     case IMAGE_FILE_MACHINE_R3000:
1142     case IMAGE_FILE_MACHINE_R4000:
1143     case IMAGE_FILE_MACHINE_R10000:
1144 
1145     case IMAGE_FILE_MACHINE_MIPS16:
1146     case IMAGE_FILE_MACHINE_MIPSFPU:
1147     case IMAGE_FILE_MACHINE_MIPSFPU16:
1148 #ifdef MIPS_ARCH_MAGIC_WINCE
1149       magic = MIPS_ARCH_MAGIC_WINCE;
1150 #endif
1151       break;
1152 
1153     case IMAGE_FILE_MACHINE_SH3:
1154     case IMAGE_FILE_MACHINE_SH4:
1155 #ifdef SH_ARCH_MAGIC_WINCE
1156       magic = SH_ARCH_MAGIC_WINCE;
1157 #endif
1158       break;
1159 
1160     case IMAGE_FILE_MACHINE_ARM:
1161 #ifdef ARMPEMAGIC
1162       magic = ARMPEMAGIC;
1163 #endif
1164       break;
1165 
1166     case IMAGE_FILE_MACHINE_THUMB:
1167 #ifdef THUMBPEMAGIC
1168       {
1169 	extern bfd_target armpei_little_vec;
1170 
1171 	if (abfd->xvec == & armpei_little_vec)
1172 	  magic = THUMBPEMAGIC;
1173       }
1174 #endif
1175       break;
1176 
1177     case IMAGE_FILE_MACHINE_POWERPC:
1178       /* We no longer support PowerPC.  */
1179     default:
1180       _bfd_error_handler
1181 	(
1182 _("%s: Unrecognised machine type (0x%x) in Import Library Format archive"),
1183          bfd_get_filename (abfd), machine);
1184       bfd_set_error (bfd_error_malformed_archive);
1185 
1186       return NULL;
1187       break;
1188     }
1189 
1190   if (magic == 0)
1191     {
1192       _bfd_error_handler
1193 	(
1194 _("%s: Recognised but unhandled machine type (0x%x) in Import Library Format archive"),
1195 	 bfd_get_filename (abfd), machine);
1196       bfd_set_error (bfd_error_wrong_format);
1197 
1198       return NULL;
1199     }
1200 
1201   /* We do not bother to check the date.
1202      date = bfd_h_get_32 (abfd, ptr);  */
1203   ptr += 4;
1204 
1205   size = bfd_h_get_32 (abfd, ptr);
1206   ptr += 4;
1207 
1208   if (size == 0)
1209     {
1210       _bfd_error_handler
1211 	(_("%s: size field is zero in Import Library Format header"),
1212 	 bfd_get_filename (abfd));
1213       bfd_set_error (bfd_error_malformed_archive);
1214 
1215       return NULL;
1216     }
1217 
1218   ordinal = bfd_h_get_16 (abfd, ptr);
1219   ptr += 2;
1220 
1221   types = bfd_h_get_16 (abfd, ptr);
1222   /* ptr += 2; */
1223 
1224   /* Now read in the two strings that follow.  */
1225   ptr = bfd_alloc (abfd, size);
1226   if (ptr == NULL)
1227     return NULL;
1228 
1229   if (bfd_read (ptr, 1, size, abfd) != size)
1230     return NULL;
1231 
1232   symbol_name = ptr;
1233   source_dll  = ptr + strlen (ptr) + 1;
1234 
1235   /* Verify that the strings are null terminated.  */
1236   if (ptr[size - 1] != 0 || ((unsigned long) (source_dll - ptr) >= size))
1237     {
1238       _bfd_error_handler
1239 	(_("%s: string not null terminated in ILF object file."),
1240 	 bfd_get_filename (abfd));
1241       bfd_set_error (bfd_error_malformed_archive);
1242 
1243       return NULL;
1244     }
1245 
1246   /* Now construct the bfd.  */
1247   if (! pe_ILF_build_a_bfd (abfd, magic, symbol_name,
1248 			    source_dll, ordinal, types))
1249     return NULL;
1250 
1251   return abfd->xvec;
1252 }
1253 
1254 static const bfd_target *
1255 pe_bfd_object_p (bfd * abfd)
1256 {
1257   /* We need to handle a PE image correctly.  In PE images created by
1258      the GNU linker, the offset to the COFF header is always the size.
1259      However, this is not the case in images generated by other PE
1260      linkers.  The PE format stores a four byte offset to the PE
1261      signature just before the COFF header at location 0x3c of the file.
1262      We pick up that offset, verify that the PE signature is there, and
1263      then set ourselves up to read in the COFF header.  */
1264   bfd_byte buffer[4];
1265   file_ptr offset;
1266   unsigned long signature;
1267 
1268   /* Detect if this a Microsoft Import Library Format element.  */
1269   if (bfd_seek (abfd, 0x00, SEEK_SET) != 0
1270       || bfd_read (buffer, 1, 4, abfd) != 4)
1271     {
1272       if (bfd_get_error () != bfd_error_system_call)
1273 	bfd_set_error (bfd_error_wrong_format);
1274       return NULL;
1275     }
1276 
1277   signature = bfd_h_get_32 (abfd, buffer);
1278 
1279   if (signature == 0xffff0000)
1280     return pe_ILF_object_p (abfd);
1281 
1282   if (bfd_seek (abfd, 0x3c, SEEK_SET) != 0
1283       || bfd_read (buffer, 1, 4, abfd) != 4)
1284     {
1285       if (bfd_get_error () != bfd_error_system_call)
1286 	bfd_set_error (bfd_error_wrong_format);
1287       return NULL;
1288     }
1289 
1290   offset = bfd_h_get_32 (abfd, buffer);
1291 
1292   if (bfd_seek (abfd, offset, SEEK_SET) != 0
1293       || bfd_read (buffer, 1, 4, abfd) != 4)
1294     {
1295       if (bfd_get_error () != bfd_error_system_call)
1296 	bfd_set_error (bfd_error_wrong_format);
1297       return NULL;
1298     }
1299 
1300   signature = bfd_h_get_32 (abfd, buffer);
1301 
1302   if (signature != 0x4550)
1303     {
1304       bfd_set_error (bfd_error_wrong_format);
1305       return NULL;
1306     }
1307 
1308   /* Here is the hack.  coff_object_p wants to read filhsz bytes to
1309      pick up the COFF header.  We adjust so that that will work.  20
1310      is the size of the i386 COFF filehdr.  */
1311   if (bfd_seek (abfd,
1312 		(bfd_tell (abfd)
1313 		 - bfd_coff_filhsz (abfd)
1314 		 + 20),
1315 		SEEK_SET)
1316       != 0)
1317     {
1318       if (bfd_get_error () != bfd_error_system_call)
1319 	bfd_set_error (bfd_error_wrong_format);
1320       return NULL;
1321     }
1322 
1323   return coff_object_p (abfd);
1324 }
1325 
1326 #define coff_object_p pe_bfd_object_p
1327 #endif /* COFF_IMAGE_WITH_PE */
1328