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