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