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