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