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