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