Home | History | Annotate | Download | only in ld
      1 /* Routines to help build PEI-format DLLs (Win32 etc)
      2    Copyright (C) 1998-2016 Free Software Foundation, Inc.
      3    Written by DJ Delorie <dj (at) cygnus.com>
      4 
      5    This file is part of the GNU Binutils.
      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 #include "sysdep.h"
     23 #include "bfd.h"
     24 #include "bfdlink.h"
     25 #include "libiberty.h"
     26 #include "filenames.h"
     27 #include "safe-ctype.h"
     28 
     29 #include <time.h>
     30 
     31 #include "ld.h"
     32 #include "ldexp.h"
     33 #include "ldlang.h"
     34 #include "ldwrite.h"
     35 #include "ldmisc.h"
     36 #include <ldgram.h>
     37 #include "ldmain.h"
     38 #include "ldfile.h"
     39 #include "ldemul.h"
     40 #include "coff/internal.h"
     41 #include "../bfd/libcoff.h"
     42 #include "deffile.h"
     43 
     44 #ifdef pe_use_x86_64
     45 
     46 #define PE_IDATA4_SIZE	8
     47 #define PE_IDATA5_SIZE	8
     48 #include "pep-dll.h"
     49 #undef  AOUTSZ
     50 #define AOUTSZ		PEPAOUTSZ
     51 #define PEAOUTHDR	PEPAOUTHDR
     52 
     53 #else
     54 
     55 #include "pe-dll.h"
     56 
     57 #endif
     58 
     59 #ifndef PE_IDATA4_SIZE
     60 #define PE_IDATA4_SIZE	4
     61 #endif
     62 
     63 #ifndef PE_IDATA5_SIZE
     64 #define PE_IDATA5_SIZE	4
     65 #endif
     66 
     67 /*  This file turns a regular Windows PE image into a DLL.  Because of
     68     the complexity of this operation, it has been broken down into a
     69     number of separate modules which are all called by the main function
     70     at the end of this file.  This function is not re-entrant and is
     71     normally only called once, so static variables are used to reduce
     72     the number of parameters and return values required.
     73 
     74     See also: ld/emultempl/pe.em and ld/emultempl/pep.em.  */
     75 
     76 /*  Auto-import feature by Paul Sokolovsky
     77 
     78     Quick facts:
     79 
     80     1. With this feature on, DLL clients can import variables from DLL
     81     without any concern from their side (for example, without any source
     82     code modifications).
     83 
     84     2. This is done completely in bounds of the PE specification (to be fair,
     85     there's a place where it pokes nose out of, but in practice it works).
     86     So, resulting module can be used with any other PE compiler/linker.
     87 
     88     3. Auto-import is fully compatible with standard import method and they
     89     can be mixed together.
     90 
     91     4. Overheads: space: 8 bytes per imported symbol, plus 20 for each
     92     reference to it; load time: negligible; virtual/physical memory: should be
     93     less than effect of DLL relocation, and I sincerely hope it doesn't affect
     94     DLL sharability (too much).
     95 
     96     Idea
     97 
     98     The obvious and only way to get rid of dllimport insanity is to make client
     99     access variable directly in the DLL, bypassing extra dereference. I.e.,
    100     whenever client contains something like
    101 
    102     mov dll_var,%eax,
    103 
    104     address of dll_var in the command should be relocated to point into loaded
    105     DLL. The aim is to make OS loader do so, and than make ld help with that.
    106     Import section of PE made following way: there's a vector of structures
    107     each describing imports from particular DLL. Each such structure points
    108     to two other parallel vectors: one holding imported names, and one which
    109     will hold address of corresponding imported name. So, the solution is
    110     de-vectorize these structures, making import locations be sparse and
    111     pointing directly into code. Before continuing, it is worth a note that,
    112     while authors strives to make PE act ELF-like, there're some other people
    113     make ELF act PE-like: elfvector, ;-) .
    114 
    115     Implementation
    116 
    117     For each reference of data symbol to be imported from DLL (to set of which
    118     belong symbols with name <sym>, if __imp_<sym> is found in implib), the
    119     import fixup entry is generated. That entry is of type
    120     IMAGE_IMPORT_DESCRIPTOR and stored in .idata$2 subsection. Each
    121     fixup entry contains pointer to symbol's address within .text section
    122     (marked with __fuN_<sym> symbol, where N is integer), pointer to DLL name
    123     (so, DLL name is referenced by multiple entries), and pointer to symbol
    124     name thunk. Symbol name thunk is singleton vector (__nm_th_<symbol>)
    125     pointing to IMAGE_IMPORT_BY_NAME structure (__nm_<symbol>) directly
    126     containing imported name. Here comes that "on the edge" problem mentioned
    127     above: PE specification rambles that name vector (OriginalFirstThunk)
    128     should run in parallel with addresses vector (FirstThunk), i.e. that they
    129     should have same number of elements and terminated with zero. We violate
    130     this, since FirstThunk points directly into machine code. But in practice,
    131     OS loader implemented the sane way: it goes thru OriginalFirstThunk and
    132     puts addresses to FirstThunk, not something else. It once again should be
    133     noted that dll and symbol name structures are reused across fixup entries
    134     and should be there anyway to support standard import stuff, so sustained
    135     overhead is 20 bytes per reference. Other question is whether having several
    136     IMAGE_IMPORT_DESCRIPTORS for the same DLL is possible. Answer is yes, it is
    137     done even by native compiler/linker (libth32's functions are in fact reside
    138     in windows9x kernel32.dll, so if you use it, you have two
    139     IMAGE_IMPORT_DESCRIPTORS for kernel32.dll). Yet other question is whether
    140     referencing the same PE structures several times is valid. The answer is why
    141     not, prohibiting that (detecting violation) would require more work on
    142     behalf of loader than not doing it.
    143 
    144     See also: ld/emultempl/pe.em and ld/emultempl/pep.em.  */
    145 
    146 static void add_bfd_to_link (bfd *, const char *, struct bfd_link_info *);
    147 
    148 /* For emultempl/pe.em.  */
    149 
    150 def_file * pe_def_file = 0;
    151 int pe_dll_export_everything = 0;
    152 int pe_dll_exclude_all_symbols = 0;
    153 int pe_dll_do_default_excludes = 1;
    154 int pe_dll_kill_ats = 0;
    155 int pe_dll_stdcall_aliases = 0;
    156 int pe_dll_warn_dup_exports = 0;
    157 int pe_dll_compat_implib = 0;
    158 int pe_dll_extra_pe_debug = 0;
    159 int pe_use_nul_prefixed_import_tables = 0;
    160 int pe_use_coff_long_section_names = -1;
    161 int pe_leading_underscore = -1;
    162 
    163 /* Static variables and types.  */
    164 
    165 static bfd_vma image_base;
    166 static bfd *filler_bfd;
    167 static struct bfd_section *edata_s, *reloc_s;
    168 static unsigned char *edata_d, *reloc_d;
    169 static size_t edata_sz, reloc_sz;
    170 static int runtime_pseudo_relocs_created = 0;
    171 static int runtime_pseudp_reloc_v2_init = 0;
    172 
    173 typedef struct
    174 {
    175   const char *name;
    176   int len;
    177 }
    178 autofilter_entry_type;
    179 
    180 typedef struct
    181 {
    182   const char *target_name;
    183   const char *object_target;
    184   unsigned int imagebase_reloc;
    185   int pe_arch;
    186   int bfd_arch;
    187   bfd_boolean underscored;
    188   const autofilter_entry_type* autofilter_symbollist;
    189 }
    190 pe_details_type;
    191 
    192 static const autofilter_entry_type autofilter_symbollist_generic[] =
    193 {
    194   { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
    195   /* Entry point symbols.  */
    196   { STRING_COMMA_LEN ("DllMain") },
    197   { STRING_COMMA_LEN ("DllMainCRTStartup") },
    198   { STRING_COMMA_LEN ("_DllMainCRTStartup") },
    199   /* Runtime pseudo-reloc.  */
    200   { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
    201   { STRING_COMMA_LEN ("do_pseudo_reloc") },
    202   { NULL, 0 }
    203 };
    204 
    205 static const autofilter_entry_type autofilter_symbollist_i386[] =
    206 {
    207   { STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
    208   /* Entry point symbols, and entry hooks.  */
    209   { STRING_COMMA_LEN ("cygwin_crt0") },
    210 #ifdef pe_use_x86_64
    211   { STRING_COMMA_LEN ("DllMain") },
    212   { STRING_COMMA_LEN ("DllEntryPoint") },
    213   { STRING_COMMA_LEN ("DllMainCRTStartup") },
    214   { STRING_COMMA_LEN ("_cygwin_dll_entry") },
    215   { STRING_COMMA_LEN ("_cygwin_crt0_common") },
    216   { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry") },
    217 #else
    218   { STRING_COMMA_LEN ("DllMain@12") },
    219   { STRING_COMMA_LEN ("DllEntryPoint@0") },
    220   { STRING_COMMA_LEN ("DllMainCRTStartup@12") },
    221   { STRING_COMMA_LEN ("_cygwin_dll_entry@12") },
    222   { STRING_COMMA_LEN ("_cygwin_crt0_common@8") },
    223   { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry@12") },
    224   { STRING_COMMA_LEN ("cygwin_attach_dll") },
    225 #endif
    226   { STRING_COMMA_LEN ("cygwin_premain0") },
    227   { STRING_COMMA_LEN ("cygwin_premain1") },
    228   { STRING_COMMA_LEN ("cygwin_premain2") },
    229   { STRING_COMMA_LEN ("cygwin_premain3") },
    230   /* Runtime pseudo-reloc.  */
    231   { STRING_COMMA_LEN ("_pei386_runtime_relocator") },
    232   { STRING_COMMA_LEN ("do_pseudo_reloc") },
    233   /* Global vars that should not be exported.  */
    234   { STRING_COMMA_LEN ("impure_ptr") },
    235   { STRING_COMMA_LEN ("_impure_ptr") },
    236   { STRING_COMMA_LEN ("_fmode") },
    237   { STRING_COMMA_LEN ("environ") },
    238   { STRING_COMMA_LEN ("__dso_handle") },
    239   { NULL, 0 }
    240 };
    241 
    242 #define PE_ARCH_i386	 1
    243 #define PE_ARCH_sh	 2
    244 #define PE_ARCH_mips	 3
    245 #define PE_ARCH_arm	 4
    246 #define PE_ARCH_arm_epoc 5
    247 #define PE_ARCH_arm_wince 6
    248 
    249 /* Don't make it constant as underscore mode gets possibly overriden
    250    by target or -(no-)leading-underscore option.  */
    251 static pe_details_type pe_detail_list[] =
    252 {
    253   {
    254 #ifdef pe_use_x86_64
    255     "pei-x86-64",
    256     "pe-x86-64",
    257     3 /* R_IMAGEBASE */,
    258 #else
    259     "pei-i386",
    260     "pe-i386",
    261     7 /* R_IMAGEBASE */,
    262 #endif
    263     PE_ARCH_i386,
    264     bfd_arch_i386,
    265 #ifdef pe_use_x86_64
    266     FALSE,
    267 #else
    268     TRUE,
    269 #endif
    270     autofilter_symbollist_i386
    271   },
    272   {
    273     "pei-shl",
    274     "pe-shl",
    275     16 /* R_SH_IMAGEBASE */,
    276     PE_ARCH_sh,
    277     bfd_arch_sh,
    278     TRUE,
    279     autofilter_symbollist_generic
    280   },
    281   {
    282     "pei-mips",
    283     "pe-mips",
    284     34 /* MIPS_R_RVA */,
    285     PE_ARCH_mips,
    286     bfd_arch_mips,
    287     FALSE,
    288     autofilter_symbollist_generic
    289   },
    290   {
    291     "pei-arm-little",
    292     "pe-arm-little",
    293     11 /* ARM_RVA32 */,
    294     PE_ARCH_arm,
    295     bfd_arch_arm,
    296     TRUE,
    297     autofilter_symbollist_generic
    298   },
    299   {
    300     "epoc-pei-arm-little",
    301     "epoc-pe-arm-little",
    302     11 /* ARM_RVA32 */,
    303     PE_ARCH_arm_epoc,
    304     bfd_arch_arm,
    305     FALSE,
    306     autofilter_symbollist_generic
    307   },
    308   {
    309     "pei-arm-wince-little",
    310     "pe-arm-wince-little",
    311     2,  /* ARM_RVA32 on Windows CE, see bfd/coff-arm.c.  */
    312     PE_ARCH_arm_wince,
    313     bfd_arch_arm,
    314     FALSE,
    315     autofilter_symbollist_generic
    316   },
    317   { NULL, NULL, 0, 0, 0, FALSE, NULL }
    318 };
    319 
    320 static const pe_details_type *pe_details;
    321 
    322 /* Do not specify library suffix explicitly, to allow for dllized versions.  */
    323 static const autofilter_entry_type autofilter_liblist[] =
    324 {
    325   { STRING_COMMA_LEN ("libcegcc") },
    326   { STRING_COMMA_LEN ("libcygwin") },
    327   { STRING_COMMA_LEN ("libgcc") },
    328   { STRING_COMMA_LEN ("libgcc_s") },
    329   { STRING_COMMA_LEN ("libstdc++") },
    330   { STRING_COMMA_LEN ("libmingw32") },
    331   { STRING_COMMA_LEN ("libmingwex") },
    332   { STRING_COMMA_LEN ("libg2c") },
    333   { STRING_COMMA_LEN ("libsupc++") },
    334   { STRING_COMMA_LEN ("libobjc") },
    335   { STRING_COMMA_LEN ("libgcj") },
    336   { NULL, 0 }
    337 };
    338 
    339 /* Regardless of the suffix issue mentioned above, we must ensure that
    340   we do not falsely match on a leading substring, such as when libtool
    341   builds libstdc++ as a DLL using libsupc++convenience.a as an intermediate.
    342   This routine ensures that the leading part of the name matches and that
    343   it is followed by only an optional version suffix and a file extension,
    344   returning zero if so or -1 if not.  */
    345 static int libnamencmp (const char *libname, const autofilter_entry_type *afptr)
    346 {
    347   if (filename_ncmp (libname, afptr->name, afptr->len))
    348     return -1;
    349 
    350   libname += afptr->len;
    351 
    352   /* Be liberal in interpreting what counts as a version suffix; we
    353     accept anything that has a dash to separate it from the name and
    354     begins with a digit.  */
    355   if (libname[0] == '-')
    356     {
    357       if (!ISDIGIT (*++libname))
    358 	return -1;
    359       /* Ensure the filename has an extension.  */
    360       while (*++libname != '.')
    361 	if (!*libname)
    362 	  return -1;
    363     }
    364   else if (libname[0] != '.')
    365     return -1;
    366 
    367   return 0;
    368 }
    369 
    370 static const autofilter_entry_type autofilter_objlist[] =
    371 {
    372   { STRING_COMMA_LEN ("crt0.o") },
    373   { STRING_COMMA_LEN ("crt1.o") },
    374   { STRING_COMMA_LEN ("crt2.o") },
    375   { STRING_COMMA_LEN ("dllcrt1.o") },
    376   { STRING_COMMA_LEN ("dllcrt2.o") },
    377   { STRING_COMMA_LEN ("gcrt0.o") },
    378   { STRING_COMMA_LEN ("gcrt1.o") },
    379   { STRING_COMMA_LEN ("gcrt2.o") },
    380   { STRING_COMMA_LEN ("crtbegin.o") },
    381   { STRING_COMMA_LEN ("crtend.o") },
    382   { NULL, 0 }
    383 };
    384 
    385 static const autofilter_entry_type autofilter_symbolprefixlist[] =
    386 {
    387   /* _imp_ is treated specially, as it is always underscored.  */
    388   /* { STRING_COMMA_LEN ("_imp_") },  */
    389   /* Don't export some c++ symbols.  */
    390   { STRING_COMMA_LEN ("__rtti_") },
    391   { STRING_COMMA_LEN ("__builtin_") },
    392   /* Don't re-export auto-imported symbols.  */
    393   { STRING_COMMA_LEN ("__nm_") },
    394   /* Don't export symbols specifying internal DLL layout.  */
    395   { STRING_COMMA_LEN ("_head_") },
    396   { STRING_COMMA_LEN ("_IMPORT_DESCRIPTOR_") },
    397   /* Don't export section labels or artificial symbols
    398   (eg ".weak.foo".  */
    399   { STRING_COMMA_LEN (".") },
    400   { NULL, 0 }
    401 };
    402 
    403 static const autofilter_entry_type autofilter_symbolsuffixlist[] =
    404 {
    405   { STRING_COMMA_LEN ("_iname") },
    406   { STRING_COMMA_LEN ("_NULL_THUNK_DATA") },
    407   { NULL, 0 }
    408 };
    409 
    410 #define U(str) (pe_details->underscored ? "_" str : str)
    411 
    412 void
    413 pe_dll_id_target (const char *target)
    414 {
    415   int i;
    416 
    417   for (i = 0; pe_detail_list[i].target_name; i++)
    418     if (strcmp (pe_detail_list[i].target_name, target) == 0
    419 	|| strcmp (pe_detail_list[i].object_target, target) == 0)
    420       {
    421 	int u = pe_leading_underscore; /* Underscoring mode. -1 for use default.  */
    422 	if (u == -1)
    423 	  bfd_get_target_info (target, NULL, NULL, &u, NULL);
    424 	if (u == -1)
    425 	  abort ();
    426 	pe_detail_list[i].underscored = (u != 0 ? TRUE : FALSE);
    427 	pe_details = pe_detail_list + i;
    428 	pe_leading_underscore = (u != 0 ? 1 : 0);
    429 	return;
    430       }
    431   einfo (_("%XUnsupported PEI architecture: %s\n"), target);
    432   exit (1);
    433 }
    434 
    435 /* Helper functions for qsort.  Relocs must be sorted so that we can write
    436    them out by pages.  */
    437 
    438 typedef struct
    439   {
    440     bfd_vma vma;
    441     char type;
    442     short extra;
    443   }
    444 reloc_data_type;
    445 
    446 static int
    447 reloc_sort (const void *va, const void *vb)
    448 {
    449   bfd_vma a = ((const reloc_data_type *) va)->vma;
    450   bfd_vma b = ((const reloc_data_type *) vb)->vma;
    451 
    452   return (a > b) ? 1 : ((a < b) ? -1 : 0);
    453 }
    454 
    455 static int
    456 pe_export_sort (const void *va, const void *vb)
    457 {
    458   const def_file_export *a = va;
    459   const def_file_export *b = vb;
    460   char *an = a->name;
    461   char *bn = b->name;
    462   if (a->its_name)
    463     an = a->its_name;
    464   if (b->its_name)
    465     bn = b->its_name;
    466 
    467   return strcmp (an, bn);
    468 }
    469 
    470 /* Read and process the .DEF file.  */
    471 
    472 /* These correspond to the entries in pe_def_file->exports[].  I use
    473    exported_symbol_sections[i] to tag whether or not the symbol was
    474    defined, since we can't export symbols we don't have.  */
    475 
    476 static bfd_vma *exported_symbol_offsets;
    477 static struct bfd_section **exported_symbol_sections;
    478 static int export_table_size;
    479 static int count_exported;
    480 static int count_exported_byname;
    481 static int count_with_ordinals;
    482 static const char *dll_name;
    483 static int min_ordinal, max_ordinal;
    484 static int *exported_symbols;
    485 
    486 typedef struct exclude_list_struct
    487   {
    488     char *string;
    489     struct exclude_list_struct *next;
    490     exclude_type type;
    491   }
    492 exclude_list_struct;
    493 
    494 static struct exclude_list_struct *excludes = 0;
    495 
    496 void
    497 pe_dll_add_excludes (const char *new_excludes, const exclude_type type)
    498 {
    499   char *local_copy;
    500   char *exclude_string;
    501 
    502   local_copy = xstrdup (new_excludes);
    503 
    504   exclude_string = strtok (local_copy, ",:");
    505   for (; exclude_string; exclude_string = strtok (NULL, ",:"))
    506     {
    507       struct exclude_list_struct *new_exclude;
    508 
    509       new_exclude = xmalloc (sizeof (struct exclude_list_struct));
    510       new_exclude->string = xmalloc (strlen (exclude_string) + 1);
    511       strcpy (new_exclude->string, exclude_string);
    512       new_exclude->type = type;
    513       new_exclude->next = excludes;
    514       excludes = new_exclude;
    515     }
    516 
    517   free (local_copy);
    518 }
    519 
    520 static bfd_boolean
    521 is_import (const char* n)
    522 {
    523   return (CONST_STRNEQ (n, "__imp_"));
    524 }
    525 
    526 /* abfd is a bfd containing n (or NULL)
    527    It can be used for contextual checks.  */
    528 
    529 static int
    530 auto_export (bfd *abfd, def_file *d, const char *n)
    531 {
    532   def_file_export key;
    533   struct exclude_list_struct *ex;
    534   const autofilter_entry_type *afptr;
    535   const char * libname = NULL;
    536 
    537   if (abfd && abfd->my_archive)
    538     libname = lbasename (abfd->my_archive->filename);
    539 
    540   key.name = key.its_name = (char *) n;
    541 
    542   /* Return false if n is in the d->exports table.  */
    543   if (bsearch (&key, d->exports, d->num_exports,
    544                sizeof (pe_def_file->exports[0]), pe_export_sort))
    545     return 0;
    546 
    547   if (pe_dll_do_default_excludes)
    548     {
    549       const char * p;
    550       int    len;
    551 
    552       if (pe_dll_extra_pe_debug)
    553 	printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
    554 		n, abfd, abfd->my_archive);
    555 
    556       /* First of all, make context checks:
    557 	 Don't export anything from standard libs.  */
    558       if (libname)
    559 	{
    560 	  afptr = autofilter_liblist;
    561 
    562 	  while (afptr->name)
    563 	    {
    564 	      if (libnamencmp (libname, afptr) == 0 )
    565 		return 0;
    566 	      afptr++;
    567 	    }
    568 	}
    569 
    570       /* Next, exclude symbols from certain startup objects.  */
    571 
    572       if (abfd && (p = lbasename (abfd->filename)))
    573 	{
    574 	  afptr = autofilter_objlist;
    575 	  while (afptr->name)
    576 	    {
    577 	      if (strcmp (p, afptr->name) == 0)
    578 		return 0;
    579 	      afptr++;
    580 	    }
    581 	}
    582 
    583       /* Don't try to blindly exclude all symbols
    584 	 that begin with '__'; this was tried and
    585 	 it is too restrictive.  Instead we have
    586 	 a target specific list to use:  */
    587       afptr = pe_details->autofilter_symbollist;
    588 
    589       while (afptr->name)
    590 	{
    591 	  if (strcmp (n, afptr->name) == 0)
    592 	    return 0;
    593 
    594 	  afptr++;
    595 	}
    596 
    597       /* Next, exclude symbols starting with ...  */
    598       afptr = autofilter_symbolprefixlist;
    599       while (afptr->name)
    600 	{
    601 	  if (strncmp (n, afptr->name, afptr->len) == 0)
    602 	    return 0;
    603 
    604 	  afptr++;
    605 	}
    606 
    607       /* Finally, exclude symbols ending with ...  */
    608       len = strlen (n);
    609       afptr = autofilter_symbolsuffixlist;
    610       while (afptr->name)
    611 	{
    612 	  if ((len >= afptr->len)
    613 	      /* Add 1 to insure match with trailing '\0'.  */
    614 	      && strncmp (n + len - afptr->len, afptr->name,
    615 			  afptr->len + 1) == 0)
    616 	    return 0;
    617 
    618 	  afptr++;
    619 	}
    620     }
    621 
    622   for (ex = excludes; ex; ex = ex->next)
    623     {
    624       if (ex->type == EXCLUDELIBS)
    625 	{
    626 	  if (libname
    627 	      && ((filename_cmp (libname, ex->string) == 0)
    628 		   || (strcasecmp ("ALL", ex->string) == 0)))
    629 	    return 0;
    630 	}
    631       else if (ex->type == EXCLUDEFORIMPLIB)
    632 	{
    633 	  if (filename_cmp (abfd->filename, ex->string) == 0)
    634 	    return 0;
    635 	}
    636       else if (strcmp (n, ex->string) == 0)
    637 	return 0;
    638     }
    639 
    640   return 1;
    641 }
    642 
    643 static void
    644 process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
    645 {
    646   int i, j;
    647   struct bfd_link_hash_entry *blhe;
    648   bfd *b;
    649   struct bfd_section *s;
    650   def_file_export *e = 0;
    651   bfd_boolean resort_needed;
    652 
    653   if (!pe_def_file)
    654     pe_def_file = def_file_empty ();
    655 
    656   /* First, run around to all the objects looking for the .drectve
    657      sections, and push those into the def file too.  */
    658   for (b = info->input_bfds; b; b = b->link.next)
    659     {
    660       s = bfd_get_section_by_name (b, ".drectve");
    661       if (s)
    662 	{
    663 	  long size = s->size;
    664 	  char *buf = xmalloc (size);
    665 
    666 	  bfd_get_section_contents (b, s, buf, 0, size);
    667 	  def_file_add_directive (pe_def_file, buf, size);
    668 	  free (buf);
    669 	}
    670     }
    671 
    672   /* Process aligned common symbol information from the
    673      .drectve sections now; common symbol allocation is
    674      done before final link, so it will be too late to
    675      process them in process_embedded_commands() called
    676      from _bfd_coff_link_input_bfd().  */
    677   if (pe_def_file->aligncomms)
    678     {
    679       def_file_aligncomm *ac = pe_def_file->aligncomms;
    680       while (ac)
    681 	{
    682 	  struct coff_link_hash_entry *sym_hash;
    683 	  sym_hash = coff_link_hash_lookup (coff_hash_table (info),
    684 		ac->symbol_name, FALSE, FALSE, FALSE);
    685 	  if (sym_hash && sym_hash->root.type == bfd_link_hash_common
    686 	    && sym_hash->root.u.c.p->alignment_power < (unsigned) ac->alignment)
    687 	    {
    688 	      sym_hash->root.u.c.p->alignment_power = (unsigned) ac->alignment;
    689 	    }
    690 	  ac = ac->next;
    691 	}
    692     }
    693 
    694   /* If we are building an executable and there is nothing
    695      to export, we do not build an export table at all.  */
    696   if (bfd_link_executable (info) && pe_def_file->num_exports == 0
    697       && (!pe_dll_export_everything || pe_dll_exclude_all_symbols))
    698     return;
    699 
    700   /* Now, maybe export everything else the default way.  */
    701   if ((pe_dll_export_everything || pe_def_file->num_exports == 0)
    702       && !pe_dll_exclude_all_symbols)
    703     {
    704       for (b = info->input_bfds; b; b = b->link.next)
    705 	{
    706 	  asymbol **symbols;
    707 	  int nsyms;
    708 
    709 	  if (!bfd_generic_link_read_symbols (b))
    710 	    {
    711 	      einfo (_("%B%F: could not read symbols: %E\n"), b);
    712 	      return;
    713 	    }
    714 
    715 	  symbols = bfd_get_outsymbols (b);
    716 	  nsyms = bfd_get_symcount (b);
    717 
    718 	  for (j = 0; j < nsyms; j++)
    719 	    {
    720 	      /* We should export symbols which are either global or not
    721 		 anything at all.  (.bss data is the latter)
    722 		 We should not export undefined symbols.  */
    723 	      bfd_boolean would_export
    724 		= (symbols[j]->section != bfd_und_section_ptr
    725 		   && ((symbols[j]->flags & BSF_GLOBAL)
    726 		       || (symbols[j]->flags == 0)));
    727 	      if (link_info.version_info && would_export)
    728 		  would_export
    729 		    = !bfd_hide_sym_by_version (link_info.version_info,
    730 						symbols[j]->name);
    731 	      if (would_export)
    732 		{
    733 		  const char *sn = symbols[j]->name;
    734 
    735 		  /* We should not re-export imported stuff.  */
    736 		  {
    737 		    char *name;
    738 		    if (is_import (sn))
    739 			  continue;
    740 
    741 		    name = xmalloc (strlen ("__imp_") + strlen (sn) + 1);
    742 		    sprintf (name, "%s%s", "__imp_", sn);
    743 
    744 		    blhe = bfd_link_hash_lookup (info->hash, name,
    745 						 FALSE, FALSE, FALSE);
    746 		    free (name);
    747 
    748 		    if (blhe && blhe->type == bfd_link_hash_defined)
    749 		      continue;
    750 		  }
    751 
    752 		  if (pe_details->underscored && *sn == '_')
    753 		    sn++;
    754 
    755 		  if (auto_export (b, pe_def_file, sn))
    756 		    {
    757 		      int is_dup = 0;
    758 		      def_file_export *p;
    759 
    760 		      p = def_file_add_export (pe_def_file, sn, 0, -1,
    761 					       NULL, &is_dup);
    762 		      /* Fill data flag properly, from dlltool.c.  */
    763 		      if (!is_dup)
    764 		        p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
    765 		    }
    766 		}
    767 	    }
    768 	}
    769     }
    770 
    771 #undef NE
    772 #define NE pe_def_file->num_exports
    773 
    774   /* Don't create an empty export table.  */
    775   if (NE == 0)
    776     return;
    777 
    778   resort_needed = FALSE;
    779 
    780   /* Canonicalize the export list.  */
    781   if (pe_dll_kill_ats)
    782     {
    783       for (i = 0; i < NE; i++)
    784 	{
    785 	  /* Check for fastcall/stdcall-decoration, but ignore
    786 	     C++ mangled names.  */
    787 	  if (pe_def_file->exports[i].name[0] != '?'
    788 	      && strchr (pe_def_file->exports[i].name, '@'))
    789 	    {
    790 	      /* This will preserve internal_name, which may have been
    791 		 pointing to the same memory as name, or might not
    792 		 have.  */
    793 	      int lead_at = (*pe_def_file->exports[i].name == '@');
    794 	      char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
    795 	      char *tmp_at = strrchr (tmp, '@');
    796 
    797 	      if (tmp_at)
    798 	        *tmp_at = 0;
    799 	      else
    800 	        einfo (_("%XCannot export %s: invalid export name\n"),
    801 		       pe_def_file->exports[i].name);
    802 	      pe_def_file->exports[i].name = tmp;
    803               resort_needed = TRUE;
    804 	    }
    805 	}
    806     }
    807 
    808   /* Re-sort the exports table as we have possibly changed the order
    809      by removing leading @.  */
    810   if (resort_needed)
    811     qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
    812            pe_export_sort);
    813 
    814   if (pe_dll_stdcall_aliases)
    815     {
    816       for (i = 0; i < NE; i++)
    817 	{
    818 	  if (is_import (pe_def_file->exports[i].name))
    819 	    continue;
    820 
    821 	  if (strchr (pe_def_file->exports[i].name, '@'))
    822 	    {
    823 	      int is_dup = 1;
    824 	      int lead_at = (*pe_def_file->exports[i].name == '@');
    825 	      char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
    826 
    827 	      *(strchr (tmp, '@')) = 0;
    828 	      if (auto_export (NULL, pe_def_file, tmp))
    829 		def_file_add_export (pe_def_file, tmp,
    830 				     pe_def_file->exports[i].internal_name,
    831 				     -1, NULL, &is_dup);
    832 	      if (is_dup)
    833 	        free (tmp);
    834 	    }
    835 	}
    836     }
    837 
    838   /* Convenience, but watch out for it changing.  */
    839   e = pe_def_file->exports;
    840 
    841   for (i = 0, j = 0; i < NE; i++)
    842     {
    843       if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
    844 	{
    845 	  /* This is a duplicate.  */
    846 	  if (e[j - 1].ordinal != -1
    847 	      && e[i].ordinal != -1
    848 	      && e[j - 1].ordinal != e[i].ordinal)
    849 	    {
    850 	      if (pe_dll_warn_dup_exports)
    851 		/* xgettext:c-format */
    852 		einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
    853 		       e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
    854 	    }
    855 	  else
    856 	    {
    857 	      if (pe_dll_warn_dup_exports)
    858 		/* xgettext:c-format */
    859 		einfo (_("Warning, duplicate EXPORT: %s\n"),
    860 		       e[j - 1].name);
    861 	    }
    862 
    863 	  if (e[i].ordinal != -1)
    864 	    e[j - 1].ordinal = e[i].ordinal;
    865 	  e[j - 1].flag_private |= e[i].flag_private;
    866 	  e[j - 1].flag_constant |= e[i].flag_constant;
    867 	  e[j - 1].flag_noname |= e[i].flag_noname;
    868 	  e[j - 1].flag_data |= e[i].flag_data;
    869 	  if (e[i].name)
    870 	    free (e[i].name);
    871 	  if (e[i].internal_name)
    872 	    free (e[i].internal_name);
    873 	  if (e[i].its_name)
    874 	    free (e[i].its_name);
    875 	}
    876       else
    877 	{
    878 	  if (i != j)
    879 	    e[j] = e[i];
    880 	  j++;
    881 	}
    882     }
    883   pe_def_file->num_exports = j;	/* == NE */
    884 
    885   exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
    886   exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
    887 
    888   memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
    889   max_ordinal = 0;
    890   min_ordinal = 65536;
    891   count_exported = 0;
    892   count_exported_byname = 0;
    893   count_with_ordinals = 0;
    894 
    895   for (i = 0; i < NE; i++)
    896     {
    897       char *int_name = pe_def_file->exports[i].internal_name;
    898       char *name;
    899 
    900       /* PR 19803: Make sure that any exported symbol does not get garbage collected.  */
    901       lang_add_gc_name (int_name);
    902 
    903       name = xmalloc (strlen (int_name) + 2);
    904       if (pe_details->underscored && int_name[0] != '@')
    905 	{
    906 	  *name = '_';
    907 	  strcpy (name + 1, int_name);
    908 
    909 	  /* PR 19803: The alias must be preserved as well.  */
    910 	  lang_add_gc_name (xstrdup (name));
    911 	}
    912       else
    913 	strcpy (name, int_name);
    914 
    915       blhe = bfd_link_hash_lookup (info->hash,
    916 				   name,
    917 				   FALSE, FALSE, TRUE);
    918 
    919       if (blhe
    920 	  && (blhe->type == bfd_link_hash_defined
    921 	      || (blhe->type == bfd_link_hash_common)))
    922 	{
    923 	  count_exported++;
    924 	  if (!pe_def_file->exports[i].flag_noname)
    925 	    count_exported_byname++;
    926 
    927 	  /* Only fill in the sections. The actual offsets are computed
    928 	     in fill_exported_offsets() after common symbols are laid
    929 	     out.  */
    930 	  if (blhe->type == bfd_link_hash_defined)
    931 	    exported_symbol_sections[i] = blhe->u.def.section;
    932 	  else
    933 	    exported_symbol_sections[i] = blhe->u.c.p->section;
    934 
    935 	  if (pe_def_file->exports[i].ordinal != -1)
    936 	    {
    937 	      if (max_ordinal < pe_def_file->exports[i].ordinal)
    938 		max_ordinal = pe_def_file->exports[i].ordinal;
    939 	      if (min_ordinal > pe_def_file->exports[i].ordinal)
    940 		min_ordinal = pe_def_file->exports[i].ordinal;
    941 	      count_with_ordinals++;
    942 	    }
    943 	}
    944       /* Check for forward exports.  These are indicated in DEF files by an
    945          export directive of the form NAME1 = MODULE-NAME.EXTERNAL-NAME
    946 	 but we must take care not to be fooled when the user wants to export
    947 	 a symbol that actually really has a dot in it, so we only check
    948 	 for them here, after real defined symbols have already been matched.  */
    949       else if (strchr (int_name, '.'))
    950 	{
    951 	  count_exported++;
    952 	  if (!pe_def_file->exports[i].flag_noname)
    953 	    count_exported_byname++;
    954 
    955 	  pe_def_file->exports[i].flag_forward = 1;
    956 
    957 	  if (pe_def_file->exports[i].ordinal != -1)
    958 	    {
    959 	      if (max_ordinal < pe_def_file->exports[i].ordinal)
    960 		max_ordinal = pe_def_file->exports[i].ordinal;
    961 	      if (min_ordinal > pe_def_file->exports[i].ordinal)
    962 		min_ordinal = pe_def_file->exports[i].ordinal;
    963 	      count_with_ordinals++;
    964 	    }
    965 	}
    966       else if (blhe && blhe->type == bfd_link_hash_undefined)
    967 	{
    968 	  /* xgettext:c-format */
    969 	  einfo (_("%XCannot export %s: symbol not defined\n"),
    970 		 int_name);
    971 	}
    972       else if (blhe)
    973 	{
    974 	  /* xgettext:c-format */
    975 	  einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
    976 		 int_name,
    977 		 blhe->type, bfd_link_hash_defined);
    978 	}
    979       else
    980 	{
    981 	  /* xgettext:c-format */
    982 	  einfo (_("%XCannot export %s: symbol not found\n"),
    983 		 int_name);
    984 	}
    985       free (name);
    986     }
    987 }
    988 
    989 /* Build the bfd that will contain .edata and .reloc sections.  */
    990 
    991 static void
    992 build_filler_bfd (int include_edata)
    993 {
    994   lang_input_statement_type *filler_file;
    995   filler_file = lang_add_input_file ("dll stuff",
    996 				     lang_input_file_is_fake_enum,
    997 				     NULL);
    998   filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff",
    999 						  link_info.output_bfd);
   1000   if (filler_bfd == NULL
   1001       || !bfd_set_arch_mach (filler_bfd,
   1002 			     bfd_get_arch (link_info.output_bfd),
   1003 			     bfd_get_mach (link_info.output_bfd)))
   1004     {
   1005       einfo ("%X%P: can not create BFD: %E\n");
   1006       return;
   1007     }
   1008 
   1009   if (include_edata)
   1010     {
   1011       edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
   1012       if (edata_s == NULL
   1013 	  || !bfd_set_section_flags (filler_bfd, edata_s,
   1014 				     (SEC_HAS_CONTENTS
   1015 				      | SEC_ALLOC
   1016 				      | SEC_LOAD
   1017 				      | SEC_KEEP
   1018 				      | SEC_IN_MEMORY)))
   1019 	{
   1020 	  einfo ("%X%P: can not create .edata section: %E\n");
   1021 	  return;
   1022 	}
   1023       bfd_set_section_size (filler_bfd, edata_s, edata_sz);
   1024     }
   1025 
   1026   reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
   1027   if (reloc_s == NULL
   1028       || !bfd_set_section_flags (filler_bfd, reloc_s,
   1029 				 (SEC_HAS_CONTENTS
   1030 				  | SEC_ALLOC
   1031 				  | SEC_LOAD
   1032 				  | SEC_KEEP
   1033 				  | SEC_IN_MEMORY)))
   1034     {
   1035       einfo ("%X%P: can not create .reloc section: %E\n");
   1036       return;
   1037     }
   1038 
   1039   bfd_set_section_size (filler_bfd, reloc_s, 0);
   1040 
   1041   ldlang_add_file (filler_file);
   1042 }
   1043 
   1044 /* Gather all the exported symbols and build the .edata section.  */
   1045 
   1046 static void
   1047 generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
   1048 {
   1049   int i, next_ordinal;
   1050   int name_table_size = 0;
   1051   const char *dlnp;
   1052 
   1053   /* First, we need to know how many exported symbols there are,
   1054      and what the range of ordinals is.  */
   1055   if (pe_def_file->name)
   1056     dll_name = pe_def_file->name;
   1057   else
   1058     {
   1059       dll_name = abfd->filename;
   1060 
   1061       for (dlnp = dll_name; *dlnp; dlnp++)
   1062 	if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
   1063 	  dll_name = dlnp + 1;
   1064     }
   1065 
   1066   if (count_with_ordinals && max_ordinal > count_exported)
   1067     {
   1068       if (min_ordinal > max_ordinal - count_exported + 1)
   1069 	min_ordinal = max_ordinal - count_exported + 1;
   1070     }
   1071   else
   1072     {
   1073       min_ordinal = 1;
   1074       max_ordinal = count_exported;
   1075     }
   1076 
   1077   export_table_size = max_ordinal - min_ordinal + 1;
   1078   exported_symbols = xmalloc (export_table_size * sizeof (int));
   1079   for (i = 0; i < export_table_size; i++)
   1080     exported_symbols[i] = -1;
   1081 
   1082   /* Now we need to assign ordinals to those that don't have them.  */
   1083   for (i = 0; i < NE; i++)
   1084     {
   1085       if (exported_symbol_sections[i] ||
   1086           pe_def_file->exports[i].flag_forward)
   1087 	{
   1088 	  if (pe_def_file->exports[i].ordinal != -1)
   1089 	    {
   1090 	      int ei = pe_def_file->exports[i].ordinal - min_ordinal;
   1091 	      int pi = exported_symbols[ei];
   1092 
   1093 	      if (pi != -1)
   1094 		{
   1095 		  /* xgettext:c-format */
   1096 		  einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
   1097 			 pe_def_file->exports[i].ordinal,
   1098 			 pe_def_file->exports[i].name,
   1099 			 pe_def_file->exports[pi].name);
   1100 		}
   1101 	      exported_symbols[ei] = i;
   1102 	    }
   1103 	  if (pe_def_file->exports[i].its_name)
   1104 	    name_table_size += strlen (pe_def_file->exports[i].its_name) + 1;
   1105 	  else
   1106 	    name_table_size += strlen (pe_def_file->exports[i].name) + 1;
   1107 	}
   1108 
   1109       /* Reserve space for the forward name. */
   1110       if (pe_def_file->exports[i].flag_forward)
   1111 	{
   1112 	  name_table_size += strlen (pe_def_file->exports[i].internal_name) + 1;
   1113 	}
   1114     }
   1115 
   1116   next_ordinal = min_ordinal;
   1117   for (i = 0; i < NE; i++)
   1118     if ((exported_symbol_sections[i] ||
   1119          pe_def_file->exports[i].flag_forward) &&
   1120         pe_def_file->exports[i].ordinal == -1)
   1121       {
   1122 	while (exported_symbols[next_ordinal - min_ordinal] != -1)
   1123 	  next_ordinal++;
   1124 
   1125 	exported_symbols[next_ordinal - min_ordinal] = i;
   1126 	pe_def_file->exports[i].ordinal = next_ordinal;
   1127       }
   1128 
   1129   /* OK, now we can allocate some memory.  */
   1130   edata_sz = (40				/* directory */
   1131 	      + 4 * export_table_size		/* addresses */
   1132 	      + 4 * count_exported_byname	/* name ptrs */
   1133 	      + 2 * count_exported_byname	/* ordinals */
   1134 	      + name_table_size + strlen (dll_name) + 1);
   1135 }
   1136 
   1137 /* Fill the exported symbol offsets. The preliminary work has already
   1138    been done in process_def_file_and_drectve().  */
   1139 
   1140 static void
   1141 fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
   1142 {
   1143   int i;
   1144   struct bfd_link_hash_entry *blhe;
   1145 
   1146   for (i = 0; i < pe_def_file->num_exports; i++)
   1147     {
   1148       char *name;
   1149 
   1150       name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
   1151       if (pe_details->underscored
   1152  	  && *pe_def_file->exports[i].internal_name != '@')
   1153 	{
   1154 	  *name = '_';
   1155 	  strcpy (name + 1, pe_def_file->exports[i].internal_name);
   1156 	}
   1157       else
   1158 	strcpy (name, pe_def_file->exports[i].internal_name);
   1159 
   1160       blhe = bfd_link_hash_lookup (info->hash,
   1161 				   name,
   1162 				   FALSE, FALSE, TRUE);
   1163 
   1164       if (blhe && blhe->type == bfd_link_hash_defined)
   1165 	exported_symbol_offsets[i] = blhe->u.def.value;
   1166 
   1167       free (name);
   1168     }
   1169 }
   1170 
   1171 static void
   1172 fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
   1173 {
   1174   int s, hint;
   1175   unsigned char *edirectory;
   1176   unsigned char *eaddresses;
   1177   unsigned char *enameptrs;
   1178   unsigned char *eordinals;
   1179   char *enamestr;
   1180 
   1181   edata_d = xmalloc (edata_sz);
   1182 
   1183   /* Note use of array pointer math here.  */
   1184   edirectory = edata_d;
   1185   eaddresses = edirectory + 40;
   1186   enameptrs = eaddresses + 4 * export_table_size;
   1187   eordinals = enameptrs + 4 * count_exported_byname;
   1188   enamestr = (char *) eordinals + 2 * count_exported_byname;
   1189 
   1190 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
   1191 		   + edata_s->output_section->vma - image_base)
   1192 
   1193   memset (edata_d, 0, edata_sz);
   1194 
   1195   if (pe_data (abfd)->insert_timestamp)
   1196     H_PUT_32 (abfd, time (0), edata_d + 4);
   1197 
   1198   if (pe_def_file->version_major != -1)
   1199     {
   1200       bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
   1201       bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
   1202     }
   1203 
   1204   bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
   1205   strcpy (enamestr, dll_name);
   1206   enamestr += strlen (enamestr) + 1;
   1207   bfd_put_32 (abfd, min_ordinal, edata_d + 16);
   1208   bfd_put_32 (abfd, export_table_size, edata_d + 20);
   1209   bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
   1210   bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
   1211   bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
   1212   bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
   1213 
   1214   fill_exported_offsets (abfd, info);
   1215 
   1216   /* Ok, now for the filling in part.
   1217      Scan alphabetically - ie the ordering in the exports[] table,
   1218      rather than by ordinal - the ordering in the exported_symbol[]
   1219      table.  See dlltool.c and:
   1220         http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
   1221      for more information.  */
   1222   hint = 0;
   1223   for (s = 0; s < NE; s++)
   1224     {
   1225       struct bfd_section *ssec = exported_symbol_sections[s];
   1226       if (pe_def_file->exports[s].ordinal != -1 &&
   1227           (pe_def_file->exports[s].flag_forward || ssec != NULL))
   1228 	{
   1229 	  int ord = pe_def_file->exports[s].ordinal;
   1230 
   1231 	  if (pe_def_file->exports[s].flag_forward)
   1232 	    {
   1233 	      bfd_put_32 (abfd, ERVA (enamestr),
   1234 		          eaddresses + 4 * (ord - min_ordinal));
   1235 
   1236 	      strcpy (enamestr, pe_def_file->exports[s].internal_name);
   1237 	      enamestr += strlen (pe_def_file->exports[s].internal_name) + 1;
   1238 	    }
   1239 	  else
   1240 	    {
   1241 	      bfd_vma srva = (exported_symbol_offsets[s]
   1242 				    + ssec->output_section->vma
   1243 				    + ssec->output_offset);
   1244 
   1245 	      bfd_put_32 (abfd, srva - image_base,
   1246 		          eaddresses + 4 * (ord - min_ordinal));
   1247 	    }
   1248 
   1249 	  if (!pe_def_file->exports[s].flag_noname)
   1250 	    {
   1251 	      char *ename = pe_def_file->exports[s].name;
   1252 	      if (pe_def_file->exports[s].its_name)
   1253 		ename = pe_def_file->exports[s].its_name;
   1254 
   1255 	      bfd_put_32 (abfd, ERVA (enamestr), enameptrs);
   1256 	      enameptrs += 4;
   1257 	      strcpy (enamestr, ename);
   1258 	      enamestr += strlen (enamestr) + 1;
   1259 	      bfd_put_16 (abfd, ord - min_ordinal, eordinals);
   1260 	      eordinals += 2;
   1261 	      pe_def_file->exports[s].hint = hint++;
   1262 	    }
   1263 	}
   1264     }
   1265 }
   1266 
   1267 
   1268 static struct bfd_section *current_sec;
   1269 
   1270 void
   1271 pe_walk_relocs_of_symbol (struct bfd_link_info *info,
   1272 			  const char *name,
   1273 			  int (*cb) (arelent *, asection *))
   1274 {
   1275   bfd *b;
   1276   asection *s;
   1277 
   1278   for (b = info->input_bfds; b; b = b->link.next)
   1279     {
   1280       asymbol **symbols;
   1281 
   1282       if (!bfd_generic_link_read_symbols (b))
   1283 	{
   1284 	  einfo (_("%B%F: could not read symbols: %E\n"), b);
   1285 	  return;
   1286 	}
   1287 
   1288       symbols = bfd_get_outsymbols (b);
   1289 
   1290       for (s = b->sections; s; s = s->next)
   1291 	{
   1292 	  arelent **relocs;
   1293 	  int relsize, nrelocs, i;
   1294 	  int flags = bfd_get_section_flags (b, s);
   1295 
   1296 	  /* Skip discarded linkonce sections.  */
   1297 	  if (flags & SEC_LINK_ONCE
   1298 	      && s->output_section == bfd_abs_section_ptr)
   1299 	    continue;
   1300 
   1301 	  current_sec = s;
   1302 
   1303 	  relsize = bfd_get_reloc_upper_bound (b, s);
   1304 	  relocs = xmalloc (relsize);
   1305 	  nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
   1306 
   1307 	  for (i = 0; i < nrelocs; i++)
   1308 	    {
   1309 	      struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
   1310 
   1311 	      if (!strcmp (name, sym->name))
   1312 		cb (relocs[i], s);
   1313 	    }
   1314 
   1315 	  free (relocs);
   1316 
   1317 	  /* Warning: the allocated symbols are remembered in BFD and reused
   1318 	     later, so don't free them! */
   1319 	  /* free (symbols); */
   1320 	}
   1321     }
   1322 }
   1323 
   1324 /* Gather all the relocations and build the .reloc section.  */
   1325 
   1326 static void
   1327 generate_reloc (bfd *abfd, struct bfd_link_info *info)
   1328 {
   1329 
   1330   /* For .reloc stuff.  */
   1331   reloc_data_type *reloc_data;
   1332   int total_relocs = 0;
   1333   int i;
   1334   bfd_vma sec_page = (bfd_vma) -1;
   1335   bfd_vma page_ptr, page_count;
   1336   int bi;
   1337   bfd *b;
   1338   struct bfd_section *s;
   1339 
   1340   total_relocs = 0;
   1341   for (b = info->input_bfds; b; b = b->link.next)
   1342     for (s = b->sections; s; s = s->next)
   1343       total_relocs += s->reloc_count;
   1344 
   1345   reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
   1346 
   1347   total_relocs = 0;
   1348   bi = 0;
   1349   for (bi = 0, b = info->input_bfds; b; bi++, b = b->link.next)
   1350     {
   1351       arelent **relocs;
   1352       int relsize, nrelocs;
   1353 
   1354       for (s = b->sections; s; s = s->next)
   1355 	{
   1356 	  bfd_vma sec_vma = s->output_section->vma + s->output_offset;
   1357 	  asymbol **symbols;
   1358 
   1359 	  /* If it's not loaded, we don't need to relocate it this way.  */
   1360 	  if (!(s->output_section->flags & SEC_LOAD))
   1361 	    continue;
   1362 
   1363 	  /* I don't know why there would be a reloc for these, but I've
   1364 	     seen it happen - DJ  */
   1365 	  if (s->output_section == bfd_abs_section_ptr)
   1366 	    continue;
   1367 
   1368 	  if (s->output_section->vma == 0)
   1369 	    {
   1370 	      /* Huh?  Shouldn't happen, but punt if it does.  */
   1371 	      einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
   1372 		     s->output_section->name, s->output_section->index,
   1373 		     s->output_section->flags);
   1374 	      continue;
   1375 	    }
   1376 
   1377 	  if (!bfd_generic_link_read_symbols (b))
   1378 	    {
   1379 	      einfo (_("%B%F: could not read symbols: %E\n"), b);
   1380 	      return;
   1381 	    }
   1382 
   1383 	  symbols = bfd_get_outsymbols (b);
   1384 	  relsize = bfd_get_reloc_upper_bound (b, s);
   1385 	  relocs = xmalloc (relsize);
   1386 	  nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
   1387 
   1388 	  for (i = 0; i < nrelocs; i++)
   1389 	    {
   1390 	      if (pe_dll_extra_pe_debug)
   1391 		{
   1392 		  struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
   1393 		  printf ("rel: %s\n", sym->name);
   1394 		}
   1395 	      if (!relocs[i]->howto->pc_relative
   1396 		  && relocs[i]->howto->type != pe_details->imagebase_reloc)
   1397 		{
   1398 		  struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
   1399 
   1400 		  /* Don't create relocs for undefined weak symbols.  */
   1401 		  if (sym->flags == BSF_WEAK)
   1402 		    {
   1403 		      struct bfd_link_hash_entry *blhe
   1404 			= bfd_wrapped_link_hash_lookup (abfd, info, sym->name,
   1405 						FALSE, FALSE, FALSE);
   1406 		      if (blhe && blhe->type == bfd_link_hash_undefweak)
   1407 			{
   1408 			  /* Check aux sym and see if it is defined or not. */
   1409 			  struct coff_link_hash_entry *h, *h2;
   1410 			  h = (struct coff_link_hash_entry *)blhe;
   1411 			  if (h->symbol_class != C_NT_WEAK || h->numaux != 1)
   1412 			    continue;
   1413 			  h2 = h->auxbfd->tdata.coff_obj_data->sym_hashes
   1414 						[h->aux->x_sym.x_tagndx.l];
   1415 			  /* We don't want a base reloc if the aux sym is not
   1416 			     found, undefined, or if it is the constant ABS
   1417 			     zero default value.  (We broaden that slightly by
   1418 			     not testing the value, just the section; there's
   1419 			     no reason we'd want a reference to any absolute
   1420 			     address to get relocated during rebasing).  */
   1421 			  if (!h2 || h2->root.type == bfd_link_hash_undefined
   1422 				|| h2->root.u.def.section == bfd_abs_section_ptr)
   1423 			    continue;
   1424 			}
   1425 		      else if (!blhe || blhe->type != bfd_link_hash_defined)
   1426 			continue;
   1427 		    }
   1428 		  /* Nor for Dwarf FDE references to discarded sections.  */
   1429 		  else if (bfd_is_abs_section (sym->section->output_section))
   1430 		    {
   1431 		      /* We only ignore relocs from .eh_frame sections, as
   1432 			 they are discarded by the final link rather than
   1433 			 resolved against the kept section.  */
   1434 		      if (!strcmp (s->name, ".eh_frame"))
   1435 			continue;
   1436 		    }
   1437 
   1438 		  reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
   1439 
   1440 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
   1441 
   1442 		  switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
   1443 					 relocs[i]->howto->rightshift)
   1444 		    {
   1445 #ifdef pe_use_x86_64
   1446 		    case BITS_AND_SHIFT (64, 0):
   1447 		      reloc_data[total_relocs].type = 10;
   1448 		      total_relocs++;
   1449 		      break;
   1450 #endif
   1451 		    case BITS_AND_SHIFT (32, 0):
   1452 		      reloc_data[total_relocs].type = 3;
   1453 		      total_relocs++;
   1454 		      break;
   1455 		    case BITS_AND_SHIFT (16, 0):
   1456 		      reloc_data[total_relocs].type = 2;
   1457 		      total_relocs++;
   1458 		      break;
   1459 		    case BITS_AND_SHIFT (16, 16):
   1460 		      reloc_data[total_relocs].type = 4;
   1461 		      /* FIXME: we can't know the symbol's right value
   1462 			 yet, but we probably can safely assume that
   1463 			 CE will relocate us in 64k blocks, so leaving
   1464 			 it zero is safe.  */
   1465 		      reloc_data[total_relocs].extra = 0;
   1466 		      total_relocs++;
   1467 		      break;
   1468 		    case BITS_AND_SHIFT (26, 2):
   1469 		      reloc_data[total_relocs].type = 5;
   1470 		      total_relocs++;
   1471 		      break;
   1472 		    case BITS_AND_SHIFT (24, 2):
   1473 		      /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
   1474 			 Those ARM_xxx definitions should go in proper
   1475 			 header someday.  */
   1476 		      if (relocs[i]->howto->type == 0
   1477 			  /* Older GNU linkers used 5 instead of 0 for this reloc.  */
   1478 			  || relocs[i]->howto->type == 5)
   1479 			/* This is an ARM_26D reloc, which is an ARM_26 reloc
   1480 			   that has already been fully processed during a
   1481 			   previous link stage, so ignore it here.  */
   1482 			break;
   1483 		      /* Fall through.  */
   1484 		    default:
   1485 		      /* xgettext:c-format */
   1486 		      einfo (_("%XError: %d-bit reloc in dll\n"),
   1487 			     relocs[i]->howto->bitsize);
   1488 		      break;
   1489 		    }
   1490 		}
   1491 	    }
   1492 	  free (relocs);
   1493 	  /* Warning: the allocated symbols are remembered in BFD and
   1494 	     reused later, so don't free them!  */
   1495 	}
   1496     }
   1497 
   1498   /* At this point, we have total_relocs relocation addresses in
   1499      reloc_addresses, which are all suitable for the .reloc section.
   1500      We must now create the new sections.  */
   1501   qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
   1502 
   1503   for (i = 0; i < total_relocs; i++)
   1504     {
   1505       bfd_vma this_page = (reloc_data[i].vma >> 12);
   1506 
   1507       if (this_page != sec_page)
   1508 	{
   1509 	  reloc_sz = (reloc_sz + 3) & ~3;	/* 4-byte align.  */
   1510 	  reloc_sz += 8;
   1511 	  sec_page = this_page;
   1512 	}
   1513 
   1514       reloc_sz += 2;
   1515 
   1516       if (reloc_data[i].type == 4)
   1517 	reloc_sz += 2;
   1518     }
   1519 
   1520   reloc_sz = (reloc_sz + 3) & ~3;	/* 4-byte align.  */
   1521   reloc_d = xmalloc (reloc_sz);
   1522   sec_page = (bfd_vma) -1;
   1523   reloc_sz = 0;
   1524   page_ptr = (bfd_vma) -1;
   1525   page_count = 0;
   1526 
   1527   for (i = 0; i < total_relocs; i++)
   1528     {
   1529       bfd_vma rva = reloc_data[i].vma - image_base;
   1530       bfd_vma this_page = (rva & ~0xfff);
   1531 
   1532       if (this_page != sec_page)
   1533 	{
   1534 	  while (reloc_sz & 3)
   1535 	    reloc_d[reloc_sz++] = 0;
   1536 
   1537 	  if (page_ptr != (bfd_vma) -1)
   1538 	    bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
   1539 
   1540 	  bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
   1541 	  page_ptr = reloc_sz;
   1542 	  reloc_sz += 8;
   1543 	  sec_page = this_page;
   1544 	  page_count = 0;
   1545 	}
   1546 
   1547       bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
   1548 		  reloc_d + reloc_sz);
   1549       reloc_sz += 2;
   1550 
   1551       if (reloc_data[i].type == 4)
   1552 	{
   1553 	  bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
   1554 	  reloc_sz += 2;
   1555 	}
   1556 
   1557       page_count++;
   1558     }
   1559 
   1560   while (reloc_sz & 3)
   1561     reloc_d[reloc_sz++] = 0;
   1562 
   1563   if (page_ptr != (bfd_vma) -1)
   1564     bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
   1565 
   1566   while (reloc_sz < reloc_s->size)
   1567     reloc_d[reloc_sz++] = 0;
   1568 }
   1569 
   1570 /* Given the exiting def_file structure, print out a .DEF file that
   1571    corresponds to it.  */
   1572 
   1573 static void
   1574 quoteput (char *s, FILE *f, int needs_quotes)
   1575 {
   1576   char *cp;
   1577 
   1578   for (cp = s; *cp; cp++)
   1579     if (*cp == '\''
   1580 	|| *cp == '"'
   1581 	|| *cp == '\\'
   1582 	|| ISSPACE (*cp)
   1583 	|| *cp == ','
   1584 	|| *cp == ';')
   1585       needs_quotes = 1;
   1586 
   1587   if (needs_quotes)
   1588     {
   1589       putc ('"', f);
   1590 
   1591       while (*s)
   1592 	{
   1593 	  if (*s == '"' || *s == '\\')
   1594 	    putc ('\\', f);
   1595 
   1596 	  putc (*s, f);
   1597 	  s++;
   1598 	}
   1599 
   1600       putc ('"', f);
   1601     }
   1602   else
   1603     fputs (s, f);
   1604 }
   1605 
   1606 void
   1607 pe_dll_generate_def_file (const char *pe_out_def_filename)
   1608 {
   1609   int i;
   1610   FILE *out = fopen (pe_out_def_filename, "w");
   1611 
   1612   if (out == NULL)
   1613     /* xgettext:c-format */
   1614     einfo (_("%s: Can't open output def file %s\n"),
   1615 	   program_name, pe_out_def_filename);
   1616 
   1617   if (pe_def_file)
   1618     {
   1619       if (pe_def_file->name)
   1620 	{
   1621 	  if (pe_def_file->is_dll)
   1622 	    fprintf (out, "LIBRARY ");
   1623 	  else
   1624 	    fprintf (out, "NAME ");
   1625 
   1626 	  quoteput (pe_def_file->name, out, 1);
   1627 
   1628 	  if (pe_data (link_info.output_bfd)->pe_opthdr.ImageBase)
   1629 	    {
   1630 	      fprintf (out, " BASE=0x");
   1631 	      fprintf_vma (out, ((bfd_vma) pe_data (link_info.output_bfd)->pe_opthdr.ImageBase));
   1632 	    }
   1633 	  fprintf (out, "\n");
   1634 	}
   1635 
   1636       if (pe_def_file->description)
   1637 	{
   1638 	  fprintf (out, "DESCRIPTION ");
   1639 	  quoteput (pe_def_file->description, out, 1);
   1640 	  fprintf (out, "\n");
   1641 	}
   1642 
   1643       if (pe_def_file->version_minor != -1)
   1644 	fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
   1645 		 pe_def_file->version_minor);
   1646       else if (pe_def_file->version_major != -1)
   1647 	fprintf (out, "VERSION %d\n", pe_def_file->version_major);
   1648 
   1649       if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
   1650 	fprintf (out, "\n");
   1651 
   1652       if (pe_def_file->stack_commit != -1)
   1653 	fprintf (out, "STACKSIZE 0x%x,0x%x\n",
   1654 		 pe_def_file->stack_reserve, pe_def_file->stack_commit);
   1655       else if (pe_def_file->stack_reserve != -1)
   1656 	fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
   1657 
   1658       if (pe_def_file->heap_commit != -1)
   1659 	fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
   1660 		 pe_def_file->heap_reserve, pe_def_file->heap_commit);
   1661       else if (pe_def_file->heap_reserve != -1)
   1662 	fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
   1663 
   1664       if (pe_def_file->num_section_defs > 0)
   1665 	{
   1666 	  fprintf (out, "\nSECTIONS\n\n");
   1667 
   1668 	  for (i = 0; i < pe_def_file->num_section_defs; i++)
   1669 	    {
   1670 	      fprintf (out, "    ");
   1671 	      quoteput (pe_def_file->section_defs[i].name, out, 0);
   1672 
   1673 	      if (pe_def_file->section_defs[i].class)
   1674 		{
   1675 		  fprintf (out, " CLASS ");
   1676 		  quoteput (pe_def_file->section_defs[i].class, out, 0);
   1677 		}
   1678 
   1679 	      if (pe_def_file->section_defs[i].flag_read)
   1680 		fprintf (out, " READ");
   1681 
   1682 	      if (pe_def_file->section_defs[i].flag_write)
   1683 		fprintf (out, " WRITE");
   1684 
   1685 	      if (pe_def_file->section_defs[i].flag_execute)
   1686 		fprintf (out, " EXECUTE");
   1687 
   1688 	      if (pe_def_file->section_defs[i].flag_shared)
   1689 		fprintf (out, " SHARED");
   1690 
   1691 	      fprintf (out, "\n");
   1692 	    }
   1693 	}
   1694 
   1695       if (pe_def_file->num_exports > 0)
   1696 	{
   1697 	  fprintf (out, "EXPORTS\n");
   1698 
   1699 	  for (i = 0; i < pe_def_file->num_exports; i++)
   1700 	    {
   1701 	      def_file_export *e = pe_def_file->exports + i;
   1702 	      fprintf (out, "    ");
   1703 	      quoteput (e->name, out, 0);
   1704 
   1705 	      if (e->internal_name && strcmp (e->internal_name, e->name))
   1706 		{
   1707 		  fprintf (out, " = ");
   1708 		  quoteput (e->internal_name, out, 0);
   1709 		}
   1710 
   1711 	      if (e->ordinal != -1)
   1712 		fprintf (out, " @%d", e->ordinal);
   1713 
   1714 	      if (e->flag_private)
   1715 		fprintf (out, " PRIVATE");
   1716 
   1717 	      if (e->flag_constant)
   1718 		fprintf (out, " CONSTANT");
   1719 
   1720 	      if (e->flag_noname)
   1721 		fprintf (out, " NONAME");
   1722 
   1723 	      if (e->flag_data)
   1724 		fprintf (out, " DATA");
   1725 
   1726 	      fprintf (out, "\n");
   1727 	    }
   1728 	}
   1729 
   1730       if (pe_def_file->num_imports > 0)
   1731 	{
   1732 	  fprintf (out, "\nIMPORTS\n\n");
   1733 
   1734 	  for (i = 0; i < pe_def_file->num_imports; i++)
   1735 	    {
   1736 	      def_file_import *im = pe_def_file->imports + i;
   1737 	      fprintf (out, "    ");
   1738 
   1739 	      if (im->internal_name
   1740 		  && (!im->name || strcmp (im->internal_name, im->name)))
   1741 		{
   1742 		  quoteput (im->internal_name, out, 0);
   1743 		  fprintf (out, " = ");
   1744 		}
   1745 
   1746 	      quoteput (im->module->name, out, 0);
   1747 	      fprintf (out, ".");
   1748 
   1749 	      if (im->name)
   1750 		quoteput (im->name, out, 0);
   1751 	      else
   1752 		fprintf (out, "%d", im->ordinal);
   1753 
   1754 	      if (im->its_name)
   1755 		{
   1756 		  fprintf (out, " == ");
   1757 		  quoteput (im->its_name, out, 0);
   1758 		}
   1759 
   1760 	      fprintf (out, "\n");
   1761 	    }
   1762 	}
   1763     }
   1764   else
   1765     fprintf (out, _("; no contents available\n"));
   1766 
   1767   if (fclose (out) == EOF)
   1768     /* xgettext:c-format */
   1769     einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
   1770 }
   1771 
   1772 /* Generate the import library.  */
   1773 
   1774 static asymbol **symtab;
   1775 static int symptr;
   1776 static int tmp_seq;
   1777 static int tmp_seq2;
   1778 static const char *dll_filename;
   1779 static char *dll_symname;
   1780 
   1781 #define UNDSEC bfd_und_section_ptr
   1782 
   1783 static asection *
   1784 quick_section (bfd *abfd, const char *name, int flags, int align)
   1785 {
   1786   asection *sec;
   1787   asymbol *sym;
   1788 
   1789   sec = bfd_make_section_old_way (abfd, name);
   1790   bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
   1791   bfd_set_section_alignment (abfd, sec, align);
   1792   /* Remember to undo this before trying to link internally!  */
   1793   sec->output_section = sec;
   1794 
   1795   sym = bfd_make_empty_symbol (abfd);
   1796   symtab[symptr++] = sym;
   1797   sym->name = sec->name;
   1798   sym->section = sec;
   1799   sym->flags = BSF_LOCAL;
   1800   sym->value = 0;
   1801 
   1802   return sec;
   1803 }
   1804 
   1805 static void
   1806 quick_symbol (bfd *abfd,
   1807 	      const char *n1,
   1808 	      const char *n2,
   1809 	      const char *n3,
   1810 	      asection *sec,
   1811 	      int flags,
   1812 	      int addr)
   1813 {
   1814   asymbol *sym;
   1815   char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
   1816 
   1817   strcpy (name, n1);
   1818   strcat (name, n2);
   1819   strcat (name, n3);
   1820   sym = bfd_make_empty_symbol (abfd);
   1821   sym->name = name;
   1822   sym->section = sec;
   1823   sym->flags = flags;
   1824   sym->value = addr;
   1825   symtab[symptr++] = sym;
   1826 }
   1827 
   1828 static arelent *reltab = 0;
   1829 static int relcount = 0, relsize = 0;
   1830 
   1831 static void
   1832 quick_reloc (bfd *abfd, bfd_size_type address, int which_howto, int symidx)
   1833 {
   1834   if (relcount >= relsize - 1)
   1835     {
   1836       relsize += 10;
   1837       if (reltab)
   1838 	reltab = xrealloc (reltab, relsize * sizeof (arelent));
   1839       else
   1840 	reltab = xmalloc (relsize * sizeof (arelent));
   1841     }
   1842   reltab[relcount].address = address;
   1843   reltab[relcount].addend = 0;
   1844   reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
   1845   reltab[relcount].sym_ptr_ptr = symtab + symidx;
   1846   relcount++;
   1847 }
   1848 
   1849 static void
   1850 save_relocs (asection *sec)
   1851 {
   1852   int i;
   1853 
   1854   sec->relocation = reltab;
   1855   sec->reloc_count = relcount;
   1856   sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
   1857   for (i = 0; i < relcount; i++)
   1858     sec->orelocation[i] = sec->relocation + i;
   1859   sec->orelocation[relcount] = 0;
   1860   sec->flags |= SEC_RELOC;
   1861   reltab = 0;
   1862   relcount = relsize = 0;
   1863 }
   1864 
   1865 /*	.section	.idata$2
   1866  	.global		__head_my_dll
   1867    __head_my_dll:
   1868  	.rva		hname
   1869  	.long		0
   1870  	.long		0
   1871  	.rva		__my_dll_iname
   1872  	.rva		fthunk
   1873 
   1874  	.section	.idata$5
   1875  	.long		0
   1876    fthunk:
   1877 
   1878  	.section	.idata$4
   1879  	.long		0
   1880    hname:                              */
   1881 
   1882 static bfd *
   1883 make_head (bfd *parent)
   1884 {
   1885   asection *id2, *id5, *id4;
   1886   unsigned char *d2, *d5, *d4;
   1887   char *oname;
   1888   bfd *abfd;
   1889 
   1890   oname = xmalloc (20);
   1891   sprintf (oname, "d%06d.o", tmp_seq);
   1892   tmp_seq++;
   1893 
   1894   abfd = bfd_create (oname, parent);
   1895   bfd_find_target (pe_details->object_target, abfd);
   1896   bfd_make_writable (abfd);
   1897 
   1898   bfd_set_format (abfd, bfd_object);
   1899   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
   1900 
   1901   symptr = 0;
   1902   symtab = xmalloc (6 * sizeof (asymbol *));
   1903   id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
   1904   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
   1905   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
   1906   quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
   1907   quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
   1908 
   1909   /* OK, pay attention here.  I got confused myself looking back at
   1910      it.  We create a four-byte section to mark the beginning of the
   1911      list, and we include an offset of 4 in the section, so that the
   1912      pointer to the list points to the *end* of this section, which is
   1913      the start of the list of sections from other objects.  */
   1914 
   1915   bfd_set_section_size (abfd, id2, 20);
   1916   d2 = xmalloc (20);
   1917   id2->contents = d2;
   1918   memset (d2, 0, 20);
   1919   if (pe_use_nul_prefixed_import_tables)
   1920     d2[0] = d2[16] = PE_IDATA5_SIZE; /* Reloc addend.  */
   1921   quick_reloc (abfd,  0, BFD_RELOC_RVA, 2);
   1922   quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
   1923   quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
   1924   save_relocs (id2);
   1925 
   1926   if (pe_use_nul_prefixed_import_tables)
   1927     bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
   1928   else
   1929     bfd_set_section_size (abfd, id5, 0);
   1930   d5 = xmalloc (PE_IDATA5_SIZE);
   1931   id5->contents = d5;
   1932   memset (d5, 0, PE_IDATA5_SIZE);
   1933   if (pe_use_nul_prefixed_import_tables)
   1934     bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
   1935   else
   1936     bfd_set_section_size (abfd, id4, 0);
   1937   d4 = xmalloc (PE_IDATA4_SIZE);
   1938   id4->contents = d4;
   1939   memset (d4, 0, PE_IDATA4_SIZE);
   1940 
   1941   bfd_set_symtab (abfd, symtab, symptr);
   1942 
   1943   bfd_set_section_contents (abfd, id2, d2, 0, 20);
   1944   if (pe_use_nul_prefixed_import_tables)
   1945     {
   1946       bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
   1947       bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
   1948     }
   1949   else
   1950     {
   1951       bfd_set_section_contents (abfd, id5, d5, 0, 0);
   1952       bfd_set_section_contents (abfd, id4, d4, 0, 0);
   1953     }
   1954 
   1955   bfd_make_readable (abfd);
   1956   return abfd;
   1957 }
   1958 
   1959 /*	.section	.idata$4
   1960  	.long		0
   1961 	[.long		0] for PE+
   1962  	.section	.idata$5
   1963  	.long		0
   1964 	[.long		0] for PE+
   1965  	.section	idata$7
   1966  	.global		__my_dll_iname
   1967   __my_dll_iname:
   1968  	.asciz		"my.dll"       */
   1969 
   1970 static bfd *
   1971 make_tail (bfd *parent)
   1972 {
   1973   asection *id4, *id5, *id7;
   1974   unsigned char *d4, *d5, *d7;
   1975   int len;
   1976   char *oname;
   1977   bfd *abfd;
   1978 
   1979   oname = xmalloc (20);
   1980   sprintf (oname, "d%06d.o", tmp_seq);
   1981   tmp_seq++;
   1982 
   1983   abfd = bfd_create (oname, parent);
   1984   bfd_find_target (pe_details->object_target, abfd);
   1985   bfd_make_writable (abfd);
   1986 
   1987   bfd_set_format (abfd, bfd_object);
   1988   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
   1989 
   1990   symptr = 0;
   1991   symtab = xmalloc (5 * sizeof (asymbol *));
   1992   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
   1993   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
   1994   id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
   1995   quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
   1996 
   1997   bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
   1998   d4 = xmalloc (PE_IDATA4_SIZE);
   1999   id4->contents = d4;
   2000   memset (d4, 0, PE_IDATA4_SIZE);
   2001 
   2002   bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
   2003   d5 = xmalloc (PE_IDATA5_SIZE);
   2004   id5->contents = d5;
   2005   memset (d5, 0, PE_IDATA5_SIZE);
   2006 
   2007   len = strlen (dll_filename) + 1;
   2008   if (len & 1)
   2009     len++;
   2010   bfd_set_section_size (abfd, id7, len);
   2011   d7 = xmalloc (len);
   2012   id7->contents = d7;
   2013   strcpy ((char *) d7, dll_filename);
   2014   /* If len was odd, the above
   2015      strcpy leaves behind an undefined byte. That is harmless,
   2016      but we set it to 0 just so the binary dumps are pretty.  */
   2017   d7[len - 1] = 0;
   2018 
   2019   bfd_set_symtab (abfd, symtab, symptr);
   2020 
   2021   bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
   2022   bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
   2023   bfd_set_section_contents (abfd, id7, d7, 0, len);
   2024 
   2025   bfd_make_readable (abfd);
   2026   return abfd;
   2027 }
   2028 
   2029 /*	.text
   2030  	.global		_function
   2031  	.global		___imp_function
   2032  	.global		__imp__function
   2033   _function:
   2034  	jmp		*__imp__function:
   2035 
   2036  	.section	idata$7
   2037  	.long		__head_my_dll
   2038 
   2039  	.section	.idata$5
   2040   ___imp_function:
   2041   __imp__function:
   2042   iat?
   2043   	.section	.idata$4
   2044   iat?
   2045  	.section	.idata$6
   2046   ID<ordinal>:
   2047  	.short		<hint>
   2048  	.asciz		"function" xlate? (add underscore, kill at)  */
   2049 
   2050 static const unsigned char jmp_ix86_bytes[] =
   2051 {
   2052   0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
   2053 };
   2054 
   2055 /* _function:
   2056  	mov.l	ip+8,r0
   2057  	mov.l	@r0,r0
   2058  	jmp	@r0
   2059  	nop
   2060  	.dw	__imp_function   */
   2061 
   2062 static const unsigned char jmp_sh_bytes[] =
   2063 {
   2064   0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
   2065 };
   2066 
   2067 /* _function:
   2068  	lui	$t0,<high:__imp_function>
   2069  	lw	$t0,<low:__imp_function>
   2070  	jr	$t0
   2071  	nop                              */
   2072 
   2073 static const unsigned char jmp_mips_bytes[] =
   2074 {
   2075   0x00, 0x00, 0x08, 0x3c,  0x00, 0x00, 0x08, 0x8d,
   2076   0x08, 0x00, 0x00, 0x01,  0x00, 0x00, 0x00, 0x00
   2077 };
   2078 
   2079 static const unsigned char jmp_arm_bytes[] =
   2080 {
   2081   0x00, 0xc0, 0x9f, 0xe5,	/* ldr  ip, [pc] */
   2082   0x00, 0xf0, 0x9c, 0xe5,	/* ldr  pc, [ip] */
   2083   0,    0,    0,    0
   2084 };
   2085 
   2086 
   2087 static bfd *
   2088 make_one (def_file_export *exp, bfd *parent, bfd_boolean include_jmp_stub)
   2089 {
   2090   asection *tx, *id7, *id5, *id4, *id6;
   2091   unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
   2092   int len;
   2093   char *oname;
   2094   bfd *abfd;
   2095   const unsigned char *jmp_bytes = NULL;
   2096   int jmp_byte_count = 0;
   2097 
   2098   /* Include the jump stub section only if it is needed. A jump
   2099      stub is needed if the symbol being imported <sym> is a function
   2100      symbol and there is at least one undefined reference to that
   2101      symbol. In other words, if all the import references to <sym> are
   2102      explicitly through _declspec(dllimport) then the jump stub is not
   2103      needed.  */
   2104   if (include_jmp_stub)
   2105     {
   2106       switch (pe_details->pe_arch)
   2107 	{
   2108 	case PE_ARCH_i386:
   2109 	  jmp_bytes = jmp_ix86_bytes;
   2110 	  jmp_byte_count = sizeof (jmp_ix86_bytes);
   2111 	  break;
   2112 	case PE_ARCH_sh:
   2113 	  jmp_bytes = jmp_sh_bytes;
   2114 	  jmp_byte_count = sizeof (jmp_sh_bytes);
   2115 	  break;
   2116 	case PE_ARCH_mips:
   2117 	  jmp_bytes = jmp_mips_bytes;
   2118 	  jmp_byte_count = sizeof (jmp_mips_bytes);
   2119 	  break;
   2120 	case PE_ARCH_arm:
   2121 	case PE_ARCH_arm_epoc:
   2122 	case PE_ARCH_arm_wince:
   2123 	  jmp_bytes = jmp_arm_bytes;
   2124 	  jmp_byte_count = sizeof (jmp_arm_bytes);
   2125 	  break;
   2126 	default:
   2127 	  abort ();
   2128 	}
   2129     }
   2130 
   2131   oname = xmalloc (20);
   2132   sprintf (oname, "d%06d.o", tmp_seq);
   2133   tmp_seq++;
   2134 
   2135   abfd = bfd_create (oname, parent);
   2136   bfd_find_target (pe_details->object_target, abfd);
   2137   bfd_make_writable (abfd);
   2138 
   2139   bfd_set_format (abfd, bfd_object);
   2140   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
   2141 
   2142   symptr = 0;
   2143   symtab = xmalloc (12 * sizeof (asymbol *));
   2144 
   2145   tx  = quick_section (abfd, ".text", SEC_CODE | SEC_HAS_CONTENTS | SEC_READONLY, 2);
   2146   id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
   2147   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
   2148   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
   2149   id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
   2150 
   2151   if  (*exp->internal_name == '@')
   2152     {
   2153       quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
   2154 		    BSF_GLOBAL, 0);
   2155       if (include_jmp_stub)
   2156 	quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
   2157       quick_symbol (abfd, "__imp_", exp->internal_name, "", id5,
   2158 		    BSF_GLOBAL, 0);
   2159       /* Fastcall applies only to functions,
   2160 	 so no need for auto-import symbol.  */
   2161     }
   2162   else
   2163     {
   2164       quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
   2165 		    BSF_GLOBAL, 0);
   2166       if (include_jmp_stub)
   2167 	quick_symbol (abfd, U (""), exp->internal_name, "", tx,
   2168 		      BSF_GLOBAL, 0);
   2169       quick_symbol (abfd, "__imp_", U (""), exp->internal_name, id5,
   2170 		    BSF_GLOBAL, 0);
   2171       /* Symbol to reference ord/name of imported
   2172 	 data symbol, used to implement auto-import.  */
   2173       if (exp->flag_data)
   2174 	quick_symbol (abfd, "__nm_", U (""), exp->internal_name, id6,
   2175 		      BSF_GLOBAL,0);
   2176     }
   2177   if (pe_dll_compat_implib)
   2178     quick_symbol (abfd, "___imp_", exp->internal_name, "", id5,
   2179 		  BSF_GLOBAL, 0);
   2180 
   2181   if (include_jmp_stub)
   2182     {
   2183       bfd_set_section_size (abfd, tx, jmp_byte_count);
   2184       td = xmalloc (jmp_byte_count);
   2185       tx->contents = td;
   2186       memcpy (td, jmp_bytes, jmp_byte_count);
   2187 
   2188       switch (pe_details->pe_arch)
   2189 	{
   2190 	case PE_ARCH_i386:
   2191 #ifdef pe_use_x86_64
   2192 	  quick_reloc (abfd, 2, BFD_RELOC_32_PCREL, 2);
   2193 #else
   2194 	  /* Mark this object as SAFESEH compatible.  */
   2195 	  quick_symbol (abfd, "", "@feat.00", "", bfd_abs_section_ptr,
   2196 			BSF_LOCAL, 1);
   2197           quick_reloc (abfd, 2, BFD_RELOC_32, 2);
   2198 #endif
   2199 	  break;
   2200 	case PE_ARCH_sh:
   2201 	  quick_reloc (abfd, 8, BFD_RELOC_32, 2);
   2202 	  break;
   2203 	case PE_ARCH_mips:
   2204 	  quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
   2205 	  quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
   2206 	  quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
   2207 	  break;
   2208 	case PE_ARCH_arm:
   2209  	case PE_ARCH_arm_epoc:
   2210  	case PE_ARCH_arm_wince:
   2211 	  quick_reloc (abfd, 8, BFD_RELOC_32, 2);
   2212 	  break;
   2213 	default:
   2214 	  abort ();
   2215 	}
   2216       save_relocs (tx);
   2217     }
   2218   else
   2219     bfd_set_section_size (abfd, tx, 0);
   2220 
   2221   bfd_set_section_size (abfd, id7, 4);
   2222   d7 = xmalloc (4);
   2223   id7->contents = d7;
   2224   memset (d7, 0, 4);
   2225   quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
   2226   save_relocs (id7);
   2227 
   2228   bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
   2229   d5 = xmalloc (PE_IDATA5_SIZE);
   2230   id5->contents = d5;
   2231   memset (d5, 0, PE_IDATA5_SIZE);
   2232 
   2233   if (exp->flag_noname)
   2234     {
   2235       d5[0] = exp->ordinal;
   2236       d5[1] = exp->ordinal >> 8;
   2237       d5[PE_IDATA5_SIZE - 1] = 0x80;
   2238     }
   2239   else
   2240     {
   2241       quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
   2242       save_relocs (id5);
   2243     }
   2244 
   2245   bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
   2246   d4 = xmalloc (PE_IDATA4_SIZE);
   2247   id4->contents = d4;
   2248   memset (d4, 0, PE_IDATA4_SIZE);
   2249 
   2250   if (exp->flag_noname)
   2251     {
   2252       d4[0] = exp->ordinal;
   2253       d4[1] = exp->ordinal >> 8;
   2254       d4[PE_IDATA4_SIZE - 1] = 0x80;
   2255     }
   2256   else
   2257     {
   2258       quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
   2259       save_relocs (id4);
   2260     }
   2261 
   2262   if (exp->flag_noname)
   2263     {
   2264       len = 0;
   2265       bfd_set_section_size (abfd, id6, 0);
   2266     }
   2267   else
   2268     {
   2269       /* { short, asciz }  */
   2270       if (exp->its_name)
   2271 	len = 2 + strlen (exp->its_name) + 1;
   2272       else
   2273 	len = 2 + strlen (exp->name) + 1;
   2274       if (len & 1)
   2275 	len++;
   2276       bfd_set_section_size (abfd, id6, len);
   2277       d6 = xmalloc (len);
   2278       id6->contents = d6;
   2279       memset (d6, 0, len);
   2280       d6[0] = exp->hint & 0xff;
   2281       d6[1] = exp->hint >> 8;
   2282       if (exp->its_name)
   2283 	strcpy ((char*) d6 + 2, exp->its_name);
   2284       else
   2285 	strcpy ((char *) d6 + 2, exp->name);
   2286     }
   2287 
   2288   bfd_set_symtab (abfd, symtab, symptr);
   2289 
   2290   if (include_jmp_stub)
   2291     bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
   2292   bfd_set_section_contents (abfd, id7, d7, 0, 4);
   2293   bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
   2294   bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
   2295   if (!exp->flag_noname)
   2296     bfd_set_section_contents (abfd, id6, d6, 0, len);
   2297 
   2298   bfd_make_readable (abfd);
   2299   return abfd;
   2300 }
   2301 
   2302 static bfd *
   2303 make_singleton_name_imp (const char *import, bfd *parent)
   2304 {
   2305   /* Name thunks go to idata$4.  */
   2306   asection *id5;
   2307   unsigned char *d5;
   2308   char *oname;
   2309   bfd *abfd;
   2310 
   2311   oname = xmalloc (20);
   2312   sprintf (oname, "nmimp%06d.o", tmp_seq2);
   2313   tmp_seq2++;
   2314 
   2315   abfd = bfd_create (oname, parent);
   2316   bfd_find_target (pe_details->object_target, abfd);
   2317   bfd_make_writable (abfd);
   2318 
   2319   bfd_set_format (abfd, bfd_object);
   2320   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
   2321 
   2322   symptr = 0;
   2323   symtab = xmalloc (3 * sizeof (asymbol *));
   2324   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
   2325   quick_symbol (abfd, "__imp_", import, "", id5, BSF_GLOBAL, 0);
   2326 
   2327   /* We need space for the real thunk and for the null terminator.  */
   2328   bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE * 2);
   2329   d5 = xmalloc (PE_IDATA5_SIZE * 2);
   2330   id5->contents = d5;
   2331   memset (d5, 0, PE_IDATA5_SIZE * 2);
   2332   quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
   2333   save_relocs (id5);
   2334 
   2335   bfd_set_symtab (abfd, symtab, symptr);
   2336 
   2337   bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA4_SIZE * 2);
   2338 
   2339   bfd_make_readable (abfd);
   2340   return abfd;
   2341 }
   2342 
   2343 static bfd *
   2344 make_singleton_name_thunk (const char *import, bfd *parent)
   2345 {
   2346   /* Name thunks go to idata$4.  */
   2347   asection *id4;
   2348   unsigned char *d4;
   2349   char *oname;
   2350   bfd *abfd;
   2351 
   2352   oname = xmalloc (20);
   2353   sprintf (oname, "nmth%06d.o", tmp_seq);
   2354   tmp_seq++;
   2355 
   2356   abfd = bfd_create (oname, parent);
   2357   bfd_find_target (pe_details->object_target, abfd);
   2358   bfd_make_writable (abfd);
   2359 
   2360   bfd_set_format (abfd, bfd_object);
   2361   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
   2362 
   2363   symptr = 0;
   2364   symtab = xmalloc (3 * sizeof (asymbol *));
   2365   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
   2366   quick_symbol (abfd, "__nm_thnk_", import, "", id4, BSF_GLOBAL, 0);
   2367   quick_symbol (abfd, "__nm_", import, "", UNDSEC, BSF_GLOBAL, 0);
   2368 
   2369   /* We need space for the real thunk and for the null terminator.  */
   2370   bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE * 2);
   2371   d4 = xmalloc (PE_IDATA4_SIZE * 2);
   2372   id4->contents = d4;
   2373   memset (d4, 0, PE_IDATA4_SIZE * 2);
   2374   quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
   2375   save_relocs (id4);
   2376 
   2377   bfd_set_symtab (abfd, symtab, symptr);
   2378 
   2379   bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE * 2);
   2380 
   2381   bfd_make_readable (abfd);
   2382   return abfd;
   2383 }
   2384 
   2385 static char *
   2386 make_import_fixup_mark (arelent *rel)
   2387 {
   2388   /* We convert reloc to symbol, for later reference.  */
   2389   static int counter;
   2390   static char *fixup_name = NULL;
   2391   static size_t buffer_len = 0;
   2392 
   2393   struct bfd_symbol *sym = *rel->sym_ptr_ptr;
   2394 
   2395   bfd *abfd = bfd_asymbol_bfd (sym);
   2396   struct bfd_link_hash_entry *bh;
   2397 
   2398   if (!fixup_name)
   2399     {
   2400       fixup_name = xmalloc (384);
   2401       buffer_len = 384;
   2402     }
   2403 
   2404   if (strlen (sym->name) + 25 > buffer_len)
   2405   /* Assume 25 chars for "__fu" + counter + "_".  If counter is
   2406      bigger than 20 digits long, we've got worse problems than
   2407      overflowing this buffer...  */
   2408     {
   2409       free (fixup_name);
   2410       /* New buffer size is length of symbol, plus 25, but
   2411 	 then rounded up to the nearest multiple of 128.  */
   2412       buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
   2413       fixup_name = xmalloc (buffer_len);
   2414     }
   2415 
   2416   sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
   2417 
   2418   bh = NULL;
   2419   bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
   2420 				current_sec, /* sym->section, */
   2421 				rel->address, NULL, TRUE, FALSE, &bh);
   2422 
   2423   return fixup_name;
   2424 }
   2425 
   2426 /*	.section	.idata$2
   2427   	.rva		__nm_thnk_SYM (singleton thunk with name of func)
   2428  	.long		0
   2429  	.long		0
   2430  	.rva		__my_dll_iname (name of dll)
   2431  	.rva		__fuNN_SYM (pointer to reference (address) in text)  */
   2432 
   2433 static bfd *
   2434 make_import_fixup_entry (const char *name,
   2435 			 const char *fixup_name,
   2436 			 const char *symname,
   2437 			 bfd *parent)
   2438 {
   2439   asection *id2;
   2440   unsigned char *d2;
   2441   char *oname;
   2442   bfd *abfd;
   2443 
   2444   oname = xmalloc (20);
   2445   sprintf (oname, "fu%06d.o", tmp_seq);
   2446   tmp_seq++;
   2447 
   2448   abfd = bfd_create (oname, parent);
   2449   bfd_find_target (pe_details->object_target, abfd);
   2450   bfd_make_writable (abfd);
   2451 
   2452   bfd_set_format (abfd, bfd_object);
   2453   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
   2454 
   2455   symptr = 0;
   2456   symtab = xmalloc (6 * sizeof (asymbol *));
   2457   id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
   2458 
   2459   quick_symbol (abfd, "__nm_thnk_", name, "", UNDSEC, BSF_GLOBAL, 0);
   2460   quick_symbol (abfd, U (""), symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
   2461   /* For relocator v2 we have to use the .idata$5 element and not
   2462      fixup_name.  */
   2463   if (link_info.pei386_runtime_pseudo_reloc == 2)
   2464     quick_symbol (abfd, "__imp_", name, "", UNDSEC, BSF_GLOBAL, 0);
   2465   else
   2466     quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
   2467 
   2468   bfd_set_section_size (abfd, id2, 20);
   2469   d2 = xmalloc (20);
   2470   id2->contents = d2;
   2471   memset (d2, 0, 20);
   2472 
   2473   quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
   2474   quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
   2475   quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
   2476   save_relocs (id2);
   2477 
   2478   bfd_set_symtab (abfd, symtab, symptr);
   2479 
   2480   bfd_set_section_contents (abfd, id2, d2, 0, 20);
   2481 
   2482   bfd_make_readable (abfd);
   2483   return abfd;
   2484 }
   2485 
   2486 /*	.section	.rdata_runtime_pseudo_reloc
   2487  	.long		addend
   2488  	.rva		__fuNN_SYM (pointer to reference (address) in text)  */
   2489 
   2490 static bfd *
   2491 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
   2492 			   const char *fixup_name,
   2493 			   bfd_vma addend ATTRIBUTE_UNUSED,
   2494 			   bfd_vma bitsize,
   2495 			   bfd *parent)
   2496 {
   2497   asection *rt_rel;
   2498   unsigned char *rt_rel_d;
   2499   char *oname;
   2500   bfd *abfd;
   2501   oname = xmalloc (20);
   2502   sprintf (oname, "rtr%06d.o", tmp_seq);
   2503   tmp_seq++;
   2504 
   2505   abfd = bfd_create (oname, parent);
   2506   bfd_find_target (pe_details->object_target, abfd);
   2507   bfd_make_writable (abfd);
   2508 
   2509   bfd_set_format (abfd, bfd_object);
   2510   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
   2511 
   2512   symptr = 0;
   2513   if (link_info.pei386_runtime_pseudo_reloc == 2)
   2514     {
   2515       symtab = xmalloc ((runtime_pseudp_reloc_v2_init ? 3 : 6) * sizeof (asymbol *));
   2516     }
   2517   else
   2518     {
   2519       symtab = xmalloc (2 * sizeof (asymbol *));
   2520     }
   2521   rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
   2522 			  SEC_HAS_CONTENTS, 2);
   2523 
   2524   quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
   2525 
   2526   if (link_info.pei386_runtime_pseudo_reloc == 2)
   2527     {
   2528 	  size_t size = 12;
   2529 	  if (! runtime_pseudp_reloc_v2_init)
   2530 	    {
   2531 		  size += 12;
   2532 		  runtime_pseudp_reloc_v2_init = 1;
   2533 	    }
   2534       quick_symbol (abfd, "__imp_", name, "", UNDSEC, BSF_GLOBAL, 0);
   2535 
   2536       bfd_set_section_size (abfd, rt_rel, size);
   2537       rt_rel_d = xmalloc (size);
   2538       rt_rel->contents = rt_rel_d;
   2539       memset (rt_rel_d, 0, size);
   2540 	  quick_reloc (abfd, size - 8, BFD_RELOC_RVA, 1);
   2541 	  quick_reloc (abfd, size - 12, BFD_RELOC_RVA, 2);
   2542 	  bfd_put_32 (abfd, bitsize, rt_rel_d + (size - 4));
   2543 	  if (size != 12)
   2544 	    bfd_put_32 (abfd, 1, rt_rel_d + 8);
   2545       save_relocs (rt_rel);
   2546 
   2547       bfd_set_symtab (abfd, symtab, symptr);
   2548 
   2549       bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, size);
   2550    }
   2551   else
   2552    {
   2553       bfd_set_section_size (abfd, rt_rel, 8);
   2554       rt_rel_d = xmalloc (8);
   2555       rt_rel->contents = rt_rel_d;
   2556       memset (rt_rel_d, 0, 8);
   2557 
   2558       bfd_put_32 (abfd, addend, rt_rel_d);
   2559       quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
   2560 
   2561       save_relocs (rt_rel);
   2562 
   2563       bfd_set_symtab (abfd, symtab, symptr);
   2564 
   2565       bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
   2566    }
   2567   bfd_make_readable (abfd);
   2568   return abfd;
   2569 }
   2570 
   2571 /*	.section	.rdata
   2572  	.rva		__pei386_runtime_relocator  */
   2573 
   2574 static bfd *
   2575 pe_create_runtime_relocator_reference (bfd *parent)
   2576 {
   2577   asection *extern_rt_rel;
   2578   unsigned char *extern_rt_rel_d;
   2579   char *oname;
   2580   bfd *abfd;
   2581 
   2582   oname = xmalloc (20);
   2583   sprintf (oname, "ertr%06d.o", tmp_seq);
   2584   tmp_seq++;
   2585 
   2586   abfd = bfd_create (oname, parent);
   2587   bfd_find_target (pe_details->object_target, abfd);
   2588   bfd_make_writable (abfd);
   2589 
   2590   bfd_set_format (abfd, bfd_object);
   2591   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
   2592 
   2593   symptr = 0;
   2594   symtab = xmalloc (2 * sizeof (asymbol *));
   2595   extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
   2596 
   2597   quick_symbol (abfd, "", U ("_pei386_runtime_relocator"), "", UNDSEC,
   2598 		BSF_NO_FLAGS, 0);
   2599 
   2600   bfd_set_section_size (abfd, extern_rt_rel, PE_IDATA5_SIZE);
   2601   extern_rt_rel_d = xcalloc (1, PE_IDATA5_SIZE);
   2602   extern_rt_rel->contents = extern_rt_rel_d;
   2603 
   2604   quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
   2605   save_relocs (extern_rt_rel);
   2606 
   2607   bfd_set_symtab (abfd, symtab, symptr);
   2608 
   2609   bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, PE_IDATA5_SIZE);
   2610 
   2611   bfd_make_readable (abfd);
   2612   return abfd;
   2613 }
   2614 
   2615 void
   2616 pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend)
   2617 {
   2618   char buf[300];
   2619   struct bfd_symbol *sym = *rel->sym_ptr_ptr;
   2620   struct bfd_link_hash_entry *name_thunk_sym;
   2621   struct bfd_link_hash_entry *name_imp_sym;
   2622   const char *name = sym->name;
   2623   char *fixup_name = make_import_fixup_mark (rel);
   2624   bfd *b;
   2625   int need_import_table = 1;
   2626 
   2627   sprintf (buf, "__imp_%s", name);
   2628   name_imp_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
   2629 
   2630   sprintf (buf, "__nm_thnk_%s", name);
   2631 
   2632   name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
   2633 
   2634   /* For version 2 pseudo relocation we don't need to add an import
   2635      if the import symbol is already present.  */
   2636   if (link_info.pei386_runtime_pseudo_reloc == 2
   2637       && name_imp_sym
   2638       && name_imp_sym->type == bfd_link_hash_defined)
   2639     need_import_table = 0;
   2640 
   2641   if (need_import_table == 1
   2642       && (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined))
   2643     {
   2644       b = make_singleton_name_thunk (name, link_info.output_bfd);
   2645       add_bfd_to_link (b, b->filename, &link_info);
   2646 
   2647       /* If we ever use autoimport, we have to cast text section writable.
   2648          But not for version 2.  */
   2649       if (link_info.pei386_runtime_pseudo_reloc != 2)
   2650         {
   2651           config.text_read_only = FALSE;
   2652           link_info.output_bfd->flags &= ~WP_TEXT;
   2653         }
   2654       if (link_info.pei386_runtime_pseudo_reloc == 2)
   2655         {
   2656 	  b = make_singleton_name_imp (name, link_info.output_bfd);
   2657           add_bfd_to_link (b, b->filename, &link_info);
   2658 	}
   2659     }
   2660 
   2661   if ((addend == 0 || link_info.pei386_runtime_pseudo_reloc)
   2662       && need_import_table == 1)
   2663     {
   2664       extern char * pe_data_import_dll;
   2665       char * symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
   2666 
   2667       b = make_import_fixup_entry (name, fixup_name, symname,
   2668 				   link_info.output_bfd);
   2669       add_bfd_to_link (b, b->filename, &link_info);
   2670     }
   2671 
   2672     if ((link_info.pei386_runtime_pseudo_reloc != 0 && addend != 0)
   2673         || link_info.pei386_runtime_pseudo_reloc == 2)
   2674       {
   2675 	if (pe_dll_extra_pe_debug)
   2676 	  printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
   2677 	          fixup_name, (int) addend);
   2678 
   2679 	b = make_runtime_pseudo_reloc (name, fixup_name, addend, rel->howto->bitsize,
   2680 				       link_info.output_bfd);
   2681 	add_bfd_to_link (b, b->filename, &link_info);
   2682 
   2683 	if (runtime_pseudo_relocs_created == 0)
   2684 	  {
   2685 	    b = pe_create_runtime_relocator_reference (link_info.output_bfd);
   2686 	    add_bfd_to_link (b, b->filename, &link_info);
   2687 	  }
   2688 	runtime_pseudo_relocs_created++;
   2689       }
   2690     else if (addend != 0)
   2691       {
   2692 	einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
   2693 	       s->owner, s, rel->address, sym->name);
   2694 	einfo ("%X");
   2695       }
   2696 }
   2697 
   2698 
   2699 void
   2700 pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_info *info)
   2701 {
   2702   int i;
   2703   bfd *ar_head;
   2704   bfd *ar_tail;
   2705   bfd *outarch;
   2706   bfd *ibfd;
   2707   bfd *head = 0;
   2708 
   2709   dll_filename = (def->name) ? def->name : dll_name;
   2710   dll_symname = xstrdup (dll_filename);
   2711   for (i = 0; dll_symname[i]; i++)
   2712     if (!ISALNUM (dll_symname[i]))
   2713       dll_symname[i] = '_';
   2714 
   2715   unlink_if_ordinary (impfilename);
   2716 
   2717   outarch = bfd_openw (impfilename, 0);
   2718 
   2719   if (!outarch)
   2720     {
   2721       /* xgettext:c-format */
   2722       einfo (_("%XCan't open .lib file: %s\n"), impfilename);
   2723       return;
   2724     }
   2725 
   2726   if (verbose)
   2727     /* xgettext:c-format */
   2728     info_msg (_("Creating library file: %s\n"), impfilename);
   2729 
   2730   bfd_set_format (outarch, bfd_archive);
   2731   outarch->has_armap = 1;
   2732 
   2733   /* Work out a reasonable size of things to put onto one line.  */
   2734   ar_head = make_head (outarch);
   2735 
   2736   /* Iterate the input BFDs, looking for exclude-modules-for-implib.  */
   2737   for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
   2738     {
   2739       /* Iterate the exclude list.  */
   2740       struct exclude_list_struct *ex;
   2741       char found;
   2742       for (ex = excludes, found = 0; ex && !found; ex = ex->next)
   2743 	{
   2744 	  if (ex->type != EXCLUDEFORIMPLIB)
   2745 	    continue;
   2746 	  found = (filename_cmp (ex->string, ibfd->filename) == 0);
   2747 	}
   2748       /* If it matched, we must open a fresh BFD for it (the original
   2749         input BFD is still needed for the DLL's final link) and add
   2750 	it into the archive member chain.  */
   2751       if (found)
   2752 	{
   2753 	  bfd *newbfd = bfd_openr (ibfd->my_archive
   2754 		? ibfd->my_archive->filename : ibfd->filename, NULL);
   2755 	  if (!newbfd)
   2756 	    {
   2757 	      einfo (_("%Xbfd_openr %s: %E\n"), ibfd->filename);
   2758 	      return;
   2759 	    }
   2760 	  if (ibfd->my_archive)
   2761 	    {
   2762 	      /* Must now iterate through archive until we find the
   2763 		required member.  A minor shame that we'll open the
   2764 		archive once per member that we require from it, and
   2765 		leak those archive bfds rather than reuse them.  */
   2766 	      bfd *arbfd = newbfd;
   2767 	      if (!bfd_check_format_matches (arbfd, bfd_archive, NULL))
   2768 		{
   2769 		  einfo (_("%X%s(%s): can't find member in non-archive file"),
   2770 		    ibfd->my_archive->filename, ibfd->filename);
   2771 		  return;
   2772 		}
   2773 	      newbfd = NULL;
   2774 	      while ((newbfd = bfd_openr_next_archived_file (arbfd, newbfd)) != 0)
   2775 		{
   2776 		  if (filename_cmp (newbfd->filename, ibfd->filename) == 0)
   2777 		    break;
   2778 		}
   2779 	      if (!newbfd)
   2780 		{
   2781 		  einfo (_("%X%s(%s): can't find member in archive"),
   2782 		    ibfd->my_archive->filename, ibfd->filename);
   2783 		  return;
   2784 		}
   2785 	    }
   2786 	  newbfd->archive_next = head;
   2787 	  head = newbfd;
   2788 	}
   2789     }
   2790 
   2791   for (i = 0; i < def->num_exports; i++)
   2792     {
   2793       /* The import library doesn't know about the internal name.  */
   2794       char *internal = def->exports[i].internal_name;
   2795       bfd *n;
   2796 
   2797       /* Don't add PRIVATE entries to import lib.  */
   2798       if (pe_def_file->exports[i].flag_private)
   2799 	continue;
   2800 
   2801       def->exports[i].internal_name = def->exports[i].name;
   2802 
   2803       /* PR 19803: If a symbol has been discard due to garbage
   2804 	 collection then do not create any exports for it.  */
   2805       {
   2806 	struct coff_link_hash_entry *h;
   2807 
   2808 	h = coff_link_hash_lookup (coff_hash_table (info), internal,
   2809 				   FALSE, FALSE, FALSE);
   2810 	if (h != NULL
   2811 	    /* If the symbol is hidden and undefined then it
   2812 	       has been swept up by garbage collection.  */
   2813 	    && h->symbol_class == C_HIDDEN
   2814 	    && h->root.u.def.section == bfd_und_section_ptr)
   2815 	  continue;
   2816 
   2817 	/* If necessary, check with an underscore prefix as well.  */
   2818 	if (pe_details->underscored && internal[0] != '@')
   2819 	  {
   2820 	    char *name;
   2821 
   2822 	    name = xmalloc (strlen (internal) + 2);
   2823 	    sprintf (name, "_%s", internal);
   2824 
   2825 	    h = coff_link_hash_lookup (coff_hash_table (info), name,
   2826 				       FALSE, FALSE, FALSE);
   2827 	    free (name);
   2828 
   2829 	    if (h != NULL
   2830 		/* If the symbol is hidden and undefined then it
   2831 		   has been swept up by garbage collection.  */
   2832 		&& h->symbol_class == C_HIDDEN
   2833 		&& h->root.u.def.section == bfd_und_section_ptr)
   2834 	      continue;
   2835 	  }
   2836       }
   2837 
   2838       n = make_one (def->exports + i, outarch,
   2839 		    ! (def->exports + i)->flag_data);
   2840       n->archive_next = head;
   2841       head = n;
   2842       def->exports[i].internal_name = internal;
   2843     }
   2844 
   2845   ar_tail = make_tail (outarch);
   2846 
   2847   if (ar_head == NULL || ar_tail == NULL)
   2848     return;
   2849 
   2850   /* Now stick them all into the archive.  */
   2851   ar_head->archive_next = head;
   2852   ar_tail->archive_next = ar_head;
   2853   head = ar_tail;
   2854 
   2855   if (! bfd_set_archive_head (outarch, head))
   2856     einfo ("%Xbfd_set_archive_head: %E\n");
   2857 
   2858   if (! bfd_close (outarch))
   2859     einfo ("%Xbfd_close %s: %E\n", impfilename);
   2860 
   2861   while (head != NULL)
   2862     {
   2863       bfd *n = head->archive_next;
   2864       bfd_close (head);
   2865       head = n;
   2866     }
   2867 }
   2868 
   2869 static int undef_count = 0;
   2870 
   2871 struct key_value
   2872 {
   2873   char *key;
   2874   const char *oname;
   2875 };
   2876 
   2877 static struct key_value *udef_table;
   2878 
   2879 static int undef_sort_cmp (const void *l1, const void *r1)
   2880 {
   2881   const struct key_value *l = l1;
   2882   const struct key_value *r = r1;
   2883 
   2884   return strcmp (l->key, r->key);
   2885 }
   2886 
   2887 static struct bfd_link_hash_entry *
   2888 pe_find_cdecl_alias_match (struct bfd_link_info *linfo, char *name)
   2889 {
   2890   struct bfd_link_hash_entry *h = NULL;
   2891   struct key_value *kv;
   2892   struct key_value key;
   2893   char *at, *lname = xmalloc (strlen (name) + 3);
   2894 
   2895   strcpy (lname, name);
   2896 
   2897   at = strchr (lname + (lname[0] == '@'), '@');
   2898   if (at)
   2899     at[1] = 0;
   2900 
   2901   key.key = lname;
   2902   kv = bsearch (&key, udef_table, undef_count, sizeof (struct key_value),
   2903 		undef_sort_cmp);
   2904 
   2905   if (kv)
   2906     {
   2907       h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
   2908       if (h->type == bfd_link_hash_undefined)
   2909         goto return_h;
   2910     }
   2911 
   2912   if (lname[0] == '?')
   2913     goto return_NULL;
   2914 
   2915   if (at || lname[0] == '@')
   2916     {
   2917       if (lname[0] == '@')
   2918         {
   2919 	  if (pe_details->underscored)
   2920 	    lname[0] = '_';
   2921 	  else
   2922 	    strcpy (lname, lname + 1);
   2923 	  key.key = lname;
   2924 	  kv = bsearch (&key, udef_table, undef_count,
   2925 			sizeof (struct key_value), undef_sort_cmp);
   2926 	  if (kv)
   2927 	    {
   2928 	      h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
   2929 	      if (h->type == bfd_link_hash_undefined)
   2930 		goto return_h;
   2931 	    }
   2932 	}
   2933       if (at)
   2934         *strchr (lname, '@') = 0;
   2935       key.key = lname;
   2936       kv = bsearch (&key, udef_table, undef_count,
   2937 		    sizeof (struct key_value), undef_sort_cmp);
   2938       if (kv)
   2939 	{
   2940 	  h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
   2941 	  if (h->type == bfd_link_hash_undefined)
   2942 	    goto return_h;
   2943 	}
   2944       goto return_NULL;
   2945     }
   2946 
   2947   strcat (lname, "@");
   2948   key.key = lname;
   2949   kv = bsearch (&key, udef_table, undef_count,
   2950 		sizeof (struct key_value), undef_sort_cmp);
   2951 
   2952   if (kv)
   2953     {
   2954       h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
   2955       if (h->type == bfd_link_hash_undefined)
   2956 	goto return_h;
   2957     }
   2958 
   2959   if (lname[0] == '_' && pe_details->underscored)
   2960     lname[0] = '@';
   2961   else
   2962     {
   2963       memmove (lname + 1, lname, strlen (lname) + 1);
   2964       lname[0] = '@';
   2965     }
   2966   key.key = lname;
   2967 
   2968   kv = bsearch (&key, udef_table, undef_count,
   2969 		sizeof (struct key_value), undef_sort_cmp);
   2970 
   2971   if (kv)
   2972     {
   2973       h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
   2974       if (h->type == bfd_link_hash_undefined)
   2975         goto return_h;
   2976     }
   2977 
   2978  return_NULL:
   2979   h = NULL;
   2980  return_h:
   2981   free (lname);
   2982   return h;
   2983 }
   2984 
   2985 static bfd_boolean
   2986 pe_undef_count (struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED,
   2987                 void *inf ATTRIBUTE_UNUSED)
   2988 {
   2989   if (h->type == bfd_link_hash_undefined)
   2990     undef_count++;
   2991   return TRUE;
   2992 }
   2993 
   2994 static bfd_boolean
   2995 pe_undef_fill (struct bfd_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
   2996 {
   2997   if (h->type == bfd_link_hash_undefined)
   2998     {
   2999       char *at;
   3000 
   3001       udef_table[undef_count].key = xstrdup (h->root.string);
   3002       at = strchr (udef_table[undef_count].key
   3003 		   + (udef_table[undef_count].key[0] == '@'), '@');
   3004       if (at)
   3005         at[1] = 0;
   3006       udef_table[undef_count].oname = h->root.string;
   3007       undef_count++;
   3008     }
   3009   return TRUE;
   3010 }
   3011 
   3012 static void
   3013 pe_create_undef_table (void)
   3014 {
   3015   undef_count = 0;
   3016 
   3017   /* count undefined symbols */
   3018 
   3019   bfd_link_hash_traverse (link_info.hash, pe_undef_count, "");
   3020 
   3021   /* create and fill the corresponding table */
   3022   udef_table = xmalloc (undef_count * sizeof (struct key_value));
   3023 
   3024   undef_count = 0;
   3025   bfd_link_hash_traverse (link_info.hash, pe_undef_fill, "");
   3026 
   3027   /* sort items */
   3028   qsort (udef_table, undef_count, sizeof (struct key_value), undef_sort_cmp);
   3029 }
   3030 
   3031 static void
   3032 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *linfo)
   3033 {
   3034   lang_input_statement_type *fake_file;
   3035 
   3036   fake_file = lang_add_input_file (name,
   3037 				   lang_input_file_is_fake_enum,
   3038 				   NULL);
   3039   fake_file->the_bfd = abfd;
   3040   ldlang_add_file (fake_file);
   3041 
   3042   if (!bfd_link_add_symbols (abfd, linfo))
   3043     einfo ("%Xaddsym %s: %E\n", name);
   3044 }
   3045 
   3046 void
   3047 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *linfo)
   3048 {
   3049   int i, j;
   3050   def_file_module *module;
   3051   def_file_import *imp;
   3052 
   3053   pe_dll_id_target (bfd_get_target (output_bfd));
   3054 
   3055   if (!pe_def_file)
   3056     return;
   3057 
   3058   imp = pe_def_file->imports;
   3059 
   3060   pe_create_undef_table ();
   3061 
   3062   for (module = pe_def_file->modules; module; module = module->next)
   3063     {
   3064       int do_this_dll = 0;
   3065 
   3066       for (i = 0; i < pe_def_file->num_imports && imp[i].module != module; i++)
   3067 	;
   3068       if (i >= pe_def_file->num_imports)
   3069         continue;
   3070 
   3071       dll_filename = module->name;
   3072       dll_symname = xstrdup (module->name);
   3073       for (j = 0; dll_symname[j]; j++)
   3074 	if (!ISALNUM (dll_symname[j]))
   3075 	  dll_symname[j] = '_';
   3076 
   3077       for (; i < pe_def_file->num_imports && imp[i].module == module; i++)
   3078 	{
   3079 	  def_file_export exp;
   3080 	  struct bfd_link_hash_entry *blhe;
   3081 	  int lead_at = (*imp[i].internal_name == '@');
   3082 	  /* See if we need this import.  */
   3083 	  size_t len = strlen (imp[i].internal_name);
   3084 	  char *name = xmalloc (len + 2 + 6);
   3085 	  bfd_boolean include_jmp_stub = FALSE;
   3086 	  bfd_boolean is_cdecl = FALSE;
   3087 	  bfd_boolean is_undef = FALSE;
   3088 
   3089 	  if (!lead_at && strchr (imp[i].internal_name, '@') == NULL)
   3090 	      is_cdecl = TRUE;
   3091 
   3092 	  if (lead_at)
   3093 	    sprintf (name, "%s", imp[i].internal_name);
   3094 	  else
   3095 	    sprintf (name, "%s%s",U (""), imp[i].internal_name);
   3096 
   3097 	  blhe = bfd_link_hash_lookup (linfo->hash, name,
   3098 				       FALSE, FALSE, FALSE);
   3099 
   3100 	  /* Include the jump stub for <sym> only if the <sym>
   3101 	     is undefined.  */
   3102 	  if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
   3103 	    {
   3104 	      if (lead_at)
   3105 		sprintf (name, "%s%s", "__imp_", imp[i].internal_name);
   3106 	      else
   3107 		sprintf (name, "%s%s%s", "__imp_", U (""),
   3108 			 imp[i].internal_name);
   3109 
   3110 	      blhe = bfd_link_hash_lookup (linfo->hash, name,
   3111 					   FALSE, FALSE, FALSE);
   3112 	      if (blhe)
   3113 	        is_undef = (blhe->type == bfd_link_hash_undefined);
   3114 	    }
   3115 	  else
   3116 	    {
   3117 	      include_jmp_stub = TRUE;
   3118 	      is_undef = (blhe->type == bfd_link_hash_undefined);
   3119 	    }
   3120 
   3121 	  if (is_cdecl && (!blhe || (blhe && blhe->type != bfd_link_hash_undefined)))
   3122 	    {
   3123 	      sprintf (name, "%s%s",U (""), imp[i].internal_name);
   3124 	      blhe = pe_find_cdecl_alias_match (linfo, name);
   3125 	      include_jmp_stub = TRUE;
   3126 	      if (blhe)
   3127 	        is_undef = (blhe->type == bfd_link_hash_undefined);
   3128 	    }
   3129 
   3130 	  free (name);
   3131 
   3132 	  if (is_undef)
   3133 	    {
   3134 	      bfd *one;
   3135 	      /* We do.  */
   3136 	      if (!do_this_dll)
   3137 		{
   3138 		  bfd *ar_head = make_head (output_bfd);
   3139 		  add_bfd_to_link (ar_head, ar_head->filename, linfo);
   3140 		  do_this_dll = 1;
   3141 		}
   3142 	      exp.internal_name = imp[i].internal_name;
   3143 	      exp.name = imp[i].name;
   3144 	      exp.its_name = imp[i].its_name;
   3145 	      exp.ordinal = imp[i].ordinal;
   3146 	      exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
   3147 	      exp.flag_private = 0;
   3148 	      exp.flag_constant = 0;
   3149 	      exp.flag_data = imp[i].data;
   3150 	      exp.flag_noname = exp.name ? 0 : 1;
   3151 	      one = make_one (&exp, output_bfd, (! exp.flag_data) && include_jmp_stub);
   3152 	      add_bfd_to_link (one, one->filename, linfo);
   3153 	    }
   3154 	}
   3155       if (do_this_dll)
   3156 	{
   3157 	  bfd *ar_tail = make_tail (output_bfd);
   3158 	  add_bfd_to_link (ar_tail, ar_tail->filename, linfo);
   3159 	}
   3160 
   3161       free (dll_symname);
   3162     }
   3163 
   3164   while (undef_count)
   3165     {
   3166       --undef_count;
   3167       free (udef_table[undef_count].key);
   3168     }
   3169   free (udef_table);
   3170 }
   3171 
   3172 /* We were handed a *.DLL file.  Parse it and turn it into a set of
   3173    IMPORTS directives in the def file.  Return TRUE if the file was
   3174    handled, FALSE if not.  */
   3175 
   3176 static unsigned int
   3177 pe_get16 (bfd *abfd, int where)
   3178 {
   3179   unsigned char b[2];
   3180 
   3181   bfd_seek (abfd, (file_ptr) where, SEEK_SET);
   3182   bfd_bread (b, (bfd_size_type) 2, abfd);
   3183   return b[0] + (b[1] << 8);
   3184 }
   3185 
   3186 static unsigned int
   3187 pe_get32 (bfd *abfd, int where)
   3188 {
   3189   unsigned char b[4];
   3190 
   3191   bfd_seek (abfd, (file_ptr) where, SEEK_SET);
   3192   bfd_bread (b, (bfd_size_type) 4, abfd);
   3193   return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
   3194 }
   3195 
   3196 static unsigned int
   3197 pe_as32 (void *ptr)
   3198 {
   3199   unsigned char *b = ptr;
   3200 
   3201   return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
   3202 }
   3203 
   3204 bfd_boolean
   3205 pe_implied_import_dll (const char *filename)
   3206 {
   3207   bfd *dll;
   3208   bfd_vma pe_header_offset, opthdr_ofs, num_entries, i;
   3209   bfd_vma export_rva, export_size, nsections, secptr, expptr;
   3210   bfd_vma exp_funcbase;
   3211   unsigned char *expdata;
   3212   char *erva;
   3213   bfd_vma name_rvas, nexp;
   3214   const char *dllname;
   3215   /* Initialization with start > end guarantees that is_data
   3216      will not be set by mistake, and avoids compiler warning.  */
   3217   bfd_vma data_start = 1;
   3218   bfd_vma data_end = 0;
   3219   bfd_vma rdata_start = 1;
   3220   bfd_vma rdata_end = 0;
   3221   bfd_vma bss_start = 1;
   3222   bfd_vma bss_end = 0;
   3223 
   3224   /* No, I can't use bfd here.  kernel32.dll puts its export table in
   3225      the middle of the .rdata section.  */
   3226   dll = bfd_openr (filename, pe_details->target_name);
   3227   if (!dll)
   3228     {
   3229       einfo ("%Xopen %s: %E\n", filename);
   3230       return FALSE;
   3231     }
   3232 
   3233   /* PEI dlls seem to be bfd_objects.  */
   3234   if (!bfd_check_format (dll, bfd_object))
   3235     {
   3236       einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
   3237       return FALSE;
   3238     }
   3239 
   3240   /* Get pe_header, optional header and numbers of directory entries.  */
   3241   pe_header_offset = pe_get32 (dll, 0x3c);
   3242   opthdr_ofs = pe_header_offset + 4 + 20;
   3243 #ifdef pe_use_x86_64
   3244   num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /*  & NumberOfRvaAndSizes.  */
   3245 #else
   3246   num_entries = pe_get32 (dll, opthdr_ofs + 92);
   3247 #endif
   3248 
   3249   /* No import or export directory entry.  */
   3250   if (num_entries < 1)
   3251     return FALSE;
   3252 
   3253 #ifdef pe_use_x86_64
   3254   export_rva  = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
   3255   export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
   3256 #else
   3257   export_rva = pe_get32 (dll, opthdr_ofs + 96);
   3258   export_size = pe_get32 (dll, opthdr_ofs + 100);
   3259 #endif
   3260 
   3261   /* No export table - nothing to export.  */
   3262   if (export_size == 0)
   3263     return FALSE;
   3264 
   3265   nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
   3266   secptr = (pe_header_offset + 4 + 20 +
   3267 	    pe_get16 (dll, pe_header_offset + 4 + 16));
   3268   expptr = 0;
   3269 
   3270   /* Get the rva and size of the export section.  */
   3271   for (i = 0; i < nsections; i++)
   3272     {
   3273       char sname[8];
   3274       bfd_vma secptr1 = secptr + 40 * i;
   3275       bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
   3276       bfd_vma vsize = pe_get32 (dll, secptr1 + 16);
   3277       bfd_vma fptr = pe_get32 (dll, secptr1 + 20);
   3278 
   3279       bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
   3280       bfd_bread (sname, (bfd_size_type) 8, dll);
   3281 
   3282       if (vaddr <= export_rva && vaddr + vsize > export_rva)
   3283 	{
   3284 	  expptr = fptr + (export_rva - vaddr);
   3285 	  if (export_rva + export_size > vaddr + vsize)
   3286 	    export_size = vsize - (export_rva - vaddr);
   3287 	  break;
   3288 	}
   3289     }
   3290 
   3291   /* Scan sections and store the base and size of the
   3292      data and bss segments in data/base_start/end.  */
   3293   for (i = 0; i < nsections; i++)
   3294     {
   3295       bfd_vma secptr1 = secptr + 40 * i;
   3296       bfd_vma vsize = pe_get32 (dll, secptr1 + 8);
   3297       bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
   3298       bfd_vma flags = pe_get32 (dll, secptr1 + 36);
   3299       char sec_name[9];
   3300 
   3301       sec_name[8] = '\0';
   3302       bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
   3303       bfd_bread (sec_name, (bfd_size_type) 8, dll);
   3304 
   3305       if (strcmp(sec_name,".data") == 0)
   3306 	{
   3307 	  data_start = vaddr;
   3308 	  data_end = vaddr + vsize;
   3309 
   3310 	  if (pe_dll_extra_pe_debug)
   3311 	    printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
   3312 		    __FUNCTION__, sec_name, (unsigned long) vaddr,
   3313 		    (unsigned long) (vaddr + vsize), (unsigned long) flags);
   3314 	}
   3315       else if (strcmp(sec_name,".rdata") == 0)
   3316 	{
   3317 	  rdata_start = vaddr;
   3318 	  rdata_end = vaddr + vsize;
   3319 
   3320 	  if (pe_dll_extra_pe_debug)
   3321 	    printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
   3322 		    __FUNCTION__, sec_name, (unsigned long) vaddr,
   3323 		    (unsigned long) (vaddr + vsize), (unsigned long) flags);
   3324 	}
   3325       else if (strcmp (sec_name,".bss") == 0)
   3326 	{
   3327 	  bss_start = vaddr;
   3328 	  bss_end = vaddr + vsize;
   3329 
   3330 	  if (pe_dll_extra_pe_debug)
   3331 	    printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
   3332 		    __FUNCTION__, sec_name, (unsigned long) vaddr,
   3333 		    (unsigned long) (vaddr + vsize), (unsigned long) flags);
   3334 	}
   3335     }
   3336 
   3337   expdata = xmalloc (export_size);
   3338   bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
   3339   bfd_bread (expdata, (bfd_size_type) export_size, dll);
   3340   erva = (char *) expdata - export_rva;
   3341 
   3342   if (pe_def_file == 0)
   3343     pe_def_file = def_file_empty ();
   3344 
   3345   nexp = pe_as32 (expdata + 24);
   3346   name_rvas = pe_as32 (expdata + 32);
   3347   exp_funcbase = pe_as32 (expdata + 28);
   3348 
   3349   /* Use internal dll name instead of filename
   3350      to enable symbolic dll linking.  */
   3351   dllname = erva + pe_as32 (expdata + 12);
   3352 
   3353   /* Check to see if the dll has already been added to
   3354      the definition list and if so return without error.
   3355      This avoids multiple symbol definitions.  */
   3356   if (def_get_module (pe_def_file, dllname))
   3357     {
   3358       if (pe_dll_extra_pe_debug)
   3359 	printf ("%s is already loaded\n", dllname);
   3360       return TRUE;
   3361     }
   3362 
   3363   /* Iterate through the list of symbols.  */
   3364   for (i = 0; i < nexp; i++)
   3365     {
   3366       /* Pointer to the names vector.  */
   3367       bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
   3368       def_file_import *imp;
   3369       /* Pointer to the function address vector.  */
   3370       bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
   3371       int is_data = 0;
   3372 
   3373       /* Skip unwanted symbols, which are
   3374 	 exported in buggy auto-import releases.  */
   3375       if (! CONST_STRNEQ (erva + name_rva, "__nm_"))
   3376  	{
   3377 	  int is_dup = 0;
   3378  	  /* is_data is true if the address is in the data, rdata or bss
   3379 	     segment.  */
   3380  	  is_data =
   3381 	    (func_rva >= data_start && func_rva < data_end)
   3382 	    || (func_rva >= rdata_start && func_rva < rdata_end)
   3383 	    || (func_rva >= bss_start && func_rva < bss_end);
   3384 
   3385 	  imp = def_file_add_import (pe_def_file, erva + name_rva,
   3386 				     dllname, i, NULL, NULL, &is_dup);
   3387  	  /* Mark symbol type.  */
   3388  	  if (!is_dup)
   3389  	    imp->data = is_data;
   3390 
   3391  	  if (pe_dll_extra_pe_debug)
   3392 	    printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
   3393 		    __FUNCTION__, dllname, erva + name_rva,
   3394 		    (unsigned long) func_rva, is_data ? "(data)" : "");
   3395  	}
   3396     }
   3397 
   3398   return TRUE;
   3399 }
   3400 
   3401 void
   3402 pe_output_file_set_long_section_names (bfd *abfd)
   3403 {
   3404   if (pe_use_coff_long_section_names < 0)
   3405     return;
   3406   if (!bfd_coff_set_long_section_names (abfd, pe_use_coff_long_section_names))
   3407     einfo (_("%XError: can't use long section names on this arch\n"));
   3408 }
   3409 
   3410 /* These are the main functions, called from the emulation.  The first
   3411    is called after the bfds are read, so we can guess at how much space
   3412    we need.  The second is called after everything is placed, so we
   3413    can put the right values in place.  */
   3414 
   3415 void
   3416 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
   3417 {
   3418   pe_dll_id_target (bfd_get_target (abfd));
   3419   pe_output_file_set_long_section_names (abfd);
   3420   process_def_file_and_drectve (abfd, info);
   3421 
   3422   if (pe_def_file->num_exports == 0 && !bfd_link_pic (info))
   3423     return;
   3424 
   3425   generate_edata (abfd, info);
   3426   build_filler_bfd (1);
   3427   pe_output_file_set_long_section_names (filler_bfd);
   3428 }
   3429 
   3430 void
   3431 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
   3432 {
   3433   pe_dll_id_target (bfd_get_target (abfd));
   3434   pe_output_file_set_long_section_names (abfd);
   3435   build_filler_bfd (0);
   3436   pe_output_file_set_long_section_names (filler_bfd);
   3437 }
   3438 
   3439 void
   3440 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
   3441 {
   3442   pe_dll_id_target (bfd_get_target (abfd));
   3443   pe_output_file_set_long_section_names (abfd);
   3444   image_base = pe_data (abfd)->pe_opthdr.ImageBase;
   3445 
   3446   generate_reloc (abfd, info);
   3447   if (reloc_sz > 0)
   3448     {
   3449       bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
   3450 
   3451       /* Resize the sections.  */
   3452       lang_reset_memory_regions ();
   3453       lang_size_sections (NULL, TRUE);
   3454 
   3455       /* Redo special stuff.  */
   3456       ldemul_after_allocation ();
   3457 
   3458       /* Do the assignments again.  */
   3459       lang_do_assignments (lang_final_phase_enum);
   3460     }
   3461 
   3462   fill_edata (abfd, info);
   3463 
   3464   if (bfd_link_dll (info))
   3465     pe_data (abfd)->dll = 1;
   3466 
   3467   edata_s->contents = edata_d;
   3468   reloc_s->contents = reloc_d;
   3469 }
   3470 
   3471 void
   3472 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
   3473 {
   3474   pe_dll_id_target (bfd_get_target (abfd));
   3475   pe_output_file_set_long_section_names (abfd);
   3476   image_base = pe_data (abfd)->pe_opthdr.ImageBase;
   3477 
   3478   generate_reloc (abfd, info);
   3479   if (reloc_sz > 0)
   3480     {
   3481       bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
   3482 
   3483       /* Resize the sections.  */
   3484       lang_reset_memory_regions ();
   3485       lang_size_sections (NULL, TRUE);
   3486 
   3487       /* Redo special stuff.  */
   3488       ldemul_after_allocation ();
   3489 
   3490       /* Do the assignments again.  */
   3491       lang_do_assignments (lang_final_phase_enum);
   3492     }
   3493   reloc_s->contents = reloc_d;
   3494 }
   3495 
   3496 bfd_boolean
   3497 pe_bfd_is_dll (bfd *abfd)
   3498 {
   3499   return (bfd_get_format (abfd) == bfd_object
   3500           && obj_pe (abfd)
   3501           && pe_data (abfd)->dll);
   3502 }
   3503