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