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