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