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