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