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