* emulparams/elf_x86_64.sh (LIBPATH_SUFFIX, ELF_INTERPRETER_NAME): Set for *-*-solaris2*.
[platform/upstream/binutils.git] / ld / pe-dll.c
1 /* Routines to help build PEI-format DLLs (Win32 etc)
2    Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
3    Free Software Foundation, Inc.
4    Written by DJ Delorie <dj@cygnus.com>
5
6    This file is part of GLD, the Gnu Linker.
7
8    GLD is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2, or (at your option)
11    any later version.
12
13    GLD is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with GLD; see the file COPYING.  If not, write to the Free
20    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21    02110-1301, USA.  */
22
23 #include "bfd.h"
24 #include "sysdep.h"
25 #include "bfdlink.h"
26 #include "libiberty.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 #include "pe-dll.h"
44
45 /*  This file turns a regular Windows PE image into a DLL.  Because of
46     the complexity of this operation, it has been broken down into a
47     number of separate modules which are all called by the main function
48     at the end of this file.  This function is not re-entrant and is
49     normally only called once, so static variables are used to reduce
50     the number of parameters and return values required.
51
52     See also: ld/emultempl/pe.em.  */
53
54 /*  Auto-import feature by Paul Sokolovsky
55
56     Quick facts:
57
58     1. With this feature on, DLL clients can import variables from DLL
59     without any concern from their side (for example, without any source
60     code modifications).
61
62     2. This is done completely in bounds of the PE specification (to be fair,
63     there's a place where it pokes nose out of, but in practice it works).
64     So, resulting module can be used with any other PE compiler/linker.
65
66     3. Auto-import is fully compatible with standard import method and they
67     can be mixed together.
68
69     4. Overheads: space: 8 bytes per imported symbol, plus 20 for each
70     reference to it; load time: negligible; virtual/physical memory: should be
71     less than effect of DLL relocation, and I sincerely hope it doesn't affect
72     DLL sharability (too much).
73
74     Idea
75
76     The obvious and only way to get rid of dllimport insanity is to make client
77     access variable directly in the DLL, bypassing extra dereference. I.e.,
78     whenever client contains something like
79
80     mov dll_var,%eax,
81
82     address of dll_var in the command should be relocated to point into loaded
83     DLL. The aim is to make OS loader do so, and than make ld help with that.
84     Import section of PE made following way: there's a vector of structures
85     each describing imports from particular DLL. Each such structure points
86     to two other parallel vectors: one holding imported names, and one which
87     will hold address of corresponding imported name. So, the solution is
88     de-vectorize these structures, making import locations be sparse and
89     pointing directly into code. Before continuing, it is worth a note that,
90     while authors strives to make PE act ELF-like, there're some other people
91     make ELF act PE-like: elfvector, ;-) .
92
93     Implementation
94
95     For each reference of data symbol to be imported from DLL (to set of which
96     belong symbols with name <sym>, if __imp_<sym> is found in implib), the
97     import fixup entry is generated. That entry is of type
98     IMAGE_IMPORT_DESCRIPTOR and stored in .idata$2 subsection. Each
99     fixup entry contains pointer to symbol's address within .text section
100     (marked with __fuN_<sym> symbol, where N is integer), pointer to DLL name
101     (so, DLL name is referenced by multiple entries), and pointer to symbol
102     name thunk. Symbol name thunk is singleton vector (__nm_th_<symbol>)
103     pointing to IMAGE_IMPORT_BY_NAME structure (__nm_<symbol>) directly
104     containing imported name. Here comes that "om the edge" problem mentioned
105     above: PE specification rambles that name vector (OriginalFirstThunk)
106     should run in parallel with addresses vector (FirstThunk), i.e. that they
107     should have same number of elements and terminated with zero. We violate
108     this, since FirstThunk points directly into machine code. But in practice,
109     OS loader implemented the sane way: it goes thru OriginalFirstThunk and
110     puts addresses to FirstThunk, not something else. It once again should be
111     noted that dll and symbol name structures are reused across fixup entries
112     and should be there anyway to support standard import stuff, so sustained
113     overhead is 20 bytes per reference. Other question is whether having several
114     IMAGE_IMPORT_DESCRIPTORS for the same DLL is possible. Answer is yes, it is
115     done even by native compiler/linker (libth32's functions are in fact reside
116     in windows9x kernel32.dll, so if you use it, you have two
117     IMAGE_IMPORT_DESCRIPTORS for kernel32.dll). Yet other question is whether
118     referencing the same PE structures several times is valid. The answer is why
119     not, prohibiting that (detecting violation) would require more work on
120     behalf of loader than not doing it.
121
122     See also: ld/emultempl/pe.em.  */
123
124 static void add_bfd_to_link (bfd *, const char *, struct bfd_link_info *);
125
126 /* For emultempl/pe.em.  */
127
128 def_file * pe_def_file = 0;
129 int pe_dll_export_everything = 0;
130 int pe_dll_do_default_excludes = 1;
131 int pe_dll_kill_ats = 0;
132 int pe_dll_stdcall_aliases = 0;
133 int pe_dll_warn_dup_exports = 0;
134 int pe_dll_compat_implib = 0;
135 int pe_dll_extra_pe_debug = 0;
136
137 /* Static variables and types.  */
138
139 static bfd_vma image_base;
140 static bfd *filler_bfd;
141 static struct bfd_section *edata_s, *reloc_s;
142 static unsigned char *edata_d, *reloc_d;
143 static size_t edata_sz, reloc_sz;
144 static int runtime_pseudo_relocs_created = 0;
145
146 typedef struct
147 {
148   char *name;
149   int len;
150 }
151 autofilter_entry_type;
152
153 typedef struct
154 {
155   char *target_name;
156   char *object_target;
157   unsigned int imagebase_reloc;
158   int pe_arch;
159   int bfd_arch;
160   bfd_boolean underscored;
161   autofilter_entry_type* autofilter_symbollist; 
162 }
163 pe_details_type;
164
165 static autofilter_entry_type autofilter_symbollist_generic[] =
166 {
167   { ".text", 5 },
168   /* Entry point symbols.  */
169   { "DllMain", 7 },
170   { "DllMainCRTStartup", 17 },
171   { "_DllMainCRTStartup", 18 },
172   /* Runtime pseudo-reloc.  */
173   { "_pei386_runtime_relocator", 25 },
174   { "do_pseudo_reloc", 15 },
175   { NULL, 0 }
176 };
177
178 static autofilter_entry_type autofilter_symbollist_i386[] =
179 {
180   { ".text", 5 },
181   /* Entry point symbols, and entry hooks.  */
182   { "cygwin_crt0", 11 },
183   { "DllMain@12", 10 },
184   { "DllEntryPoint@0", 15 },
185   { "DllMainCRTStartup@12", 20 },
186   { "_cygwin_dll_entry@12", 20 },
187   { "_cygwin_crt0_common@8", 21 },
188   { "_cygwin_noncygwin_dll_entry@12", 30 },
189   { "cygwin_attach_dll", 17 },
190   { "cygwin_premain0", 15 },
191   { "cygwin_premain1", 15 },
192   { "cygwin_premain2", 15 },
193   { "cygwin_premain3", 15 },
194   /* Runtime pseudo-reloc.  */
195   { "_pei386_runtime_relocator", 25 },
196   { "do_pseudo_reloc", 15 },
197   /* Global vars that should not be exported.  */
198   { "impure_ptr", 10 },
199   { "_impure_ptr", 11 },
200   { "_fmode", 6 },
201   { "environ", 7 },
202   { NULL, 0 }
203 };
204
205 #define PE_ARCH_i386     1
206 #define PE_ARCH_sh       2
207 #define PE_ARCH_mips     3
208 #define PE_ARCH_arm      4
209 #define PE_ARCH_arm_epoc 5
210
211 static pe_details_type pe_detail_list[] =
212 {
213   {
214     "pei-i386",
215     "pe-i386",
216     7 /* R_IMAGEBASE */,
217     PE_ARCH_i386,
218     bfd_arch_i386,
219     TRUE,
220     autofilter_symbollist_i386
221   },
222   {
223     "pei-shl",
224     "pe-shl",
225     16 /* R_SH_IMAGEBASE */,
226     PE_ARCH_sh,
227     bfd_arch_sh,
228     TRUE,
229     autofilter_symbollist_generic
230   },
231   {
232     "pei-mips",
233     "pe-mips",
234     34 /* MIPS_R_RVA */,
235     PE_ARCH_mips,
236     bfd_arch_mips,
237     FALSE,
238     autofilter_symbollist_generic
239   },
240   {
241     "pei-arm-little",
242     "pe-arm-little",
243     11 /* ARM_RVA32 */,
244     PE_ARCH_arm,
245     bfd_arch_arm,
246     TRUE,
247     autofilter_symbollist_generic
248   },
249   {
250     "epoc-pei-arm-little",
251     "epoc-pe-arm-little",
252     11 /* ARM_RVA32 */,
253     PE_ARCH_arm_epoc,
254     bfd_arch_arm,
255     FALSE,
256     autofilter_symbollist_generic
257   },
258   { NULL, NULL, 0, 0, 0, FALSE, NULL }
259 };
260
261 static pe_details_type *pe_details;
262
263 /* Do not specify library suffix explicitly, to allow for dllized versions.  */
264 static autofilter_entry_type autofilter_liblist[] =
265 {
266   { "libcegcc", 8 },
267   { "libcygwin", 9 },
268   { "libgcc", 6 },
269   { "libstdc++", 9 },
270   { "libmingw32", 10 },
271   { "libmingwex", 10 },
272   { "libg2c", 6 },
273   { "libsupc++", 9 },
274   { "libobjc", 7 },
275   { "libgcj", 6 },
276   { NULL, 0 }
277 };
278
279 static autofilter_entry_type autofilter_objlist[] =
280 {
281   { "crt0.o", 6 },
282   { "crt1.o", 6 },
283   { "crt2.o", 6 },
284   { "dllcrt1.o", 9 },
285   { "dllcrt2.o", 9 },
286   { "gcrt0.o", 7 },
287   { "gcrt1.o", 7 },
288   { "gcrt2.o", 7 },
289   { "crtbegin.o", 10 },
290   { "crtend.o", 8 },
291   { NULL, 0 }
292 };
293
294 static autofilter_entry_type autofilter_symbolprefixlist[] =
295 {
296   { "__imp_", 6 },
297   /* Do __imp_ explicitly to save time.  */
298   { "__rtti_", 7 },
299   { ".idata$", 7 },
300   /* Don't re-export auto-imported symbols.  */
301   { "_nm_", 4 },
302   { "__builtin_", 10 },
303   /* Don't export symbols specifying internal DLL layout.  */
304   { "_head_", 6 },
305   { NULL, 0 }
306 };
307
308 static autofilter_entry_type autofilter_symbolsuffixlist[] =
309 {
310   { "_iname", 6 },
311   { NULL, 0 }
312 };
313
314 #define U(str) (pe_details->underscored ? "_" str : str)
315
316 void
317 pe_dll_id_target (const char *target)
318 {
319   int i;
320
321   for (i = 0; pe_detail_list[i].target_name; i++)
322     if (strcmp (pe_detail_list[i].target_name, target) == 0
323         || strcmp (pe_detail_list[i].object_target, target) == 0)
324       {
325         pe_details = pe_detail_list + i;
326         return;
327       }
328   einfo (_("%XUnsupported PEI architecture: %s\n"), target);
329   exit (1);
330 }
331
332 /* Helper functions for qsort.  Relocs must be sorted so that we can write
333    them out by pages.  */
334
335 typedef struct
336   {
337     bfd_vma vma;
338     char type;
339     short extra;
340   }
341 reloc_data_type;
342
343 static int
344 reloc_sort (const void *va, const void *vb)
345 {
346   bfd_vma a = ((const reloc_data_type *) va)->vma;
347   bfd_vma b = ((const reloc_data_type *) vb)->vma;
348
349   return (a > b) ? 1 : ((a < b) ? -1 : 0);
350 }
351
352 static int
353 pe_export_sort (const void *va, const void *vb)
354 {
355   const def_file_export *a = va;
356   const def_file_export *b = vb;
357
358   return strcmp (a->name, b->name);
359 }
360
361 /* Read and process the .DEF file.  */
362
363 /* These correspond to the entries in pe_def_file->exports[].  I use
364    exported_symbol_sections[i] to tag whether or not the symbol was
365    defined, since we can't export symbols we don't have.  */
366
367 static bfd_vma *exported_symbol_offsets;
368 static struct bfd_section **exported_symbol_sections;
369 static int export_table_size;
370 static int count_exported;
371 static int count_exported_byname;
372 static int count_with_ordinals;
373 static const char *dll_name;
374 static int min_ordinal, max_ordinal;
375 static int *exported_symbols;
376
377 typedef struct exclude_list_struct
378   {
379     char *string;
380     struct exclude_list_struct *next;
381     int type;
382   }
383 exclude_list_struct;
384
385 static struct exclude_list_struct *excludes = 0;
386
387 void
388 pe_dll_add_excludes (const char *new_excludes, const int type)
389 {
390   char *local_copy;
391   char *exclude_string;
392
393   local_copy = xstrdup (new_excludes);
394
395   exclude_string = strtok (local_copy, ",:");
396   for (; exclude_string; exclude_string = strtok (NULL, ",:"))
397     {
398       struct exclude_list_struct *new_exclude;
399
400       new_exclude = xmalloc (sizeof (struct exclude_list_struct));
401       new_exclude->string = xmalloc (strlen (exclude_string) + 1);
402       strcpy (new_exclude->string, exclude_string);
403       new_exclude->type = type;
404       new_exclude->next = excludes;
405       excludes = new_exclude;
406     }
407
408   free (local_copy);
409 }
410
411
412 /* abfd is a bfd containing n (or NULL)
413    It can be used for contextual checks.  */
414
415 static int
416 auto_export (bfd *abfd, def_file *d, const char *n)
417 {
418   int i;
419   struct exclude_list_struct *ex;
420   autofilter_entry_type *afptr;
421   const char * libname = 0;
422   if (abfd && abfd->my_archive)
423     libname = lbasename (abfd->my_archive->filename);
424
425   /* We should not re-export imported stuff.  */
426   if (strncmp (n, "_imp_", 5) == 0)
427     return 0;
428
429   for (i = 0; i < d->num_exports; i++)
430     if (strcmp (d->exports[i].name, n) == 0)
431       return 0;
432
433   if (pe_dll_do_default_excludes)
434     {
435       const char * p;
436       int    len;
437
438       if (pe_dll_extra_pe_debug)
439         printf ("considering exporting: %s, abfd=%p, abfd->my_arc=%p\n",
440                 n, abfd, abfd->my_archive);
441
442       /* First of all, make context checks:
443          Don't export anything from standard libs.  */
444       if (libname)
445         {
446           afptr = autofilter_liblist;
447
448           while (afptr->name)
449             {
450               if (strncmp (libname, afptr->name, afptr->len) == 0 )
451                 return 0;
452               afptr++;
453             }
454         }
455
456       /* Next, exclude symbols from certain startup objects.  */
457
458       if (abfd && (p = lbasename (abfd->filename)))
459         {
460           afptr = autofilter_objlist;
461           while (afptr->name)
462             {
463               if (strcmp (p, afptr->name) == 0)
464                 return 0;
465               afptr++;
466             }
467         }
468
469       /* Don't try to blindly exclude all symbols
470          that begin with '__'; this was tried and
471          it is too restrictive.  Instead we have
472          a target specific list to use:  */
473       afptr = pe_details->autofilter_symbollist; 
474       while (afptr->name)
475         {
476           if (strcmp (n, afptr->name) == 0)
477             return 0;
478
479           afptr++;
480         }
481
482       /* Next, exclude symbols starting with ...  */
483       afptr = autofilter_symbolprefixlist;
484       while (afptr->name)
485         {
486           if (strncmp (n, afptr->name, afptr->len) == 0)
487             return 0;
488
489           afptr++;
490         }
491
492       /* Finally, exclude symbols ending with ...  */
493       len = strlen (n);
494       afptr = autofilter_symbolsuffixlist;
495       while (afptr->name)
496         {
497           if ((len >= afptr->len)
498               /* Add 1 to insure match with trailing '\0'.  */
499               && strncmp (n + len - afptr->len, afptr->name,
500                           afptr->len + 1) == 0)
501             return 0;
502
503           afptr++;
504         }
505     }
506
507   for (ex = excludes; ex; ex = ex->next)
508     {
509       if (ex->type == 1) /* exclude-libs */
510         {
511           if (libname
512               && ((strcmp (libname, ex->string) == 0)
513                    || (strcasecmp ("ALL", ex->string) == 0)))
514             return 0;
515         }
516       else if (strcmp (n, ex->string) == 0)
517         return 0;
518     }
519
520   return 1;
521 }
522
523 static void
524 process_def_file (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
525 {
526   int i, j;
527   struct bfd_link_hash_entry *blhe;
528   bfd *b;
529   struct bfd_section *s;
530   def_file_export *e = 0;
531
532   if (!pe_def_file)
533     pe_def_file = def_file_empty ();
534
535   /* First, run around to all the objects looking for the .drectve
536      sections, and push those into the def file too.  */
537   for (b = info->input_bfds; b; b = b->link_next)
538     {
539       s = bfd_get_section_by_name (b, ".drectve");
540       if (s)
541         {
542           long size = s->size;
543           char *buf = xmalloc (size);
544
545           bfd_get_section_contents (b, s, buf, 0, size);
546           def_file_add_directive (pe_def_file, buf, size);
547           free (buf);
548         }
549     }
550
551   /* If we are not building a DLL, when there are no exports
552      we do not build an export table at all.  */
553   if (!pe_dll_export_everything && pe_def_file->num_exports == 0
554       && info->executable)
555     return;
556
557   /* Now, maybe export everything else the default way.  */
558   if (pe_dll_export_everything || pe_def_file->num_exports == 0)
559     {
560       for (b = info->input_bfds; b; b = b->link_next)
561         {
562           asymbol **symbols;
563           int nsyms, symsize;
564
565           symsize = bfd_get_symtab_upper_bound (b);
566           symbols = xmalloc (symsize);
567           nsyms = bfd_canonicalize_symtab (b, symbols);
568
569           for (j = 0; j < nsyms; j++)
570             {
571               /* We should export symbols which are either global or not
572                  anything at all.  (.bss data is the latter)
573                  We should not export undefined symbols.  */
574               if (symbols[j]->section != &bfd_und_section
575                   && ((symbols[j]->flags & BSF_GLOBAL)
576                       || (symbols[j]->flags == BFD_FORT_COMM_DEFAULT_VALUE)))
577                 {
578                   const char *sn = symbols[j]->name;
579
580                   /* We should not re-export imported stuff.  */
581                   {
582                     char *name = xmalloc (strlen (sn) + 2 + 6);
583                     sprintf (name, "%s%s", U("_imp_"), sn);
584
585                     blhe = bfd_link_hash_lookup (info->hash, name,
586                                                  FALSE, FALSE, FALSE);
587                     free (name);
588
589                     if (blhe && blhe->type == bfd_link_hash_defined)
590                       continue;
591                   }
592
593                   if (*sn == '_')
594                     sn++;
595
596                   if (auto_export (b, pe_def_file, sn))
597                     {
598                       def_file_export *p;
599                       p=def_file_add_export (pe_def_file, sn, 0, -1);
600                       /* Fill data flag properly, from dlltool.c.  */
601                       p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
602                     }
603                 }
604             }
605         }
606     }
607
608 #undef NE
609 #define NE pe_def_file->num_exports
610
611   /* Canonicalize the export list.  */
612   if (pe_dll_kill_ats)
613     {
614       for (i = 0; i < NE; i++)
615         {
616           if (strchr (pe_def_file->exports[i].name, '@'))
617             {
618               /* This will preserve internal_name, which may have been
619                  pointing to the same memory as name, or might not
620                  have.  */
621               int lead_at = (*pe_def_file->exports[i].name == '@');
622               char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
623               char *tmp_at = strchr (tmp, '@');
624
625               if (tmp_at)
626                 *tmp_at = 0;
627               else
628                 einfo (_("%XCannot export %s: invalid export name\n"),
629                        pe_def_file->exports[i].name);
630               pe_def_file->exports[i].name = tmp;
631             }
632         }
633     }
634
635   if (pe_dll_stdcall_aliases)
636     {
637       for (i = 0; i < NE; i++)
638         {
639           if (strchr (pe_def_file->exports[i].name, '@'))
640             {
641               int lead_at = (*pe_def_file->exports[i].name == '@');
642               char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
643
644               *(strchr (tmp, '@')) = 0;
645               if (auto_export (NULL, pe_def_file, tmp))
646                 def_file_add_export (pe_def_file, tmp,
647                                      pe_def_file->exports[i].internal_name,
648                                      -1);
649               else
650                 free (tmp);
651             }
652         }
653     }
654
655   /* Convenience, but watch out for it changing.  */
656   e = pe_def_file->exports;
657
658   exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
659   exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
660
661   memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
662   max_ordinal = 0;
663   min_ordinal = 65536;
664   count_exported = 0;
665   count_exported_byname = 0;
666   count_with_ordinals = 0;
667
668   qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
669          pe_export_sort);
670   for (i = 0, j = 0; i < NE; i++)
671     {
672       if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
673         {
674           /* This is a duplicate.  */
675           if (e[j - 1].ordinal != -1
676               && e[i].ordinal != -1
677               && e[j - 1].ordinal != e[i].ordinal)
678             {
679               if (pe_dll_warn_dup_exports)
680                 /* xgettext:c-format */
681                 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
682                        e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
683             }
684           else
685             {
686               if (pe_dll_warn_dup_exports)
687                 /* xgettext:c-format */
688                 einfo (_("Warning, duplicate EXPORT: %s\n"),
689                        e[j - 1].name);
690             }
691
692           if (e[i].ordinal != -1)
693             e[j - 1].ordinal = e[i].ordinal;
694           e[j - 1].flag_private |= e[i].flag_private;
695           e[j - 1].flag_constant |= e[i].flag_constant;
696           e[j - 1].flag_noname |= e[i].flag_noname;
697           e[j - 1].flag_data |= e[i].flag_data;
698         }
699       else
700         {
701           if (i != j)
702             e[j] = e[i];
703           j++;
704         }
705     }
706   pe_def_file->num_exports = j; /* == NE */
707
708   for (i = 0; i < NE; i++)
709     {
710       char *name;
711
712       /* Check for forward exports */
713       if (strchr (pe_def_file->exports[i].internal_name, '.'))
714         {
715           count_exported++;
716           if (!pe_def_file->exports[i].flag_noname)
717             count_exported_byname++;
718
719           pe_def_file->exports[i].flag_forward = 1;
720
721           if (pe_def_file->exports[i].ordinal != -1)
722             {
723               if (max_ordinal < pe_def_file->exports[i].ordinal)
724                 max_ordinal = pe_def_file->exports[i].ordinal;
725               if (min_ordinal > pe_def_file->exports[i].ordinal)
726                 min_ordinal = pe_def_file->exports[i].ordinal;
727               count_with_ordinals++;
728             }
729
730           continue;
731         }
732
733       name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
734       if (pe_details->underscored
735           && (*pe_def_file->exports[i].internal_name != '@'))
736         {
737           *name = '_';
738           strcpy (name + 1, pe_def_file->exports[i].internal_name);
739         }
740       else
741         strcpy (name, pe_def_file->exports[i].internal_name);
742
743       blhe = bfd_link_hash_lookup (info->hash,
744                                    name,
745                                    FALSE, FALSE, TRUE);
746
747       if (blhe
748           && (blhe->type == bfd_link_hash_defined
749               || (blhe->type == bfd_link_hash_common)))
750         {
751           count_exported++;
752           if (!pe_def_file->exports[i].flag_noname)
753             count_exported_byname++;
754
755           /* Only fill in the sections. The actual offsets are computed
756              in fill_exported_offsets() after common symbols are laid
757              out.  */
758           if (blhe->type == bfd_link_hash_defined)
759             exported_symbol_sections[i] = blhe->u.def.section;
760           else
761             exported_symbol_sections[i] = blhe->u.c.p->section;
762
763           if (pe_def_file->exports[i].ordinal != -1)
764             {
765               if (max_ordinal < pe_def_file->exports[i].ordinal)
766                 max_ordinal = pe_def_file->exports[i].ordinal;
767               if (min_ordinal > pe_def_file->exports[i].ordinal)
768                 min_ordinal = pe_def_file->exports[i].ordinal;
769               count_with_ordinals++;
770             }
771         }
772       else if (blhe && blhe->type == bfd_link_hash_undefined)
773         {
774           /* xgettext:c-format */
775           einfo (_("%XCannot export %s: symbol not defined\n"),
776                  pe_def_file->exports[i].internal_name);
777         }
778       else if (blhe)
779         {
780           /* xgettext:c-format */
781           einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
782                  pe_def_file->exports[i].internal_name,
783                  blhe->type, bfd_link_hash_defined);
784         }
785       else
786         {
787           /* xgettext:c-format */
788           einfo (_("%XCannot export %s: symbol not found\n"),
789                  pe_def_file->exports[i].internal_name);
790         }
791       free (name);
792     }
793 }
794
795 /* Build the bfd that will contain .edata and .reloc sections.  */
796
797 static void
798 build_filler_bfd (int include_edata)
799 {
800   lang_input_statement_type *filler_file;
801   filler_file = lang_add_input_file ("dll stuff",
802                                      lang_input_file_is_fake_enum,
803                                      NULL);
804   filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff", output_bfd);
805   if (filler_bfd == NULL
806       || !bfd_set_arch_mach (filler_bfd,
807                              bfd_get_arch (output_bfd),
808                              bfd_get_mach (output_bfd)))
809     {
810       einfo ("%X%P: can not create BFD: %E\n");
811       return;
812     }
813
814   if (include_edata)
815     {
816       edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
817       if (edata_s == NULL
818           || !bfd_set_section_flags (filler_bfd, edata_s,
819                                      (SEC_HAS_CONTENTS
820                                       | SEC_ALLOC
821                                       | SEC_LOAD
822                                       | SEC_KEEP
823                                       | SEC_IN_MEMORY)))
824         {
825           einfo ("%X%P: can not create .edata section: %E\n");
826           return;
827         }
828       bfd_set_section_size (filler_bfd, edata_s, edata_sz);
829     }
830
831   reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
832   if (reloc_s == NULL
833       || !bfd_set_section_flags (filler_bfd, reloc_s,
834                                  (SEC_HAS_CONTENTS
835                                   | SEC_ALLOC
836                                   | SEC_LOAD
837                                   | SEC_KEEP
838                                   | SEC_IN_MEMORY)))
839     {
840       einfo ("%X%P: can not create .reloc section: %E\n");
841       return;
842     }
843
844   bfd_set_section_size (filler_bfd, reloc_s, 0);
845
846   ldlang_add_file (filler_file);
847 }
848
849 /* Gather all the exported symbols and build the .edata section.  */
850
851 static void
852 generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
853 {
854   int i, next_ordinal;
855   int name_table_size = 0;
856   const char *dlnp;
857
858   /* First, we need to know how many exported symbols there are,
859      and what the range of ordinals is.  */
860   if (pe_def_file->name)
861     dll_name = pe_def_file->name;
862   else
863     {
864       dll_name = abfd->filename;
865
866       for (dlnp = dll_name; *dlnp; dlnp++)
867         if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
868           dll_name = dlnp + 1;
869     }
870
871   if (count_with_ordinals && max_ordinal > count_exported)
872     {
873       if (min_ordinal > max_ordinal - count_exported + 1)
874         min_ordinal = max_ordinal - count_exported + 1;
875     }
876   else
877     {
878       min_ordinal = 1;
879       max_ordinal = count_exported;
880     }
881
882   export_table_size = max_ordinal - min_ordinal + 1;
883   exported_symbols = xmalloc (export_table_size * sizeof (int));
884   for (i = 0; i < export_table_size; i++)
885     exported_symbols[i] = -1;
886
887   /* Now we need to assign ordinals to those that don't have them.  */
888   for (i = 0; i < NE; i++)
889     {
890       if (exported_symbol_sections[i] ||
891           pe_def_file->exports[i].flag_forward)
892         {
893           if (pe_def_file->exports[i].ordinal != -1)
894             {
895               int ei = pe_def_file->exports[i].ordinal - min_ordinal;
896               int pi = exported_symbols[ei];
897
898               if (pi != -1)
899                 {
900                   /* xgettext:c-format */
901                   einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
902                          pe_def_file->exports[i].ordinal,
903                          pe_def_file->exports[i].name,
904                          pe_def_file->exports[pi].name);
905                 }
906               exported_symbols[ei] = i;
907             }
908           name_table_size += strlen (pe_def_file->exports[i].name) + 1;
909         }
910
911       /* Reserve space for the forward name. */
912       if (pe_def_file->exports[i].flag_forward)
913         {
914           name_table_size += strlen (pe_def_file->exports[i].internal_name) + 1;
915         }
916     }
917
918   next_ordinal = min_ordinal;
919   for (i = 0; i < NE; i++)
920     if ((exported_symbol_sections[i] ||
921          pe_def_file->exports[i].flag_forward) &&
922         pe_def_file->exports[i].ordinal == -1)
923       {
924         while (exported_symbols[next_ordinal - min_ordinal] != -1)
925           next_ordinal++;
926
927         exported_symbols[next_ordinal - min_ordinal] = i;
928         pe_def_file->exports[i].ordinal = next_ordinal;
929       }
930
931   /* OK, now we can allocate some memory.  */
932   edata_sz = (40                                /* directory */
933               + 4 * export_table_size           /* addresses */
934               + 4 * count_exported_byname       /* name ptrs */
935               + 2 * count_exported_byname       /* ordinals */
936               + name_table_size + strlen (dll_name) + 1);
937 }
938
939 /* Fill the exported symbol offsets. The preliminary work has already
940    been done in process_def_file().  */
941
942 static void
943 fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
944 {
945   int i;
946   struct bfd_link_hash_entry *blhe;
947
948   for (i = 0; i < pe_def_file->num_exports; i++)
949     {
950       char *name;
951
952       name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
953       if (pe_details->underscored
954           && *pe_def_file->exports[i].internal_name != '@')
955         {
956           *name = '_';
957           strcpy (name + 1, pe_def_file->exports[i].internal_name);
958         }
959       else
960         strcpy (name, pe_def_file->exports[i].internal_name);
961
962       blhe = bfd_link_hash_lookup (info->hash,
963                                    name,
964                                    FALSE, FALSE, TRUE);
965
966       if (blhe && blhe->type == bfd_link_hash_defined)
967         exported_symbol_offsets[i] = blhe->u.def.value;
968
969       free (name);
970     }
971 }
972
973 static void
974 fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
975 {
976   int s, hint;
977   unsigned char *edirectory;
978   unsigned char *eaddresses;
979   unsigned char *enameptrs;
980   unsigned char *eordinals;
981   char *enamestr;
982   time_t now;
983
984   time (&now);
985
986   edata_d = xmalloc (edata_sz);
987
988   /* Note use of array pointer math here.  */
989   edirectory = edata_d;
990   eaddresses = edata_d + 40;
991   enameptrs = eaddresses + 4 * export_table_size;
992   eordinals = enameptrs + 4 * count_exported_byname;
993   enamestr = (char *) eordinals + 2 * count_exported_byname;
994
995 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
996                    + edata_s->output_section->vma - image_base)
997
998   memset (edata_d, 0, edata_sz);
999   bfd_put_32 (abfd, now, edata_d + 4);
1000   if (pe_def_file->version_major != -1)
1001     {
1002       bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
1003       bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
1004     }
1005
1006   bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
1007   strcpy (enamestr, dll_name);
1008   enamestr += strlen (enamestr) + 1;
1009   bfd_put_32 (abfd, min_ordinal, edata_d + 16);
1010   bfd_put_32 (abfd, export_table_size, edata_d + 20);
1011   bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
1012   bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
1013   bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
1014   bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
1015
1016   fill_exported_offsets (abfd, info);
1017
1018   /* Ok, now for the filling in part.
1019      Scan alphabetically - ie the ordering in the exports[] table,
1020      rather than by ordinal - the ordering in the exported_symbol[]
1021      table.  See dlltool.c and:
1022         http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1023      for more information.  */
1024   hint = 0;
1025   for (s = 0; s < NE; s++)
1026     {
1027       struct bfd_section *ssec = exported_symbol_sections[s];
1028       if (pe_def_file->exports[s].ordinal != -1 &&
1029           (pe_def_file->exports[s].flag_forward || ssec != NULL))
1030         {
1031           int ord = pe_def_file->exports[s].ordinal;
1032
1033           if (pe_def_file->exports[s].flag_forward)
1034             {
1035               bfd_put_32 (abfd, ERVA (enamestr),
1036                           eaddresses + 4 * (ord - min_ordinal));
1037
1038               strcpy (enamestr, pe_def_file->exports[s].internal_name);
1039               enamestr += strlen (pe_def_file->exports[s].internal_name) + 1;
1040             }
1041           else
1042             {
1043               unsigned long srva = (exported_symbol_offsets[s]
1044                                     + ssec->output_section->vma
1045                                     + ssec->output_offset);
1046
1047               bfd_put_32 (abfd, srva - image_base,
1048                           eaddresses + 4 * (ord - min_ordinal));
1049             }
1050
1051           if (!pe_def_file->exports[s].flag_noname)
1052             {
1053               char *ename = pe_def_file->exports[s].name;
1054
1055               bfd_put_32 (abfd, ERVA (enamestr), enameptrs);
1056               enameptrs += 4;
1057               strcpy (enamestr, ename);
1058               enamestr += strlen (enamestr) + 1;
1059               bfd_put_16 (abfd, ord - min_ordinal, eordinals);
1060               eordinals += 2;
1061               pe_def_file->exports[s].hint = hint++;
1062             }
1063         }
1064     }
1065 }
1066
1067
1068 static struct bfd_section *current_sec;
1069
1070 void
1071 pe_walk_relocs_of_symbol (struct bfd_link_info *info,
1072                           const char *name,
1073                           int (*cb) (arelent *, asection *))
1074 {
1075   bfd *b;
1076   asection *s;
1077
1078   for (b = info->input_bfds; b; b = b->link_next)
1079     {
1080       asymbol **symbols;
1081       int nsyms, symsize;
1082
1083       symsize = bfd_get_symtab_upper_bound (b);
1084       symbols = xmalloc (symsize);
1085       nsyms   = bfd_canonicalize_symtab (b, symbols);
1086
1087       for (s = b->sections; s; s = s->next)
1088         {
1089           arelent **relocs;
1090           int relsize, nrelocs, i;
1091           int flags = bfd_get_section_flags (b, s);
1092
1093           /* Skip discarded linkonce sections.  */
1094           if (flags & SEC_LINK_ONCE
1095               && s->output_section == bfd_abs_section_ptr)
1096             continue;
1097
1098           current_sec = s;
1099
1100           relsize = bfd_get_reloc_upper_bound (b, s);
1101           relocs = xmalloc (relsize);
1102           nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1103
1104           for (i = 0; i < nrelocs; i++)
1105             {
1106               struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1107
1108               if (!strcmp (name, sym->name))
1109                 cb (relocs[i], s);
1110             }
1111
1112           free (relocs);
1113
1114           /* Warning: the allocated symbols are remembered in BFD and reused
1115              later, so don't free them! */
1116           /* free (symbols); */
1117         }
1118     }
1119 }
1120
1121 /* Gather all the relocations and build the .reloc section.  */
1122
1123 static void
1124 generate_reloc (bfd *abfd, struct bfd_link_info *info)
1125 {
1126
1127   /* For .reloc stuff.  */
1128   reloc_data_type *reloc_data;
1129   int total_relocs = 0;
1130   int i;
1131   unsigned long sec_page = (unsigned long) -1;
1132   unsigned long page_ptr, page_count;
1133   int bi;
1134   bfd *b;
1135   struct bfd_section *s;
1136
1137   total_relocs = 0;
1138   for (b = info->input_bfds; b; b = b->link_next)
1139     for (s = b->sections; s; s = s->next)
1140       total_relocs += s->reloc_count;
1141
1142   reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
1143
1144   total_relocs = 0;
1145   bi = 0;
1146   for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1147     {
1148       arelent **relocs;
1149       int relsize, nrelocs, i;
1150
1151       for (s = b->sections; s; s = s->next)
1152         {
1153           unsigned long sec_vma = s->output_section->vma + s->output_offset;
1154           asymbol **symbols;
1155           int nsyms, symsize;
1156
1157           /* If it's not loaded, we don't need to relocate it this way.  */
1158 #if 0     /* Some toolchains can generate .data sections without a SEC_LOAD flag but with relocs.  */
1159           if (!(s->output_section->flags & SEC_LOAD))
1160             continue;
1161 #endif
1162           /* Huh ?  */
1163           if (strncmp (bfd_get_section_name (abfd, s), ".idata",6) == 0)
1164             continue;
1165
1166           /* I don't know why there would be a reloc for these, but I've
1167              seen it happen - DJ  */
1168           if (s->output_section == &bfd_abs_section)
1169             continue;
1170
1171           if (s->output_section->vma == 0)
1172             {
1173               /* Huh?  Shouldn't happen, but punt if it does.  */
1174               einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1175                      s->output_section->name, s->output_section->index,
1176                      s->output_section->flags);
1177               continue;
1178             }
1179
1180           symsize = bfd_get_symtab_upper_bound (b);
1181           symbols = xmalloc (symsize);
1182           nsyms = bfd_canonicalize_symtab (b, symbols);
1183
1184           relsize = bfd_get_reloc_upper_bound (b, s);
1185           relocs = xmalloc (relsize);
1186           nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1187
1188           for (i = 0; i < nrelocs; i++)
1189             {
1190               if (pe_dll_extra_pe_debug)
1191                 {
1192                   struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1193                   printf ("rel: %s\n", sym->name);
1194                 }
1195               if (!relocs[i]->howto->pc_relative
1196                   && relocs[i]->howto->type != pe_details->imagebase_reloc)
1197                 {
1198                   bfd_vma sym_vma;
1199                   struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1200
1201                   sym_vma = (relocs[i]->addend
1202                              + sym->value
1203                              + sym->section->vma
1204                              + sym->section->output_offset
1205                              + sym->section->output_section->vma);
1206                   reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1207
1208 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1209
1210                   switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1211                                          relocs[i]->howto->rightshift)
1212                     {
1213                     case BITS_AND_SHIFT (32, 0):
1214                       reloc_data[total_relocs].type = 3;
1215                       total_relocs++;
1216                       break;
1217                     case BITS_AND_SHIFT (16, 0):
1218                       reloc_data[total_relocs].type = 2;
1219                       total_relocs++;
1220                       break;
1221                     case BITS_AND_SHIFT (16, 16):
1222                       reloc_data[total_relocs].type = 4;
1223                       /* FIXME: we can't know the symbol's right value
1224                          yet, but we probably can safely assume that
1225                          CE will relocate us in 64k blocks, so leaving
1226                          it zero is safe.  */
1227                       reloc_data[total_relocs].extra = 0;
1228                       total_relocs++;
1229                       break;
1230                     case BITS_AND_SHIFT (26, 2):
1231                       reloc_data[total_relocs].type = 5;
1232                       total_relocs++;
1233                       break;
1234                     case BITS_AND_SHIFT (24, 2):
1235                       /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1236                          Those ARM_xxx definitions should go in proper
1237                          header someday.  */
1238                       if (relocs[i]->howto->type == 0
1239                           /* Older GNU linkers used 5 instead of 0 for this reloc.  */
1240                           || relocs[i]->howto->type == 5)
1241                         /* This is an ARM_26D reloc, which is an ARM_26 reloc
1242                            that has already been fully processed during a
1243                            previous link stage, so ignore it here.  */
1244                         break;
1245                       /* Fall through.  */
1246                     default:
1247                       /* xgettext:c-format */
1248                       einfo (_("%XError: %d-bit reloc in dll\n"),
1249                              relocs[i]->howto->bitsize);
1250                       break;
1251                     }
1252                 }
1253             }
1254           free (relocs);
1255           /* Warning: the allocated symbols are remembered in BFD and
1256              reused later, so don't free them!  */
1257         }
1258     }
1259
1260   /* At this point, we have total_relocs relocation addresses in
1261      reloc_addresses, which are all suitable for the .reloc section.
1262      We must now create the new sections.  */
1263   qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1264
1265   for (i = 0; i < total_relocs; i++)
1266     {
1267       unsigned long this_page = (reloc_data[i].vma >> 12);
1268
1269       if (this_page != sec_page)
1270         {
1271           reloc_sz = (reloc_sz + 3) & ~3;       /* 4-byte align.  */
1272           reloc_sz += 8;
1273           sec_page = this_page;
1274         }
1275
1276       reloc_sz += 2;
1277
1278       if (reloc_data[i].type == 4)
1279         reloc_sz += 2;
1280     }
1281
1282   reloc_sz = (reloc_sz + 3) & ~3;       /* 4-byte align.  */
1283   reloc_d = xmalloc (reloc_sz);
1284   sec_page = (unsigned long) -1;
1285   reloc_sz = 0;
1286   page_ptr = (unsigned long) -1;
1287   page_count = 0;
1288
1289   for (i = 0; i < total_relocs; i++)
1290     {
1291       unsigned long rva = reloc_data[i].vma - image_base;
1292       unsigned long this_page = (rva & ~0xfff);
1293
1294       if (this_page != sec_page)
1295         {
1296           while (reloc_sz & 3)
1297             reloc_d[reloc_sz++] = 0;
1298
1299           if (page_ptr != (unsigned long) -1)
1300             bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1301
1302           bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1303           page_ptr = reloc_sz;
1304           reloc_sz += 8;
1305           sec_page = this_page;
1306           page_count = 0;
1307         }
1308
1309       bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1310                   reloc_d + reloc_sz);
1311       reloc_sz += 2;
1312
1313       if (reloc_data[i].type == 4)
1314         {
1315           bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1316           reloc_sz += 2;
1317         }
1318
1319       page_count++;
1320     }
1321
1322   while (reloc_sz & 3)
1323     reloc_d[reloc_sz++] = 0;
1324
1325   if (page_ptr != (unsigned long) -1)
1326     bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1327
1328   while (reloc_sz < reloc_s->size)
1329     reloc_d[reloc_sz++] = 0;
1330 }
1331
1332 /* Given the exiting def_file structure, print out a .DEF file that
1333    corresponds to it.  */
1334
1335 static void
1336 quoteput (char *s, FILE *f, int needs_quotes)
1337 {
1338   char *cp;
1339
1340   for (cp = s; *cp; cp++)
1341     if (*cp == '\''
1342         || *cp == '"'
1343         || *cp == '\\'
1344         || ISSPACE (*cp)
1345         || *cp == ','
1346         || *cp == ';')
1347       needs_quotes = 1;
1348
1349   if (needs_quotes)
1350     {
1351       putc ('"', f);
1352
1353       while (*s)
1354         {
1355           if (*s == '"' || *s == '\\')
1356             putc ('\\', f);
1357
1358           putc (*s, f);
1359           s++;
1360         }
1361
1362       putc ('"', f);
1363     }
1364   else
1365     fputs (s, f);
1366 }
1367
1368 void
1369 pe_dll_generate_def_file (const char *pe_out_def_filename)
1370 {
1371   int i;
1372   FILE *out = fopen (pe_out_def_filename, "w");
1373
1374   if (out == NULL)
1375     /* xgettext:c-format */
1376     einfo (_("%s: Can't open output def file %s\n"),
1377            program_name, pe_out_def_filename);
1378
1379   if (pe_def_file)
1380     {
1381       if (pe_def_file->name)
1382         {
1383           if (pe_def_file->is_dll)
1384             fprintf (out, "LIBRARY ");
1385           else
1386             fprintf (out, "NAME ");
1387
1388           quoteput (pe_def_file->name, out, 1);
1389
1390           if (pe_data (output_bfd)->pe_opthdr.ImageBase)
1391             fprintf (out, " BASE=0x%lx",
1392                      (unsigned long) pe_data (output_bfd)->pe_opthdr.ImageBase);
1393           fprintf (out, "\n");
1394         }
1395
1396       if (pe_def_file->description)
1397         {
1398           fprintf (out, "DESCRIPTION ");
1399           quoteput (pe_def_file->description, out, 1);
1400           fprintf (out, "\n");
1401         }
1402
1403       if (pe_def_file->version_minor != -1)
1404         fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1405                  pe_def_file->version_minor);
1406       else if (pe_def_file->version_major != -1)
1407         fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1408
1409       if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1410         fprintf (out, "\n");
1411
1412       if (pe_def_file->stack_commit != -1)
1413         fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1414                  pe_def_file->stack_reserve, pe_def_file->stack_commit);
1415       else if (pe_def_file->stack_reserve != -1)
1416         fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1417
1418       if (pe_def_file->heap_commit != -1)
1419         fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1420                  pe_def_file->heap_reserve, pe_def_file->heap_commit);
1421       else if (pe_def_file->heap_reserve != -1)
1422         fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1423
1424       if (pe_def_file->num_section_defs > 0)
1425         {
1426           fprintf (out, "\nSECTIONS\n\n");
1427
1428           for (i = 0; i < pe_def_file->num_section_defs; i++)
1429             {
1430               fprintf (out, "    ");
1431               quoteput (pe_def_file->section_defs[i].name, out, 0);
1432
1433               if (pe_def_file->section_defs[i].class)
1434                 {
1435                   fprintf (out, " CLASS ");
1436                   quoteput (pe_def_file->section_defs[i].class, out, 0);
1437                 }
1438
1439               if (pe_def_file->section_defs[i].flag_read)
1440                 fprintf (out, " READ");
1441
1442               if (pe_def_file->section_defs[i].flag_write)
1443                 fprintf (out, " WRITE");
1444
1445               if (pe_def_file->section_defs[i].flag_execute)
1446                 fprintf (out, " EXECUTE");
1447
1448               if (pe_def_file->section_defs[i].flag_shared)
1449                 fprintf (out, " SHARED");
1450
1451               fprintf (out, "\n");
1452             }
1453         }
1454
1455       if (pe_def_file->num_exports > 0)
1456         {
1457           fprintf (out, "EXPORTS\n");
1458
1459           for (i = 0; i < pe_def_file->num_exports; i++)
1460             {
1461               def_file_export *e = pe_def_file->exports + i;
1462               fprintf (out, "    ");
1463               quoteput (e->name, out, 0);
1464
1465               if (e->internal_name && strcmp (e->internal_name, e->name))
1466                 {
1467                   fprintf (out, " = ");
1468                   quoteput (e->internal_name, out, 0);
1469                 }
1470
1471               if (e->ordinal != -1)
1472                 fprintf (out, " @%d", e->ordinal);
1473
1474               if (e->flag_private)
1475                 fprintf (out, " PRIVATE");
1476
1477               if (e->flag_constant)
1478                 fprintf (out, " CONSTANT");
1479
1480               if (e->flag_noname)
1481                 fprintf (out, " NONAME");
1482
1483               if (e->flag_data)
1484                 fprintf (out, " DATA");
1485
1486               fprintf (out, "\n");
1487             }
1488         }
1489
1490       if (pe_def_file->num_imports > 0)
1491         {
1492           fprintf (out, "\nIMPORTS\n\n");
1493
1494           for (i = 0; i < pe_def_file->num_imports; i++)
1495             {
1496               def_file_import *im = pe_def_file->imports + i;
1497               fprintf (out, "    ");
1498
1499               if (im->internal_name
1500                   && (!im->name || strcmp (im->internal_name, im->name)))
1501                 {
1502                   quoteput (im->internal_name, out, 0);
1503                   fprintf (out, " = ");
1504                 }
1505
1506               quoteput (im->module->name, out, 0);
1507               fprintf (out, ".");
1508
1509               if (im->name)
1510                 quoteput (im->name, out, 0);
1511               else
1512                 fprintf (out, "%d", im->ordinal);
1513
1514               fprintf (out, "\n");
1515             }
1516         }
1517     }
1518   else
1519     fprintf (out, _("; no contents available\n"));
1520
1521   if (fclose (out) == EOF)
1522     /* xgettext:c-format */
1523     einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1524 }
1525
1526 /* Generate the import library.  */
1527
1528 static asymbol **symtab;
1529 static int symptr;
1530 static int tmp_seq;
1531 static const char *dll_filename;
1532 static char *dll_symname;
1533
1534 #define UNDSEC (asection *) &bfd_und_section
1535
1536 static asection *
1537 quick_section (bfd *abfd, const char *name, int flags, int align)
1538 {
1539   asection *sec;
1540   asymbol *sym;
1541
1542   sec = bfd_make_section_old_way (abfd, name);
1543   bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1544   bfd_set_section_alignment (abfd, sec, align);
1545   /* Remember to undo this before trying to link internally!  */
1546   sec->output_section = sec;
1547
1548   sym = bfd_make_empty_symbol (abfd);
1549   symtab[symptr++] = sym;
1550   sym->name = sec->name;
1551   sym->section = sec;
1552   sym->flags = BSF_LOCAL;
1553   sym->value = 0;
1554
1555   return sec;
1556 }
1557
1558 static void
1559 quick_symbol (bfd *abfd,
1560               const char *n1,
1561               const char *n2,
1562               const char *n3,
1563               asection *sec,
1564               int flags,
1565               int addr)
1566 {
1567   asymbol *sym;
1568   char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1569
1570   strcpy (name, n1);
1571   strcat (name, n2);
1572   strcat (name, n3);
1573   sym = bfd_make_empty_symbol (abfd);
1574   sym->name = name;
1575   sym->section = sec;
1576   sym->flags = flags;
1577   sym->value = addr;
1578   symtab[symptr++] = sym;
1579 }
1580
1581 static arelent *reltab = 0;
1582 static int relcount = 0, relsize = 0;
1583
1584 static void
1585 quick_reloc (bfd *abfd, int address, int which_howto, int symidx)
1586 {
1587   if (relcount >= relsize - 1)
1588     {
1589       relsize += 10;
1590       if (reltab)
1591         reltab = xrealloc (reltab, relsize * sizeof (arelent));
1592       else
1593         reltab = xmalloc (relsize * sizeof (arelent));
1594     }
1595   reltab[relcount].address = address;
1596   reltab[relcount].addend = 0;
1597   reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1598   reltab[relcount].sym_ptr_ptr = symtab + symidx;
1599   relcount++;
1600 }
1601
1602 static void
1603 save_relocs (asection *sec)
1604 {
1605   int i;
1606
1607   sec->relocation = reltab;
1608   sec->reloc_count = relcount;
1609   sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
1610   for (i = 0; i < relcount; i++)
1611     sec->orelocation[i] = sec->relocation + i;
1612   sec->orelocation[relcount] = 0;
1613   sec->flags |= SEC_RELOC;
1614   reltab = 0;
1615   relcount = relsize = 0;
1616 }
1617
1618 /*      .section        .idata$2
1619         .global         __head_my_dll
1620    __head_my_dll:
1621         .rva            hname
1622         .long           0
1623         .long           0
1624         .rva            __my_dll_iname
1625         .rva            fthunk
1626
1627         .section        .idata$5
1628         .long           0
1629    fthunk:
1630
1631         .section        .idata$4
1632         .long           0
1633    hname:                              */
1634
1635 static bfd *
1636 make_head (bfd *parent)
1637 {
1638   asection *id2, *id5, *id4;
1639   unsigned char *d2, *d5, *d4;
1640   char *oname;
1641   bfd *abfd;
1642
1643   oname = xmalloc (20);
1644   sprintf (oname, "d%06d.o", tmp_seq);
1645   tmp_seq++;
1646
1647   abfd = bfd_create (oname, parent);
1648   bfd_find_target (pe_details->object_target, abfd);
1649   bfd_make_writable (abfd);
1650
1651   bfd_set_format (abfd, bfd_object);
1652   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1653
1654   symptr = 0;
1655   symtab = xmalloc (6 * sizeof (asymbol *));
1656   id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1657   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1658   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1659   quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1660   quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1661
1662   /* OK, pay attention here.  I got confused myself looking back at
1663      it.  We create a four-byte section to mark the beginning of the
1664      list, and we include an offset of 4 in the section, so that the
1665      pointer to the list points to the *end* of this section, which is
1666      the start of the list of sections from other objects.  */
1667
1668   bfd_set_section_size (abfd, id2, 20);
1669   d2 = xmalloc (20);
1670   id2->contents = d2;
1671   memset (d2, 0, 20);
1672   d2[0] = d2[16] = 4; /* Reloc addend.  */
1673   quick_reloc (abfd,  0, BFD_RELOC_RVA, 2);
1674   quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1675   quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1676   save_relocs (id2);
1677
1678   bfd_set_section_size (abfd, id5, 4);
1679   d5 = xmalloc (4);
1680   id5->contents = d5;
1681   memset (d5, 0, 4);
1682
1683   bfd_set_section_size (abfd, id4, 4);
1684   d4 = xmalloc (4);
1685   id4->contents = d4;
1686   memset (d4, 0, 4);
1687
1688   bfd_set_symtab (abfd, symtab, symptr);
1689
1690   bfd_set_section_contents (abfd, id2, d2, 0, 20);
1691   bfd_set_section_contents (abfd, id5, d5, 0, 4);
1692   bfd_set_section_contents (abfd, id4, d4, 0, 4);
1693
1694   bfd_make_readable (abfd);
1695   return abfd;
1696 }
1697
1698 /*      .section        .idata$4
1699         .long           0
1700         .section        .idata$5
1701         .long           0
1702         .section        idata$7
1703         .global         __my_dll_iname
1704   __my_dll_iname:
1705         .asciz          "my.dll"       */
1706
1707 static bfd *
1708 make_tail (bfd *parent)
1709 {
1710   asection *id4, *id5, *id7;
1711   unsigned char *d4, *d5, *d7;
1712   int len;
1713   char *oname;
1714   bfd *abfd;
1715
1716   oname = xmalloc (20);
1717   sprintf (oname, "d%06d.o", tmp_seq);
1718   tmp_seq++;
1719
1720   abfd = bfd_create (oname, parent);
1721   bfd_find_target (pe_details->object_target, abfd);
1722   bfd_make_writable (abfd);
1723
1724   bfd_set_format (abfd, bfd_object);
1725   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1726
1727   symptr = 0;
1728   symtab = xmalloc (5 * sizeof (asymbol *));
1729   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1730   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1731   id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1732   quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1733
1734   bfd_set_section_size (abfd, id4, 4);
1735   d4 = xmalloc (4);
1736   id4->contents = d4;
1737   memset (d4, 0, 4);
1738
1739   bfd_set_section_size (abfd, id5, 4);
1740   d5 = xmalloc (4);
1741   id5->contents = d5;
1742   memset (d5, 0, 4);
1743
1744   len = strlen (dll_filename) + 1;
1745   if (len & 1)
1746     len++;
1747   bfd_set_section_size (abfd, id7, len);
1748   d7 = xmalloc (len);
1749   id7->contents = d7;
1750   strcpy ((char *) d7, dll_filename);
1751
1752   bfd_set_symtab (abfd, symtab, symptr);
1753
1754   bfd_set_section_contents (abfd, id4, d4, 0, 4);
1755   bfd_set_section_contents (abfd, id5, d5, 0, 4);
1756   bfd_set_section_contents (abfd, id7, d7, 0, len);
1757
1758   bfd_make_readable (abfd);
1759   return abfd;
1760 }
1761
1762 /*      .text
1763         .global         _function
1764         .global         ___imp_function
1765         .global         __imp__function
1766   _function:
1767         jmp             *__imp__function:
1768
1769         .section        idata$7
1770         .long           __head_my_dll
1771
1772         .section        .idata$5
1773   ___imp_function:
1774   __imp__function:
1775   iat?
1776         .section        .idata$4
1777   iat?
1778         .section        .idata$6
1779   ID<ordinal>:
1780         .short          <hint>
1781         .asciz          "function" xlate? (add underscore, kill at)  */
1782
1783 static unsigned char jmp_ix86_bytes[] =
1784 {
1785   0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1786 };
1787
1788 /* _function:
1789         mov.l   ip+8,r0
1790         mov.l   @r0,r0
1791         jmp     @r0
1792         nop
1793         .dw     __imp_function   */
1794
1795 static unsigned char jmp_sh_bytes[] =
1796 {
1797   0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1798 };
1799
1800 /* _function:
1801         lui     $t0,<high:__imp_function>
1802         lw      $t0,<low:__imp_function>
1803         jr      $t0
1804         nop                              */
1805
1806 static unsigned char jmp_mips_bytes[] =
1807 {
1808   0x00, 0x00, 0x08, 0x3c,  0x00, 0x00, 0x08, 0x8d,
1809   0x08, 0x00, 0x00, 0x01,  0x00, 0x00, 0x00, 0x00
1810 };
1811
1812 static unsigned char jmp_arm_bytes[] =
1813 {
1814   0x00, 0xc0, 0x9f, 0xe5,       /* ldr  ip, [pc] */
1815   0x00, 0xf0, 0x9c, 0xe5,       /* ldr  pc, [ip] */
1816   0,    0,    0,    0
1817 };
1818
1819
1820 static bfd *
1821 make_one (def_file_export *exp, bfd *parent)
1822 {
1823   asection *tx, *id7, *id5, *id4, *id6;
1824   unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
1825   int len;
1826   char *oname;
1827   bfd *abfd;
1828   unsigned char *jmp_bytes = NULL;
1829   int jmp_byte_count = 0;
1830
1831   switch (pe_details->pe_arch)
1832     {
1833     case PE_ARCH_i386:
1834       jmp_bytes = jmp_ix86_bytes;
1835       jmp_byte_count = sizeof (jmp_ix86_bytes);
1836       break;
1837     case PE_ARCH_sh:
1838       jmp_bytes = jmp_sh_bytes;
1839       jmp_byte_count = sizeof (jmp_sh_bytes);
1840       break;
1841     case PE_ARCH_mips:
1842       jmp_bytes = jmp_mips_bytes;
1843       jmp_byte_count = sizeof (jmp_mips_bytes);
1844       break;
1845     case PE_ARCH_arm:
1846       jmp_bytes = jmp_arm_bytes;
1847       jmp_byte_count = sizeof (jmp_arm_bytes);
1848       break;
1849     default:
1850       abort ();
1851     }
1852
1853   oname = xmalloc (20);
1854   sprintf (oname, "d%06d.o", tmp_seq);
1855   tmp_seq++;
1856
1857   abfd = bfd_create (oname, parent);
1858   bfd_find_target (pe_details->object_target, abfd);
1859   bfd_make_writable (abfd);
1860
1861   bfd_set_format (abfd, bfd_object);
1862   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1863
1864   symptr = 0;
1865   symtab = xmalloc (11 * sizeof (asymbol *));
1866   tx  = quick_section (abfd, ".text",    SEC_CODE|SEC_HAS_CONTENTS, 2);
1867   id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1868   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1869   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1870   id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
1871
1872   if  (*exp->internal_name == '@')
1873     {
1874       quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
1875                     BSF_GLOBAL, 0);
1876       if (! exp->flag_data)
1877         quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
1878       quick_symbol (abfd, U ("_imp_"), exp->internal_name, "", id5,
1879                     BSF_GLOBAL, 0);
1880       /* Fastcall applies only to functions,
1881          so no need for auto-import symbol.  */
1882     }
1883   else
1884     {
1885       quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
1886                     BSF_GLOBAL, 0);
1887       if (! exp->flag_data)
1888         quick_symbol (abfd, U (""), exp->internal_name, "", tx,
1889                       BSF_GLOBAL, 0);
1890       quick_symbol (abfd, U ("_imp__"), exp->internal_name, "", id5,
1891                     BSF_GLOBAL, 0);
1892       /* Symbol to reference ord/name of imported
1893          data symbol, used to implement auto-import.  */
1894       if (exp->flag_data)
1895         quick_symbol (abfd, U("_nm__"), exp->internal_name, "", id6,
1896                       BSF_GLOBAL,0);
1897     }
1898   if (pe_dll_compat_implib)
1899     quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", id5,
1900                   BSF_GLOBAL, 0);
1901
1902   if (! exp->flag_data)
1903     {
1904       bfd_set_section_size (abfd, tx, jmp_byte_count);
1905       td = xmalloc (jmp_byte_count);
1906       tx->contents = td;
1907       memcpy (td, jmp_bytes, jmp_byte_count);
1908
1909       switch (pe_details->pe_arch)
1910         {
1911         case PE_ARCH_i386:
1912           quick_reloc (abfd, 2, BFD_RELOC_32, 2);
1913           break;
1914         case PE_ARCH_sh:
1915           quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1916           break;
1917         case PE_ARCH_mips:
1918           quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
1919           quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
1920           quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
1921           break;
1922         case PE_ARCH_arm:
1923           quick_reloc (abfd, 8, BFD_RELOC_32, 2);
1924           break;
1925         default:
1926           abort ();
1927         }
1928       save_relocs (tx);
1929     }
1930
1931   bfd_set_section_size (abfd, id7, 4);
1932   d7 = xmalloc (4);
1933   id7->contents = d7;
1934   memset (d7, 0, 4);
1935   quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
1936   save_relocs (id7);
1937
1938   bfd_set_section_size (abfd, id5, 4);
1939   d5 = xmalloc (4);
1940   id5->contents = d5;
1941   memset (d5, 0, 4);
1942
1943   if (exp->flag_noname)
1944     {
1945       d5[0] = exp->ordinal;
1946       d5[1] = exp->ordinal >> 8;
1947       d5[3] = 0x80;
1948     }
1949   else
1950     {
1951       quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1952       save_relocs (id5);
1953     }
1954
1955   bfd_set_section_size (abfd, id4, 4);
1956   d4 = xmalloc (4);
1957   id4->contents = d4;
1958   memset (d4, 0, 4);
1959
1960   if (exp->flag_noname)
1961     {
1962       d4[0] = exp->ordinal;
1963       d4[1] = exp->ordinal >> 8;
1964       d4[3] = 0x80;
1965     }
1966   else
1967     {
1968       quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
1969       save_relocs (id4);
1970     }
1971
1972   if (exp->flag_noname)
1973     {
1974       len = 0;
1975       bfd_set_section_size (abfd, id6, 0);
1976     }
1977   else
1978     {
1979       len = strlen (exp->name) + 3;
1980       if (len & 1)
1981         len++;
1982       bfd_set_section_size (abfd, id6, len);
1983       d6 = xmalloc (len);
1984       id6->contents = d6;
1985       memset (d6, 0, len);
1986       d6[0] = exp->hint & 0xff;
1987       d6[1] = exp->hint >> 8;
1988       strcpy ((char *) d6 + 2, exp->name);
1989     }
1990
1991   bfd_set_symtab (abfd, symtab, symptr);
1992
1993   bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
1994   bfd_set_section_contents (abfd, id7, d7, 0, 4);
1995   bfd_set_section_contents (abfd, id5, d5, 0, 4);
1996   bfd_set_section_contents (abfd, id4, d4, 0, 4);
1997   if (!exp->flag_noname)
1998     bfd_set_section_contents (abfd, id6, d6, 0, len);
1999
2000   bfd_make_readable (abfd);
2001   return abfd;
2002 }
2003
2004 static bfd *
2005 make_singleton_name_thunk (const char *import, bfd *parent)
2006 {
2007   /* Name thunks go to idata$4.  */
2008   asection *id4;
2009   unsigned char *d4;
2010   char *oname;
2011   bfd *abfd;
2012
2013   oname = xmalloc (20);
2014   sprintf (oname, "nmth%06d.o", tmp_seq);
2015   tmp_seq++;
2016
2017   abfd = bfd_create (oname, parent);
2018   bfd_find_target (pe_details->object_target, abfd);
2019   bfd_make_writable (abfd);
2020
2021   bfd_set_format (abfd, bfd_object);
2022   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2023
2024   symptr = 0;
2025   symtab = xmalloc (3 * sizeof (asymbol *));
2026   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2027   quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
2028   quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
2029
2030   bfd_set_section_size (abfd, id4, 8);
2031   d4 = xmalloc (4);
2032   id4->contents = d4;
2033   memset (d4, 0, 8);
2034   quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2035   save_relocs (id4);
2036
2037   bfd_set_symtab (abfd, symtab, symptr);
2038
2039   bfd_set_section_contents (abfd, id4, d4, 0, 8);
2040
2041   bfd_make_readable (abfd);
2042   return abfd;
2043 }
2044
2045 static char *
2046 make_import_fixup_mark (arelent *rel)
2047 {
2048   /* We convert reloc to symbol, for later reference.  */
2049   static int counter;
2050   static char *fixup_name = NULL;
2051   static size_t buffer_len = 0;
2052
2053   struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2054
2055   bfd *abfd = bfd_asymbol_bfd (sym);
2056   struct bfd_link_hash_entry *bh;
2057
2058   if (!fixup_name)
2059     {
2060       fixup_name = xmalloc (384);
2061       buffer_len = 384;
2062     }
2063
2064   if (strlen (sym->name) + 25 > buffer_len)
2065   /* Assume 25 chars for "__fu" + counter + "_".  If counter is
2066      bigger than 20 digits long, we've got worse problems than
2067      overflowing this buffer...  */
2068     {
2069       free (fixup_name);
2070       /* New buffer size is length of symbol, plus 25, but
2071          then rounded up to the nearest multiple of 128.  */
2072       buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
2073       fixup_name = xmalloc (buffer_len);
2074     }
2075
2076   sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2077
2078   bh = NULL;
2079   bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2080                                 current_sec, /* sym->section, */
2081                                 rel->address, NULL, TRUE, FALSE, &bh);
2082
2083   if (0)
2084     {
2085       struct coff_link_hash_entry *myh;
2086
2087       myh = (struct coff_link_hash_entry *) bh;
2088       printf ("type:%d\n", myh->type);
2089       printf ("%s\n", myh->root.u.def.section->name);
2090     }
2091
2092   return fixup_name;
2093 }
2094
2095 /*      .section        .idata$2
2096         .rva            __nm_thnk_SYM (singleton thunk with name of func)
2097         .long           0
2098         .long           0
2099         .rva            __my_dll_iname (name of dll)
2100         .rva            __fuNN_SYM (pointer to reference (address) in text)  */
2101
2102 static bfd *
2103 make_import_fixup_entry (const char *name,
2104                          const char *fixup_name,
2105                          const char *dll_symname,
2106                          bfd *parent)
2107 {
2108   asection *id2;
2109   unsigned char *d2;
2110   char *oname;
2111   bfd *abfd;
2112
2113   oname = xmalloc (20);
2114   sprintf (oname, "fu%06d.o", tmp_seq);
2115   tmp_seq++;
2116
2117   abfd = bfd_create (oname, parent);
2118   bfd_find_target (pe_details->object_target, abfd);
2119   bfd_make_writable (abfd);
2120
2121   bfd_set_format (abfd, bfd_object);
2122   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2123
2124   symptr = 0;
2125   symtab = xmalloc (6 * sizeof (asymbol *));
2126   id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2127
2128   quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2129   quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2130   quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2131
2132   bfd_set_section_size (abfd, id2, 20);
2133   d2 = xmalloc (20);
2134   id2->contents = d2;
2135   memset (d2, 0, 20);
2136
2137   quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2138   quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2139   quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2140   save_relocs (id2);
2141
2142   bfd_set_symtab (abfd, symtab, symptr);
2143
2144   bfd_set_section_contents (abfd, id2, d2, 0, 20);
2145
2146   bfd_make_readable (abfd);
2147   return abfd;
2148 }
2149
2150 /*      .section        .rdata_runtime_pseudo_reloc
2151         .long           addend
2152         .rva            __fuNN_SYM (pointer to reference (address) in text)  */
2153
2154 static bfd *
2155 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2156                            const char *fixup_name,
2157                            int addend,
2158                            bfd *parent)
2159 {
2160   asection *rt_rel;
2161   unsigned char *rt_rel_d;
2162   char *oname;
2163   bfd *abfd;
2164
2165   oname = xmalloc (20);
2166   sprintf (oname, "rtr%06d.o", tmp_seq);
2167   tmp_seq++;
2168
2169   abfd = bfd_create (oname, parent);
2170   bfd_find_target (pe_details->object_target, abfd);
2171   bfd_make_writable (abfd);
2172
2173   bfd_set_format (abfd, bfd_object);
2174   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2175
2176   symptr = 0;
2177   symtab = xmalloc (2 * sizeof (asymbol *));
2178   rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2179                           SEC_HAS_CONTENTS, 2);
2180
2181   quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2182
2183   bfd_set_section_size (abfd, rt_rel, 8);
2184   rt_rel_d = xmalloc (8);
2185   rt_rel->contents = rt_rel_d;
2186   memset (rt_rel_d, 0, 8);
2187   bfd_put_32 (abfd, addend, rt_rel_d);
2188
2189   quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2190   save_relocs (rt_rel);
2191
2192   bfd_set_symtab (abfd, symtab, symptr);
2193
2194   bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2195
2196   bfd_make_readable (abfd);
2197   return abfd;
2198 }
2199
2200 /*      .section        .rdata
2201         .rva            __pei386_runtime_relocator  */
2202
2203 static bfd *
2204 pe_create_runtime_relocator_reference (bfd *parent)
2205 {
2206   asection *extern_rt_rel;
2207   unsigned char *extern_rt_rel_d;
2208   char *oname;
2209   bfd *abfd;
2210
2211   oname = xmalloc (20);
2212   sprintf (oname, "ertr%06d.o", tmp_seq);
2213   tmp_seq++;
2214
2215   abfd = bfd_create (oname, parent);
2216   bfd_find_target (pe_details->object_target, abfd);
2217   bfd_make_writable (abfd);
2218
2219   bfd_set_format (abfd, bfd_object);
2220   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2221
2222   symptr = 0;
2223   symtab = xmalloc (2 * sizeof (asymbol *));
2224   extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2225
2226   quick_symbol (abfd, "", "__pei386_runtime_relocator", "", UNDSEC,
2227                 BSF_NO_FLAGS, 0);
2228
2229   bfd_set_section_size (abfd, extern_rt_rel, 4);
2230   extern_rt_rel_d = xmalloc (4);
2231   extern_rt_rel->contents = extern_rt_rel_d;
2232
2233   quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2234   save_relocs (extern_rt_rel);
2235
2236   bfd_set_symtab (abfd, symtab, symptr);
2237
2238   bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, 4);
2239
2240   bfd_make_readable (abfd);
2241   return abfd;
2242 }
2243
2244 void
2245 pe_create_import_fixup (arelent *rel, asection *s, int addend)
2246 {
2247   char buf[300];
2248   struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2249   struct bfd_link_hash_entry *name_thunk_sym;
2250   const char *name = sym->name;
2251   char *fixup_name = make_import_fixup_mark (rel);
2252   bfd *b;
2253
2254   sprintf (buf, U ("_nm_thnk_%s"), name);
2255
2256   name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2257
2258   if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined)
2259     {
2260       bfd *b = make_singleton_name_thunk (name, output_bfd);
2261       add_bfd_to_link (b, b->filename, &link_info);
2262
2263       /* If we ever use autoimport, we have to cast text section writable.  */
2264       config.text_read_only = FALSE;
2265       output_bfd->flags &= ~WP_TEXT;   
2266     }
2267
2268   if (addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2269     {
2270       extern char * pe_data_import_dll;
2271       char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2272
2273       b = make_import_fixup_entry (name, fixup_name, dll_symname, output_bfd);
2274       add_bfd_to_link (b, b->filename, &link_info);
2275     }
2276
2277   if (addend != 0)
2278     {
2279       if (link_info.pei386_runtime_pseudo_reloc)
2280         {
2281           if (pe_dll_extra_pe_debug)
2282             printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2283                    fixup_name, addend);
2284           b = make_runtime_pseudo_reloc (name, fixup_name, addend, output_bfd);
2285           add_bfd_to_link (b, b->filename, &link_info);
2286
2287           if (runtime_pseudo_relocs_created == 0)
2288             {
2289               b = pe_create_runtime_relocator_reference (output_bfd);
2290               add_bfd_to_link (b, b->filename, &link_info);
2291             }
2292           runtime_pseudo_relocs_created++;
2293         }
2294       else
2295         {
2296           einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2297                  s->owner, s, rel->address, sym->name);
2298           einfo ("%X");
2299         }
2300     }
2301 }
2302
2303
2304 void
2305 pe_dll_generate_implib (def_file *def, const char *impfilename)
2306 {
2307   int i;
2308   bfd *ar_head;
2309   bfd *ar_tail;
2310   bfd *outarch;
2311   bfd *head = 0;
2312
2313   dll_filename = (def->name) ? def->name : dll_name;
2314   dll_symname = xstrdup (dll_filename);
2315   for (i = 0; dll_symname[i]; i++)
2316     if (!ISALNUM (dll_symname[i]))
2317       dll_symname[i] = '_';
2318
2319   unlink_if_ordinary (impfilename);
2320
2321   outarch = bfd_openw (impfilename, 0);
2322
2323   if (!outarch)
2324     {
2325       /* xgettext:c-format */
2326       einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2327       return;
2328     }
2329
2330   /* xgettext:c-format */
2331   info_msg (_("Creating library file: %s\n"), impfilename);
2332  
2333   bfd_set_format (outarch, bfd_archive);
2334   outarch->has_armap = 1;
2335
2336   /* Work out a reasonable size of things to put onto one line.  */
2337   ar_head = make_head (outarch);
2338
2339   for (i = 0; i < def->num_exports; i++)
2340     {
2341       /* The import library doesn't know about the internal name.  */
2342       char *internal = def->exports[i].internal_name;
2343       bfd *n;
2344
2345       /* Don't add PRIVATE entries to import lib.  */   
2346       if (pe_def_file->exports[i].flag_private)
2347         continue;
2348       def->exports[i].internal_name = def->exports[i].name;
2349       n = make_one (def->exports + i, outarch);
2350       n->next = head;
2351       head = n;
2352       def->exports[i].internal_name = internal;
2353     }
2354
2355   ar_tail = make_tail (outarch);
2356
2357   if (ar_head == NULL || ar_tail == NULL)
2358     return;
2359
2360   /* Now stick them all into the archive.  */
2361   ar_head->next = head;
2362   ar_tail->next = ar_head;
2363   head = ar_tail;
2364
2365   if (! bfd_set_archive_head (outarch, head))
2366     einfo ("%Xbfd_set_archive_head: %E\n");
2367
2368   if (! bfd_close (outarch))
2369     einfo ("%Xbfd_close %s: %E\n", impfilename);
2370
2371   while (head != NULL)
2372     {
2373       bfd *n = head->next;
2374       bfd_close (head);
2375       head = n;
2376     }
2377 }
2378
2379 static void
2380 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *link_info)
2381 {
2382   lang_input_statement_type *fake_file;
2383
2384   fake_file = lang_add_input_file (name,
2385                                    lang_input_file_is_fake_enum,
2386                                    NULL);
2387   fake_file->the_bfd = abfd;
2388   ldlang_add_file (fake_file);
2389
2390   if (!bfd_link_add_symbols (abfd, link_info))
2391     einfo ("%Xaddsym %s: %E\n", name);
2392 }
2393
2394 void
2395 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *link_info)
2396 {
2397   def_file_module *module;
2398
2399   pe_dll_id_target (bfd_get_target (output_bfd));
2400
2401   if (!pe_def_file)
2402     return;
2403
2404   for (module = pe_def_file->modules; module; module = module->next)
2405     {
2406       int i, do_this_dll;
2407
2408       dll_filename = module->name;
2409       dll_symname = xstrdup (module->name);
2410       for (i = 0; dll_symname[i]; i++)
2411         if (!ISALNUM (dll_symname[i]))
2412           dll_symname[i] = '_';
2413
2414       do_this_dll = 0;
2415
2416       for (i = 0; i < pe_def_file->num_imports; i++)
2417         if (pe_def_file->imports[i].module == module)
2418           {
2419             def_file_export exp;
2420             struct bfd_link_hash_entry *blhe;
2421             int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2422             /* See if we need this import.  */
2423             size_t len = strlen (pe_def_file->imports[i].internal_name);
2424             char *name = xmalloc (len + 2 + 6);
2425
2426             if (lead_at)
2427               sprintf (name, "%s%s", "",
2428                        pe_def_file->imports[i].internal_name);
2429             else
2430               sprintf (name, "%s%s",U (""),
2431                        pe_def_file->imports[i].internal_name);
2432
2433             blhe = bfd_link_hash_lookup (link_info->hash, name,
2434                                          FALSE, FALSE, FALSE);
2435
2436             if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2437               {
2438                 if (lead_at)
2439                   sprintf (name, "%s%s", U ("_imp_"),
2440                            pe_def_file->imports[i].internal_name);
2441                 else
2442                   sprintf (name, "%s%s", U ("_imp__"),
2443                            pe_def_file->imports[i].internal_name);
2444
2445                 blhe = bfd_link_hash_lookup (link_info->hash, name,
2446                                              FALSE, FALSE, FALSE);
2447               }
2448             free (name);
2449
2450             if (blhe && blhe->type == bfd_link_hash_undefined)
2451               {
2452                 bfd *one;
2453                 /* We do.  */
2454                 if (!do_this_dll)
2455                   {
2456                     bfd *ar_head = make_head (output_bfd);
2457                     add_bfd_to_link (ar_head, ar_head->filename, link_info);
2458                     do_this_dll = 1;
2459                   }
2460                 exp.internal_name = pe_def_file->imports[i].internal_name;
2461                 exp.name = pe_def_file->imports[i].name;
2462                 exp.ordinal = pe_def_file->imports[i].ordinal;
2463                 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2464                 exp.flag_private = 0;
2465                 exp.flag_constant = 0;
2466                 exp.flag_data = pe_def_file->imports[i].data;
2467                 exp.flag_noname = exp.name ? 0 : 1;
2468                 one = make_one (&exp, output_bfd);
2469                 add_bfd_to_link (one, one->filename, link_info);
2470               }
2471           }
2472       if (do_this_dll)
2473         {
2474           bfd *ar_tail = make_tail (output_bfd);
2475           add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2476         }
2477
2478       free (dll_symname);
2479     }
2480 }
2481
2482 /* We were handed a *.DLL file.  Parse it and turn it into a set of
2483    IMPORTS directives in the def file.  Return TRUE if the file was
2484    handled, FALSE if not.  */
2485
2486 static unsigned int
2487 pe_get16 (bfd *abfd, int where)
2488 {
2489   unsigned char b[2];
2490
2491   bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2492   bfd_bread (b, (bfd_size_type) 2, abfd);
2493   return b[0] + (b[1] << 8);
2494 }
2495
2496 static unsigned int
2497 pe_get32 (bfd *abfd, int where)
2498 {
2499   unsigned char b[4];
2500
2501   bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2502   bfd_bread (b, (bfd_size_type) 4, abfd);
2503   return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2504 }
2505
2506 static unsigned int
2507 pe_as32 (void *ptr)
2508 {
2509   unsigned char *b = ptr;
2510
2511   return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2512 }
2513
2514 bfd_boolean
2515 pe_implied_import_dll (const char *filename)
2516 {
2517   bfd *dll;
2518   unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
2519   unsigned long export_rva, export_size, nsections, secptr, expptr;
2520   unsigned long exp_funcbase;
2521   unsigned char *expdata;
2522   char *erva;
2523   unsigned long name_rvas, ordinals, nexp, ordbase;
2524   const char *dll_name;
2525   /* Initialization with start > end guarantees that is_data
2526      will not be set by mistake, and avoids compiler warning.  */
2527   unsigned long data_start = 1;
2528   unsigned long data_end = 0;
2529   unsigned long rdata_start = 1;
2530   unsigned long rdata_end = 0;
2531   unsigned long bss_start = 1;
2532   unsigned long bss_end = 0;
2533
2534   /* No, I can't use bfd here.  kernel32.dll puts its export table in
2535      the middle of the .rdata section.  */
2536   dll = bfd_openr (filename, pe_details->target_name);
2537   if (!dll)
2538     {
2539       einfo ("%Xopen %s: %E\n", filename);
2540       return FALSE;
2541     }
2542
2543   /* PEI dlls seem to be bfd_objects.  */
2544   if (!bfd_check_format (dll, bfd_object))
2545     {
2546       einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
2547       return FALSE;
2548     }
2549
2550   /* Get pe_header, optional header and numbers of export entries.  */
2551   pe_header_offset = pe_get32 (dll, 0x3c);
2552   opthdr_ofs = pe_header_offset + 4 + 20;
2553   num_entries = pe_get32 (dll, opthdr_ofs + 92);
2554
2555   if (num_entries < 1) /* No exports.  */
2556     return FALSE;
2557
2558   export_rva = pe_get32 (dll, opthdr_ofs + 96);
2559   export_size = pe_get32 (dll, opthdr_ofs + 100);
2560   nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
2561   secptr = (pe_header_offset + 4 + 20 +
2562             pe_get16 (dll, pe_header_offset + 4 + 16));
2563   expptr = 0;
2564
2565   /* Get the rva and size of the export section.  */
2566   for (i = 0; i < nsections; i++)
2567     {
2568       char sname[8];
2569       unsigned long secptr1 = secptr + 40 * i;
2570       unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2571       unsigned long vsize = pe_get32 (dll, secptr1 + 16);
2572       unsigned long fptr = pe_get32 (dll, secptr1 + 20);
2573
2574       bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
2575       bfd_bread (sname, (bfd_size_type) 8, dll);
2576
2577       if (vaddr <= export_rva && vaddr + vsize > export_rva)
2578         {
2579           expptr = fptr + (export_rva - vaddr);
2580           if (export_rva + export_size > vaddr + vsize)
2581             export_size = vsize - (export_rva - vaddr);
2582           break;
2583         }
2584     }
2585
2586   /* Scan sections and store the base and size of the
2587      data and bss segments in data/base_start/end.  */
2588   for (i = 0; i < nsections; i++)
2589     {
2590       unsigned long secptr1 = secptr + 40 * i;
2591       unsigned long vsize = pe_get32 (dll, secptr1 + 8);
2592       unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
2593       unsigned long flags = pe_get32 (dll, secptr1 + 36);
2594       char sec_name[9];
2595
2596       sec_name[8] = '\0';
2597       bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
2598       bfd_bread (sec_name, (bfd_size_type) 8, dll);
2599
2600       if (strcmp(sec_name,".data") == 0)
2601         {
2602           data_start = vaddr;
2603           data_end = vaddr + vsize;
2604
2605           if (pe_dll_extra_pe_debug)
2606             printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2607                     __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2608         }
2609       else if (strcmp(sec_name,".rdata") == 0)
2610         {
2611           rdata_start = vaddr;
2612           rdata_end = vaddr + vsize;
2613
2614           if (pe_dll_extra_pe_debug)
2615             printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2616                     __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2617         }
2618       else if (strcmp (sec_name,".bss") == 0)
2619         {
2620           bss_start = vaddr;
2621           bss_end = vaddr + vsize;
2622
2623           if (pe_dll_extra_pe_debug)
2624             printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2625                     __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags);
2626         }
2627     }
2628
2629   expdata = xmalloc (export_size);
2630   bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
2631   bfd_bread (expdata, (bfd_size_type) export_size, dll);
2632   erva = (char *) expdata - export_rva;
2633
2634   if (pe_def_file == 0)
2635     pe_def_file = def_file_empty ();
2636
2637   nexp = pe_as32 (expdata + 24);
2638   name_rvas = pe_as32 (expdata + 32);
2639   ordinals = pe_as32 (expdata + 36);
2640   ordbase = pe_as32 (expdata + 16);
2641   exp_funcbase = pe_as32 (expdata + 28);
2642
2643   /* Use internal dll name instead of filename
2644      to enable symbolic dll linking.  */
2645   dll_name = erva + pe_as32 (expdata + 12);
2646
2647   /* Check to see if the dll has already been added to
2648      the definition list and if so return without error.
2649      This avoids multiple symbol definitions.  */
2650   if (def_get_module (pe_def_file, dll_name))
2651     {
2652       if (pe_dll_extra_pe_debug)
2653         printf ("%s is already loaded\n", dll_name);
2654       return TRUE;
2655     }
2656
2657   /* Iterate through the list of symbols.  */
2658   for (i = 0; i < nexp; i++)
2659     {
2660       /* Pointer to the names vector.  */
2661       unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4);
2662       def_file_import *imp;
2663       /* Pointer to the function address vector.  */
2664       unsigned long func_rva = pe_as32 (erva + exp_funcbase + i * 4);
2665       int is_data = 0;
2666
2667       /* Skip unwanted symbols, which are
2668          exported in buggy auto-import releases.  */
2669       if (strncmp (erva + name_rva, "_nm_", 4) != 0)
2670         {
2671           /* is_data is true if the address is in the data, rdata or bss
2672              segment.  */
2673           is_data =
2674             (func_rva >= data_start && func_rva < data_end)
2675             || (func_rva >= rdata_start && func_rva < rdata_end)
2676             || (func_rva >= bss_start && func_rva < bss_end);
2677
2678           imp = def_file_add_import (pe_def_file, erva + name_rva,
2679                                      dll_name, i, 0);
2680           /* Mark symbol type.  */
2681           imp->data = is_data;
2682
2683           if (pe_dll_extra_pe_debug)
2684             printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
2685                     __FUNCTION__, dll_name, erva + name_rva,
2686                     func_rva, is_data ? "(data)" : "");
2687         }
2688     }
2689
2690   return TRUE;
2691 }
2692
2693 /* These are the main functions, called from the emulation.  The first
2694    is called after the bfds are read, so we can guess at how much space
2695    we need.  The second is called after everything is placed, so we
2696    can put the right values in place.  */
2697
2698 void
2699 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
2700 {
2701   pe_dll_id_target (bfd_get_target (abfd));
2702   process_def_file (abfd, info);
2703
2704   if (pe_def_file->num_exports == 0 && !info->shared)
2705     return;
2706
2707   generate_edata (abfd, info);
2708   build_filler_bfd (1);
2709 }
2710
2711 void
2712 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
2713 {
2714   pe_dll_id_target (bfd_get_target (abfd));
2715   build_filler_bfd (0);
2716 }
2717
2718 void
2719 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
2720 {
2721   pe_dll_id_target (bfd_get_target (abfd));
2722   image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2723
2724   generate_reloc (abfd, info);
2725   if (reloc_sz > 0)
2726     {
2727       bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2728
2729       /* Resize the sections.  */
2730       lang_reset_memory_regions ();
2731       lang_size_sections (NULL, TRUE);
2732
2733       /* Redo special stuff.  */
2734       ldemul_after_allocation ();
2735
2736       /* Do the assignments again.  */
2737       lang_do_assignments ();
2738     }
2739
2740   fill_edata (abfd, info);
2741
2742   if (info->shared && !info->pie)
2743     pe_data (abfd)->dll = 1;
2744
2745   edata_s->contents = edata_d;
2746   reloc_s->contents = reloc_d;
2747 }
2748
2749 void
2750 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
2751 {
2752   pe_dll_id_target (bfd_get_target (abfd));
2753   image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2754
2755   generate_reloc (abfd, info);
2756   if (reloc_sz > 0)
2757     {
2758       bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2759
2760       /* Resize the sections.  */
2761       lang_reset_memory_regions ();
2762       lang_size_sections (NULL, TRUE);
2763
2764       /* Redo special stuff.  */
2765       ldemul_after_allocation ();
2766
2767       /* Do the assignments again.  */
2768       lang_do_assignments ();
2769     }
2770   reloc_s->contents = reloc_d;
2771 }