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