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