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