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