Upload Tizen:Base source
[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 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 (lang_elf_version_info && would_export)
722                 {
723                   bfd_boolean hide = 0;
724                   (void) bfd_find_version_for_sym (lang_elf_version_info,
725                                 symbols[j]->name, &hide);
726                   would_export = !hide;
727                 }
728               if (would_export)
729                 {
730                   const char *sn = symbols[j]->name;
731
732                   /* We should not re-export imported stuff.  */
733                   {
734                     char *name;
735                     if (is_import (sn))
736                           continue;
737
738                     name = xmalloc (strlen ("__imp_") + strlen (sn) + 1);
739                     sprintf (name, "%s%s", "__imp_", sn);
740
741                     blhe = bfd_link_hash_lookup (info->hash, name,
742                                                  FALSE, FALSE, FALSE);
743                     free (name);
744
745                     if (blhe && blhe->type == bfd_link_hash_defined)
746                       continue;
747                   }
748
749                   if (pe_details->underscored && *sn == '_')
750                     sn++;
751
752                   if (auto_export (b, pe_def_file, sn))
753                     {
754                       int is_dup = 0;
755                       def_file_export *p;
756                       p = def_file_add_export (pe_def_file, sn, 0, -1,
757                                                NULL, &is_dup);
758                       /* Fill data flag properly, from dlltool.c.  */
759                       if (!is_dup)
760                         p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
761                     }
762                 }
763             }
764         }
765     }
766
767 #undef NE
768 #define NE pe_def_file->num_exports
769
770   /* Don't create an empty export table.  */
771   if (NE == 0)
772     return;
773
774   /* Canonicalize the export list.  */
775   if (pe_dll_kill_ats)
776     {
777       for (i = 0; i < NE; i++)
778         {
779           if (strchr (pe_def_file->exports[i].name, '@'))
780             {
781               /* This will preserve internal_name, which may have been
782                  pointing to the same memory as name, or might not
783                  have.  */
784               int lead_at = (*pe_def_file->exports[i].name == '@');
785               char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
786               char *tmp_at = strchr (tmp, '@');
787
788               if (tmp_at)
789                 *tmp_at = 0;
790               else
791                 einfo (_("%XCannot export %s: invalid export name\n"),
792                        pe_def_file->exports[i].name);
793               pe_def_file->exports[i].name = tmp;
794             }
795         }
796     }
797
798   if (pe_dll_stdcall_aliases)
799     {
800       for (i = 0; i < NE; i++)
801         {
802           if (is_import (pe_def_file->exports[i].name))
803             continue;
804
805           if (strchr (pe_def_file->exports[i].name, '@'))
806             {
807               int is_dup = 1;
808               int lead_at = (*pe_def_file->exports[i].name == '@');
809               char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
810
811               *(strchr (tmp, '@')) = 0;
812               if (auto_export (NULL, pe_def_file, tmp))
813                 def_file_add_export (pe_def_file, tmp,
814                                      pe_def_file->exports[i].internal_name,
815                                      -1, NULL, &is_dup);
816               if (is_dup)
817                 free (tmp);
818             }
819         }
820     }
821
822   /* Convenience, but watch out for it changing.  */
823   e = pe_def_file->exports;
824
825   exported_symbol_offsets = xmalloc (NE * sizeof (bfd_vma));
826   exported_symbol_sections = xmalloc (NE * sizeof (struct bfd_section *));
827
828   memset (exported_symbol_sections, 0, NE * sizeof (struct bfd_section *));
829   max_ordinal = 0;
830   min_ordinal = 65536;
831   count_exported = 0;
832   count_exported_byname = 0;
833   count_with_ordinals = 0;
834
835   qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
836          pe_export_sort);
837   for (i = 0, j = 0; i < NE; i++)
838     {
839       if (i > 0 && strcmp (e[i].name, e[i - 1].name) == 0)
840         {
841           /* This is a duplicate.  */
842           if (e[j - 1].ordinal != -1
843               && e[i].ordinal != -1
844               && e[j - 1].ordinal != e[i].ordinal)
845             {
846               if (pe_dll_warn_dup_exports)
847                 /* xgettext:c-format */
848                 einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
849                        e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
850             }
851           else
852             {
853               if (pe_dll_warn_dup_exports)
854                 /* xgettext:c-format */
855                 einfo (_("Warning, duplicate EXPORT: %s\n"),
856                        e[j - 1].name);
857             }
858
859           if (e[i].ordinal != -1)
860             e[j - 1].ordinal = e[i].ordinal;
861           e[j - 1].flag_private |= e[i].flag_private;
862           e[j - 1].flag_constant |= e[i].flag_constant;
863           e[j - 1].flag_noname |= e[i].flag_noname;
864           e[j - 1].flag_data |= e[i].flag_data;
865         }
866       else
867         {
868           if (i != j)
869             e[j] = e[i];
870           j++;
871         }
872     }
873   pe_def_file->num_exports = j; /* == NE */
874
875   for (i = 0; i < NE; i++)
876     {
877       char *name;
878       name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
879       if (pe_details->underscored
880           && (*pe_def_file->exports[i].internal_name != '@'))
881         {
882           *name = '_';
883           strcpy (name + 1, pe_def_file->exports[i].internal_name);
884         }
885       else
886         strcpy (name, pe_def_file->exports[i].internal_name);
887
888       blhe = bfd_link_hash_lookup (info->hash,
889                                    name,
890                                    FALSE, FALSE, TRUE);
891
892       if (blhe
893           && (blhe->type == bfd_link_hash_defined
894               || (blhe->type == bfd_link_hash_common)))
895         {
896           count_exported++;
897           if (!pe_def_file->exports[i].flag_noname)
898             count_exported_byname++;
899
900           /* Only fill in the sections. The actual offsets are computed
901              in fill_exported_offsets() after common symbols are laid
902              out.  */
903           if (blhe->type == bfd_link_hash_defined)
904             exported_symbol_sections[i] = blhe->u.def.section;
905           else
906             exported_symbol_sections[i] = blhe->u.c.p->section;
907
908           if (pe_def_file->exports[i].ordinal != -1)
909             {
910               if (max_ordinal < pe_def_file->exports[i].ordinal)
911                 max_ordinal = pe_def_file->exports[i].ordinal;
912               if (min_ordinal > pe_def_file->exports[i].ordinal)
913                 min_ordinal = pe_def_file->exports[i].ordinal;
914               count_with_ordinals++;
915             }
916         }
917       /* Check for forward exports.  These are indicated in DEF files by an
918          export directive of the form NAME1 = MODULE-NAME.EXTERNAL-NAME
919          but we must take care not to be fooled when the user wants to export
920          a symbol that actually really has a dot in it, so we only check
921          for them here, after real defined symbols have already been matched.  */
922       else if (strchr (pe_def_file->exports[i].internal_name, '.'))
923         {
924           count_exported++;
925           if (!pe_def_file->exports[i].flag_noname)
926             count_exported_byname++;
927
928           pe_def_file->exports[i].flag_forward = 1;
929
930           if (pe_def_file->exports[i].ordinal != -1)
931             {
932               if (max_ordinal < pe_def_file->exports[i].ordinal)
933                 max_ordinal = pe_def_file->exports[i].ordinal;
934               if (min_ordinal > pe_def_file->exports[i].ordinal)
935                 min_ordinal = pe_def_file->exports[i].ordinal;
936               count_with_ordinals++;
937             }
938         }
939       else if (blhe && blhe->type == bfd_link_hash_undefined)
940         {
941           /* xgettext:c-format */
942           einfo (_("%XCannot export %s: symbol not defined\n"),
943                  pe_def_file->exports[i].internal_name);
944         }
945       else if (blhe)
946         {
947           /* xgettext:c-format */
948           einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
949                  pe_def_file->exports[i].internal_name,
950                  blhe->type, bfd_link_hash_defined);
951         }
952       else
953         {
954           /* xgettext:c-format */
955           einfo (_("%XCannot export %s: symbol not found\n"),
956                  pe_def_file->exports[i].internal_name);
957         }
958       free (name);
959     }
960 }
961
962 /* Build the bfd that will contain .edata and .reloc sections.  */
963
964 static void
965 build_filler_bfd (int include_edata)
966 {
967   lang_input_statement_type *filler_file;
968   filler_file = lang_add_input_file ("dll stuff",
969                                      lang_input_file_is_fake_enum,
970                                      NULL);
971   filler_file->the_bfd = filler_bfd = bfd_create ("dll stuff",
972                                                   link_info.output_bfd);
973   if (filler_bfd == NULL
974       || !bfd_set_arch_mach (filler_bfd,
975                              bfd_get_arch (link_info.output_bfd),
976                              bfd_get_mach (link_info.output_bfd)))
977     {
978       einfo ("%X%P: can not create BFD: %E\n");
979       return;
980     }
981
982   if (include_edata)
983     {
984       edata_s = bfd_make_section_old_way (filler_bfd, ".edata");
985       if (edata_s == NULL
986           || !bfd_set_section_flags (filler_bfd, edata_s,
987                                      (SEC_HAS_CONTENTS
988                                       | SEC_ALLOC
989                                       | SEC_LOAD
990                                       | SEC_KEEP
991                                       | SEC_IN_MEMORY)))
992         {
993           einfo ("%X%P: can not create .edata section: %E\n");
994           return;
995         }
996       bfd_set_section_size (filler_bfd, edata_s, edata_sz);
997     }
998
999   reloc_s = bfd_make_section_old_way (filler_bfd, ".reloc");
1000   if (reloc_s == NULL
1001       || !bfd_set_section_flags (filler_bfd, reloc_s,
1002                                  (SEC_HAS_CONTENTS
1003                                   | SEC_ALLOC
1004                                   | SEC_LOAD
1005                                   | SEC_KEEP
1006                                   | SEC_IN_MEMORY)))
1007     {
1008       einfo ("%X%P: can not create .reloc section: %E\n");
1009       return;
1010     }
1011
1012   bfd_set_section_size (filler_bfd, reloc_s, 0);
1013
1014   ldlang_add_file (filler_file);
1015 }
1016
1017 /* Gather all the exported symbols and build the .edata section.  */
1018
1019 static void
1020 generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
1021 {
1022   int i, next_ordinal;
1023   int name_table_size = 0;
1024   const char *dlnp;
1025
1026   /* First, we need to know how many exported symbols there are,
1027      and what the range of ordinals is.  */
1028   if (pe_def_file->name)
1029     dll_name = pe_def_file->name;
1030   else
1031     {
1032       dll_name = abfd->filename;
1033
1034       for (dlnp = dll_name; *dlnp; dlnp++)
1035         if (*dlnp == '\\' || *dlnp == '/' || *dlnp == ':')
1036           dll_name = dlnp + 1;
1037     }
1038
1039   if (count_with_ordinals && max_ordinal > count_exported)
1040     {
1041       if (min_ordinal > max_ordinal - count_exported + 1)
1042         min_ordinal = max_ordinal - count_exported + 1;
1043     }
1044   else
1045     {
1046       min_ordinal = 1;
1047       max_ordinal = count_exported;
1048     }
1049
1050   export_table_size = max_ordinal - min_ordinal + 1;
1051   exported_symbols = xmalloc (export_table_size * sizeof (int));
1052   for (i = 0; i < export_table_size; i++)
1053     exported_symbols[i] = -1;
1054
1055   /* Now we need to assign ordinals to those that don't have them.  */
1056   for (i = 0; i < NE; i++)
1057     {
1058       if (exported_symbol_sections[i] ||
1059           pe_def_file->exports[i].flag_forward)
1060         {
1061           if (pe_def_file->exports[i].ordinal != -1)
1062             {
1063               int ei = pe_def_file->exports[i].ordinal - min_ordinal;
1064               int pi = exported_symbols[ei];
1065
1066               if (pi != -1)
1067                 {
1068                   /* xgettext:c-format */
1069                   einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
1070                          pe_def_file->exports[i].ordinal,
1071                          pe_def_file->exports[i].name,
1072                          pe_def_file->exports[pi].name);
1073                 }
1074               exported_symbols[ei] = i;
1075             }
1076           if (pe_def_file->exports[i].its_name)
1077             name_table_size += strlen (pe_def_file->exports[i].its_name) + 1;
1078           else
1079             name_table_size += strlen (pe_def_file->exports[i].name) + 1;
1080         }
1081
1082       /* Reserve space for the forward name. */
1083       if (pe_def_file->exports[i].flag_forward)
1084         {
1085           name_table_size += strlen (pe_def_file->exports[i].internal_name) + 1;
1086         }
1087     }
1088
1089   next_ordinal = min_ordinal;
1090   for (i = 0; i < NE; i++)
1091     if ((exported_symbol_sections[i] ||
1092          pe_def_file->exports[i].flag_forward) &&
1093         pe_def_file->exports[i].ordinal == -1)
1094       {
1095         while (exported_symbols[next_ordinal - min_ordinal] != -1)
1096           next_ordinal++;
1097
1098         exported_symbols[next_ordinal - min_ordinal] = i;
1099         pe_def_file->exports[i].ordinal = next_ordinal;
1100       }
1101
1102   /* OK, now we can allocate some memory.  */
1103   edata_sz = (40                                /* directory */
1104               + 4 * export_table_size           /* addresses */
1105               + 4 * count_exported_byname       /* name ptrs */
1106               + 2 * count_exported_byname       /* ordinals */
1107               + name_table_size + strlen (dll_name) + 1);
1108 }
1109
1110 /* Fill the exported symbol offsets. The preliminary work has already
1111    been done in process_def_file_and_drectve().  */
1112
1113 static void
1114 fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
1115 {
1116   int i;
1117   struct bfd_link_hash_entry *blhe;
1118
1119   for (i = 0; i < pe_def_file->num_exports; i++)
1120     {
1121       char *name;
1122
1123       name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
1124       if (pe_details->underscored
1125           && *pe_def_file->exports[i].internal_name != '@')
1126         {
1127           *name = '_';
1128           strcpy (name + 1, pe_def_file->exports[i].internal_name);
1129         }
1130       else
1131         strcpy (name, pe_def_file->exports[i].internal_name);
1132
1133       blhe = bfd_link_hash_lookup (info->hash,
1134                                    name,
1135                                    FALSE, FALSE, TRUE);
1136
1137       if (blhe && blhe->type == bfd_link_hash_defined)
1138         exported_symbol_offsets[i] = blhe->u.def.value;
1139
1140       free (name);
1141     }
1142 }
1143
1144 static void
1145 fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
1146 {
1147   int s, hint;
1148   unsigned char *edirectory;
1149   unsigned char *eaddresses;
1150   unsigned char *enameptrs;
1151   unsigned char *eordinals;
1152   char *enamestr;
1153   time_t now;
1154
1155   time (&now);
1156
1157   edata_d = xmalloc (edata_sz);
1158
1159   /* Note use of array pointer math here.  */
1160   edirectory = edata_d;
1161   eaddresses = edirectory + 40;
1162   enameptrs = eaddresses + 4 * export_table_size;
1163   eordinals = enameptrs + 4 * count_exported_byname;
1164   enamestr = (char *) eordinals + 2 * count_exported_byname;
1165
1166 #define ERVA(ptr) (((unsigned char *)(ptr) - edata_d) \
1167                    + edata_s->output_section->vma - image_base)
1168
1169   memset (edata_d, 0, edata_sz);
1170   bfd_put_32 (abfd, now, edata_d + 4);
1171   if (pe_def_file->version_major != -1)
1172     {
1173       bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);
1174       bfd_put_16 (abfd, pe_def_file->version_minor, edata_d + 10);
1175     }
1176
1177   bfd_put_32 (abfd, ERVA (enamestr), edata_d + 12);
1178   strcpy (enamestr, dll_name);
1179   enamestr += strlen (enamestr) + 1;
1180   bfd_put_32 (abfd, min_ordinal, edata_d + 16);
1181   bfd_put_32 (abfd, export_table_size, edata_d + 20);
1182   bfd_put_32 (abfd, count_exported_byname, edata_d + 24);
1183   bfd_put_32 (abfd, ERVA (eaddresses), edata_d + 28);
1184   bfd_put_32 (abfd, ERVA (enameptrs), edata_d + 32);
1185   bfd_put_32 (abfd, ERVA (eordinals), edata_d + 36);
1186
1187   fill_exported_offsets (abfd, info);
1188
1189   /* Ok, now for the filling in part.
1190      Scan alphabetically - ie the ordering in the exports[] table,
1191      rather than by ordinal - the ordering in the exported_symbol[]
1192      table.  See dlltool.c and:
1193         http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
1194      for more information.  */
1195   hint = 0;
1196   for (s = 0; s < NE; s++)
1197     {
1198       struct bfd_section *ssec = exported_symbol_sections[s];
1199       if (pe_def_file->exports[s].ordinal != -1 &&
1200           (pe_def_file->exports[s].flag_forward || ssec != NULL))
1201         {
1202           int ord = pe_def_file->exports[s].ordinal;
1203
1204           if (pe_def_file->exports[s].flag_forward)
1205             {
1206               bfd_put_32 (abfd, ERVA (enamestr),
1207                           eaddresses + 4 * (ord - min_ordinal));
1208
1209               strcpy (enamestr, pe_def_file->exports[s].internal_name);
1210               enamestr += strlen (pe_def_file->exports[s].internal_name) + 1;
1211             }
1212           else
1213             {
1214               bfd_vma srva = (exported_symbol_offsets[s]
1215                                     + ssec->output_section->vma
1216                                     + ssec->output_offset);
1217
1218               bfd_put_32 (abfd, srva - image_base,
1219                           eaddresses + 4 * (ord - min_ordinal));
1220             }
1221
1222           if (!pe_def_file->exports[s].flag_noname)
1223             {
1224               char *ename = pe_def_file->exports[s].name;
1225               if (pe_def_file->exports[s].its_name)
1226                 ename = pe_def_file->exports[s].its_name;
1227
1228               bfd_put_32 (abfd, ERVA (enamestr), enameptrs);
1229               enameptrs += 4;
1230               strcpy (enamestr, ename);
1231               enamestr += strlen (enamestr) + 1;
1232               bfd_put_16 (abfd, ord - min_ordinal, eordinals);
1233               eordinals += 2;
1234               pe_def_file->exports[s].hint = hint++;
1235             }
1236         }
1237     }
1238 }
1239
1240
1241 static struct bfd_section *current_sec;
1242
1243 void
1244 pe_walk_relocs_of_symbol (struct bfd_link_info *info,
1245                           const char *name,
1246                           int (*cb) (arelent *, asection *))
1247 {
1248   bfd *b;
1249   asection *s;
1250
1251   for (b = info->input_bfds; b; b = b->link_next)
1252     {
1253       asymbol **symbols;
1254
1255       if (!bfd_generic_link_read_symbols (b))
1256         {
1257           einfo (_("%B%F: could not read symbols: %E\n"), b);
1258           return;
1259         }
1260
1261       symbols = bfd_get_outsymbols (b);
1262
1263       for (s = b->sections; s; s = s->next)
1264         {
1265           arelent **relocs;
1266           int relsize, nrelocs, i;
1267           int flags = bfd_get_section_flags (b, s);
1268
1269           /* Skip discarded linkonce sections.  */
1270           if (flags & SEC_LINK_ONCE
1271               && s->output_section == bfd_abs_section_ptr)
1272             continue;
1273
1274           current_sec = s;
1275
1276           relsize = bfd_get_reloc_upper_bound (b, s);
1277           relocs = xmalloc (relsize);
1278           nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1279
1280           for (i = 0; i < nrelocs; i++)
1281             {
1282               struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1283
1284               if (!strcmp (name, sym->name))
1285                 cb (relocs[i], s);
1286             }
1287
1288           free (relocs);
1289
1290           /* Warning: the allocated symbols are remembered in BFD and reused
1291              later, so don't free them! */
1292           /* free (symbols); */
1293         }
1294     }
1295 }
1296
1297 /* Gather all the relocations and build the .reloc section.  */
1298
1299 static void
1300 generate_reloc (bfd *abfd, struct bfd_link_info *info)
1301 {
1302
1303   /* For .reloc stuff.  */
1304   reloc_data_type *reloc_data;
1305   int total_relocs = 0;
1306   int i;
1307   bfd_vma sec_page = (bfd_vma) -1;
1308   bfd_vma page_ptr, page_count;
1309   int bi;
1310   bfd *b;
1311   struct bfd_section *s;
1312
1313   total_relocs = 0;
1314   for (b = info->input_bfds; b; b = b->link_next)
1315     for (s = b->sections; s; s = s->next)
1316       total_relocs += s->reloc_count;
1317
1318   reloc_data = xmalloc (total_relocs * sizeof (reloc_data_type));
1319
1320   total_relocs = 0;
1321   bi = 0;
1322   for (bi = 0, b = info->input_bfds; b; bi++, b = b->link_next)
1323     {
1324       arelent **relocs;
1325       int relsize, nrelocs;
1326
1327       for (s = b->sections; s; s = s->next)
1328         {
1329           bfd_vma sec_vma = s->output_section->vma + s->output_offset;
1330           asymbol **symbols;
1331
1332           /* If it's not loaded, we don't need to relocate it this way.  */
1333           if (!(s->output_section->flags & SEC_LOAD))
1334             continue;
1335
1336           /* I don't know why there would be a reloc for these, but I've
1337              seen it happen - DJ  */
1338           if (s->output_section == &bfd_abs_section)
1339             continue;
1340
1341           if (s->output_section->vma == 0)
1342             {
1343               /* Huh?  Shouldn't happen, but punt if it does.  */
1344               einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
1345                      s->output_section->name, s->output_section->index,
1346                      s->output_section->flags);
1347               continue;
1348             }
1349
1350           if (!bfd_generic_link_read_symbols (b))
1351             {
1352               einfo (_("%B%F: could not read symbols: %E\n"), b);
1353               return;
1354             }
1355
1356           symbols = bfd_get_outsymbols (b);
1357           relsize = bfd_get_reloc_upper_bound (b, s);
1358           relocs = xmalloc (relsize);
1359           nrelocs = bfd_canonicalize_reloc (b, s, relocs, symbols);
1360
1361           for (i = 0; i < nrelocs; i++)
1362             {
1363               if (pe_dll_extra_pe_debug)
1364                 {
1365                   struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1366                   printf ("rel: %s\n", sym->name);
1367                 }
1368               if (!relocs[i]->howto->pc_relative
1369                   && relocs[i]->howto->type != pe_details->imagebase_reloc)
1370                 {
1371                   struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
1372
1373                   /* Don't create relocs for undefined weak symbols.  */
1374                   if (sym->flags == BSF_WEAK)
1375                     {
1376                       struct bfd_link_hash_entry *blhe
1377                         = bfd_wrapped_link_hash_lookup (abfd, info, sym->name,
1378                                                 FALSE, FALSE, FALSE);
1379                       if (blhe && blhe->type == bfd_link_hash_undefweak)
1380                         {
1381                           /* Check aux sym and see if it is defined or not. */
1382                           struct coff_link_hash_entry *h, *h2;
1383                           h = (struct coff_link_hash_entry *)blhe;
1384                           if (h->symbol_class != C_NT_WEAK || h->numaux != 1)
1385                             continue;
1386                           h2 = h->auxbfd->tdata.coff_obj_data->sym_hashes
1387                                                 [h->aux->x_sym.x_tagndx.l];
1388                           /* We don't want a base reloc if the aux sym is not
1389                              found, undefined, or if it is the constant ABS
1390                              zero default value.  (We broaden that slightly by
1391                              not testing the value, just the section; there's
1392                              no reason we'd want a reference to any absolute
1393                              address to get relocated during rebasing).  */
1394                           if (!h2 || h2->root.type == bfd_link_hash_undefined
1395                                 || h2->root.u.def.section == &bfd_abs_section)
1396                             continue;
1397                         }
1398                       else if (!blhe || blhe->type != bfd_link_hash_defined)
1399                         continue;
1400                     }
1401
1402                   reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1403
1404 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1405
1406                   switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1407                                          relocs[i]->howto->rightshift)
1408                     {
1409 #ifdef pe_use_x86_64
1410                     case BITS_AND_SHIFT (64, 0):
1411                       reloc_data[total_relocs].type = 10;
1412                       total_relocs++;
1413                       break;
1414 #endif
1415                     case BITS_AND_SHIFT (32, 0):
1416                       reloc_data[total_relocs].type = 3;
1417                       total_relocs++;
1418                       break;
1419                     case BITS_AND_SHIFT (16, 0):
1420                       reloc_data[total_relocs].type = 2;
1421                       total_relocs++;
1422                       break;
1423                     case BITS_AND_SHIFT (16, 16):
1424                       reloc_data[total_relocs].type = 4;
1425                       /* FIXME: we can't know the symbol's right value
1426                          yet, but we probably can safely assume that
1427                          CE will relocate us in 64k blocks, so leaving
1428                          it zero is safe.  */
1429                       reloc_data[total_relocs].extra = 0;
1430                       total_relocs++;
1431                       break;
1432                     case BITS_AND_SHIFT (26, 2):
1433                       reloc_data[total_relocs].type = 5;
1434                       total_relocs++;
1435                       break;
1436                     case BITS_AND_SHIFT (24, 2):
1437                       /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1438                          Those ARM_xxx definitions should go in proper
1439                          header someday.  */
1440                       if (relocs[i]->howto->type == 0
1441                           /* Older GNU linkers used 5 instead of 0 for this reloc.  */
1442                           || relocs[i]->howto->type == 5)
1443                         /* This is an ARM_26D reloc, which is an ARM_26 reloc
1444                            that has already been fully processed during a
1445                            previous link stage, so ignore it here.  */
1446                         break;
1447                       /* Fall through.  */
1448                     default:
1449                       /* xgettext:c-format */
1450                       einfo (_("%XError: %d-bit reloc in dll\n"),
1451                              relocs[i]->howto->bitsize);
1452                       break;
1453                     }
1454                 }
1455             }
1456           free (relocs);
1457           /* Warning: the allocated symbols are remembered in BFD and
1458              reused later, so don't free them!  */
1459         }
1460     }
1461
1462   /* At this point, we have total_relocs relocation addresses in
1463      reloc_addresses, which are all suitable for the .reloc section.
1464      We must now create the new sections.  */
1465   qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1466
1467   for (i = 0; i < total_relocs; i++)
1468     {
1469       bfd_vma this_page = (reloc_data[i].vma >> 12);
1470
1471       if (this_page != sec_page)
1472         {
1473           reloc_sz = (reloc_sz + 3) & ~3;       /* 4-byte align.  */
1474           reloc_sz += 8;
1475           sec_page = this_page;
1476         }
1477
1478       reloc_sz += 2;
1479
1480       if (reloc_data[i].type == 4)
1481         reloc_sz += 2;
1482     }
1483
1484   reloc_sz = (reloc_sz + 3) & ~3;       /* 4-byte align.  */
1485   reloc_d = xmalloc (reloc_sz);
1486   sec_page = (bfd_vma) -1;
1487   reloc_sz = 0;
1488   page_ptr = (bfd_vma) -1;
1489   page_count = 0;
1490
1491   for (i = 0; i < total_relocs; i++)
1492     {
1493       bfd_vma rva = reloc_data[i].vma - image_base;
1494       bfd_vma this_page = (rva & ~0xfff);
1495
1496       if (this_page != sec_page)
1497         {
1498           while (reloc_sz & 3)
1499             reloc_d[reloc_sz++] = 0;
1500
1501           if (page_ptr != (bfd_vma) -1)
1502             bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1503
1504           bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1505           page_ptr = reloc_sz;
1506           reloc_sz += 8;
1507           sec_page = this_page;
1508           page_count = 0;
1509         }
1510
1511       bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1512                   reloc_d + reloc_sz);
1513       reloc_sz += 2;
1514
1515       if (reloc_data[i].type == 4)
1516         {
1517           bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1518           reloc_sz += 2;
1519         }
1520
1521       page_count++;
1522     }
1523
1524   while (reloc_sz & 3)
1525     reloc_d[reloc_sz++] = 0;
1526
1527   if (page_ptr != (bfd_vma) -1)
1528     bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1529
1530   while (reloc_sz < reloc_s->size)
1531     reloc_d[reloc_sz++] = 0;
1532 }
1533
1534 /* Given the exiting def_file structure, print out a .DEF file that
1535    corresponds to it.  */
1536
1537 static void
1538 quoteput (char *s, FILE *f, int needs_quotes)
1539 {
1540   char *cp;
1541
1542   for (cp = s; *cp; cp++)
1543     if (*cp == '\''
1544         || *cp == '"'
1545         || *cp == '\\'
1546         || ISSPACE (*cp)
1547         || *cp == ','
1548         || *cp == ';')
1549       needs_quotes = 1;
1550
1551   if (needs_quotes)
1552     {
1553       putc ('"', f);
1554
1555       while (*s)
1556         {
1557           if (*s == '"' || *s == '\\')
1558             putc ('\\', f);
1559
1560           putc (*s, f);
1561           s++;
1562         }
1563
1564       putc ('"', f);
1565     }
1566   else
1567     fputs (s, f);
1568 }
1569
1570 void
1571 pe_dll_generate_def_file (const char *pe_out_def_filename)
1572 {
1573   int i;
1574   FILE *out = fopen (pe_out_def_filename, "w");
1575
1576   if (out == NULL)
1577     /* xgettext:c-format */
1578     einfo (_("%s: Can't open output def file %s\n"),
1579            program_name, pe_out_def_filename);
1580
1581   if (pe_def_file)
1582     {
1583       if (pe_def_file->name)
1584         {
1585           if (pe_def_file->is_dll)
1586             fprintf (out, "LIBRARY ");
1587           else
1588             fprintf (out, "NAME ");
1589
1590           quoteput (pe_def_file->name, out, 1);
1591
1592           if (pe_data (link_info.output_bfd)->pe_opthdr.ImageBase)
1593             {
1594               fprintf (out, " BASE=0x");
1595               fprintf_vma (out, ((bfd_vma) pe_data (link_info.output_bfd)->pe_opthdr.ImageBase));
1596             }
1597           fprintf (out, "\n");
1598         }
1599
1600       if (pe_def_file->description)
1601         {
1602           fprintf (out, "DESCRIPTION ");
1603           quoteput (pe_def_file->description, out, 1);
1604           fprintf (out, "\n");
1605         }
1606
1607       if (pe_def_file->version_minor != -1)
1608         fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1609                  pe_def_file->version_minor);
1610       else if (pe_def_file->version_major != -1)
1611         fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1612
1613       if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1614         fprintf (out, "\n");
1615
1616       if (pe_def_file->stack_commit != -1)
1617         fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1618                  pe_def_file->stack_reserve, pe_def_file->stack_commit);
1619       else if (pe_def_file->stack_reserve != -1)
1620         fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1621
1622       if (pe_def_file->heap_commit != -1)
1623         fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1624                  pe_def_file->heap_reserve, pe_def_file->heap_commit);
1625       else if (pe_def_file->heap_reserve != -1)
1626         fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1627
1628       if (pe_def_file->num_section_defs > 0)
1629         {
1630           fprintf (out, "\nSECTIONS\n\n");
1631
1632           for (i = 0; i < pe_def_file->num_section_defs; i++)
1633             {
1634               fprintf (out, "    ");
1635               quoteput (pe_def_file->section_defs[i].name, out, 0);
1636
1637               if (pe_def_file->section_defs[i].class)
1638                 {
1639                   fprintf (out, " CLASS ");
1640                   quoteput (pe_def_file->section_defs[i].class, out, 0);
1641                 }
1642
1643               if (pe_def_file->section_defs[i].flag_read)
1644                 fprintf (out, " READ");
1645
1646               if (pe_def_file->section_defs[i].flag_write)
1647                 fprintf (out, " WRITE");
1648
1649               if (pe_def_file->section_defs[i].flag_execute)
1650                 fprintf (out, " EXECUTE");
1651
1652               if (pe_def_file->section_defs[i].flag_shared)
1653                 fprintf (out, " SHARED");
1654
1655               fprintf (out, "\n");
1656             }
1657         }
1658
1659       if (pe_def_file->num_exports > 0)
1660         {
1661           fprintf (out, "EXPORTS\n");
1662
1663           for (i = 0; i < pe_def_file->num_exports; i++)
1664             {
1665               def_file_export *e = pe_def_file->exports + i;
1666               fprintf (out, "    ");
1667               quoteput (e->name, out, 0);
1668
1669               if (e->internal_name && strcmp (e->internal_name, e->name))
1670                 {
1671                   fprintf (out, " = ");
1672                   quoteput (e->internal_name, out, 0);
1673                 }
1674
1675               if (e->ordinal != -1)
1676                 fprintf (out, " @%d", e->ordinal);
1677
1678               if (e->flag_private)
1679                 fprintf (out, " PRIVATE");
1680
1681               if (e->flag_constant)
1682                 fprintf (out, " CONSTANT");
1683
1684               if (e->flag_noname)
1685                 fprintf (out, " NONAME");
1686
1687               if (e->flag_data)
1688                 fprintf (out, " DATA");
1689
1690               fprintf (out, "\n");
1691             }
1692         }
1693
1694       if (pe_def_file->num_imports > 0)
1695         {
1696           fprintf (out, "\nIMPORTS\n\n");
1697
1698           for (i = 0; i < pe_def_file->num_imports; i++)
1699             {
1700               def_file_import *im = pe_def_file->imports + i;
1701               fprintf (out, "    ");
1702
1703               if (im->internal_name
1704                   && (!im->name || strcmp (im->internal_name, im->name)))
1705                 {
1706                   quoteput (im->internal_name, out, 0);
1707                   fprintf (out, " = ");
1708                 }
1709
1710               quoteput (im->module->name, out, 0);
1711               fprintf (out, ".");
1712
1713               if (im->name)
1714                 quoteput (im->name, out, 0);
1715               else
1716                 fprintf (out, "%d", im->ordinal);
1717
1718               if (im->its_name)
1719                 {
1720                   fprintf (out, " == ");
1721                   quoteput (im->its_name, out, 0);
1722                 }
1723
1724               fprintf (out, "\n");
1725             }
1726         }
1727     }
1728   else
1729     fprintf (out, _("; no contents available\n"));
1730
1731   if (fclose (out) == EOF)
1732     /* xgettext:c-format */
1733     einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1734 }
1735
1736 /* Generate the import library.  */
1737
1738 static asymbol **symtab;
1739 static int symptr;
1740 static int tmp_seq;
1741 static int tmp_seq2;
1742 static const char *dll_filename;
1743 static char *dll_symname;
1744
1745 #define UNDSEC (asection *) &bfd_und_section
1746
1747 static asection *
1748 quick_section (bfd *abfd, const char *name, int flags, int align)
1749 {
1750   asection *sec;
1751   asymbol *sym;
1752
1753   sec = bfd_make_section_old_way (abfd, name);
1754   bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1755   bfd_set_section_alignment (abfd, sec, align);
1756   /* Remember to undo this before trying to link internally!  */
1757   sec->output_section = sec;
1758
1759   sym = bfd_make_empty_symbol (abfd);
1760   symtab[symptr++] = sym;
1761   sym->name = sec->name;
1762   sym->section = sec;
1763   sym->flags = BSF_LOCAL;
1764   sym->value = 0;
1765
1766   return sec;
1767 }
1768
1769 static void
1770 quick_symbol (bfd *abfd,
1771               const char *n1,
1772               const char *n2,
1773               const char *n3,
1774               asection *sec,
1775               int flags,
1776               int addr)
1777 {
1778   asymbol *sym;
1779   char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1780
1781   strcpy (name, n1);
1782   strcat (name, n2);
1783   strcat (name, n3);
1784   sym = bfd_make_empty_symbol (abfd);
1785   sym->name = name;
1786   sym->section = sec;
1787   sym->flags = flags;
1788   sym->value = addr;
1789   symtab[symptr++] = sym;
1790 }
1791
1792 static arelent *reltab = 0;
1793 static int relcount = 0, relsize = 0;
1794
1795 static void
1796 quick_reloc (bfd *abfd, bfd_size_type address, int which_howto, int symidx)
1797 {
1798   if (relcount >= relsize - 1)
1799     {
1800       relsize += 10;
1801       if (reltab)
1802         reltab = xrealloc (reltab, relsize * sizeof (arelent));
1803       else
1804         reltab = xmalloc (relsize * sizeof (arelent));
1805     }
1806   reltab[relcount].address = address;
1807   reltab[relcount].addend = 0;
1808   reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1809   reltab[relcount].sym_ptr_ptr = symtab + symidx;
1810   relcount++;
1811 }
1812
1813 static void
1814 save_relocs (asection *sec)
1815 {
1816   int i;
1817
1818   sec->relocation = reltab;
1819   sec->reloc_count = relcount;
1820   sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
1821   for (i = 0; i < relcount; i++)
1822     sec->orelocation[i] = sec->relocation + i;
1823   sec->orelocation[relcount] = 0;
1824   sec->flags |= SEC_RELOC;
1825   reltab = 0;
1826   relcount = relsize = 0;
1827 }
1828
1829 /*      .section        .idata$2
1830         .global         __head_my_dll
1831    __head_my_dll:
1832         .rva            hname
1833         .long           0
1834         .long           0
1835         .rva            __my_dll_iname
1836         .rva            fthunk
1837
1838         .section        .idata$5
1839         .long           0
1840    fthunk:
1841
1842         .section        .idata$4
1843         .long           0
1844    hname:                              */
1845
1846 static bfd *
1847 make_head (bfd *parent)
1848 {
1849   asection *id2, *id5, *id4;
1850   unsigned char *d2, *d5, *d4;
1851   char *oname;
1852   bfd *abfd;
1853
1854   oname = xmalloc (20);
1855   sprintf (oname, "d%06d.o", tmp_seq);
1856   tmp_seq++;
1857
1858   abfd = bfd_create (oname, parent);
1859   bfd_find_target (pe_details->object_target, abfd);
1860   bfd_make_writable (abfd);
1861
1862   bfd_set_format (abfd, bfd_object);
1863   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1864
1865   symptr = 0;
1866   symtab = xmalloc (6 * sizeof (asymbol *));
1867   id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1868   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1869   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1870   quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1871   quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1872
1873   /* OK, pay attention here.  I got confused myself looking back at
1874      it.  We create a four-byte section to mark the beginning of the
1875      list, and we include an offset of 4 in the section, so that the
1876      pointer to the list points to the *end* of this section, which is
1877      the start of the list of sections from other objects.  */
1878
1879   bfd_set_section_size (abfd, id2, 20);
1880   d2 = xmalloc (20);
1881   id2->contents = d2;
1882   memset (d2, 0, 20);
1883   if (pe_use_nul_prefixed_import_tables)
1884     d2[0] = d2[16] = PE_IDATA5_SIZE; /* Reloc addend.  */
1885   quick_reloc (abfd,  0, BFD_RELOC_RVA, 2);
1886   quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1887   quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1888   save_relocs (id2);
1889
1890   if (pe_use_nul_prefixed_import_tables)
1891     bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1892   else
1893     bfd_set_section_size (abfd, id5, 0);
1894   d5 = xmalloc (PE_IDATA5_SIZE);
1895   id5->contents = d5;
1896   memset (d5, 0, PE_IDATA5_SIZE);
1897   if (pe_use_nul_prefixed_import_tables)
1898     bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1899   else
1900     bfd_set_section_size (abfd, id4, 0);
1901   d4 = xmalloc (PE_IDATA4_SIZE);
1902   id4->contents = d4;
1903   memset (d4, 0, PE_IDATA4_SIZE);
1904
1905   bfd_set_symtab (abfd, symtab, symptr);
1906
1907   bfd_set_section_contents (abfd, id2, d2, 0, 20);
1908   if (pe_use_nul_prefixed_import_tables)
1909     {
1910       bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1911       bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1912     }
1913   else
1914     {
1915       bfd_set_section_contents (abfd, id5, d5, 0, 0);
1916       bfd_set_section_contents (abfd, id4, d4, 0, 0);
1917     }
1918
1919   bfd_make_readable (abfd);
1920   return abfd;
1921 }
1922
1923 /*      .section        .idata$4
1924         .long           0
1925         [.long          0] for PE+
1926         .section        .idata$5
1927         .long           0
1928         [.long          0] for PE+
1929         .section        idata$7
1930         .global         __my_dll_iname
1931   __my_dll_iname:
1932         .asciz          "my.dll"       */
1933
1934 static bfd *
1935 make_tail (bfd *parent)
1936 {
1937   asection *id4, *id5, *id7;
1938   unsigned char *d4, *d5, *d7;
1939   int len;
1940   char *oname;
1941   bfd *abfd;
1942
1943   oname = xmalloc (20);
1944   sprintf (oname, "d%06d.o", tmp_seq);
1945   tmp_seq++;
1946
1947   abfd = bfd_create (oname, parent);
1948   bfd_find_target (pe_details->object_target, abfd);
1949   bfd_make_writable (abfd);
1950
1951   bfd_set_format (abfd, bfd_object);
1952   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1953
1954   symptr = 0;
1955   symtab = xmalloc (5 * sizeof (asymbol *));
1956   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1957   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1958   id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1959   quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1960
1961   bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1962   d4 = xmalloc (PE_IDATA4_SIZE);
1963   id4->contents = d4;
1964   memset (d4, 0, PE_IDATA4_SIZE);
1965
1966   bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1967   d5 = xmalloc (PE_IDATA5_SIZE);
1968   id5->contents = d5;
1969   memset (d5, 0, PE_IDATA5_SIZE);
1970
1971   len = strlen (dll_filename) + 1;
1972   if (len & 1)
1973     len++;
1974   bfd_set_section_size (abfd, id7, len);
1975   d7 = xmalloc (len);
1976   id7->contents = d7;
1977   strcpy ((char *) d7, dll_filename);
1978   /* If len was odd, the above
1979      strcpy leaves behind an undefined byte. That is harmless,
1980      but we set it to 0 just so the binary dumps are pretty.  */
1981   d7[len - 1] = 0;
1982
1983   bfd_set_symtab (abfd, symtab, symptr);
1984
1985   bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1986   bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1987   bfd_set_section_contents (abfd, id7, d7, 0, len);
1988
1989   bfd_make_readable (abfd);
1990   return abfd;
1991 }
1992
1993 /*      .text
1994         .global         _function
1995         .global         ___imp_function
1996         .global         __imp__function
1997   _function:
1998         jmp             *__imp__function:
1999
2000         .section        idata$7
2001         .long           __head_my_dll
2002
2003         .section        .idata$5
2004   ___imp_function:
2005   __imp__function:
2006   iat?
2007         .section        .idata$4
2008   iat?
2009         .section        .idata$6
2010   ID<ordinal>:
2011         .short          <hint>
2012         .asciz          "function" xlate? (add underscore, kill at)  */
2013
2014 static const unsigned char jmp_ix86_bytes[] =
2015 {
2016   0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
2017 };
2018
2019 /* _function:
2020         mov.l   ip+8,r0
2021         mov.l   @r0,r0
2022         jmp     @r0
2023         nop
2024         .dw     __imp_function   */
2025
2026 static const unsigned char jmp_sh_bytes[] =
2027 {
2028   0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
2029 };
2030
2031 /* _function:
2032         lui     $t0,<high:__imp_function>
2033         lw      $t0,<low:__imp_function>
2034         jr      $t0
2035         nop                              */
2036
2037 static const unsigned char jmp_mips_bytes[] =
2038 {
2039   0x00, 0x00, 0x08, 0x3c,  0x00, 0x00, 0x08, 0x8d,
2040   0x08, 0x00, 0x00, 0x01,  0x00, 0x00, 0x00, 0x00
2041 };
2042
2043 static const unsigned char jmp_arm_bytes[] =
2044 {
2045   0x00, 0xc0, 0x9f, 0xe5,       /* ldr  ip, [pc] */
2046   0x00, 0xf0, 0x9c, 0xe5,       /* ldr  pc, [ip] */
2047   0,    0,    0,    0
2048 };
2049
2050
2051 static bfd *
2052 make_one (def_file_export *exp, bfd *parent, bfd_boolean include_jmp_stub)
2053 {
2054   asection *tx, *id7, *id5, *id4, *id6;
2055   unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
2056   int len;
2057   char *oname;
2058   bfd *abfd;
2059   const unsigned char *jmp_bytes = NULL;
2060   int jmp_byte_count = 0;
2061
2062   /* Include the jump stub section only if it is needed. A jump
2063      stub is needed if the symbol being imported <sym> is a function
2064      symbol and there is at least one undefined reference to that
2065      symbol. In other words, if all the import references to <sym> are
2066      explicitly through _declspec(dllimport) then the jump stub is not
2067      needed.  */
2068   if (include_jmp_stub)
2069     {
2070       switch (pe_details->pe_arch)
2071         {
2072         case PE_ARCH_i386:
2073           jmp_bytes = jmp_ix86_bytes;
2074           jmp_byte_count = sizeof (jmp_ix86_bytes);
2075           break;
2076         case PE_ARCH_sh:
2077           jmp_bytes = jmp_sh_bytes;
2078           jmp_byte_count = sizeof (jmp_sh_bytes);
2079           break;
2080         case PE_ARCH_mips:
2081           jmp_bytes = jmp_mips_bytes;
2082           jmp_byte_count = sizeof (jmp_mips_bytes);
2083           break;
2084         case PE_ARCH_arm:
2085         case PE_ARCH_arm_epoc:
2086         case PE_ARCH_arm_wince:
2087           jmp_bytes = jmp_arm_bytes;
2088           jmp_byte_count = sizeof (jmp_arm_bytes);
2089           break;
2090         default:
2091           abort ();
2092         }
2093     }
2094
2095   oname = xmalloc (20);
2096   sprintf (oname, "d%06d.o", tmp_seq);
2097   tmp_seq++;
2098
2099   abfd = bfd_create (oname, parent);
2100   bfd_find_target (pe_details->object_target, abfd);
2101   bfd_make_writable (abfd);
2102
2103   bfd_set_format (abfd, bfd_object);
2104   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2105
2106   symptr = 0;
2107   symtab = xmalloc (12 * sizeof (asymbol *));
2108
2109   tx  = quick_section (abfd, ".text", SEC_CODE | SEC_HAS_CONTENTS | SEC_READONLY, 2);
2110   id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
2111   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2112   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2113   id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
2114
2115   if  (*exp->internal_name == '@')
2116     {
2117       quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2118                     BSF_GLOBAL, 0);
2119       if (include_jmp_stub)
2120         quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
2121       quick_symbol (abfd, "__imp_", exp->internal_name, "", id5,
2122                     BSF_GLOBAL, 0);
2123       /* Fastcall applies only to functions,
2124          so no need for auto-import symbol.  */
2125     }
2126   else
2127     {
2128       quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2129                     BSF_GLOBAL, 0);
2130       if (include_jmp_stub)
2131         quick_symbol (abfd, U (""), exp->internal_name, "", tx,
2132                       BSF_GLOBAL, 0);
2133       quick_symbol (abfd, "__imp_", U (""), exp->internal_name, id5,
2134                     BSF_GLOBAL, 0);
2135       /* Symbol to reference ord/name of imported
2136          data symbol, used to implement auto-import.  */
2137       if (exp->flag_data)
2138         quick_symbol (abfd, "__nm_", U (""), exp->internal_name, id6,
2139                       BSF_GLOBAL,0);
2140     }
2141   if (pe_dll_compat_implib)
2142     quick_symbol (abfd, "___imp_", exp->internal_name, "", id5,
2143                   BSF_GLOBAL, 0);
2144
2145   if (include_jmp_stub)
2146     {
2147       bfd_set_section_size (abfd, tx, jmp_byte_count);
2148       td = xmalloc (jmp_byte_count);
2149       tx->contents = td;
2150       memcpy (td, jmp_bytes, jmp_byte_count);
2151
2152       switch (pe_details->pe_arch)
2153         {
2154         case PE_ARCH_i386:
2155 #ifdef pe_use_x86_64
2156           quick_reloc (abfd, 2, BFD_RELOC_32_PCREL, 2);
2157 #else
2158           /* Mark this object as SAFESEH compatible.  */
2159           quick_symbol (abfd, "", "@feat.00", "", bfd_abs_section_ptr,
2160                         BSF_LOCAL, 1);
2161           quick_reloc (abfd, 2, BFD_RELOC_32, 2);
2162 #endif
2163           break;
2164         case PE_ARCH_sh:
2165           quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2166           break;
2167         case PE_ARCH_mips:
2168           quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
2169           quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
2170           quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
2171           break;
2172         case PE_ARCH_arm:
2173         case PE_ARCH_arm_epoc:
2174         case PE_ARCH_arm_wince:
2175           quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2176           break;
2177         default:
2178           abort ();
2179         }
2180       save_relocs (tx);
2181     }
2182   else
2183     bfd_set_section_size (abfd, tx, 0);
2184
2185   bfd_set_section_size (abfd, id7, 4);
2186   d7 = xmalloc (4);
2187   id7->contents = d7;
2188   memset (d7, 0, 4);
2189   quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
2190   save_relocs (id7);
2191
2192   bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
2193   d5 = xmalloc (PE_IDATA5_SIZE);
2194   id5->contents = d5;
2195   memset (d5, 0, PE_IDATA5_SIZE);
2196
2197   if (exp->flag_noname)
2198     {
2199       d5[0] = exp->ordinal;
2200       d5[1] = exp->ordinal >> 8;
2201       d5[PE_IDATA5_SIZE - 1] = 0x80;
2202     }
2203   else
2204     {
2205       quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2206       save_relocs (id5);
2207     }
2208
2209   bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
2210   d4 = xmalloc (PE_IDATA4_SIZE);
2211   id4->contents = d4;
2212   memset (d4, 0, PE_IDATA4_SIZE);
2213
2214   if (exp->flag_noname)
2215     {
2216       d4[0] = exp->ordinal;
2217       d4[1] = exp->ordinal >> 8;
2218       d4[PE_IDATA4_SIZE - 1] = 0x80;
2219     }
2220   else
2221     {
2222       quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2223       save_relocs (id4);
2224     }
2225
2226   if (exp->flag_noname)
2227     {
2228       len = 0;
2229       bfd_set_section_size (abfd, id6, 0);
2230     }
2231   else
2232     {
2233       /* { short, asciz }  */
2234       if (exp->its_name)
2235         len = 2 + strlen (exp->its_name) + 1;
2236       else
2237         len = 2 + strlen (exp->name) + 1;
2238       if (len & 1)
2239         len++;
2240       bfd_set_section_size (abfd, id6, len);
2241       d6 = xmalloc (len);
2242       id6->contents = d6;
2243       memset (d6, 0, len);
2244       d6[0] = exp->hint & 0xff;
2245       d6[1] = exp->hint >> 8;
2246       if (exp->its_name)
2247         strcpy ((char*) d6 + 2, exp->its_name);
2248       else
2249         strcpy ((char *) d6 + 2, exp->name);
2250     }
2251
2252   bfd_set_symtab (abfd, symtab, symptr);
2253
2254   if (include_jmp_stub)
2255     bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
2256   bfd_set_section_contents (abfd, id7, d7, 0, 4);
2257   bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2258   bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2259   if (!exp->flag_noname)
2260     bfd_set_section_contents (abfd, id6, d6, 0, len);
2261
2262   bfd_make_readable (abfd);
2263   return abfd;
2264 }
2265
2266 static bfd *
2267 make_singleton_name_imp (const char *import, bfd *parent)
2268 {
2269   /* Name thunks go to idata$4.  */
2270   asection *id5;
2271   unsigned char *d5;
2272   char *oname;
2273   bfd *abfd;
2274
2275   oname = xmalloc (20);
2276   sprintf (oname, "nmimp%06d.o", tmp_seq2);
2277   tmp_seq2++;
2278
2279   abfd = bfd_create (oname, parent);
2280   bfd_find_target (pe_details->object_target, abfd);
2281   bfd_make_writable (abfd);
2282
2283   bfd_set_format (abfd, bfd_object);
2284   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2285
2286   symptr = 0;
2287   symtab = xmalloc (3 * sizeof (asymbol *));
2288   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2289   quick_symbol (abfd, "__imp_", import, "", id5, BSF_GLOBAL, 0);
2290
2291   /* We need space for the real thunk and for the null terminator.  */
2292   bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE * 2);
2293   d5 = xmalloc (PE_IDATA5_SIZE * 2);
2294   id5->contents = d5;
2295   memset (d5, 0, PE_IDATA5_SIZE * 2);
2296   quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2297   save_relocs (id5);
2298
2299   bfd_set_symtab (abfd, symtab, symptr);
2300
2301   bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA4_SIZE * 2);
2302
2303   bfd_make_readable (abfd);
2304   return abfd;
2305 }
2306
2307 static bfd *
2308 make_singleton_name_thunk (const char *import, bfd *parent)
2309 {
2310   /* Name thunks go to idata$4.  */
2311   asection *id4;
2312   unsigned char *d4;
2313   char *oname;
2314   bfd *abfd;
2315
2316   oname = xmalloc (20);
2317   sprintf (oname, "nmth%06d.o", tmp_seq);
2318   tmp_seq++;
2319
2320   abfd = bfd_create (oname, parent);
2321   bfd_find_target (pe_details->object_target, abfd);
2322   bfd_make_writable (abfd);
2323
2324   bfd_set_format (abfd, bfd_object);
2325   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2326
2327   symptr = 0;
2328   symtab = xmalloc (3 * sizeof (asymbol *));
2329   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2330   quick_symbol (abfd, "__nm_thnk_", import, "", id4, BSF_GLOBAL, 0);
2331   quick_symbol (abfd, "__nm_", import, "", UNDSEC, BSF_GLOBAL, 0);
2332
2333   /* We need space for the real thunk and for the null terminator.  */
2334   bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE * 2);
2335   d4 = xmalloc (PE_IDATA4_SIZE * 2);
2336   id4->contents = d4;
2337   memset (d4, 0, PE_IDATA4_SIZE * 2);
2338   quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2339   save_relocs (id4);
2340
2341   bfd_set_symtab (abfd, symtab, symptr);
2342
2343   bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE * 2);
2344
2345   bfd_make_readable (abfd);
2346   return abfd;
2347 }
2348
2349 static char *
2350 make_import_fixup_mark (arelent *rel)
2351 {
2352   /* We convert reloc to symbol, for later reference.  */
2353   static int counter;
2354   static char *fixup_name = NULL;
2355   static size_t buffer_len = 0;
2356
2357   struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2358
2359   bfd *abfd = bfd_asymbol_bfd (sym);
2360   struct bfd_link_hash_entry *bh;
2361
2362   if (!fixup_name)
2363     {
2364       fixup_name = xmalloc (384);
2365       buffer_len = 384;
2366     }
2367
2368   if (strlen (sym->name) + 25 > buffer_len)
2369   /* Assume 25 chars for "__fu" + counter + "_".  If counter is
2370      bigger than 20 digits long, we've got worse problems than
2371      overflowing this buffer...  */
2372     {
2373       free (fixup_name);
2374       /* New buffer size is length of symbol, plus 25, but
2375          then rounded up to the nearest multiple of 128.  */
2376       buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
2377       fixup_name = xmalloc (buffer_len);
2378     }
2379
2380   sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2381
2382   bh = NULL;
2383   bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2384                                 current_sec, /* sym->section, */
2385                                 rel->address, NULL, TRUE, FALSE, &bh);
2386
2387   return fixup_name;
2388 }
2389
2390 /*      .section        .idata$2
2391         .rva            __nm_thnk_SYM (singleton thunk with name of func)
2392         .long           0
2393         .long           0
2394         .rva            __my_dll_iname (name of dll)
2395         .rva            __fuNN_SYM (pointer to reference (address) in text)  */
2396
2397 static bfd *
2398 make_import_fixup_entry (const char *name,
2399                          const char *fixup_name,
2400                          const char *symname,
2401                          bfd *parent)
2402 {
2403   asection *id2;
2404   unsigned char *d2;
2405   char *oname;
2406   bfd *abfd;
2407
2408   oname = xmalloc (20);
2409   sprintf (oname, "fu%06d.o", tmp_seq);
2410   tmp_seq++;
2411
2412   abfd = bfd_create (oname, parent);
2413   bfd_find_target (pe_details->object_target, abfd);
2414   bfd_make_writable (abfd);
2415
2416   bfd_set_format (abfd, bfd_object);
2417   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2418
2419   symptr = 0;
2420   symtab = xmalloc (6 * sizeof (asymbol *));
2421   id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2422
2423   quick_symbol (abfd, "__nm_thnk_", name, "", UNDSEC, BSF_GLOBAL, 0);
2424   quick_symbol (abfd, U (""), symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2425   /* For relocator v2 we have to use the .idata$5 element and not
2426      fixup_name.  */
2427   if (link_info.pei386_runtime_pseudo_reloc == 2)
2428     quick_symbol (abfd, "__imp_", name, "", UNDSEC, BSF_GLOBAL, 0);
2429   else
2430     quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2431
2432   bfd_set_section_size (abfd, id2, 20);
2433   d2 = xmalloc (20);
2434   id2->contents = d2;
2435   memset (d2, 0, 20);
2436
2437   quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2438   quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2439   quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2440   save_relocs (id2);
2441
2442   bfd_set_symtab (abfd, symtab, symptr);
2443
2444   bfd_set_section_contents (abfd, id2, d2, 0, 20);
2445
2446   bfd_make_readable (abfd);
2447   return abfd;
2448 }
2449
2450 /*      .section        .rdata_runtime_pseudo_reloc
2451         .long           addend
2452         .rva            __fuNN_SYM (pointer to reference (address) in text)  */
2453
2454 static bfd *
2455 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2456                            const char *fixup_name,
2457                            bfd_vma addend ATTRIBUTE_UNUSED,
2458                            bfd_vma bitsize,
2459                            bfd *parent)
2460 {
2461   asection *rt_rel;
2462   unsigned char *rt_rel_d;
2463   char *oname;
2464   bfd *abfd;
2465   oname = xmalloc (20);
2466   sprintf (oname, "rtr%06d.o", tmp_seq);
2467   tmp_seq++;
2468
2469   abfd = bfd_create (oname, parent);
2470   bfd_find_target (pe_details->object_target, abfd);
2471   bfd_make_writable (abfd);
2472
2473   bfd_set_format (abfd, bfd_object);
2474   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2475
2476   symptr = 0;
2477   if (link_info.pei386_runtime_pseudo_reloc == 2)
2478     {
2479       symtab = xmalloc ((runtime_pseudp_reloc_v2_init ? 3 : 6) * sizeof (asymbol *));
2480     }
2481   else
2482     {
2483       symtab = xmalloc (2 * sizeof (asymbol *));
2484     }
2485   rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2486                           SEC_HAS_CONTENTS, 2);
2487
2488   quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2489
2490   if (link_info.pei386_runtime_pseudo_reloc == 2)
2491     {
2492           size_t size = 12;
2493           if (! runtime_pseudp_reloc_v2_init)
2494             {
2495                   size += 12;
2496                   runtime_pseudp_reloc_v2_init = 1;
2497             }
2498       quick_symbol (abfd, "__imp_", name, "", UNDSEC, BSF_GLOBAL, 0);
2499
2500       bfd_set_section_size (abfd, rt_rel, size);
2501       rt_rel_d = xmalloc (size);
2502       rt_rel->contents = rt_rel_d;
2503       memset (rt_rel_d, 0, size);
2504           quick_reloc (abfd, size - 8, BFD_RELOC_RVA, 1);
2505           quick_reloc (abfd, size - 12, BFD_RELOC_RVA, 2);
2506           bfd_put_32 (abfd, bitsize, rt_rel_d + (size - 4));
2507           if (size != 12)
2508             bfd_put_32 (abfd, 1, rt_rel_d + 8);
2509       save_relocs (rt_rel);
2510
2511       bfd_set_symtab (abfd, symtab, symptr);
2512
2513       bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, size);
2514    }
2515   else
2516    {
2517       bfd_set_section_size (abfd, rt_rel, 8);
2518       rt_rel_d = xmalloc (8);
2519       rt_rel->contents = rt_rel_d;
2520       memset (rt_rel_d, 0, 8);
2521
2522       bfd_put_32 (abfd, addend, rt_rel_d);
2523       quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2524
2525       save_relocs (rt_rel);
2526
2527       bfd_set_symtab (abfd, symtab, symptr);
2528
2529       bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2530    }
2531   bfd_make_readable (abfd);
2532   return abfd;
2533 }
2534
2535 /*      .section        .rdata
2536         .rva            __pei386_runtime_relocator  */
2537
2538 static bfd *
2539 pe_create_runtime_relocator_reference (bfd *parent)
2540 {
2541   asection *extern_rt_rel;
2542   unsigned char *extern_rt_rel_d;
2543   char *oname;
2544   bfd *abfd;
2545
2546   oname = xmalloc (20);
2547   sprintf (oname, "ertr%06d.o", tmp_seq);
2548   tmp_seq++;
2549
2550   abfd = bfd_create (oname, parent);
2551   bfd_find_target (pe_details->object_target, abfd);
2552   bfd_make_writable (abfd);
2553
2554   bfd_set_format (abfd, bfd_object);
2555   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2556
2557   symptr = 0;
2558   symtab = xmalloc (2 * sizeof (asymbol *));
2559   extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2560
2561   quick_symbol (abfd, "", U ("_pei386_runtime_relocator"), "", UNDSEC,
2562                 BSF_NO_FLAGS, 0);
2563
2564   bfd_set_section_size (abfd, extern_rt_rel, PE_IDATA5_SIZE);
2565   extern_rt_rel_d = xmalloc (PE_IDATA5_SIZE);
2566   extern_rt_rel->contents = extern_rt_rel_d;
2567
2568   quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2569   save_relocs (extern_rt_rel);
2570
2571   bfd_set_symtab (abfd, symtab, symptr);
2572
2573   bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, PE_IDATA5_SIZE);
2574
2575   bfd_make_readable (abfd);
2576   return abfd;
2577 }
2578
2579 void
2580 pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend)
2581 {
2582   char buf[300];
2583   struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2584   struct bfd_link_hash_entry *name_thunk_sym;
2585   struct bfd_link_hash_entry *name_imp_sym;
2586   const char *name = sym->name;
2587   char *fixup_name = make_import_fixup_mark (rel);
2588   bfd *b;
2589   int need_import_table = 1;
2590
2591   sprintf (buf, "__imp_%s", name);
2592   name_imp_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2593
2594   sprintf (buf, "__nm_thnk_%s", name);
2595
2596   name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2597
2598   /* For version 2 pseudo relocation we don't need to add an import
2599      if the import symbol is already present.  */
2600   if (link_info.pei386_runtime_pseudo_reloc == 2
2601       && name_imp_sym
2602       && name_imp_sym->type == bfd_link_hash_defined)
2603     need_import_table = 0;
2604
2605   if (need_import_table == 1
2606       && (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined))
2607     {
2608       b = make_singleton_name_thunk (name, link_info.output_bfd);
2609       add_bfd_to_link (b, b->filename, &link_info);
2610
2611       /* If we ever use autoimport, we have to cast text section writable.
2612          But not for version 2.  */
2613       if (link_info.pei386_runtime_pseudo_reloc != 2)
2614         {
2615           config.text_read_only = FALSE;
2616           link_info.output_bfd->flags &= ~WP_TEXT;
2617         }
2618       if (link_info.pei386_runtime_pseudo_reloc == 2)
2619         {
2620           b = make_singleton_name_imp (name, link_info.output_bfd);
2621           add_bfd_to_link (b, b->filename, &link_info);
2622         }
2623     }
2624
2625   if ((addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2626       && need_import_table == 1)
2627     {
2628       extern char * pe_data_import_dll;
2629       char * symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2630
2631       b = make_import_fixup_entry (name, fixup_name, symname,
2632                                    link_info.output_bfd);
2633       add_bfd_to_link (b, b->filename, &link_info);
2634     }
2635
2636     if ((link_info.pei386_runtime_pseudo_reloc != 0 && addend != 0)
2637         || link_info.pei386_runtime_pseudo_reloc == 2)
2638       {
2639         if (pe_dll_extra_pe_debug)
2640           printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2641                   fixup_name, (int) addend);
2642
2643         b = make_runtime_pseudo_reloc (name, fixup_name, addend, rel->howto->bitsize,
2644                                        link_info.output_bfd);
2645         add_bfd_to_link (b, b->filename, &link_info);
2646
2647         if (runtime_pseudo_relocs_created == 0)
2648           {
2649             b = pe_create_runtime_relocator_reference (link_info.output_bfd);
2650             add_bfd_to_link (b, b->filename, &link_info);
2651           }
2652         runtime_pseudo_relocs_created++;
2653       }
2654     else if (addend != 0)
2655       {
2656         einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2657                s->owner, s, rel->address, sym->name);
2658         einfo ("%X");
2659       }
2660 }
2661
2662
2663 void
2664 pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_info *info)
2665 {
2666   int i;
2667   bfd *ar_head;
2668   bfd *ar_tail;
2669   bfd *outarch;
2670   bfd *ibfd;
2671   bfd *head = 0;
2672
2673   dll_filename = (def->name) ? def->name : dll_name;
2674   dll_symname = xstrdup (dll_filename);
2675   for (i = 0; dll_symname[i]; i++)
2676     if (!ISALNUM (dll_symname[i]))
2677       dll_symname[i] = '_';
2678
2679   unlink_if_ordinary (impfilename);
2680
2681   outarch = bfd_openw (impfilename, 0);
2682
2683   if (!outarch)
2684     {
2685       /* xgettext:c-format */
2686       einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2687       return;
2688     }
2689
2690   /* xgettext:c-format */
2691   info_msg (_("Creating library file: %s\n"), impfilename);
2692
2693   bfd_set_format (outarch, bfd_archive);
2694   outarch->has_armap = 1;
2695
2696   /* Work out a reasonable size of things to put onto one line.  */
2697   ar_head = make_head (outarch);
2698
2699   /* Iterate the input BFDs, looking for exclude-modules-for-implib.  */
2700   for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link_next)
2701     {
2702       /* Iterate the exclude list.  */
2703       struct exclude_list_struct *ex;
2704       char found;
2705       for (ex = excludes, found = 0; ex && !found; ex = ex->next)
2706         {
2707           if (ex->type != EXCLUDEFORIMPLIB)
2708             continue;
2709           found = (filename_cmp (ex->string, ibfd->filename) == 0);
2710         }
2711       /* If it matched, we must open a fresh BFD for it (the original
2712         input BFD is still needed for the DLL's final link) and add
2713         it into the archive member chain.  */
2714       if (found)
2715         {
2716           bfd *newbfd = bfd_openr (ibfd->my_archive
2717                 ? ibfd->my_archive->filename : ibfd->filename, NULL);
2718           if (!newbfd)
2719             {
2720               einfo (_("%Xbfd_openr %s: %E\n"), ibfd->filename);
2721               return;
2722             }
2723           if (ibfd->my_archive)
2724             {
2725               /* Must now iterate through archive until we find the
2726                 required member.  A minor shame that we'll open the
2727                 archive once per member that we require from it, and
2728                 leak those archive bfds rather than reuse them.  */
2729               bfd *arbfd = newbfd;
2730               if (!bfd_check_format_matches (arbfd, bfd_archive, NULL))
2731                 {
2732                   einfo (_("%X%s(%s): can't find member in non-archive file"),
2733                     ibfd->my_archive->filename, ibfd->filename);
2734                   return;
2735                 }
2736               newbfd = NULL;
2737               while ((newbfd = bfd_openr_next_archived_file (arbfd, newbfd)) != 0)
2738                 {
2739                   if (filename_cmp (newbfd->filename, ibfd->filename) == 0)
2740                     break;
2741                 }
2742               if (!newbfd)
2743                 {
2744                   einfo (_("%X%s(%s): can't find member in archive"),
2745                     ibfd->my_archive->filename, ibfd->filename);
2746                   return;
2747                 }
2748             }
2749           newbfd->archive_next = head;
2750           head = newbfd;
2751         }
2752     }
2753
2754   for (i = 0; i < def->num_exports; i++)
2755     {
2756       /* The import library doesn't know about the internal name.  */
2757       char *internal = def->exports[i].internal_name;
2758       bfd *n;
2759
2760       /* Don't add PRIVATE entries to import lib.  */
2761       if (pe_def_file->exports[i].flag_private)
2762         continue;
2763       def->exports[i].internal_name = def->exports[i].name;
2764       n = make_one (def->exports + i, outarch,
2765                     ! (def->exports + i)->flag_data);
2766       n->archive_next = head;
2767       head = n;
2768       def->exports[i].internal_name = internal;
2769     }
2770
2771   ar_tail = make_tail (outarch);
2772
2773   if (ar_head == NULL || ar_tail == NULL)
2774     return;
2775
2776   /* Now stick them all into the archive.  */
2777   ar_head->archive_next = head;
2778   ar_tail->archive_next = ar_head;
2779   head = ar_tail;
2780
2781   if (! bfd_set_archive_head (outarch, head))
2782     einfo ("%Xbfd_set_archive_head: %E\n");
2783
2784   if (! bfd_close (outarch))
2785     einfo ("%Xbfd_close %s: %E\n", impfilename);
2786
2787   while (head != NULL)
2788     {
2789       bfd *n = head->archive_next;
2790       bfd_close (head);
2791       head = n;
2792     }
2793 }
2794
2795 static struct bfd_link_hash_entry *found_sym;
2796
2797 static bfd_boolean
2798 pe_undef_alias_cdecl_match (struct bfd_link_hash_entry *h, void *inf)
2799 {
2800   int sl;
2801   char *string = inf;
2802   const char *hs = h->root.string;
2803
2804   sl = strlen (string);
2805   if (h->type == bfd_link_hash_undefined
2806       && ((*hs == '@' && (!pe_details->underscored || *string == '_')
2807            && strncmp (hs + 1, string + (pe_details->underscored != 0),
2808                        sl - (pe_details->underscored != 0)) == 0)
2809           || strncmp (hs, string, sl) == 0)
2810       && h->root.string[sl] == '@')
2811     {
2812       found_sym = h;
2813       return FALSE;
2814     }
2815   return TRUE;
2816 }
2817
2818 static struct bfd_link_hash_entry *
2819 pe_find_cdecl_alias_match (char *name)
2820 {
2821   found_sym = 0;
2822   bfd_link_hash_traverse (link_info.hash, pe_undef_alias_cdecl_match,
2823                           (char *) name);
2824   return found_sym;
2825 }
2826
2827 static void
2828 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *linfo)
2829 {
2830   lang_input_statement_type *fake_file;
2831
2832   fake_file = lang_add_input_file (name,
2833                                    lang_input_file_is_fake_enum,
2834                                    NULL);
2835   fake_file->the_bfd = abfd;
2836   ldlang_add_file (fake_file);
2837
2838   if (!bfd_link_add_symbols (abfd, linfo))
2839     einfo ("%Xaddsym %s: %E\n", name);
2840 }
2841
2842 void
2843 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *linfo)
2844 {
2845   def_file_module *module;
2846
2847   pe_dll_id_target (bfd_get_target (output_bfd));
2848
2849   if (!pe_def_file)
2850     return;
2851
2852   for (module = pe_def_file->modules; module; module = module->next)
2853     {
2854       int i, do_this_dll;
2855
2856       dll_filename = module->name;
2857       dll_symname = xstrdup (module->name);
2858       for (i = 0; dll_symname[i]; i++)
2859         if (!ISALNUM (dll_symname[i]))
2860           dll_symname[i] = '_';
2861
2862       do_this_dll = 0;
2863
2864       for (i = 0; i < pe_def_file->num_imports; i++)
2865         if (pe_def_file->imports[i].module == module)
2866           {
2867             def_file_export exp;
2868             struct bfd_link_hash_entry *blhe;
2869             int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2870             /* See if we need this import.  */
2871             size_t len = strlen (pe_def_file->imports[i].internal_name);
2872             char *name = xmalloc (len + 2 + 6);
2873             bfd_boolean include_jmp_stub = FALSE;
2874             bfd_boolean is_cdecl = FALSE;
2875             if (!lead_at && strchr (pe_def_file->imports[i].internal_name, '@') == NULL)
2876                 is_cdecl = TRUE;
2877
2878             if (lead_at)
2879               sprintf (name, "%s",
2880                        pe_def_file->imports[i].internal_name);
2881             else
2882               sprintf (name, "%s%s",U (""),
2883                        pe_def_file->imports[i].internal_name);
2884
2885             blhe = bfd_link_hash_lookup (linfo->hash, name,
2886                                          FALSE, FALSE, FALSE);
2887
2888             /* Include the jump stub for <sym> only if the <sym>
2889                is undefined.  */
2890             if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2891               {
2892                 if (lead_at)
2893                   sprintf (name, "%s%s", "__imp_",
2894                            pe_def_file->imports[i].internal_name);
2895                 else
2896                   sprintf (name, "%s%s%s", "__imp_", U (""),
2897                            pe_def_file->imports[i].internal_name);
2898
2899                 blhe = bfd_link_hash_lookup (linfo->hash, name,
2900                                              FALSE, FALSE, FALSE);
2901               }
2902             else
2903               include_jmp_stub = TRUE;
2904
2905             if (is_cdecl && !blhe)
2906               {
2907                 sprintf (name, "%s%s",U (""),
2908                          pe_def_file->imports[i].internal_name);
2909                 blhe = pe_find_cdecl_alias_match (name);
2910                 include_jmp_stub = TRUE;
2911               }
2912
2913             free (name);
2914
2915             if (blhe && blhe->type == bfd_link_hash_undefined)
2916               {
2917                 bfd *one;
2918                 /* We do.  */
2919                 if (!do_this_dll)
2920                   {
2921                     bfd *ar_head = make_head (output_bfd);
2922                     add_bfd_to_link (ar_head, ar_head->filename, linfo);
2923                     do_this_dll = 1;
2924                   }
2925                 exp.internal_name = pe_def_file->imports[i].internal_name;
2926                 exp.name = pe_def_file->imports[i].name;
2927                 exp.its_name = pe_def_file->imports[i].its_name;
2928                 exp.ordinal = pe_def_file->imports[i].ordinal;
2929                 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2930                 exp.flag_private = 0;
2931                 exp.flag_constant = 0;
2932                 exp.flag_data = pe_def_file->imports[i].data;
2933                 exp.flag_noname = exp.name ? 0 : 1;
2934                 one = make_one (&exp, output_bfd, (! exp.flag_data) && include_jmp_stub);
2935                 add_bfd_to_link (one, one->filename, linfo);
2936               }
2937           }
2938       if (do_this_dll)
2939         {
2940           bfd *ar_tail = make_tail (output_bfd);
2941           add_bfd_to_link (ar_tail, ar_tail->filename, linfo);
2942         }
2943
2944       free (dll_symname);
2945     }
2946 }
2947
2948 /* We were handed a *.DLL file.  Parse it and turn it into a set of
2949    IMPORTS directives in the def file.  Return TRUE if the file was
2950    handled, FALSE if not.  */
2951
2952 static unsigned int
2953 pe_get16 (bfd *abfd, int where)
2954 {
2955   unsigned char b[2];
2956
2957   bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2958   bfd_bread (b, (bfd_size_type) 2, abfd);
2959   return b[0] + (b[1] << 8);
2960 }
2961
2962 static unsigned int
2963 pe_get32 (bfd *abfd, int where)
2964 {
2965   unsigned char b[4];
2966
2967   bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2968   bfd_bread (b, (bfd_size_type) 4, abfd);
2969   return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2970 }
2971
2972 static unsigned int
2973 pe_as32 (void *ptr)
2974 {
2975   unsigned char *b = ptr;
2976
2977   return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2978 }
2979
2980 bfd_boolean
2981 pe_implied_import_dll (const char *filename)
2982 {
2983   bfd *dll;
2984   bfd_vma pe_header_offset, opthdr_ofs, num_entries, i;
2985   bfd_vma export_rva, export_size, nsections, secptr, expptr;
2986   bfd_vma exp_funcbase;
2987   unsigned char *expdata;
2988   char *erva;
2989   bfd_vma name_rvas, nexp;
2990   const char *dllname;
2991   /* Initialization with start > end guarantees that is_data
2992      will not be set by mistake, and avoids compiler warning.  */
2993   bfd_vma data_start = 1;
2994   bfd_vma data_end = 0;
2995   bfd_vma rdata_start = 1;
2996   bfd_vma rdata_end = 0;
2997   bfd_vma bss_start = 1;
2998   bfd_vma bss_end = 0;
2999
3000   /* No, I can't use bfd here.  kernel32.dll puts its export table in
3001      the middle of the .rdata section.  */
3002   dll = bfd_openr (filename, pe_details->target_name);
3003   if (!dll)
3004     {
3005       einfo ("%Xopen %s: %E\n", filename);
3006       return FALSE;
3007     }
3008
3009   /* PEI dlls seem to be bfd_objects.  */
3010   if (!bfd_check_format (dll, bfd_object))
3011     {
3012       einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
3013       return FALSE;
3014     }
3015
3016   /* Get pe_header, optional header and numbers of directory entries.  */
3017   pe_header_offset = pe_get32 (dll, 0x3c);
3018   opthdr_ofs = pe_header_offset + 4 + 20;
3019 #ifdef pe_use_x86_64
3020   num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /*  & NumberOfRvaAndSizes.  */
3021 #else
3022   num_entries = pe_get32 (dll, opthdr_ofs + 92);
3023 #endif
3024
3025   /* No import or export directory entry.  */
3026   if (num_entries < 1)
3027     return FALSE;
3028
3029 #ifdef pe_use_x86_64
3030   export_rva  = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
3031   export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
3032 #else
3033   export_rva = pe_get32 (dll, opthdr_ofs + 96);
3034   export_size = pe_get32 (dll, opthdr_ofs + 100);
3035 #endif
3036
3037   /* No export table - nothing to export.  */
3038   if (export_size == 0)
3039     return FALSE;
3040
3041   nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
3042   secptr = (pe_header_offset + 4 + 20 +
3043             pe_get16 (dll, pe_header_offset + 4 + 16));
3044   expptr = 0;
3045
3046   /* Get the rva and size of the export section.  */
3047   for (i = 0; i < nsections; i++)
3048     {
3049       char sname[8];
3050       bfd_vma secptr1 = secptr + 40 * i;
3051       bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3052       bfd_vma vsize = pe_get32 (dll, secptr1 + 16);
3053       bfd_vma fptr = pe_get32 (dll, secptr1 + 20);
3054
3055       bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
3056       bfd_bread (sname, (bfd_size_type) 8, dll);
3057
3058       if (vaddr <= export_rva && vaddr + vsize > export_rva)
3059         {
3060           expptr = fptr + (export_rva - vaddr);
3061           if (export_rva + export_size > vaddr + vsize)
3062             export_size = vsize - (export_rva - vaddr);
3063           break;
3064         }
3065     }
3066
3067   /* Scan sections and store the base and size of the
3068      data and bss segments in data/base_start/end.  */
3069   for (i = 0; i < nsections; i++)
3070     {
3071       bfd_vma secptr1 = secptr + 40 * i;
3072       bfd_vma vsize = pe_get32 (dll, secptr1 + 8);
3073       bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3074       bfd_vma flags = pe_get32 (dll, secptr1 + 36);
3075       char sec_name[9];
3076
3077       sec_name[8] = '\0';
3078       bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
3079       bfd_bread (sec_name, (bfd_size_type) 8, dll);
3080
3081       if (strcmp(sec_name,".data") == 0)
3082         {
3083           data_start = vaddr;
3084           data_end = vaddr + vsize;
3085
3086           if (pe_dll_extra_pe_debug)
3087             printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3088                     __FUNCTION__, sec_name, (unsigned long) vaddr,
3089                     (unsigned long) (vaddr + vsize), (unsigned long) flags);
3090         }
3091       else if (strcmp(sec_name,".rdata") == 0)
3092         {
3093           rdata_start = vaddr;
3094           rdata_end = vaddr + vsize;
3095
3096           if (pe_dll_extra_pe_debug)
3097             printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3098                     __FUNCTION__, sec_name, (unsigned long) vaddr,
3099                     (unsigned long) (vaddr + vsize), (unsigned long) flags);
3100         }
3101       else if (strcmp (sec_name,".bss") == 0)
3102         {
3103           bss_start = vaddr;
3104           bss_end = vaddr + vsize;
3105
3106           if (pe_dll_extra_pe_debug)
3107             printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3108                     __FUNCTION__, sec_name, (unsigned long) vaddr,
3109                     (unsigned long) (vaddr + vsize), (unsigned long) flags);
3110         }
3111     }
3112
3113   expdata = xmalloc (export_size);
3114   bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
3115   bfd_bread (expdata, (bfd_size_type) export_size, dll);
3116   erva = (char *) expdata - export_rva;
3117
3118   if (pe_def_file == 0)
3119     pe_def_file = def_file_empty ();
3120
3121   nexp = pe_as32 (expdata + 24);
3122   name_rvas = pe_as32 (expdata + 32);
3123   exp_funcbase = pe_as32 (expdata + 28);
3124
3125   /* Use internal dll name instead of filename
3126      to enable symbolic dll linking.  */
3127   dllname = erva + pe_as32 (expdata + 12);
3128
3129   /* Check to see if the dll has already been added to
3130      the definition list and if so return without error.
3131      This avoids multiple symbol definitions.  */
3132   if (def_get_module (pe_def_file, dllname))
3133     {
3134       if (pe_dll_extra_pe_debug)
3135         printf ("%s is already loaded\n", dllname);
3136       return TRUE;
3137     }
3138
3139   /* Iterate through the list of symbols.  */
3140   for (i = 0; i < nexp; i++)
3141     {
3142       /* Pointer to the names vector.  */
3143       bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
3144       def_file_import *imp;
3145       /* Pointer to the function address vector.  */
3146       bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
3147       int is_data = 0;
3148
3149       /* Skip unwanted symbols, which are
3150          exported in buggy auto-import releases.  */
3151       if (! CONST_STRNEQ (erva + name_rva, "__nm_"))
3152         {
3153           int is_dup = 0;
3154           /* is_data is true if the address is in the data, rdata or bss
3155              segment.  */
3156           is_data =
3157             (func_rva >= data_start && func_rva < data_end)
3158             || (func_rva >= rdata_start && func_rva < rdata_end)
3159             || (func_rva >= bss_start && func_rva < bss_end);
3160
3161           imp = def_file_add_import (pe_def_file, erva + name_rva,
3162                                      dllname, i, 0, NULL, &is_dup);
3163           /* Mark symbol type.  */
3164           if (!is_dup)
3165             imp->data = is_data;
3166
3167           if (pe_dll_extra_pe_debug)
3168             printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3169                     __FUNCTION__, dllname, erva + name_rva,
3170                     (unsigned long) func_rva, is_data ? "(data)" : "");
3171         }
3172     }
3173
3174   return TRUE;
3175 }
3176
3177 void
3178 pe_output_file_set_long_section_names (bfd *abfd)
3179 {
3180   if (pe_use_coff_long_section_names < 0)
3181     return;
3182   if (!bfd_coff_set_long_section_names (abfd, pe_use_coff_long_section_names))
3183     einfo (_("%XError: can't use long section names on this arch\n"));
3184 }
3185
3186 /* These are the main functions, called from the emulation.  The first
3187    is called after the bfds are read, so we can guess at how much space
3188    we need.  The second is called after everything is placed, so we
3189    can put the right values in place.  */
3190
3191 void
3192 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
3193 {
3194   pe_dll_id_target (bfd_get_target (abfd));
3195   pe_output_file_set_long_section_names (abfd);
3196   process_def_file_and_drectve (abfd, info);
3197
3198   if (pe_def_file->num_exports == 0 && !info->shared)
3199     return;
3200
3201   generate_edata (abfd, info);
3202   build_filler_bfd (1);
3203   pe_output_file_set_long_section_names (filler_bfd);
3204 }
3205
3206 void
3207 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
3208 {
3209   pe_dll_id_target (bfd_get_target (abfd));
3210   pe_output_file_set_long_section_names (abfd);
3211   build_filler_bfd (0);
3212   pe_output_file_set_long_section_names (filler_bfd);
3213 }
3214
3215 void
3216 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
3217 {
3218   pe_dll_id_target (bfd_get_target (abfd));
3219   pe_output_file_set_long_section_names (abfd);
3220   image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3221
3222   generate_reloc (abfd, info);
3223   if (reloc_sz > 0)
3224     {
3225       bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3226
3227       /* Resize the sections.  */
3228       lang_reset_memory_regions ();
3229       lang_size_sections (NULL, TRUE);
3230
3231       /* Redo special stuff.  */
3232       ldemul_after_allocation ();
3233
3234       /* Do the assignments again.  */
3235       lang_do_assignments ();
3236     }
3237
3238   fill_edata (abfd, info);
3239
3240   if (info->shared && !info->pie)
3241     pe_data (abfd)->dll = 1;
3242
3243   edata_s->contents = edata_d;
3244   reloc_s->contents = reloc_d;
3245 }
3246
3247 void
3248 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
3249 {
3250   pe_dll_id_target (bfd_get_target (abfd));
3251   pe_output_file_set_long_section_names (abfd);
3252   image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3253
3254   generate_reloc (abfd, info);
3255   if (reloc_sz > 0)
3256     {
3257       bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3258
3259       /* Resize the sections.  */
3260       lang_reset_memory_regions ();
3261       lang_size_sections (NULL, TRUE);
3262
3263       /* Redo special stuff.  */
3264       ldemul_after_allocation ();
3265
3266       /* Do the assignments again.  */
3267       lang_do_assignments ();
3268     }
3269   reloc_s->contents = reloc_d;
3270 }
3271
3272 bfd_boolean
3273 pe_bfd_is_dll (bfd *abfd)
3274 {
3275   return (bfd_get_format (abfd) == bfd_object
3276           && obj_pe (abfd)
3277           && pe_data (abfd)->dll);
3278 }