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