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