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