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