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