2009-01-03 Dave Korn <dave.korn.cygwin@gmail.com>
[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     int 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 int 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 == 1) /* exclude-libs */
597         {
598           if (libname
599               && ((strcmp (libname, ex->string) == 0)
600                    || (strcasecmp ("ALL", ex->string) == 0)))
601             return 0;
602         }
603       else if (strcmp (n, ex->string) == 0)
604         return 0;
605     }
606
607   return 1;
608 }
609
610 static void
611 process_def_file (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
612 {
613   int i, j;
614   struct bfd_link_hash_entry *blhe;
615   bfd *b;
616   struct bfd_section *s;
617   def_file_export *e = 0;
618
619   if (!pe_def_file)
620     pe_def_file = def_file_empty ();
621
622   /* First, run around to all the objects looking for the .drectve
623      sections, and push those into the def file too.  */
624   for (b = info->input_bfds; b; b = b->link_next)
625     {
626       s = bfd_get_section_by_name (b, ".drectve");
627       if (s)
628         {
629           long size = s->size;
630           char *buf = xmalloc (size);
631
632           bfd_get_section_contents (b, s, buf, 0, size);
633           def_file_add_directive (pe_def_file, buf, size);
634           free (buf);
635         }
636     }
637
638   /* If we are not building a DLL, when there are no exports
639      we do not build an export table at all.  */
640   if (!pe_dll_export_everything && pe_def_file->num_exports == 0
641       && info->executable)
642     return;
643
644   /* Now, maybe export everything else the default way.  */
645   if (pe_dll_export_everything || pe_def_file->num_exports == 0)
646     {
647       for (b = info->input_bfds; b; b = b->link_next)
648         {
649           asymbol **symbols;
650           int nsyms;
651
652           if (!bfd_generic_link_read_symbols (b))
653             {
654               einfo (_("%B%F: could not read symbols: %E\n"), b);
655               return;
656             }
657
658           symbols = bfd_get_outsymbols (b);
659           nsyms = bfd_get_symcount (b);
660
661           for (j = 0; j < nsyms; j++)
662             {
663               /* We should export symbols which are either global or not
664                  anything at all.  (.bss data is the latter)
665                  We should not export undefined symbols.  */
666               if (symbols[j]->section != &bfd_und_section
667                   && ((symbols[j]->flags & BSF_GLOBAL)
668                       || (symbols[j]->flags == 0)))
669                 {
670                   const char *sn = symbols[j]->name;
671
672                   /* We should not re-export imported stuff.  */
673                   {
674                     char *name;
675                     if (is_import (sn))
676                           continue;
677
678                     name = xmalloc (strlen ("__imp_") + strlen (sn) + 1);
679                     sprintf (name, "%s%s", "__imp_", sn);
680
681                     blhe = bfd_link_hash_lookup (info->hash, name,
682                                                  FALSE, FALSE, FALSE);
683                     free (name);
684
685                     if (blhe && blhe->type == bfd_link_hash_defined)
686                       continue;
687                   }
688
689                   if (pe_details->underscored && *sn == '_')
690                     sn++;
691
692                   if (auto_export (b, pe_def_file, sn))
693                     {
694                       def_file_export *p;
695                       p=def_file_add_export (pe_def_file, sn, 0, -1);
696                       /* Fill data flag properly, from dlltool.c.  */
697                       p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
698                     }
699                 }
700             }
701         }
702     }
703
704 #undef NE
705 #define NE pe_def_file->num_exports
706
707   /* Canonicalize the export list.  */
708   if (pe_dll_kill_ats)
709     {
710       for (i = 0; i < NE; i++)
711         {
712           if (strchr (pe_def_file->exports[i].name, '@'))
713             {
714               /* This will preserve internal_name, which may have been
715                  pointing to the same memory as name, or might not
716                  have.  */
717               int lead_at = (*pe_def_file->exports[i].name == '@');
718               char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
719               char *tmp_at = strchr (tmp, '@');
720
721               if (tmp_at)
722                 *tmp_at = 0;
723               else
724                 einfo (_("%XCannot export %s: invalid export name\n"),
725                        pe_def_file->exports[i].name);
726               pe_def_file->exports[i].name = tmp;
727             }
728         }
729     }
730
731   if (pe_dll_stdcall_aliases)
732     {
733       for (i = 0; i < NE; i++)
734         {
735           if (is_import (pe_def_file->exports[i].name))
736             continue;
737
738           if (strchr (pe_def_file->exports[i].name, '@'))
739             {
740               int lead_at = (*pe_def_file->exports[i].name == '@');
741               char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
742
743               *(strchr (tmp, '@')) = 0;
744               if (auto_export (NULL, pe_def_file, tmp))
745                 def_file_add_export (pe_def_file, tmp,
746                                      pe_def_file->exports[i].internal_name,
747                                      -1);
748               else
749                 free (tmp);
750             }
751         }
752     }
753
754   /* Convenience, but watch out for it changing.  */
755   e = pe_def_file->exports;
756
757   exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
758   exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
759
760   memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
761   max_ordinal = 0;
762   min_ordinal = 65536;
763   count_exported = 0;
764   count_exported_byname = 0;
765   count_with_ordinals = 0;
766
767   qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
768          pe_export_sort);
769   for (i = 0, j = 0; i < NE; i++)
770     {
771       if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
772         {
773           /* This is a duplicate.  */
774           if (e[j - 1].ordinal != -1
775               && e[i].ordinal != -1
776               && e[j - 1].ordinal != e[i].ordinal)
777             {
778               if (pe_dll_warn_dup_exports)
779                 /* xgettext:c-format */
780                 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
781                        e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
782             }
783           else
784             {
785               if (pe_dll_warn_dup_exports)
786                 /* xgettext:c-format */
787                 einfo (_("Warning, duplicate EXPORT: %s\n"),
788                        e[j - 1].name);
789             }
790
791           if (e[i].ordinal != -1)
792             e[j - 1].ordinal = e[i].ordinal;
793           e[j - 1].flag_private |= e[i].flag_private;
794           e[j - 1].flag_constant |= e[i].flag_constant;
795           e[j - 1].flag_noname |= e[i].flag_noname;
796           e[j - 1].flag_data |= e[i].flag_data;
797         }
798       else
799         {
800           if (i != j)
801             e[j] = e[i];
802           j++;
803         }
804     }
805   pe_def_file->num_exports = j; /* == NE */
806
807   for (i = 0; i < NE; i++)
808     {
809       char *name;
810
811       /* Check for forward exports */
812       if (strchr (pe_def_file->exports[i].internal_name, '.'))
813         {
814           count_exported++;
815           if (!pe_def_file->exports[i].flag_noname)
816             count_exported_byname++;
817
818           pe_def_file->exports[i].flag_forward = 1;
819
820           if (pe_def_file->exports[i].ordinal != -1)
821             {
822               if (max_ordinal < pe_def_file->exports[i].ordinal)
823                 max_ordinal = pe_def_file->exports[i].ordinal;
824               if (min_ordinal > pe_def_file->exports[i].ordinal)
825                 min_ordinal = pe_def_file->exports[i].ordinal;
826               count_with_ordinals++;
827             }
828
829           continue;
830         }
831
832       name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
833       if (pe_details->underscored
834           && (*pe_def_file->exports[i].internal_name != '@'))
835         {
836           *name = '_';
837           strcpy (name + 1, pe_def_file->exports[i].internal_name);
838         }
839       else
840         strcpy (name, pe_def_file->exports[i].internal_name);
841
842       blhe = bfd_link_hash_lookup (info->hash,
843                                    name,
844                                    FALSE, FALSE, TRUE);
845
846       if (blhe
847           && (blhe->type == bfd_link_hash_defined
848               || (blhe->type == bfd_link_hash_common)))
849         {
850           count_exported++;
851           if (!pe_def_file->exports[i].flag_noname)
852             count_exported_byname++;
853
854           /* Only fill in the sections. The actual offsets are computed
855              in fill_exported_offsets() after common symbols are laid
856              out.  */
857           if (blhe->type == bfd_link_hash_defined)
858             exported_symbol_sections[i] = blhe->u.def.section;
859           else
860             exported_symbol_sections[i] = blhe->u.c.p->section;
861
862           if (pe_def_file->exports[i].ordinal != -1)
863             {
864               if (max_ordinal < pe_def_file->exports[i].ordinal)
865                 max_ordinal = pe_def_file->exports[i].ordinal;
866               if (min_ordinal > pe_def_file->exports[i].ordinal)
867                 min_ordinal = pe_def_file->exports[i].ordinal;
868               count_with_ordinals++;
869             }
870         }
871       else if (blhe && blhe->type == bfd_link_hash_undefined)
872         {
873           /* xgettext:c-format */
874           einfo (_("%XCannot export %s: symbol not defined\n"),
875                  pe_def_file->exports[i].internal_name);
876         }
877       else if (blhe)
878         {
879           /* xgettext:c-format */
880           einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
881                  pe_def_file->exports[i].internal_name,
882                  blhe->type, bfd_link_hash_defined);
883         }
884       else
885         {
886           /* xgettext:c-format */
887           einfo (_("%XCannot export %s: symbol not found\n"),
888                  pe_def_file->exports[i].internal_name);
889         }
890       free (name);
891     }
892 }
893
894 /* Build the bfd that will contain .edata and .reloc sections.  */
895
896 static void
897 build_filler_bfd (int include_edata)
898 {
899   lang_input_statement_type *filler_file;
900   filler_file = lang_add_input_file ("dll stuff",
901                                      lang_input_file_is_fake_enum,
902                                      NULL);
903   filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff",
904                                                   link_info.output_bfd);
905   if (filler_bfd == NULL
906       || !bfd_set_arch_mach (filler_bfd,
907                              bfd_get_arch (link_info.output_bfd),
908                              bfd_get_mach (link_info.output_bfd)))
909     {
910       einfo ("%X%P: can not create BFD: %E\n");
911       return;
912     }
913
914   if (include_edata)
915     {
916       edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
917       if (edata_s == NULL
918           || !bfd_set_section_flags (filler_bfd, edata_s,
919                                      (SEC_HAS_CONTENTS
920                                       | SEC_ALLOC
921                                       | SEC_LOAD
922                                       | SEC_KEEP
923                                       | SEC_IN_MEMORY)))
924         {
925           einfo ("%X%P: can not create .edata section: %E\n");
926           return;
927         }
928       bfd_set_section_size (filler_bfd, edata_s, edata_sz);
929     }
930
931   reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
932   if (reloc_s == NULL
933       || !bfd_set_section_flags (filler_bfd, reloc_s,
934                                  (SEC_HAS_CONTENTS
935                                   | SEC_ALLOC
936                                   | SEC_LOAD
937                                   | SEC_KEEP
938                                   | SEC_IN_MEMORY)))
939     {
940       einfo ("%X%P: can not create .reloc section: %E\n");
941       return;
942     }
943
944   bfd_set_section_size (filler_bfd, reloc_s, 0);
945
946   ldlang_add_file (filler_file);
947 }
948
949 /* Gather all the exported symbols and build the .edata section.  */
950
951 static void
952 generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
953 {
954   int i, next_ordinal;
955   int name_table_size = 0;
956   const char *dlnp;
957
958   /* First, we need to know how many exported symbols there are,
959      and what the range of ordinals is.  */
960   if (pe_def_file->name)
961     dll_name = pe_def_file->name;
962   else
963     {
964       dll_name = abfd->filename;
965
966       for (dlnp = dll_name; *dlnp; dlnp++)
967         if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
968           dll_name = dlnp + 1;
969     }
970
971   if (count_with_ordinals && max_ordinal > count_exported)
972     {
973       if (min_ordinal > max_ordinal - count_exported + 1)
974         min_ordinal = max_ordinal - count_exported + 1;
975     }
976   else
977     {
978       min_ordinal = 1;
979       max_ordinal = count_exported;
980     }
981
982   export_table_size = max_ordinal - min_ordinal + 1;
983   exported_symbols = xmalloc (export_table_size * sizeof (int));
984   for (i = 0; i < export_table_size; i++)
985     exported_symbols[i] = -1;
986
987   /* Now we need to assign ordinals to those that don't have them.  */
988   for (i = 0; i < NE; i++)
989     {
990       if (exported_symbol_sections[i] ||
991           pe_def_file->exports[i].flag_forward)
992         {
993           if (pe_def_file->exports[i].ordinal != -1)
994             {
995               int ei = pe_def_file->exports[i].ordinal - min_ordinal;
996               int pi = exported_symbols[ei];
997
998               if (pi != -1)
999                 {
1000                   /* xgettext:c-format */
1001                   einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
1002                          pe_def_file->exports[i].ordinal,
1003                          pe_def_file->exports[i].name,
1004                          pe_def_file->exports[pi].name);
1005                 }
1006               exported_symbols[ei] = i;
1007             }
1008           name_table_size += strlen (pe_def_file->exports[i].name) + 1;
1009         }
1010
1011       /* Reserve space for the forward name. */
1012       if (pe_def_file->exports[i].flag_forward)
1013         {
1014           name_table_size += strlen (pe_def_file->exports[i].internal_name) + 1;
1015         }
1016     }
1017
1018   next_ordinal = min_ordinal;
1019   for (i = 0; i < NE; i++)
1020     if ((exported_symbol_sections[i] ||
1021          pe_def_file->exports[i].flag_forward) &&
1022         pe_def_file->exports[i].ordinal == -1)
1023       {
1024         while (exported_symbols[next_ordinal - min_ordinal] != -1)
1025           next_ordinal++;
1026
1027         exported_symbols[next_ordinal - min_ordinal] = i;
1028         pe_def_file->exports[i].ordinal = next_ordinal;
1029       }
1030
1031   /* OK, now we can allocate some memory.  */
1032   edata_sz = (40                                /* directory */
1033               + 4 * export_table_size           /* addresses */
1034               + 4 * count_exported_byname       /* name ptrs */
1035               + 2 * count_exported_byname       /* ordinals */
1036               + name_table_size + strlen (dll_name) + 1);
1037 }
1038
1039 /* Fill the exported symbol offsets. The preliminary work has already
1040    been done in process_def_file().  */
1041
1042 static void
1043 fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
1044 {
1045   int i;
1046   struct bfd_link_hash_entry *blhe;
1047
1048   for (i = 0; i < pe_def_file->num_exports; i++)
1049     {
1050       char *name;
1051
1052       name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
1053       if (pe_details->underscored
1054           && *pe_def_file->exports[i].internal_name != '@')
1055         {
1056           *name = '_';
1057           strcpy (name + 1, pe_def_file->exports[i].internal_name);
1058         }
1059       else
1060         strcpy (name, pe_def_file->exports[i].internal_name);
1061
1062       blhe = bfd_link_hash_lookup (info->hash,
1063                                    name,
1064                                    FALSE, FALSE, TRUE);
1065
1066       if (blhe && blhe->type == bfd_link_hash_defined)
1067         exported_symbol_offsets[i] = blhe->u.def.value;
1068
1069       free (name);
1070     }
1071 }
1072
1073 static void
1074 fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
1075 {
1076   int s, hint;
1077   unsigned char *edirectory;
1078   unsigned char *eaddresses;
1079   unsigned char *enameptrs;
1080   unsigned char *eordinals;
1081   char *enamestr;
1082   time_t now;
1083
1084   time (&now);
1085
1086   edata_d = xmalloc (edata_sz);
1087
1088   /* Note use of array pointer math here.  */
1089   edirectory = edata_d;
1090   eaddresses = edata_d + 40;
1091   enameptrs = eaddresses + 4 * export_table_size;
1092   eordinals = enameptrs + 4 * count_exported_byname;
1093   enamestr = (char *) eordinals + 2 * count_exported_byname;
1094
1095 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
1096                    + edata_s->output_section->vma - image_base)
1097
1098   memset (edata_d, 0, edata_sz);
1099   bfd_put_32 (abfd, now, edata_d + 4);
1100   if (pe_def_file->version_major != -1)
1101     {
1102       bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
1103       bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
1104     }
1105
1106   bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
1107   strcpy (enamestr, dll_name);
1108   enamestr += strlen (enamestr) + 1;
1109   bfd_put_32 (abfd, min_ordinal, edata_d + 16);
1110   bfd_put_32 (abfd, export_table_size, edata_d + 20);
1111   bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
1112   bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
1113   bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
1114   bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
1115
1116   fill_exported_offsets (abfd, info);
1117
1118   /* Ok, now for the filling in part.
1119      Scan alphabetically - ie the ordering in the exports[] table,
1120      rather than by ordinal - the ordering in the exported_symbol[]
1121      table.  See dlltool.c and:
1122         http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1123      for more information.  */
1124   hint = 0;
1125   for (s = 0; s < NE; s++)
1126     {
1127       struct bfd_section *ssec = exported_symbol_sections[s];
1128       if (pe_def_file->exports[s].ordinal != -1 &&
1129           (pe_def_file->exports[s].flag_forward || ssec != NULL))
1130         {
1131           int ord = pe_def_file->exports[s].ordinal;
1132
1133           if (pe_def_file->exports[s].flag_forward)
1134             {
1135               bfd_put_32 (abfd, ERVA (enamestr),
1136                           eaddresses + 4 * (ord - min_ordinal));
1137
1138               strcpy (enamestr, pe_def_file->exports[s].internal_name);
1139               enamestr += strlen (pe_def_file->exports[s].internal_name) + 1;
1140             }
1141           else
1142             {
1143               bfd_vma srva = (exported_symbol_offsets[s]
1144                                     + ssec->output_section->vma
1145                                     + ssec->output_offset);
1146
1147               bfd_put_32 (abfd, srva - image_base,
1148                           eaddresses + 4 * (ord - min_ordinal));
1149             }
1150
1151           if (!pe_def_file->exports[s].flag_noname)
1152             {
1153               char *ename = pe_def_file->exports[s].name;
1154
1155               bfd_put_32 (abfd, ERVA (enamestr), enameptrs);
1156               enameptrs += 4;
1157               strcpy (enamestr, ename);
1158               enamestr += strlen (enamestr) + 1;
1159               bfd_put_16 (abfd, ord - min_ordinal, eordinals);
1160               eordinals += 2;
1161               pe_def_file->exports[s].hint = hint++;
1162             }
1163         }
1164     }
1165 }
1166
1167
1168 static struct bfd_section *current_sec;
1169
1170 void
1171 pe_walk_relocs_of_symbol (struct bfd_link_info *info,
1172                           const char *name,
1173                           int (*cb) (arelent *, asection *))
1174 {
1175   bfd *b;
1176   asection *s;
1177
1178   for (b = info->input_bfds; b; b = b->link_next)
1179     {
1180       asymbol **symbols;
1181       int nsyms;
1182
1183       if (!bfd_generic_link_read_symbols (b))
1184         {
1185           einfo (_("%B%F: could not read symbols: %E\n"), b);
1186           return;
1187         }
1188
1189       symbols = bfd_get_outsymbols (b);
1190       nsyms = bfd_get_symcount (b);
1191
1192       for (s = b->sections; s; s = s->next)
1193         {
1194           arelent **relocs;
1195           int relsize, nrelocs, i;
1196           int flags = bfd_get_section_flags (b, s);
1197
1198           /* Skip discarded linkonce sections.  */
1199           if (flags & SEC_LINK_ONCE
1200               && s->output_section == bfd_abs_section_ptr)
1201             continue;
1202
1203           current_sec = s;
1204
1205           relsize = bfd_get_reloc_upper_bound (b, s);
1206           relocs = xmalloc (relsize);
1207           nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1208
1209           for (i = 0; i < nrelocs; i++)
1210             {
1211               struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1212
1213               if (!strcmp (name, sym->name))
1214                 cb (relocs[i], s);
1215             }
1216
1217           free (relocs);
1218
1219           /* Warning: the allocated symbols are remembered in BFD and reused
1220              later, so don't free them! */
1221           /* free (symbols); */
1222         }
1223     }
1224 }
1225
1226 /* Gather all the relocations and build the .reloc section.  */
1227
1228 static void
1229 generate_reloc (bfd *abfd, struct bfd_link_info *info)
1230 {
1231
1232   /* For .reloc stuff.  */
1233   reloc_data_type *reloc_data;
1234   int total_relocs = 0;
1235   int i;
1236   bfd_vma sec_page = (bfd_vma) -1;
1237   bfd_vma page_ptr, page_count;
1238   int bi;
1239   bfd *b;
1240   struct bfd_section *s;
1241
1242   total_relocs = 0;
1243   for (b = info->input_bfds; b; b = b->link_next)
1244     for (s = b->sections; s; s = s->next)
1245       total_relocs += s->reloc_count;
1246
1247   reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
1248
1249   total_relocs = 0;
1250   bi = 0;
1251   for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1252     {
1253       arelent **relocs;
1254       int relsize, nrelocs, i;
1255
1256       for (s = b->sections; s; s = s->next)
1257         {
1258           bfd_vma sec_vma = s->output_section->vma + s->output_offset;
1259           asymbol **symbols;
1260           int nsyms;
1261
1262           /* If it's not loaded, we don't need to relocate it this way.  */
1263           if (!(s->output_section->flags & SEC_LOAD))
1264             continue;
1265
1266           /* I don't know why there would be a reloc for these, but I've
1267              seen it happen - DJ  */
1268           if (s->output_section == &bfd_abs_section)
1269             continue;
1270
1271           if (s->output_section->vma == 0)
1272             {
1273               /* Huh?  Shouldn't happen, but punt if it does.  */
1274               einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1275                      s->output_section->name, s->output_section->index,
1276                      s->output_section->flags);
1277               continue;
1278             }
1279
1280           if (!bfd_generic_link_read_symbols (b))
1281             {
1282               einfo (_("%B%F: could not read symbols: %E\n"), b);
1283               return;
1284             }
1285
1286           symbols = bfd_get_outsymbols (b);
1287           nsyms = bfd_get_symcount (b);
1288           relsize = bfd_get_reloc_upper_bound (b, s);
1289           relocs = xmalloc (relsize);
1290           nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1291
1292           for (i = 0; i < nrelocs; i++)
1293             {
1294               if (pe_dll_extra_pe_debug)
1295                 {
1296                   struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1297                   printf ("rel: %s\n", sym->name);
1298                 }
1299               if (!relocs[i]->howto->pc_relative
1300                   && relocs[i]->howto->type != pe_details->imagebase_reloc)
1301                 {
1302                   bfd_vma sym_vma;
1303                   struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1304
1305                   /* Don't create relocs for undefined weak symbols.  */ 
1306                   if (sym->flags == BSF_WEAK)
1307                     {
1308                       struct bfd_link_hash_entry *blhe
1309                         = bfd_link_hash_lookup (info->hash, sym->name,
1310                                                 FALSE, FALSE, FALSE);
1311                       if (!blhe || blhe->type != bfd_link_hash_defined)
1312                         continue;                     
1313                     }
1314
1315                   sym_vma = (relocs[i]->addend
1316                              + sym->value
1317                              + sym->section->vma
1318                              + sym->section->output_offset
1319                              + sym->section->output_section->vma);
1320                   reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1321
1322 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1323
1324                   switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1325                                          relocs[i]->howto->rightshift)
1326                     {
1327 #ifdef pe_use_x86_64
1328                     case BITS_AND_SHIFT (64, 0):
1329                       reloc_data[total_relocs].type = 10;
1330                       total_relocs++;
1331                       break;
1332 #endif
1333                     case BITS_AND_SHIFT (32, 0):
1334                       reloc_data[total_relocs].type = 3;
1335                       total_relocs++;
1336                       break;
1337                     case BITS_AND_SHIFT (16, 0):
1338                       reloc_data[total_relocs].type = 2;
1339                       total_relocs++;
1340                       break;
1341                     case BITS_AND_SHIFT (16, 16):
1342                       reloc_data[total_relocs].type = 4;
1343                       /* FIXME: we can't know the symbol's right value
1344                          yet, but we probably can safely assume that
1345                          CE will relocate us in 64k blocks, so leaving
1346                          it zero is safe.  */
1347                       reloc_data[total_relocs].extra = 0;
1348                       total_relocs++;
1349                       break;
1350                     case BITS_AND_SHIFT (26, 2):
1351                       reloc_data[total_relocs].type = 5;
1352                       total_relocs++;
1353                       break;
1354                     case BITS_AND_SHIFT (24, 2):
1355                       /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1356                          Those ARM_xxx definitions should go in proper
1357                          header someday.  */
1358                       if (relocs[i]->howto->type == 0
1359                           /* Older GNU linkers used 5 instead of 0 for this reloc.  */
1360                           || relocs[i]->howto->type == 5)
1361                         /* This is an ARM_26D reloc, which is an ARM_26 reloc
1362                            that has already been fully processed during a
1363                            previous link stage, so ignore it here.  */
1364                         break;
1365                       /* Fall through.  */
1366                     default:
1367                       /* xgettext:c-format */
1368                       einfo (_("%XError: %d-bit reloc in dll\n"),
1369                              relocs[i]->howto->bitsize);
1370                       break;
1371                     }
1372                 }
1373             }
1374           free (relocs);
1375           /* Warning: the allocated symbols are remembered in BFD and
1376              reused later, so don't free them!  */
1377         }
1378     }
1379
1380   /* At this point, we have total_relocs relocation addresses in
1381      reloc_addresses, which are all suitable for the .reloc section.
1382      We must now create the new sections.  */
1383   qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1384
1385   for (i = 0; i < total_relocs; i++)
1386     {
1387       bfd_vma this_page = (reloc_data[i].vma >> 12);
1388
1389       if (this_page != sec_page)
1390         {
1391           reloc_sz = (reloc_sz + 3) & ~3;       /* 4-byte align.  */
1392           reloc_sz += 8;
1393           sec_page = this_page;
1394         }
1395
1396       reloc_sz += 2;
1397
1398       if (reloc_data[i].type == 4)
1399         reloc_sz += 2;
1400     }
1401
1402   reloc_sz = (reloc_sz + 3) & ~3;       /* 4-byte align.  */
1403   reloc_d = xmalloc (reloc_sz);
1404   sec_page = (bfd_vma) -1;
1405   reloc_sz = 0;
1406   page_ptr = (bfd_vma) -1;
1407   page_count = 0;
1408
1409   for (i = 0; i < total_relocs; i++)
1410     {
1411       bfd_vma rva = reloc_data[i].vma - image_base;
1412       bfd_vma this_page = (rva & ~0xfff);
1413
1414       if (this_page != sec_page)
1415         {
1416           while (reloc_sz & 3)
1417             reloc_d[reloc_sz++] = 0;
1418
1419           if (page_ptr != (bfd_vma) -1)
1420             bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1421
1422           bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1423           page_ptr = reloc_sz;
1424           reloc_sz += 8;
1425           sec_page = this_page;
1426           page_count = 0;
1427         }
1428
1429       bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1430                   reloc_d + reloc_sz);
1431       reloc_sz += 2;
1432
1433       if (reloc_data[i].type == 4)
1434         {
1435           bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1436           reloc_sz += 2;
1437         }
1438
1439       page_count++;
1440     }
1441
1442   while (reloc_sz & 3)
1443     reloc_d[reloc_sz++] = 0;
1444
1445   if (page_ptr != (bfd_vma) -1)
1446     bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1447
1448   while (reloc_sz < reloc_s->size)
1449     reloc_d[reloc_sz++] = 0;
1450 }
1451
1452 /* Given the exiting def_file structure, print out a .DEF file that
1453    corresponds to it.  */
1454
1455 static void
1456 quoteput (char *s, FILE *f, int needs_quotes)
1457 {
1458   char *cp;
1459
1460   for (cp = s; *cp; cp++)
1461     if (*cp == '\''
1462         || *cp == '"'
1463         || *cp == '\\'
1464         || ISSPACE (*cp)
1465         || *cp == ','
1466         || *cp == ';')
1467       needs_quotes = 1;
1468
1469   if (needs_quotes)
1470     {
1471       putc ('"', f);
1472
1473       while (*s)
1474         {
1475           if (*s == '"' || *s == '\\')
1476             putc ('\\', f);
1477
1478           putc (*s, f);
1479           s++;
1480         }
1481
1482       putc ('"', f);
1483     }
1484   else
1485     fputs (s, f);
1486 }
1487
1488 void
1489 pe_dll_generate_def_file (const char *pe_out_def_filename)
1490 {
1491   int i;
1492   FILE *out = fopen (pe_out_def_filename, "w");
1493
1494   if (out == NULL)
1495     /* xgettext:c-format */
1496     einfo (_("%s: Can't open output def file %s\n"),
1497            program_name, pe_out_def_filename);
1498
1499   if (pe_def_file)
1500     {
1501       if (pe_def_file->name)
1502         {
1503           if (pe_def_file->is_dll)
1504             fprintf (out, "LIBRARY ");
1505           else
1506             fprintf (out, "NAME ");
1507
1508           quoteput (pe_def_file->name, out, 1);
1509
1510           if (pe_data (link_info.output_bfd)->pe_opthdr.ImageBase)
1511             {
1512               fprintf (out, " BASE=0x");
1513               fprintf_vma (out, ((bfd_vma) pe_data (link_info.output_bfd)->pe_opthdr.ImageBase));
1514             }
1515           fprintf (out, "\n");
1516         }
1517
1518       if (pe_def_file->description)
1519         {
1520           fprintf (out, "DESCRIPTION ");
1521           quoteput (pe_def_file->description, out, 1);
1522           fprintf (out, "\n");
1523         }
1524
1525       if (pe_def_file->version_minor != -1)
1526         fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1527                  pe_def_file->version_minor);
1528       else if (pe_def_file->version_major != -1)
1529         fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1530
1531       if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1532         fprintf (out, "\n");
1533
1534       if (pe_def_file->stack_commit != -1)
1535         fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1536                  pe_def_file->stack_reserve, pe_def_file->stack_commit);
1537       else if (pe_def_file->stack_reserve != -1)
1538         fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1539
1540       if (pe_def_file->heap_commit != -1)
1541         fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1542                  pe_def_file->heap_reserve, pe_def_file->heap_commit);
1543       else if (pe_def_file->heap_reserve != -1)
1544         fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1545
1546       if (pe_def_file->num_section_defs > 0)
1547         {
1548           fprintf (out, "\nSECTIONS\n\n");
1549
1550           for (i = 0; i < pe_def_file->num_section_defs; i++)
1551             {
1552               fprintf (out, "    ");
1553               quoteput (pe_def_file->section_defs[i].name, out, 0);
1554
1555               if (pe_def_file->section_defs[i].class)
1556                 {
1557                   fprintf (out, " CLASS ");
1558                   quoteput (pe_def_file->section_defs[i].class, out, 0);
1559                 }
1560
1561               if (pe_def_file->section_defs[i].flag_read)
1562                 fprintf (out, " READ");
1563
1564               if (pe_def_file->section_defs[i].flag_write)
1565                 fprintf (out, " WRITE");
1566
1567               if (pe_def_file->section_defs[i].flag_execute)
1568                 fprintf (out, " EXECUTE");
1569
1570               if (pe_def_file->section_defs[i].flag_shared)
1571                 fprintf (out, " SHARED");
1572
1573               fprintf (out, "\n");
1574             }
1575         }
1576
1577       if (pe_def_file->num_exports > 0)
1578         {
1579           fprintf (out, "EXPORTS\n");
1580
1581           for (i = 0; i < pe_def_file->num_exports; i++)
1582             {
1583               def_file_export *e = pe_def_file->exports + i;
1584               fprintf (out, "    ");
1585               quoteput (e->name, out, 0);
1586
1587               if (e->internal_name && strcmp (e->internal_name, e->name))
1588                 {
1589                   fprintf (out, " = ");
1590                   quoteput (e->internal_name, out, 0);
1591                 }
1592
1593               if (e->ordinal != -1)
1594                 fprintf (out, " @%d", e->ordinal);
1595
1596               if (e->flag_private)
1597                 fprintf (out, " PRIVATE");
1598
1599               if (e->flag_constant)
1600                 fprintf (out, " CONSTANT");
1601
1602               if (e->flag_noname)
1603                 fprintf (out, " NONAME");
1604
1605               if (e->flag_data)
1606                 fprintf (out, " DATA");
1607
1608               fprintf (out, "\n");
1609             }
1610         }
1611
1612       if (pe_def_file->num_imports > 0)
1613         {
1614           fprintf (out, "\nIMPORTS\n\n");
1615
1616           for (i = 0; i < pe_def_file->num_imports; i++)
1617             {
1618               def_file_import *im = pe_def_file->imports + i;
1619               fprintf (out, "    ");
1620
1621               if (im->internal_name
1622                   && (!im->name || strcmp (im->internal_name, im->name)))
1623                 {
1624                   quoteput (im->internal_name, out, 0);
1625                   fprintf (out, " = ");
1626                 }
1627
1628               quoteput (im->module->name, out, 0);
1629               fprintf (out, ".");
1630
1631               if (im->name)
1632                 quoteput (im->name, out, 0);
1633               else
1634                 fprintf (out, "%d", im->ordinal);
1635
1636               fprintf (out, "\n");
1637             }
1638         }
1639     }
1640   else
1641     fprintf (out, _("; no contents available\n"));
1642
1643   if (fclose (out) == EOF)
1644     /* xgettext:c-format */
1645     einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1646 }
1647
1648 /* Generate the import library.  */
1649
1650 static asymbol **symtab;
1651 static int symptr;
1652 static int tmp_seq;
1653 static const char *dll_filename;
1654 static char *dll_symname;
1655
1656 #define UNDSEC (asection *) &bfd_und_section
1657
1658 static asection *
1659 quick_section (bfd *abfd, const char *name, int flags, int align)
1660 {
1661   asection *sec;
1662   asymbol *sym;
1663
1664   sec = bfd_make_section_old_way (abfd, name);
1665   bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1666   bfd_set_section_alignment (abfd, sec, align);
1667   /* Remember to undo this before trying to link internally!  */
1668   sec->output_section = sec;
1669
1670   sym = bfd_make_empty_symbol (abfd);
1671   symtab[symptr++] = sym;
1672   sym->name = sec->name;
1673   sym->section = sec;
1674   sym->flags = BSF_LOCAL;
1675   sym->value = 0;
1676
1677   return sec;
1678 }
1679
1680 static void
1681 quick_symbol (bfd *abfd,
1682               const char *n1,
1683               const char *n2,
1684               const char *n3,
1685               asection *sec,
1686               int flags,
1687               int addr)
1688 {
1689   asymbol *sym;
1690   char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1691
1692   strcpy (name, n1);
1693   strcat (name, n2);
1694   strcat (name, n3);
1695   sym = bfd_make_empty_symbol (abfd);
1696   sym->name = name;
1697   sym->section = sec;
1698   sym->flags = flags;
1699   sym->value = addr;
1700   symtab[symptr++] = sym;
1701 }
1702
1703 static arelent *reltab = 0;
1704 static int relcount = 0, relsize = 0;
1705
1706 static void
1707 quick_reloc (bfd *abfd, bfd_size_type address, int which_howto, int symidx)
1708 {
1709   if (relcount >= relsize - 1)
1710     {
1711       relsize += 10;
1712       if (reltab)
1713         reltab = xrealloc (reltab, relsize * sizeof (arelent));
1714       else
1715         reltab = xmalloc (relsize * sizeof (arelent));
1716     }
1717   reltab[relcount].address = address;
1718   reltab[relcount].addend = 0;
1719   reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1720   reltab[relcount].sym_ptr_ptr = symtab + symidx;
1721   relcount++;
1722 }
1723
1724 static void
1725 save_relocs (asection *sec)
1726 {
1727   int i;
1728
1729   sec->relocation = reltab;
1730   sec->reloc_count = relcount;
1731   sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
1732   for (i = 0; i < relcount; i++)
1733     sec->orelocation[i] = sec->relocation + i;
1734   sec->orelocation[relcount] = 0;
1735   sec->flags |= SEC_RELOC;
1736   reltab = 0;
1737   relcount = relsize = 0;
1738 }
1739
1740 /*      .section        .idata$2
1741         .global         __head_my_dll
1742    __head_my_dll:
1743         .rva            hname
1744         .long           0
1745         .long           0
1746         .rva            __my_dll_iname
1747         .rva            fthunk
1748
1749         .section        .idata$5
1750         .long           0
1751    fthunk:
1752
1753         .section        .idata$4
1754         .long           0
1755    hname:                              */
1756
1757 static bfd *
1758 make_head (bfd *parent)
1759 {
1760   asection *id2, *id5, *id4;
1761   unsigned char *d2, *d5, *d4;
1762   char *oname;
1763   bfd *abfd;
1764
1765   oname = xmalloc (20);
1766   sprintf (oname, "d%06d.o", tmp_seq);
1767   tmp_seq++;
1768
1769   abfd = bfd_create (oname, parent);
1770   bfd_find_target (pe_details->object_target, abfd);
1771   bfd_make_writable (abfd);
1772
1773   bfd_set_format (abfd, bfd_object);
1774   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1775
1776   symptr = 0;
1777   symtab = xmalloc (6 * sizeof (asymbol *));
1778   id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1779   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1780   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1781   quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1782   quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1783
1784   /* OK, pay attention here.  I got confused myself looking back at
1785      it.  We create a four-byte section to mark the beginning of the
1786      list, and we include an offset of 4 in the section, so that the
1787      pointer to the list points to the *end* of this section, which is
1788      the start of the list of sections from other objects.  */
1789
1790   bfd_set_section_size (abfd, id2, 20);
1791   d2 = xmalloc (20);
1792   id2->contents = d2;
1793   memset (d2, 0, 20);
1794   d2[0] = d2[16] = PE_IDATA5_SIZE; /* Reloc addend.  */
1795   quick_reloc (abfd,  0, BFD_RELOC_RVA, 2);
1796   quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1797   quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1798   save_relocs (id2);
1799
1800   bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1801   d5 = xmalloc (PE_IDATA5_SIZE);
1802   id5->contents = d5;
1803   memset (d5, 0, PE_IDATA5_SIZE);
1804
1805   bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1806   d4 = xmalloc (PE_IDATA4_SIZE);
1807   id4->contents = d4;
1808   memset (d4, 0, PE_IDATA4_SIZE);
1809
1810   bfd_set_symtab (abfd, symtab, symptr);
1811
1812   bfd_set_section_contents (abfd, id2, d2, 0, 20);
1813   bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1814   bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1815
1816   bfd_make_readable (abfd);
1817   return abfd;
1818 }
1819
1820 /*      .section        .idata$4
1821         .long           0
1822         [.long          0] for PE+
1823         .section        .idata$5
1824         .long           0
1825         [.long          0] for PE+
1826         .section        idata$7
1827         .global         __my_dll_iname
1828   __my_dll_iname:
1829         .asciz          "my.dll"       */
1830
1831 static bfd *
1832 make_tail (bfd *parent)
1833 {
1834   asection *id4, *id5, *id7;
1835   unsigned char *d4, *d5, *d7;
1836   int len;
1837   char *oname;
1838   bfd *abfd;
1839
1840   oname = xmalloc (20);
1841   sprintf (oname, "d%06d.o", tmp_seq);
1842   tmp_seq++;
1843
1844   abfd = bfd_create (oname, parent);
1845   bfd_find_target (pe_details->object_target, abfd);
1846   bfd_make_writable (abfd);
1847
1848   bfd_set_format (abfd, bfd_object);
1849   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1850
1851   symptr = 0;
1852   symtab = xmalloc (5 * sizeof (asymbol *));
1853   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1854   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1855   id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1856   quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1857
1858   bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1859   d4 = xmalloc (PE_IDATA4_SIZE);
1860   id4->contents = d4;
1861   memset (d4, 0, PE_IDATA4_SIZE);
1862
1863   bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1864   d5 = xmalloc (PE_IDATA5_SIZE);
1865   id5->contents = d5;
1866   memset (d5, 0, PE_IDATA5_SIZE);
1867
1868   len = strlen (dll_filename) + 1;
1869   if (len & 1)
1870     len++;
1871   bfd_set_section_size (abfd, id7, len);
1872   d7 = xmalloc (len);
1873   id7->contents = d7;
1874   strcpy ((char *) d7, dll_filename);
1875   /* If len was odd, the above
1876      strcpy leaves behind an undefined byte. That is harmless,
1877      but we set it to 0 just so the binary dumps are pretty.  */
1878   d7[len - 1] = 0;
1879
1880   bfd_set_symtab (abfd, symtab, symptr);
1881
1882   bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1883   bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1884   bfd_set_section_contents (abfd, id7, d7, 0, len);
1885
1886   bfd_make_readable (abfd);
1887   return abfd;
1888 }
1889
1890 /*      .text
1891         .global         _function
1892         .global         ___imp_function
1893         .global         __imp__function
1894   _function:
1895         jmp             *__imp__function:
1896
1897         .section        idata$7
1898         .long           __head_my_dll
1899
1900         .section        .idata$5
1901   ___imp_function:
1902   __imp__function:
1903   iat?
1904         .section        .idata$4
1905   iat?
1906         .section        .idata$6
1907   ID<ordinal>:
1908         .short          <hint>
1909         .asciz          "function" xlate? (add underscore, kill at)  */
1910
1911 static const unsigned char jmp_ix86_bytes[] =
1912 {
1913   0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1914 };
1915
1916 /* _function:
1917         mov.l   ip+8,r0
1918         mov.l   @r0,r0
1919         jmp     @r0
1920         nop
1921         .dw     __imp_function   */
1922
1923 static const unsigned char jmp_sh_bytes[] =
1924 {
1925   0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
1926 };
1927
1928 /* _function:
1929         lui     $t0,<high:__imp_function>
1930         lw      $t0,<low:__imp_function>
1931         jr      $t0
1932         nop                              */
1933
1934 static const unsigned char jmp_mips_bytes[] =
1935 {
1936   0x00, 0x00, 0x08, 0x3c,  0x00, 0x00, 0x08, 0x8d,
1937   0x08, 0x00, 0x00, 0x01,  0x00, 0x00, 0x00, 0x00
1938 };
1939
1940 static const unsigned char jmp_arm_bytes[] =
1941 {
1942   0x00, 0xc0, 0x9f, 0xe5,       /* ldr  ip, [pc] */
1943   0x00, 0xf0, 0x9c, 0xe5,       /* ldr  pc, [ip] */
1944   0,    0,    0,    0
1945 };
1946
1947
1948 static bfd *
1949 make_one (def_file_export *exp, bfd *parent, bfd_boolean include_jmp_stub)
1950 {
1951   asection *tx, *id7, *id5, *id4, *id6;
1952   unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
1953   int len;
1954   char *oname;
1955   bfd *abfd;
1956   const unsigned char *jmp_bytes = NULL;
1957   int jmp_byte_count = 0;
1958
1959   /* Include the jump stub section only if it is needed. A jump
1960      stub is needed if the symbol being imported <sym> is a function
1961      symbol and there is at least one undefined reference to that
1962      symbol. In other words, if all the import references to <sym> are
1963      explicitly through _declspec(dllimport) then the jump stub is not
1964      needed.  */
1965   if (include_jmp_stub)
1966     {
1967       switch (pe_details->pe_arch)
1968         {
1969         case PE_ARCH_i386:
1970           jmp_bytes = jmp_ix86_bytes;
1971           jmp_byte_count = sizeof (jmp_ix86_bytes);
1972           break;
1973         case PE_ARCH_sh:
1974           jmp_bytes = jmp_sh_bytes;
1975           jmp_byte_count = sizeof (jmp_sh_bytes);
1976           break;
1977         case PE_ARCH_mips:
1978           jmp_bytes = jmp_mips_bytes;
1979           jmp_byte_count = sizeof (jmp_mips_bytes);
1980           break;
1981         case PE_ARCH_arm:
1982         case PE_ARCH_arm_epoc:
1983         case PE_ARCH_arm_wince:
1984           jmp_bytes = jmp_arm_bytes;
1985           jmp_byte_count = sizeof (jmp_arm_bytes);
1986           break;
1987         default:
1988           abort ();
1989         }
1990     }
1991
1992   oname = xmalloc (20);
1993   sprintf (oname, "d%06d.o", tmp_seq);
1994   tmp_seq++;
1995
1996   abfd = bfd_create (oname, parent);
1997   bfd_find_target (pe_details->object_target, abfd);
1998   bfd_make_writable (abfd);
1999
2000   bfd_set_format (abfd, bfd_object);
2001   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2002
2003   symptr = 0;
2004   symtab = xmalloc (11 * sizeof (asymbol *));
2005   tx  = quick_section (abfd, ".text",    SEC_CODE|SEC_HAS_CONTENTS, 2);
2006   id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
2007   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2008   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2009   id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
2010
2011   if  (*exp->internal_name == '@')
2012     {
2013       quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2014                     BSF_GLOBAL, 0);
2015       if (include_jmp_stub)
2016         quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
2017       quick_symbol (abfd, "__imp_", exp->internal_name, "", id5,
2018                     BSF_GLOBAL, 0);
2019       /* Fastcall applies only to functions,
2020          so no need for auto-import symbol.  */
2021     }
2022   else
2023     {
2024       quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2025                     BSF_GLOBAL, 0);
2026       if (include_jmp_stub)
2027         quick_symbol (abfd, U (""), exp->internal_name, "", tx,
2028                       BSF_GLOBAL, 0);
2029       quick_symbol (abfd, "__imp_", U (""), exp->internal_name, id5,
2030                     BSF_GLOBAL, 0);
2031       /* Symbol to reference ord/name of imported
2032          data symbol, used to implement auto-import.  */
2033       if (exp->flag_data)
2034         quick_symbol (abfd, U ("_nm_"), U (""), exp->internal_name, id6,
2035                       BSF_GLOBAL,0);
2036     }
2037   if (pe_dll_compat_implib)
2038     quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", id5,
2039                   BSF_GLOBAL, 0);
2040
2041   if (include_jmp_stub)
2042     {
2043       bfd_set_section_size (abfd, tx, jmp_byte_count);
2044       td = xmalloc (jmp_byte_count);
2045       tx->contents = td;
2046       memcpy (td, jmp_bytes, jmp_byte_count);
2047
2048       switch (pe_details->pe_arch)
2049         {
2050         case PE_ARCH_i386:
2051 #ifdef pe_use_x86_64
2052           quick_reloc (abfd, 2, BFD_RELOC_32_PCREL, 2);
2053 #else
2054           quick_reloc (abfd, 2, BFD_RELOC_32, 2);
2055 #endif
2056           break;
2057         case PE_ARCH_sh:
2058           quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2059           break;
2060         case PE_ARCH_mips:
2061           quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
2062           quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
2063           quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
2064           break;
2065         case PE_ARCH_arm:
2066         case PE_ARCH_arm_epoc:
2067         case PE_ARCH_arm_wince:
2068           quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2069           break;
2070         default:
2071           abort ();
2072         }
2073       save_relocs (tx);
2074     }
2075   else
2076     bfd_set_section_size (abfd, tx, 0);
2077
2078   bfd_set_section_size (abfd, id7, 4);
2079   d7 = xmalloc (4);
2080   id7->contents = d7;
2081   memset (d7, 0, 4);
2082   quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
2083   save_relocs (id7);
2084
2085   bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
2086   d5 = xmalloc (PE_IDATA5_SIZE);
2087   id5->contents = d5;
2088   memset (d5, 0, PE_IDATA5_SIZE);
2089
2090   if (exp->flag_noname)
2091     {
2092       d5[0] = exp->ordinal;
2093       d5[1] = exp->ordinal >> 8;
2094       d5[PE_IDATA5_SIZE - 1] = 0x80;
2095     }
2096   else
2097     {
2098       quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2099       save_relocs (id5);
2100     }
2101
2102   bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
2103   d4 = xmalloc (PE_IDATA4_SIZE);
2104   id4->contents = d4;
2105   memset (d4, 0, PE_IDATA4_SIZE);
2106
2107   if (exp->flag_noname)
2108     {
2109       d4[0] = exp->ordinal;
2110       d4[1] = exp->ordinal >> 8;
2111       d4[PE_IDATA4_SIZE - 1] = 0x80;
2112     }
2113   else
2114     {
2115       quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2116       save_relocs (id4);
2117     }
2118
2119   if (exp->flag_noname)
2120     {
2121       len = 0;
2122       bfd_set_section_size (abfd, id6, 0);
2123     }
2124   else
2125     {
2126       /* { short, asciz }  */
2127       len = 2 + strlen (exp->name) + 1;
2128       if (len & 1)
2129         len++;
2130       bfd_set_section_size (abfd, id6, len);
2131       d6 = xmalloc (len);
2132       id6->contents = d6;
2133       memset (d6, 0, len);
2134       d6[0] = exp->hint & 0xff;
2135       d6[1] = exp->hint >> 8;
2136       strcpy ((char *) d6 + 2, exp->name);
2137     }
2138
2139   bfd_set_symtab (abfd, symtab, symptr);
2140
2141   if (include_jmp_stub)
2142     bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
2143   bfd_set_section_contents (abfd, id7, d7, 0, 4);
2144   bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2145   bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2146   if (!exp->flag_noname)
2147     bfd_set_section_contents (abfd, id6, d6, 0, len);
2148
2149   bfd_make_readable (abfd);
2150   return abfd;
2151 }
2152
2153 static bfd *
2154 make_singleton_name_thunk (const char *import, bfd *parent)
2155 {
2156   /* Name thunks go to idata$4.  */
2157   asection *id4;
2158   unsigned char *d4;
2159   char *oname;
2160   bfd *abfd;
2161
2162   oname = xmalloc (20);
2163   sprintf (oname, "nmth%06d.o", tmp_seq);
2164   tmp_seq++;
2165
2166   abfd = bfd_create (oname, parent);
2167   bfd_find_target (pe_details->object_target, abfd);
2168   bfd_make_writable (abfd);
2169
2170   bfd_set_format (abfd, bfd_object);
2171   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2172
2173   symptr = 0;
2174   symtab = xmalloc (3 * sizeof (asymbol *));
2175   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2176   quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
2177   quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
2178
2179   /* We need space for the real thunk and for the null terminator.  */
2180   bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE * 2);
2181   d4 = xmalloc (PE_IDATA4_SIZE * 2);
2182   id4->contents = d4;
2183   memset (d4, 0, PE_IDATA4_SIZE * 2);
2184   quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2185   save_relocs (id4);
2186
2187   bfd_set_symtab (abfd, symtab, symptr);
2188
2189   bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE * 2);
2190
2191   bfd_make_readable (abfd);
2192   return abfd;
2193 }
2194
2195 static char *
2196 make_import_fixup_mark (arelent *rel)
2197 {
2198   /* We convert reloc to symbol, for later reference.  */
2199   static int counter;
2200   static char *fixup_name = NULL;
2201   static size_t buffer_len = 0;
2202
2203   struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2204
2205   bfd *abfd = bfd_asymbol_bfd (sym);
2206   struct bfd_link_hash_entry *bh;
2207
2208   if (!fixup_name)
2209     {
2210       fixup_name = xmalloc (384);
2211       buffer_len = 384;
2212     }
2213
2214   if (strlen (sym->name) + 25 > buffer_len)
2215   /* Assume 25 chars for "__fu" + counter + "_".  If counter is
2216      bigger than 20 digits long, we've got worse problems than
2217      overflowing this buffer...  */
2218     {
2219       free (fixup_name);
2220       /* New buffer size is length of symbol, plus 25, but
2221          then rounded up to the nearest multiple of 128.  */
2222       buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
2223       fixup_name = xmalloc (buffer_len);
2224     }
2225
2226   sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2227
2228   bh = NULL;
2229   bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2230                                 current_sec, /* sym->section, */
2231                                 rel->address, NULL, TRUE, FALSE, &bh);
2232
2233   return fixup_name;
2234 }
2235
2236 /*      .section        .idata$2
2237         .rva            __nm_thnk_SYM (singleton thunk with name of func)
2238         .long           0
2239         .long           0
2240         .rva            __my_dll_iname (name of dll)
2241         .rva            __fuNN_SYM (pointer to reference (address) in text)  */
2242
2243 static bfd *
2244 make_import_fixup_entry (const char *name,
2245                          const char *fixup_name,
2246                          const char *dll_symname,
2247                          bfd *parent)
2248 {
2249   asection *id2;
2250   unsigned char *d2;
2251   char *oname;
2252   bfd *abfd;
2253
2254   oname = xmalloc (20);
2255   sprintf (oname, "fu%06d.o", tmp_seq);
2256   tmp_seq++;
2257
2258   abfd = bfd_create (oname, parent);
2259   bfd_find_target (pe_details->object_target, abfd);
2260   bfd_make_writable (abfd);
2261
2262   bfd_set_format (abfd, bfd_object);
2263   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2264
2265   symptr = 0;
2266   symtab = xmalloc (6 * sizeof (asymbol *));
2267   id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2268
2269   quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2270   quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2271   quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2272
2273   bfd_set_section_size (abfd, id2, 20);
2274   d2 = xmalloc (20);
2275   id2->contents = d2;
2276   memset (d2, 0, 20);
2277   d2[0] = d2[16] = PE_IDATA5_SIZE; /* Reloc addend.  */
2278
2279   quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2280   quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2281   quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2282   save_relocs (id2);
2283
2284   bfd_set_symtab (abfd, symtab, symptr);
2285
2286   bfd_set_section_contents (abfd, id2, d2, 0, 20);
2287
2288   bfd_make_readable (abfd);
2289   return abfd;
2290 }
2291
2292 /*      .section        .rdata_runtime_pseudo_reloc
2293         .long           addend
2294         .rva            __fuNN_SYM (pointer to reference (address) in text)  */
2295
2296 static bfd *
2297 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2298                            const char *fixup_name,
2299                            bfd_vma addend ATTRIBUTE_UNUSED,
2300                            bfd_vma bitsize,
2301                            bfd *parent)
2302 {
2303   asection *rt_rel;
2304   unsigned char *rt_rel_d;
2305   char *oname;
2306   bfd *abfd;
2307   oname = xmalloc (20);
2308   sprintf (oname, "rtr%06d.o", tmp_seq);
2309   tmp_seq++;
2310
2311   abfd = bfd_create (oname, parent);
2312   bfd_find_target (pe_details->object_target, abfd);
2313   bfd_make_writable (abfd);
2314
2315   bfd_set_format (abfd, bfd_object);
2316   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2317
2318   symptr = 0;
2319   if (link_info.pei386_runtime_pseudo_reloc == 2)
2320     {
2321       symtab = xmalloc ((runtime_pseudp_reloc_v2_init ? 3 : 6) * sizeof (asymbol *));
2322     }
2323   else
2324     {
2325       symtab = xmalloc (2 * sizeof (asymbol *));
2326     }
2327   rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2328                           SEC_HAS_CONTENTS, 2);
2329
2330   quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2331
2332   if (link_info.pei386_runtime_pseudo_reloc == 2)
2333     {
2334           size_t size = 12;
2335           if (! runtime_pseudp_reloc_v2_init)
2336             {
2337                   size += 12;
2338                   runtime_pseudp_reloc_v2_init = 1;
2339             }
2340       quick_symbol (abfd, U ("_imp_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2341
2342       bfd_set_section_size (abfd, rt_rel, size);
2343       rt_rel_d = xmalloc (size);
2344       rt_rel->contents = rt_rel_d;
2345       memset (rt_rel_d, 0, size);
2346           quick_reloc (abfd, size - 8, BFD_RELOC_RVA, 1);
2347           quick_reloc (abfd, size - 12, BFD_RELOC_RVA, 2);
2348           bfd_put_32 (abfd, bitsize, rt_rel_d + (size - 4));
2349           if (size != 12)
2350             bfd_put_32 (abfd, 1, rt_rel_d + 8);
2351       save_relocs (rt_rel);
2352
2353       bfd_set_symtab (abfd, symtab, symptr);
2354
2355       bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, size);
2356    }
2357   else
2358    {
2359       bfd_set_section_size (abfd, rt_rel, 8);
2360       rt_rel_d = xmalloc (8);
2361       rt_rel->contents = rt_rel_d;
2362       memset (rt_rel_d, 0, 8);
2363
2364       bfd_put_32 (abfd, addend, rt_rel_d);
2365       quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2366
2367       save_relocs (rt_rel);
2368
2369       bfd_set_symtab (abfd, symtab, symptr);
2370
2371       bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2372    }
2373   bfd_make_readable (abfd);
2374   return abfd;
2375 }
2376
2377 /*      .section        .rdata
2378         .rva            __pei386_runtime_relocator  */
2379
2380 static bfd *
2381 pe_create_runtime_relocator_reference (bfd *parent)
2382 {
2383   asection *extern_rt_rel;
2384   unsigned char *extern_rt_rel_d;
2385   char *oname;
2386   bfd *abfd;
2387
2388   oname = xmalloc (20);
2389   sprintf (oname, "ertr%06d.o", tmp_seq);
2390   tmp_seq++;
2391
2392   abfd = bfd_create (oname, parent);
2393   bfd_find_target (pe_details->object_target, abfd);
2394   bfd_make_writable (abfd);
2395
2396   bfd_set_format (abfd, bfd_object);
2397   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2398
2399   symptr = 0;
2400   symtab = xmalloc (2 * sizeof (asymbol *));
2401   extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2402
2403   quick_symbol (abfd, "", U ("_pei386_runtime_relocator"), "", UNDSEC,
2404                 BSF_NO_FLAGS, 0);
2405
2406   bfd_set_section_size (abfd, extern_rt_rel, 4);
2407   extern_rt_rel_d = xmalloc (4);
2408   extern_rt_rel->contents = extern_rt_rel_d;
2409
2410   quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2411   save_relocs (extern_rt_rel);
2412
2413   bfd_set_symtab (abfd, symtab, symptr);
2414
2415   bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, 4);
2416
2417   bfd_make_readable (abfd);
2418   return abfd;
2419 }
2420
2421 void
2422 pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend)
2423 {
2424   char buf[300];
2425   struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2426   struct bfd_link_hash_entry *name_thunk_sym;
2427   const char *name = sym->name;
2428   char *fixup_name = make_import_fixup_mark (rel);
2429   bfd *b;
2430
2431   sprintf (buf, U ("_nm_thnk_%s"), name);
2432
2433   name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2434
2435   if (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined)
2436     {
2437       bfd *b = make_singleton_name_thunk (name, link_info.output_bfd);
2438       add_bfd_to_link (b, b->filename, &link_info);
2439
2440       /* If we ever use autoimport, we have to cast text section writable.  */
2441       config.text_read_only = FALSE;
2442       link_info.output_bfd->flags &= ~WP_TEXT;   
2443     }
2444
2445   if (addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2446     {
2447       extern char * pe_data_import_dll;
2448       char * dll_symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2449
2450       b = make_import_fixup_entry (name, fixup_name, dll_symname,
2451                                    link_info.output_bfd);
2452       add_bfd_to_link (b, b->filename, &link_info);
2453     }
2454
2455     if ((link_info.pei386_runtime_pseudo_reloc != 0 && addend != 0)
2456         || link_info.pei386_runtime_pseudo_reloc == 2)
2457       {
2458         if (pe_dll_extra_pe_debug)
2459           printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2460                   fixup_name, (int) addend);
2461
2462         b = make_runtime_pseudo_reloc (name, fixup_name, addend, rel->howto->bitsize,
2463                                        link_info.output_bfd);
2464         add_bfd_to_link (b, b->filename, &link_info);
2465
2466         if (runtime_pseudo_relocs_created == 0)
2467           {
2468             b = pe_create_runtime_relocator_reference (link_info.output_bfd);
2469             add_bfd_to_link (b, b->filename, &link_info);
2470           }
2471         runtime_pseudo_relocs_created++;
2472       }
2473     else if (addend != 0)
2474       {
2475         einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2476                s->owner, s, rel->address, sym->name);
2477         einfo ("%X");
2478       }
2479 }
2480
2481
2482 void
2483 pe_dll_generate_implib (def_file *def, const char *impfilename)
2484 {
2485   int i;
2486   bfd *ar_head;
2487   bfd *ar_tail;
2488   bfd *outarch;
2489   bfd *head = 0;
2490
2491   dll_filename = (def->name) ? def->name : dll_name;
2492   dll_symname = xstrdup (dll_filename);
2493   for (i = 0; dll_symname[i]; i++)
2494     if (!ISALNUM (dll_symname[i]))
2495       dll_symname[i] = '_';
2496
2497   unlink_if_ordinary (impfilename);
2498
2499   outarch = bfd_openw (impfilename, 0);
2500
2501   if (!outarch)
2502     {
2503       /* xgettext:c-format */
2504       einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2505       return;
2506     }
2507
2508   /* xgettext:c-format */
2509   info_msg (_("Creating library file: %s\n"), impfilename);
2510  
2511   bfd_set_format (outarch, bfd_archive);
2512   outarch->has_armap = 1;
2513
2514   /* Work out a reasonable size of things to put onto one line.  */
2515   ar_head = make_head (outarch);
2516
2517   for (i = 0; i < def->num_exports; i++)
2518     {
2519       /* The import library doesn't know about the internal name.  */
2520       char *internal = def->exports[i].internal_name;
2521       bfd *n;
2522
2523       /* Don't add PRIVATE entries to import lib.  */   
2524       if (pe_def_file->exports[i].flag_private)
2525         continue;
2526       def->exports[i].internal_name = def->exports[i].name;
2527       n = make_one (def->exports + i, outarch,
2528                     ! (def->exports + i)->flag_data);
2529       n->archive_next = head;
2530       head = n;
2531       def->exports[i].internal_name = internal;
2532     }
2533
2534   ar_tail = make_tail (outarch);
2535
2536   if (ar_head == NULL || ar_tail == NULL)
2537     return;
2538
2539   /* Now stick them all into the archive.  */
2540   ar_head->archive_next = head;
2541   ar_tail->archive_next = ar_head;
2542   head = ar_tail;
2543
2544   if (! bfd_set_archive_head (outarch, head))
2545     einfo ("%Xbfd_set_archive_head: %E\n");
2546
2547   if (! bfd_close (outarch))
2548     einfo ("%Xbfd_close %s: %E\n", impfilename);
2549
2550   while (head != NULL)
2551     {
2552       bfd *n = head->archive_next;
2553       bfd_close (head);
2554       head = n;
2555     }
2556 }
2557
2558 static void
2559 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *link_info)
2560 {
2561   lang_input_statement_type *fake_file;
2562
2563   fake_file = lang_add_input_file (name,
2564                                    lang_input_file_is_fake_enum,
2565                                    NULL);
2566   fake_file->the_bfd = abfd;
2567   ldlang_add_file (fake_file);
2568
2569   if (!bfd_link_add_symbols (abfd, link_info))
2570     einfo ("%Xaddsym %s: %E\n", name);
2571 }
2572
2573 void
2574 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *link_info)
2575 {
2576   def_file_module *module;
2577
2578   pe_dll_id_target (bfd_get_target (output_bfd));
2579
2580   if (!pe_def_file)
2581     return;
2582
2583   for (module = pe_def_file->modules; module; module = module->next)
2584     {
2585       int i, do_this_dll;
2586
2587       dll_filename = module->name;
2588       dll_symname = xstrdup (module->name);
2589       for (i = 0; dll_symname[i]; i++)
2590         if (!ISALNUM (dll_symname[i]))
2591           dll_symname[i] = '_';
2592
2593       do_this_dll = 0;
2594
2595       for (i = 0; i < pe_def_file->num_imports; i++)
2596         if (pe_def_file->imports[i].module == module)
2597           {
2598             def_file_export exp;
2599             struct bfd_link_hash_entry *blhe;
2600             int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2601             /* See if we need this import.  */
2602             size_t len = strlen (pe_def_file->imports[i].internal_name);
2603             char *name = xmalloc (len + 2 + 6);
2604             bfd_boolean include_jmp_stub = FALSE;
2605
2606             if (lead_at)
2607               sprintf (name, "%s",
2608                        pe_def_file->imports[i].internal_name);
2609             else
2610               sprintf (name, "%s%s",U (""),
2611                        pe_def_file->imports[i].internal_name);
2612
2613             blhe = bfd_link_hash_lookup (link_info->hash, name,
2614                                          FALSE, FALSE, FALSE);
2615
2616             /* Include the jump stub for <sym> only if the <sym>
2617                is undefined.  */
2618             if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2619               {
2620                 if (lead_at)
2621                   sprintf (name, "%s%s", "__imp_", 
2622                            pe_def_file->imports[i].internal_name);
2623                 else
2624                   sprintf (name, "%s%s%s", "__imp_", U (""),
2625                            pe_def_file->imports[i].internal_name);
2626
2627                 blhe = bfd_link_hash_lookup (link_info->hash, name,
2628                                              FALSE, FALSE, FALSE);
2629               }
2630             else
2631               include_jmp_stub = TRUE;
2632
2633             free (name);
2634
2635             if (blhe && blhe->type == bfd_link_hash_undefined)
2636               {
2637                 bfd *one;
2638                 /* We do.  */
2639                 if (!do_this_dll)
2640                   {
2641                     bfd *ar_head = make_head (output_bfd);
2642                     add_bfd_to_link (ar_head, ar_head->filename, link_info);
2643                     do_this_dll = 1;
2644                   }
2645                 exp.internal_name = pe_def_file->imports[i].internal_name;
2646                 exp.name = pe_def_file->imports[i].name;
2647                 exp.ordinal = pe_def_file->imports[i].ordinal;
2648                 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2649                 exp.flag_private = 0;
2650                 exp.flag_constant = 0;
2651                 exp.flag_data = pe_def_file->imports[i].data;
2652                 exp.flag_noname = exp.name ? 0 : 1;
2653                 one = make_one (&exp, output_bfd, (! exp.flag_data) && include_jmp_stub);
2654                 add_bfd_to_link (one, one->filename, link_info);
2655               }
2656           }
2657       if (do_this_dll)
2658         {
2659           bfd *ar_tail = make_tail (output_bfd);
2660           add_bfd_to_link (ar_tail, ar_tail->filename, link_info);
2661         }
2662
2663       free (dll_symname);
2664     }
2665 }
2666
2667 /* We were handed a *.DLL file.  Parse it and turn it into a set of
2668    IMPORTS directives in the def file.  Return TRUE if the file was
2669    handled, FALSE if not.  */
2670
2671 static unsigned int
2672 pe_get16 (bfd *abfd, int where)
2673 {
2674   unsigned char b[2];
2675
2676   bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2677   bfd_bread (b, (bfd_size_type) 2, abfd);
2678   return b[0] + (b[1] << 8);
2679 }
2680
2681 static unsigned int
2682 pe_get32 (bfd *abfd, int where)
2683 {
2684   unsigned char b[4];
2685
2686   bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2687   bfd_bread (b, (bfd_size_type) 4, abfd);
2688   return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2689 }
2690
2691 static unsigned int
2692 pe_as32 (void *ptr)
2693 {
2694   unsigned char *b = ptr;
2695
2696   return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2697 }
2698
2699 bfd_boolean
2700 pe_implied_import_dll (const char *filename)
2701 {
2702   bfd *dll;
2703   bfd_vma pe_header_offset, opthdr_ofs, num_entries, i;
2704   bfd_vma export_rva, export_size, nsections, secptr, expptr;
2705   bfd_vma exp_funcbase;
2706   unsigned char *expdata;
2707   char *erva;
2708   bfd_vma name_rvas, ordinals, nexp, ordbase;
2709   const char *dll_name;
2710   /* Initialization with start > end guarantees that is_data
2711      will not be set by mistake, and avoids compiler warning.  */
2712   bfd_vma data_start = 1;
2713   bfd_vma data_end = 0;
2714   bfd_vma rdata_start = 1;
2715   bfd_vma rdata_end = 0;
2716   bfd_vma bss_start = 1;
2717   bfd_vma bss_end = 0;
2718
2719   /* No, I can't use bfd here.  kernel32.dll puts its export table in
2720      the middle of the .rdata section.  */
2721   dll = bfd_openr (filename, pe_details->target_name);
2722   if (!dll)
2723     {
2724       einfo ("%Xopen %s: %E\n", filename);
2725       return FALSE;
2726     }
2727
2728   /* PEI dlls seem to be bfd_objects.  */
2729   if (!bfd_check_format (dll, bfd_object))
2730     {
2731       einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
2732       return FALSE;
2733     }
2734
2735   /* Get pe_header, optional header and numbers of export entries.  */
2736   pe_header_offset = pe_get32 (dll, 0x3c);
2737   opthdr_ofs = pe_header_offset + 4 + 20;
2738 #ifdef pe_use_x86_64
2739   num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /*  & NumberOfRvaAndSizes.  */
2740 #else
2741   num_entries = pe_get32 (dll, opthdr_ofs + 92);
2742 #endif
2743
2744   if (num_entries < 1) /* No exports.  */
2745     return FALSE;
2746
2747 #ifdef pe_use_x86_64
2748   export_rva  = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
2749   export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
2750 #else
2751   export_rva = pe_get32 (dll, opthdr_ofs + 96);
2752   export_size = pe_get32 (dll, opthdr_ofs + 100);
2753 #endif
2754   
2755   nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
2756   secptr = (pe_header_offset + 4 + 20 +
2757             pe_get16 (dll, pe_header_offset + 4 + 16));
2758   expptr = 0;
2759
2760   /* Get the rva and size of the export section.  */
2761   for (i = 0; i < nsections; i++)
2762     {
2763       char sname[8];
2764       bfd_vma secptr1 = secptr + 40 * i;
2765       bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
2766       bfd_vma vsize = pe_get32 (dll, secptr1 + 16);
2767       bfd_vma fptr = pe_get32 (dll, secptr1 + 20);
2768
2769       bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
2770       bfd_bread (sname, (bfd_size_type) 8, dll);
2771
2772       if (vaddr <= export_rva && vaddr + vsize > export_rva)
2773         {
2774           expptr = fptr + (export_rva - vaddr);
2775           if (export_rva + export_size > vaddr + vsize)
2776             export_size = vsize - (export_rva - vaddr);
2777           break;
2778         }
2779     }
2780
2781   /* Scan sections and store the base and size of the
2782      data and bss segments in data/base_start/end.  */
2783   for (i = 0; i < nsections; i++)
2784     {
2785       bfd_vma secptr1 = secptr + 40 * i;
2786       bfd_vma vsize = pe_get32 (dll, secptr1 + 8);
2787       bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
2788       bfd_vma flags = pe_get32 (dll, secptr1 + 36);
2789       char sec_name[9];
2790
2791       sec_name[8] = '\0';
2792       bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
2793       bfd_bread (sec_name, (bfd_size_type) 8, dll);
2794
2795       if (strcmp(sec_name,".data") == 0)
2796         {
2797           data_start = vaddr;
2798           data_end = vaddr + vsize;
2799
2800           if (pe_dll_extra_pe_debug)
2801             printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2802                     __FUNCTION__, sec_name, (unsigned long) vaddr,
2803                     (unsigned long) (vaddr + vsize), (unsigned long) flags);
2804         }
2805       else if (strcmp(sec_name,".rdata") == 0)
2806         {
2807           rdata_start = vaddr;
2808           rdata_end = vaddr + vsize;
2809
2810           if (pe_dll_extra_pe_debug)
2811             printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2812                     __FUNCTION__, sec_name, (unsigned long) vaddr,
2813                     (unsigned long) (vaddr + vsize), (unsigned long) flags);
2814         }
2815       else if (strcmp (sec_name,".bss") == 0)
2816         {
2817           bss_start = vaddr;
2818           bss_end = vaddr + vsize;
2819
2820           if (pe_dll_extra_pe_debug)
2821             printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
2822                     __FUNCTION__, sec_name, (unsigned long) vaddr,
2823                     (unsigned long) (vaddr + vsize), (unsigned long) flags);
2824         }
2825     }
2826
2827   expdata = xmalloc (export_size);
2828   bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
2829   bfd_bread (expdata, (bfd_size_type) export_size, dll);
2830   erva = (char *) expdata - export_rva;
2831
2832   if (pe_def_file == 0)
2833     pe_def_file = def_file_empty ();
2834
2835   nexp = pe_as32 (expdata + 24);
2836   name_rvas = pe_as32 (expdata + 32);
2837   ordinals = pe_as32 (expdata + 36);
2838   ordbase = pe_as32 (expdata + 16);
2839   exp_funcbase = pe_as32 (expdata + 28);
2840
2841   /* Use internal dll name instead of filename
2842      to enable symbolic dll linking.  */
2843   dll_name = erva + pe_as32 (expdata + 12);
2844
2845   /* Check to see if the dll has already been added to
2846      the definition list and if so return without error.
2847      This avoids multiple symbol definitions.  */
2848   if (def_get_module (pe_def_file, dll_name))
2849     {
2850       if (pe_dll_extra_pe_debug)
2851         printf ("%s is already loaded\n", dll_name);
2852       return TRUE;
2853     }
2854
2855   /* Iterate through the list of symbols.  */
2856   for (i = 0; i < nexp; i++)
2857     {
2858       /* Pointer to the names vector.  */
2859       bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
2860       def_file_import *imp;
2861       /* Pointer to the function address vector.  */
2862       bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
2863       int is_data = 0;
2864
2865       /* Skip unwanted symbols, which are
2866          exported in buggy auto-import releases.  */
2867       if (! CONST_STRNEQ (erva + name_rva, "_nm_"))
2868         {
2869           /* is_data is true if the address is in the data, rdata or bss
2870              segment.  */
2871           is_data =
2872             (func_rva >= data_start && func_rva < data_end)
2873             || (func_rva >= rdata_start && func_rva < rdata_end)
2874             || (func_rva >= bss_start && func_rva < bss_end);
2875
2876           imp = def_file_add_import (pe_def_file, erva + name_rva,
2877                                      dll_name, i, 0);
2878           /* Mark symbol type.  */
2879           imp->data = is_data;
2880
2881           if (pe_dll_extra_pe_debug)
2882             printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
2883                     __FUNCTION__, dll_name, erva + name_rva,
2884                     (unsigned long) func_rva, is_data ? "(data)" : "");
2885         }
2886     }
2887
2888   return TRUE;
2889 }
2890
2891 /* These are the main functions, called from the emulation.  The first
2892    is called after the bfds are read, so we can guess at how much space
2893    we need.  The second is called after everything is placed, so we
2894    can put the right values in place.  */
2895
2896 void
2897 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
2898 {
2899   pe_dll_id_target (bfd_get_target (abfd));
2900   process_def_file (abfd, info);
2901
2902   if (pe_def_file->num_exports == 0 && !info->shared)
2903     return;
2904
2905   generate_edata (abfd, info);
2906   build_filler_bfd (1);
2907 }
2908
2909 void
2910 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
2911 {
2912   pe_dll_id_target (bfd_get_target (abfd));
2913   build_filler_bfd (0);
2914 }
2915
2916 void
2917 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
2918 {
2919   pe_dll_id_target (bfd_get_target (abfd));
2920   image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2921
2922   generate_reloc (abfd, info);
2923   if (reloc_sz > 0)
2924     {
2925       bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2926
2927       /* Resize the sections.  */
2928       lang_reset_memory_regions ();
2929       lang_size_sections (NULL, TRUE);
2930
2931       /* Redo special stuff.  */
2932       ldemul_after_allocation ();
2933
2934       /* Do the assignments again.  */
2935       lang_do_assignments ();
2936     }
2937
2938   fill_edata (abfd, info);
2939
2940   if (info->shared && !info->pie)
2941     pe_data (abfd)->dll = 1;
2942
2943   edata_s->contents = edata_d;
2944   reloc_s->contents = reloc_d;
2945 }
2946
2947 void
2948 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
2949 {
2950   pe_dll_id_target (bfd_get_target (abfd));
2951   image_base = pe_data (abfd)->pe_opthdr.ImageBase;
2952
2953   generate_reloc (abfd, info);
2954   if (reloc_sz > 0)
2955     {
2956       bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
2957
2958       /* Resize the sections.  */
2959       lang_reset_memory_regions ();
2960       lang_size_sections (NULL, TRUE);
2961
2962       /* Redo special stuff.  */
2963       ldemul_after_allocation ();
2964
2965       /* Do the assignments again.  */
2966       lang_do_assignments ();
2967     }
2968   reloc_s->contents = reloc_d;
2969 }
2970
2971 bfd_boolean
2972 pe_bfd_is_dll (bfd *abfd)
2973 {
2974   return (bfd_get_format (abfd) == bfd_object
2975           && obj_pe (abfd)
2976           && pe_data (abfd)->dll);
2977 }