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