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