OSDN Git Service

* server.c (gdbserver_version): Update copyright year to 2010.
[pf3gnuchains/pf3gnuchains3x.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 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 (11 * sizeof (asymbol *));
2100   tx  = quick_section (abfd, ".text",    SEC_CODE|SEC_HAS_CONTENTS, 2);
2101   id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
2102   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2103   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2104   id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
2105
2106   if  (*exp->internal_name == '@')
2107     {
2108       quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2109                     BSF_GLOBAL, 0);
2110       if (include_jmp_stub)
2111         quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
2112       quick_symbol (abfd, "__imp_", exp->internal_name, "", id5,
2113                     BSF_GLOBAL, 0);
2114       /* Fastcall applies only to functions,
2115          so no need for auto-import symbol.  */
2116     }
2117   else
2118     {
2119       quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2120                     BSF_GLOBAL, 0);
2121       if (include_jmp_stub)
2122         quick_symbol (abfd, U (""), exp->internal_name, "", tx,
2123                       BSF_GLOBAL, 0);
2124       quick_symbol (abfd, "__imp_", U (""), exp->internal_name, id5,
2125                     BSF_GLOBAL, 0);
2126       /* Symbol to reference ord/name of imported
2127          data symbol, used to implement auto-import.  */
2128       if (exp->flag_data)
2129         quick_symbol (abfd, U ("_nm_"), U (""), exp->internal_name, id6,
2130                       BSF_GLOBAL,0);
2131     }
2132   if (pe_dll_compat_implib)
2133     quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", id5,
2134                   BSF_GLOBAL, 0);
2135
2136   if (include_jmp_stub)
2137     {
2138       bfd_set_section_size (abfd, tx, jmp_byte_count);
2139       td = xmalloc (jmp_byte_count);
2140       tx->contents = td;
2141       memcpy (td, jmp_bytes, jmp_byte_count);
2142
2143       switch (pe_details->pe_arch)
2144         {
2145         case PE_ARCH_i386:
2146 #ifdef pe_use_x86_64
2147           quick_reloc (abfd, 2, BFD_RELOC_32_PCREL, 2);
2148 #else
2149           quick_reloc (abfd, 2, BFD_RELOC_32, 2);
2150 #endif
2151           break;
2152         case PE_ARCH_sh:
2153           quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2154           break;
2155         case PE_ARCH_mips:
2156           quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
2157           quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
2158           quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
2159           break;
2160         case PE_ARCH_arm:
2161         case PE_ARCH_arm_epoc:
2162         case PE_ARCH_arm_wince:
2163           quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2164           break;
2165         default:
2166           abort ();
2167         }
2168       save_relocs (tx);
2169     }
2170   else
2171     bfd_set_section_size (abfd, tx, 0);
2172
2173   bfd_set_section_size (abfd, id7, 4);
2174   d7 = xmalloc (4);
2175   id7->contents = d7;
2176   memset (d7, 0, 4);
2177   quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
2178   save_relocs (id7);
2179
2180   bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
2181   d5 = xmalloc (PE_IDATA5_SIZE);
2182   id5->contents = d5;
2183   memset (d5, 0, PE_IDATA5_SIZE);
2184
2185   if (exp->flag_noname)
2186     {
2187       d5[0] = exp->ordinal;
2188       d5[1] = exp->ordinal >> 8;
2189       d5[PE_IDATA5_SIZE - 1] = 0x80;
2190     }
2191   else
2192     {
2193       quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2194       save_relocs (id5);
2195     }
2196
2197   bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
2198   d4 = xmalloc (PE_IDATA4_SIZE);
2199   id4->contents = d4;
2200   memset (d4, 0, PE_IDATA4_SIZE);
2201
2202   if (exp->flag_noname)
2203     {
2204       d4[0] = exp->ordinal;
2205       d4[1] = exp->ordinal >> 8;
2206       d4[PE_IDATA4_SIZE - 1] = 0x80;
2207     }
2208   else
2209     {
2210       quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2211       save_relocs (id4);
2212     }
2213
2214   if (exp->flag_noname)
2215     {
2216       len = 0;
2217       bfd_set_section_size (abfd, id6, 0);
2218     }
2219   else
2220     {
2221       /* { short, asciz }  */
2222       if (exp->its_name)
2223         len = 2 + strlen (exp->its_name) + 1;
2224       else
2225         len = 2 + strlen (exp->name) + 1;
2226       if (len & 1)
2227         len++;
2228       bfd_set_section_size (abfd, id6, len);
2229       d6 = xmalloc (len);
2230       id6->contents = d6;
2231       memset (d6, 0, len);
2232       d6[0] = exp->hint & 0xff;
2233       d6[1] = exp->hint >> 8;
2234       if (exp->its_name)
2235         strcpy ((char*) d6 + 2, exp->its_name);
2236       else
2237         strcpy ((char *) d6 + 2, exp->name);
2238     }
2239
2240   bfd_set_symtab (abfd, symtab, symptr);
2241
2242   if (include_jmp_stub)
2243     bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
2244   bfd_set_section_contents (abfd, id7, d7, 0, 4);
2245   bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2246   bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2247   if (!exp->flag_noname)
2248     bfd_set_section_contents (abfd, id6, d6, 0, len);
2249
2250   bfd_make_readable (abfd);
2251   return abfd;
2252 }
2253
2254 static bfd *
2255 make_singleton_name_imp (const char *import, bfd *parent)
2256 {
2257   /* Name thunks go to idata$4.  */
2258   asection *id5;
2259   unsigned char *d5;
2260   char *oname;
2261   bfd *abfd;
2262
2263   oname = xmalloc (20);
2264   sprintf (oname, "nmimp%06d.o", tmp_seq2);
2265   tmp_seq2++;
2266
2267   abfd = bfd_create (oname, parent);
2268   bfd_find_target (pe_details->object_target, abfd);
2269   bfd_make_writable (abfd);
2270
2271   bfd_set_format (abfd, bfd_object);
2272   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2273
2274   symptr = 0;
2275   symtab = xmalloc (3 * sizeof (asymbol *));
2276   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2277   quick_symbol (abfd, U ("_imp_"), import, "", id5, BSF_GLOBAL, 0);
2278
2279   /* We need space for the real thunk and for the null terminator.  */
2280   bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE * 2);
2281   d5 = xmalloc (PE_IDATA5_SIZE * 2);
2282   id5->contents = d5;
2283   memset (d5, 0, PE_IDATA5_SIZE * 2);
2284   quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2285   save_relocs (id5);
2286
2287   bfd_set_symtab (abfd, symtab, symptr);
2288
2289   bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA4_SIZE * 2);
2290
2291   bfd_make_readable (abfd);
2292   return abfd;
2293 }
2294
2295 static bfd *
2296 make_singleton_name_thunk (const char *import, bfd *parent)
2297 {
2298   /* Name thunks go to idata$4.  */
2299   asection *id4;
2300   unsigned char *d4;
2301   char *oname;
2302   bfd *abfd;
2303
2304   oname = xmalloc (20);
2305   sprintf (oname, "nmth%06d.o", tmp_seq);
2306   tmp_seq++;
2307
2308   abfd = bfd_create (oname, parent);
2309   bfd_find_target (pe_details->object_target, abfd);
2310   bfd_make_writable (abfd);
2311
2312   bfd_set_format (abfd, bfd_object);
2313   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2314
2315   symptr = 0;
2316   symtab = xmalloc (3 * sizeof (asymbol *));
2317   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2318   quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
2319   quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
2320
2321   /* We need space for the real thunk and for the null terminator.  */
2322   bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE * 2);
2323   d4 = xmalloc (PE_IDATA4_SIZE * 2);
2324   id4->contents = d4;
2325   memset (d4, 0, PE_IDATA4_SIZE * 2);
2326   quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2327   save_relocs (id4);
2328
2329   bfd_set_symtab (abfd, symtab, symptr);
2330
2331   bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE * 2);
2332
2333   bfd_make_readable (abfd);
2334   return abfd;
2335 }
2336
2337 static char *
2338 make_import_fixup_mark (arelent *rel)
2339 {
2340   /* We convert reloc to symbol, for later reference.  */
2341   static int counter;
2342   static char *fixup_name = NULL;
2343   static size_t buffer_len = 0;
2344
2345   struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2346
2347   bfd *abfd = bfd_asymbol_bfd (sym);
2348   struct bfd_link_hash_entry *bh;
2349
2350   if (!fixup_name)
2351     {
2352       fixup_name = xmalloc (384);
2353       buffer_len = 384;
2354     }
2355
2356   if (strlen (sym->name) + 25 > buffer_len)
2357   /* Assume 25 chars for "__fu" + counter + "_".  If counter is
2358      bigger than 20 digits long, we've got worse problems than
2359      overflowing this buffer...  */
2360     {
2361       free (fixup_name);
2362       /* New buffer size is length of symbol, plus 25, but
2363          then rounded up to the nearest multiple of 128.  */
2364       buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
2365       fixup_name = xmalloc (buffer_len);
2366     }
2367
2368   sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2369
2370   bh = NULL;
2371   bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2372                                 current_sec, /* sym->section, */
2373                                 rel->address, NULL, TRUE, FALSE, &bh);
2374
2375   return fixup_name;
2376 }
2377
2378 /*      .section        .idata$2
2379         .rva            __nm_thnk_SYM (singleton thunk with name of func)
2380         .long           0
2381         .long           0
2382         .rva            __my_dll_iname (name of dll)
2383         .rva            __fuNN_SYM (pointer to reference (address) in text)  */
2384
2385 static bfd *
2386 make_import_fixup_entry (const char *name,
2387                          const char *fixup_name,
2388                          const char *symname,
2389                          bfd *parent)
2390 {
2391   asection *id2;
2392   unsigned char *d2;
2393   char *oname;
2394   bfd *abfd;
2395
2396   oname = xmalloc (20);
2397   sprintf (oname, "fu%06d.o", tmp_seq);
2398   tmp_seq++;
2399
2400   abfd = bfd_create (oname, parent);
2401   bfd_find_target (pe_details->object_target, abfd);
2402   bfd_make_writable (abfd);
2403
2404   bfd_set_format (abfd, bfd_object);
2405   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2406
2407   symptr = 0;
2408   symtab = xmalloc (6 * sizeof (asymbol *));
2409   id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2410
2411   quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2412   quick_symbol (abfd, U (""), symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2413   /* For relocator v2 we have to use the .idata$5 element and not 
2414      fixup_name.  */
2415   if (link_info.pei386_runtime_pseudo_reloc == 2)
2416     quick_symbol (abfd, U ("_imp_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2417   else
2418     quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2419
2420   bfd_set_section_size (abfd, id2, 20);
2421   d2 = xmalloc (20);
2422   id2->contents = d2;
2423   memset (d2, 0, 20);
2424
2425   quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2426   quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2427   quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2428   save_relocs (id2);
2429
2430   bfd_set_symtab (abfd, symtab, symptr);
2431
2432   bfd_set_section_contents (abfd, id2, d2, 0, 20);
2433
2434   bfd_make_readable (abfd);
2435   return abfd;
2436 }
2437
2438 /*      .section        .rdata_runtime_pseudo_reloc
2439         .long           addend
2440         .rva            __fuNN_SYM (pointer to reference (address) in text)  */
2441
2442 static bfd *
2443 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2444                            const char *fixup_name,
2445                            bfd_vma addend ATTRIBUTE_UNUSED,
2446                            bfd_vma bitsize,
2447                            bfd *parent)
2448 {
2449   asection *rt_rel;
2450   unsigned char *rt_rel_d;
2451   char *oname;
2452   bfd *abfd;
2453   oname = xmalloc (20);
2454   sprintf (oname, "rtr%06d.o", tmp_seq);
2455   tmp_seq++;
2456
2457   abfd = bfd_create (oname, parent);
2458   bfd_find_target (pe_details->object_target, abfd);
2459   bfd_make_writable (abfd);
2460
2461   bfd_set_format (abfd, bfd_object);
2462   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2463
2464   symptr = 0;
2465   if (link_info.pei386_runtime_pseudo_reloc == 2)
2466     {
2467       symtab = xmalloc ((runtime_pseudp_reloc_v2_init ? 3 : 6) * sizeof (asymbol *));
2468     }
2469   else
2470     {
2471       symtab = xmalloc (2 * sizeof (asymbol *));
2472     }
2473   rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2474                           SEC_HAS_CONTENTS, 2);
2475
2476   quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2477
2478   if (link_info.pei386_runtime_pseudo_reloc == 2)
2479     {
2480           size_t size = 12;
2481           if (! runtime_pseudp_reloc_v2_init)
2482             {
2483                   size += 12;
2484                   runtime_pseudp_reloc_v2_init = 1;
2485             }
2486       quick_symbol (abfd, U ("_imp_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2487
2488       bfd_set_section_size (abfd, rt_rel, size);
2489       rt_rel_d = xmalloc (size);
2490       rt_rel->contents = rt_rel_d;
2491       memset (rt_rel_d, 0, size);
2492           quick_reloc (abfd, size - 8, BFD_RELOC_RVA, 1);
2493           quick_reloc (abfd, size - 12, BFD_RELOC_RVA, 2);
2494           bfd_put_32 (abfd, bitsize, rt_rel_d + (size - 4));
2495           if (size != 12)
2496             bfd_put_32 (abfd, 1, rt_rel_d + 8);
2497       save_relocs (rt_rel);
2498
2499       bfd_set_symtab (abfd, symtab, symptr);
2500
2501       bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, size);
2502    }
2503   else
2504    {
2505       bfd_set_section_size (abfd, rt_rel, 8);
2506       rt_rel_d = xmalloc (8);
2507       rt_rel->contents = rt_rel_d;
2508       memset (rt_rel_d, 0, 8);
2509
2510       bfd_put_32 (abfd, addend, rt_rel_d);
2511       quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2512
2513       save_relocs (rt_rel);
2514
2515       bfd_set_symtab (abfd, symtab, symptr);
2516
2517       bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2518    }
2519   bfd_make_readable (abfd);
2520   return abfd;
2521 }
2522
2523 /*      .section        .rdata
2524         .rva            __pei386_runtime_relocator  */
2525
2526 static bfd *
2527 pe_create_runtime_relocator_reference (bfd *parent)
2528 {
2529   asection *extern_rt_rel;
2530   unsigned char *extern_rt_rel_d;
2531   char *oname;
2532   bfd *abfd;
2533
2534   oname = xmalloc (20);
2535   sprintf (oname, "ertr%06d.o", tmp_seq);
2536   tmp_seq++;
2537
2538   abfd = bfd_create (oname, parent);
2539   bfd_find_target (pe_details->object_target, abfd);
2540   bfd_make_writable (abfd);
2541
2542   bfd_set_format (abfd, bfd_object);
2543   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2544
2545   symptr = 0;
2546   symtab = xmalloc (2 * sizeof (asymbol *));
2547   extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2548
2549   quick_symbol (abfd, "", U ("_pei386_runtime_relocator"), "", UNDSEC,
2550                 BSF_NO_FLAGS, 0);
2551
2552   bfd_set_section_size (abfd, extern_rt_rel, PE_IDATA5_SIZE);
2553   extern_rt_rel_d = xmalloc (PE_IDATA5_SIZE);
2554   extern_rt_rel->contents = extern_rt_rel_d;
2555
2556   quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2557   save_relocs (extern_rt_rel);
2558
2559   bfd_set_symtab (abfd, symtab, symptr);
2560
2561   bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, PE_IDATA5_SIZE);
2562
2563   bfd_make_readable (abfd);
2564   return abfd;
2565 }
2566
2567 void
2568 pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend)
2569 {
2570   char buf[300];
2571   struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2572   struct bfd_link_hash_entry *name_thunk_sym;
2573   struct bfd_link_hash_entry *name_imp_sym;
2574   const char *name = sym->name;
2575   char *fixup_name = make_import_fixup_mark (rel);
2576   bfd *b;
2577   int need_import_table = 1;
2578
2579   sprintf (buf, U ("_imp_%s"), name);
2580   name_imp_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2581
2582   sprintf (buf, U ("_nm_thnk_%s"), name);
2583
2584   name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2585
2586   /* For version 2 pseudo relocation we don't need to add an import
2587      if the import symbol is already present.  */
2588   if (link_info.pei386_runtime_pseudo_reloc == 2
2589       && name_imp_sym
2590       && name_imp_sym->type == bfd_link_hash_defined)
2591     need_import_table = 0;
2592
2593   if (need_import_table == 1
2594       && (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined))
2595     {
2596       b = make_singleton_name_thunk (name, link_info.output_bfd);
2597       add_bfd_to_link (b, b->filename, &link_info);
2598
2599       /* If we ever use autoimport, we have to cast text section writable.
2600          But not for version 2.  */
2601       if (link_info.pei386_runtime_pseudo_reloc != 2)
2602         {
2603           config.text_read_only = FALSE;
2604           link_info.output_bfd->flags &= ~WP_TEXT;
2605         }
2606       if (link_info.pei386_runtime_pseudo_reloc == 2)
2607         {
2608           b = make_singleton_name_imp (name, link_info.output_bfd);
2609           add_bfd_to_link (b, b->filename, &link_info);
2610         }
2611     }
2612
2613   if ((addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2614       && need_import_table == 1)
2615     {
2616       extern char * pe_data_import_dll;
2617       char * symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2618
2619       b = make_import_fixup_entry (name, fixup_name, symname,
2620                                    link_info.output_bfd);
2621       add_bfd_to_link (b, b->filename, &link_info);
2622     }
2623
2624     if ((link_info.pei386_runtime_pseudo_reloc != 0 && addend != 0)
2625         || link_info.pei386_runtime_pseudo_reloc == 2)
2626       {
2627         if (pe_dll_extra_pe_debug)
2628           printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2629                   fixup_name, (int) addend);
2630
2631         b = make_runtime_pseudo_reloc (name, fixup_name, addend, rel->howto->bitsize,
2632                                        link_info.output_bfd);
2633         add_bfd_to_link (b, b->filename, &link_info);
2634
2635         if (runtime_pseudo_relocs_created == 0)
2636           {
2637             b = pe_create_runtime_relocator_reference (link_info.output_bfd);
2638             add_bfd_to_link (b, b->filename, &link_info);
2639           }
2640         runtime_pseudo_relocs_created++;
2641       }
2642     else if (addend != 0)
2643       {
2644         einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2645                s->owner, s, rel->address, sym->name);
2646         einfo ("%X");
2647       }
2648 }
2649
2650
2651 void
2652 pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_info *info)
2653 {
2654   int i;
2655   bfd *ar_head;
2656   bfd *ar_tail;
2657   bfd *outarch;
2658   bfd *ibfd;
2659   bfd *head = 0;
2660
2661   dll_filename = (def->name) ? def->name : dll_name;
2662   dll_symname = xstrdup (dll_filename);
2663   for (i = 0; dll_symname[i]; i++)
2664     if (!ISALNUM (dll_symname[i]))
2665       dll_symname[i] = '_';
2666
2667   unlink_if_ordinary (impfilename);
2668
2669   outarch = bfd_openw (impfilename, 0);
2670
2671   if (!outarch)
2672     {
2673       /* xgettext:c-format */
2674       einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2675       return;
2676     }
2677
2678   /* xgettext:c-format */
2679   info_msg (_("Creating library file: %s\n"), impfilename);
2680
2681   bfd_set_format (outarch, bfd_archive);
2682   outarch->has_armap = 1;
2683
2684   /* Work out a reasonable size of things to put onto one line.  */
2685   ar_head = make_head (outarch);
2686
2687   /* Iterate the input BFDs, looking for exclude-modules-for-implib.  */
2688   for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link_next)
2689     {
2690       /* Iterate the exclude list.  */
2691       struct exclude_list_struct *ex;
2692       char found;
2693       for (ex = excludes, found = 0; ex && !found; ex = ex->next)
2694         {
2695           if (ex->type != EXCLUDEFORIMPLIB)
2696             continue;
2697           found = (strcmp (ex->string, ibfd->filename) == 0);
2698         }
2699       /* If it matched, we must open a fresh BFD for it (the original
2700         input BFD is still needed for the DLL's final link) and add
2701         it into the archive member chain.  */
2702       if (found)
2703         {
2704           bfd *newbfd = bfd_openr (ibfd->my_archive
2705                 ? ibfd->my_archive->filename : ibfd->filename, NULL);
2706           if (!newbfd)
2707             {
2708               einfo (_("%Xbfd_openr %s: %E\n"), ibfd->filename);
2709               return;
2710             }
2711           if (ibfd->my_archive)
2712             {
2713               /* Must now iterate through archive until we find the
2714                 required member.  A minor shame that we'll open the
2715                 archive once per member that we require from it, and
2716                 leak those archive bfds rather than reuse them.  */
2717               bfd *arbfd = newbfd;
2718               if (!bfd_check_format_matches (arbfd, bfd_archive, NULL))
2719                 {
2720                   einfo (_("%X%s(%s): can't find member in non-archive file"),
2721                     ibfd->my_archive->filename, ibfd->filename);
2722                   return;
2723                 }
2724               newbfd = NULL;
2725               while ((newbfd = bfd_openr_next_archived_file (arbfd, newbfd)) != 0)
2726                 {
2727                   if (strcmp (newbfd->filename, ibfd->filename) == 0)
2728                     break;
2729                 }
2730               if (!newbfd)
2731                 {
2732                   einfo (_("%X%s(%s): can't find member in archive"),
2733                     ibfd->my_archive->filename, ibfd->filename);
2734                   return;
2735                 }
2736             }
2737           newbfd->archive_next = head;
2738           head = newbfd;
2739         }
2740     }
2741
2742   for (i = 0; i < def->num_exports; i++)
2743     {
2744       /* The import library doesn't know about the internal name.  */
2745       char *internal = def->exports[i].internal_name;
2746       bfd *n;
2747
2748       /* Don't add PRIVATE entries to import lib.  */
2749       if (pe_def_file->exports[i].flag_private)
2750         continue;
2751       def->exports[i].internal_name = def->exports[i].name;
2752       n = make_one (def->exports + i, outarch,
2753                     ! (def->exports + i)->flag_data);
2754       n->archive_next = head;
2755       head = n;
2756       def->exports[i].internal_name = internal;
2757     }
2758
2759   ar_tail = make_tail (outarch);
2760
2761   if (ar_head == NULL || ar_tail == NULL)
2762     return;
2763
2764   /* Now stick them all into the archive.  */
2765   ar_head->archive_next = head;
2766   ar_tail->archive_next = ar_head;
2767   head = ar_tail;
2768
2769   if (! bfd_set_archive_head (outarch, head))
2770     einfo ("%Xbfd_set_archive_head: %E\n");
2771
2772   if (! bfd_close (outarch))
2773     einfo ("%Xbfd_close %s: %E\n", impfilename);
2774
2775   while (head != NULL)
2776     {
2777       bfd *n = head->archive_next;
2778       bfd_close (head);
2779       head = n;
2780     }
2781 }
2782
2783 static struct bfd_link_hash_entry *found_sym;
2784
2785 static bfd_boolean
2786 pe_undef_alias_cdecl_match (struct bfd_link_hash_entry *h, void *inf)
2787 {
2788   int sl;
2789   char *string = inf;
2790   const char *hs = h->root.string;
2791
2792   sl = strlen (string);
2793   if (h->type == bfd_link_hash_undefined
2794       && ((*hs == '@' && *string == '_'
2795            && strncmp (hs + 1, string + 1, sl - 1) == 0)
2796           || strncmp (hs, string, sl) == 0)
2797       && h->root.string[sl] == '@')
2798     {
2799       found_sym = h;
2800       return FALSE;
2801     }
2802   return TRUE;
2803 }
2804
2805 static struct bfd_link_hash_entry *
2806 pe_find_cdecl_alias_match (char *name)
2807 {
2808   found_sym = 0;
2809   bfd_link_hash_traverse (link_info.hash, pe_undef_alias_cdecl_match,
2810                           (char *) name);
2811   return found_sym;
2812 }
2813
2814 static void
2815 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *linfo)
2816 {
2817   lang_input_statement_type *fake_file;
2818
2819   fake_file = lang_add_input_file (name,
2820                                    lang_input_file_is_fake_enum,
2821                                    NULL);
2822   fake_file->the_bfd = abfd;
2823   ldlang_add_file (fake_file);
2824
2825   if (!bfd_link_add_symbols (abfd, linfo))
2826     einfo ("%Xaddsym %s: %E\n", name);
2827 }
2828
2829 void
2830 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *linfo)
2831 {
2832   def_file_module *module;
2833
2834   pe_dll_id_target (bfd_get_target (output_bfd));
2835
2836   if (!pe_def_file)
2837     return;
2838
2839   for (module = pe_def_file->modules; module; module = module->next)
2840     {
2841       int i, do_this_dll;
2842
2843       dll_filename = module->name;
2844       dll_symname = xstrdup (module->name);
2845       for (i = 0; dll_symname[i]; i++)
2846         if (!ISALNUM (dll_symname[i]))
2847           dll_symname[i] = '_';
2848
2849       do_this_dll = 0;
2850
2851       for (i = 0; i < pe_def_file->num_imports; i++)
2852         if (pe_def_file->imports[i].module == module)
2853           {
2854             def_file_export exp;
2855             struct bfd_link_hash_entry *blhe;
2856             int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2857             /* See if we need this import.  */
2858             size_t len = strlen (pe_def_file->imports[i].internal_name);
2859             char *name = xmalloc (len + 2 + 6);
2860             bfd_boolean include_jmp_stub = FALSE;
2861             bfd_boolean is_cdecl = FALSE;
2862             if (!lead_at && strchr (pe_def_file->imports[i].internal_name, '@') == NULL)
2863                 is_cdecl = TRUE;
2864
2865             if (lead_at)
2866               sprintf (name, "%s",
2867                        pe_def_file->imports[i].internal_name);
2868             else
2869               sprintf (name, "%s%s",U (""),
2870                        pe_def_file->imports[i].internal_name);
2871
2872             blhe = bfd_link_hash_lookup (linfo->hash, name,
2873                                          FALSE, FALSE, FALSE);
2874
2875             /* Include the jump stub for <sym> only if the <sym>
2876                is undefined.  */
2877             if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2878               {
2879                 if (lead_at)
2880                   sprintf (name, "%s%s", "__imp_",
2881                            pe_def_file->imports[i].internal_name);
2882                 else
2883                   sprintf (name, "%s%s%s", "__imp_", U (""),
2884                            pe_def_file->imports[i].internal_name);
2885
2886                 blhe = bfd_link_hash_lookup (linfo->hash, name,
2887                                              FALSE, FALSE, FALSE);
2888               }
2889             else
2890               include_jmp_stub = TRUE;
2891
2892             if (is_cdecl && !blhe)
2893               {
2894                 sprintf (name, "%s%s",U (""),
2895                          pe_def_file->imports[i].internal_name);
2896                 blhe = pe_find_cdecl_alias_match (name);
2897                 include_jmp_stub = TRUE;
2898               }
2899
2900             free (name);
2901
2902             if (blhe && blhe->type == bfd_link_hash_undefined)
2903               {
2904                 bfd *one;
2905                 /* We do.  */
2906                 if (!do_this_dll)
2907                   {
2908                     bfd *ar_head = make_head (output_bfd);
2909                     add_bfd_to_link (ar_head, ar_head->filename, linfo);
2910                     do_this_dll = 1;
2911                   }
2912                 exp.internal_name = pe_def_file->imports[i].internal_name;
2913                 exp.name = pe_def_file->imports[i].name;
2914                 exp.its_name = pe_def_file->imports[i].its_name;
2915                 exp.ordinal = pe_def_file->imports[i].ordinal;
2916                 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2917                 exp.flag_private = 0;
2918                 exp.flag_constant = 0;
2919                 exp.flag_data = pe_def_file->imports[i].data;
2920                 exp.flag_noname = exp.name ? 0 : 1;
2921                 one = make_one (&exp, output_bfd, (! exp.flag_data) && include_jmp_stub);
2922                 add_bfd_to_link (one, one->filename, linfo);
2923               }
2924           }
2925       if (do_this_dll)
2926         {
2927           bfd *ar_tail = make_tail (output_bfd);
2928           add_bfd_to_link (ar_tail, ar_tail->filename, linfo);
2929         }
2930
2931       free (dll_symname);
2932     }
2933 }
2934
2935 /* We were handed a *.DLL file.  Parse it and turn it into a set of
2936    IMPORTS directives in the def file.  Return TRUE if the file was
2937    handled, FALSE if not.  */
2938
2939 static unsigned int
2940 pe_get16 (bfd *abfd, int where)
2941 {
2942   unsigned char b[2];
2943
2944   bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2945   bfd_bread (b, (bfd_size_type) 2, abfd);
2946   return b[0] + (b[1] << 8);
2947 }
2948
2949 static unsigned int
2950 pe_get32 (bfd *abfd, int where)
2951 {
2952   unsigned char b[4];
2953
2954   bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2955   bfd_bread (b, (bfd_size_type) 4, abfd);
2956   return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2957 }
2958
2959 static unsigned int
2960 pe_as32 (void *ptr)
2961 {
2962   unsigned char *b = ptr;
2963
2964   return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2965 }
2966
2967 bfd_boolean
2968 pe_implied_import_dll (const char *filename)
2969 {
2970   bfd *dll;
2971   bfd_vma pe_header_offset, opthdr_ofs, num_entries, i;
2972   bfd_vma export_rva, export_size, nsections, secptr, expptr;
2973   bfd_vma exp_funcbase;
2974   unsigned char *expdata;
2975   char *erva;
2976   bfd_vma name_rvas, ordinals, nexp, ordbase;
2977   const char *dllname;
2978   /* Initialization with start > end guarantees that is_data
2979      will not be set by mistake, and avoids compiler warning.  */
2980   bfd_vma data_start = 1;
2981   bfd_vma data_end = 0;
2982   bfd_vma rdata_start = 1;
2983   bfd_vma rdata_end = 0;
2984   bfd_vma bss_start = 1;
2985   bfd_vma bss_end = 0;
2986
2987   /* No, I can't use bfd here.  kernel32.dll puts its export table in
2988      the middle of the .rdata section.  */
2989   dll = bfd_openr (filename, pe_details->target_name);
2990   if (!dll)
2991     {
2992       einfo ("%Xopen %s: %E\n", filename);
2993       return FALSE;
2994     }
2995
2996   /* PEI dlls seem to be bfd_objects.  */
2997   if (!bfd_check_format (dll, bfd_object))
2998     {
2999       einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
3000       return FALSE;
3001     }
3002
3003   /* Get pe_header, optional header and numbers of directory entries.  */
3004   pe_header_offset = pe_get32 (dll, 0x3c);
3005   opthdr_ofs = pe_header_offset + 4 + 20;
3006 #ifdef pe_use_x86_64
3007   num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /*  & NumberOfRvaAndSizes.  */
3008 #else
3009   num_entries = pe_get32 (dll, opthdr_ofs + 92);
3010 #endif
3011
3012   /* No import or export directory entry.  */
3013   if (num_entries < 1)
3014     return FALSE;
3015
3016 #ifdef pe_use_x86_64
3017   export_rva  = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
3018   export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
3019 #else
3020   export_rva = pe_get32 (dll, opthdr_ofs + 96);
3021   export_size = pe_get32 (dll, opthdr_ofs + 100);
3022 #endif
3023
3024   /* No export table - nothing to export.  */
3025   if (export_size == 0)
3026     return FALSE;
3027
3028   nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
3029   secptr = (pe_header_offset + 4 + 20 +
3030             pe_get16 (dll, pe_header_offset + 4 + 16));
3031   expptr = 0;
3032
3033   /* Get the rva and size of the export section.  */
3034   for (i = 0; i < nsections; i++)
3035     {
3036       char sname[8];
3037       bfd_vma secptr1 = secptr + 40 * i;
3038       bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3039       bfd_vma vsize = pe_get32 (dll, secptr1 + 16);
3040       bfd_vma fptr = pe_get32 (dll, secptr1 + 20);
3041
3042       bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
3043       bfd_bread (sname, (bfd_size_type) 8, dll);
3044
3045       if (vaddr <= export_rva && vaddr + vsize > export_rva)
3046         {
3047           expptr = fptr + (export_rva - vaddr);
3048           if (export_rva + export_size > vaddr + vsize)
3049             export_size = vsize - (export_rva - vaddr);
3050           break;
3051         }
3052     }
3053
3054   /* Scan sections and store the base and size of the
3055      data and bss segments in data/base_start/end.  */
3056   for (i = 0; i < nsections; i++)
3057     {
3058       bfd_vma secptr1 = secptr + 40 * i;
3059       bfd_vma vsize = pe_get32 (dll, secptr1 + 8);
3060       bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3061       bfd_vma flags = pe_get32 (dll, secptr1 + 36);
3062       char sec_name[9];
3063
3064       sec_name[8] = '\0';
3065       bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
3066       bfd_bread (sec_name, (bfd_size_type) 8, dll);
3067
3068       if (strcmp(sec_name,".data") == 0)
3069         {
3070           data_start = vaddr;
3071           data_end = vaddr + vsize;
3072
3073           if (pe_dll_extra_pe_debug)
3074             printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3075                     __FUNCTION__, sec_name, (unsigned long) vaddr,
3076                     (unsigned long) (vaddr + vsize), (unsigned long) flags);
3077         }
3078       else if (strcmp(sec_name,".rdata") == 0)
3079         {
3080           rdata_start = vaddr;
3081           rdata_end = vaddr + vsize;
3082
3083           if (pe_dll_extra_pe_debug)
3084             printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3085                     __FUNCTION__, sec_name, (unsigned long) vaddr,
3086                     (unsigned long) (vaddr + vsize), (unsigned long) flags);
3087         }
3088       else if (strcmp (sec_name,".bss") == 0)
3089         {
3090           bss_start = vaddr;
3091           bss_end = vaddr + vsize;
3092
3093           if (pe_dll_extra_pe_debug)
3094             printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3095                     __FUNCTION__, sec_name, (unsigned long) vaddr,
3096                     (unsigned long) (vaddr + vsize), (unsigned long) flags);
3097         }
3098     }
3099
3100   expdata = xmalloc (export_size);
3101   bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
3102   bfd_bread (expdata, (bfd_size_type) export_size, dll);
3103   erva = (char *) expdata - export_rva;
3104
3105   if (pe_def_file == 0)
3106     pe_def_file = def_file_empty ();
3107
3108   nexp = pe_as32 (expdata + 24);
3109   name_rvas = pe_as32 (expdata + 32);
3110   ordinals = pe_as32 (expdata + 36);
3111   ordbase = pe_as32 (expdata + 16);
3112   exp_funcbase = pe_as32 (expdata + 28);
3113
3114   /* Use internal dll name instead of filename
3115      to enable symbolic dll linking.  */
3116   dllname = erva + pe_as32 (expdata + 12);
3117
3118   /* Check to see if the dll has already been added to
3119      the definition list and if so return without error.
3120      This avoids multiple symbol definitions.  */
3121   if (def_get_module (pe_def_file, dllname))
3122     {
3123       if (pe_dll_extra_pe_debug)
3124         printf ("%s is already loaded\n", dllname);
3125       return TRUE;
3126     }
3127
3128   /* Iterate through the list of symbols.  */
3129   for (i = 0; i < nexp; i++)
3130     {
3131       /* Pointer to the names vector.  */
3132       bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
3133       def_file_import *imp;
3134       /* Pointer to the function address vector.  */
3135       bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
3136       int is_data = 0;
3137
3138       /* Skip unwanted symbols, which are
3139          exported in buggy auto-import releases.  */
3140       if (! CONST_STRNEQ (erva + name_rva, "_nm_"))
3141         {
3142           /* is_data is true if the address is in the data, rdata or bss
3143              segment.  */
3144           is_data =
3145             (func_rva >= data_start && func_rva < data_end)
3146             || (func_rva >= rdata_start && func_rva < rdata_end)
3147             || (func_rva >= bss_start && func_rva < bss_end);
3148
3149           imp = def_file_add_import (pe_def_file, erva + name_rva,
3150                                      dllname, i, 0, NULL);
3151           /* Mark symbol type.  */
3152           imp->data = is_data;
3153
3154           if (pe_dll_extra_pe_debug)
3155             printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3156                     __FUNCTION__, dllname, erva + name_rva,
3157                     (unsigned long) func_rva, is_data ? "(data)" : "");
3158         }
3159     }
3160
3161   return TRUE;
3162 }
3163
3164 void
3165 pe_output_file_set_long_section_names (bfd *abfd)
3166 {
3167   if (pe_use_coff_long_section_names < 0)
3168     return;
3169   if (!bfd_coff_set_long_section_names (abfd, pe_use_coff_long_section_names))
3170     einfo (_("%XError: can't use long section names on this arch\n"));
3171 }
3172
3173 /* These are the main functions, called from the emulation.  The first
3174    is called after the bfds are read, so we can guess at how much space
3175    we need.  The second is called after everything is placed, so we
3176    can put the right values in place.  */
3177
3178 void
3179 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
3180 {
3181   pe_dll_id_target (bfd_get_target (abfd));
3182   pe_output_file_set_long_section_names (abfd);
3183   process_def_file_and_drectve (abfd, info);
3184
3185   if (pe_def_file->num_exports == 0 && !info->shared)
3186     return;
3187
3188   generate_edata (abfd, info);
3189   build_filler_bfd (1);
3190   pe_output_file_set_long_section_names (filler_bfd);
3191 }
3192
3193 void
3194 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
3195 {
3196   pe_dll_id_target (bfd_get_target (abfd));
3197   pe_output_file_set_long_section_names (abfd);
3198   build_filler_bfd (0);
3199   pe_output_file_set_long_section_names (filler_bfd);
3200 }
3201
3202 void
3203 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
3204 {
3205   pe_dll_id_target (bfd_get_target (abfd));
3206   pe_output_file_set_long_section_names (abfd);
3207   image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3208
3209   generate_reloc (abfd, info);
3210   if (reloc_sz > 0)
3211     {
3212       bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3213
3214       /* Resize the sections.  */
3215       lang_reset_memory_regions ();
3216       lang_size_sections (NULL, TRUE);
3217
3218       /* Redo special stuff.  */
3219       ldemul_after_allocation ();
3220
3221       /* Do the assignments again.  */
3222       lang_do_assignments ();
3223     }
3224
3225   fill_edata (abfd, info);
3226
3227   if (info->shared && !info->pie)
3228     pe_data (abfd)->dll = 1;
3229
3230   edata_s->contents = edata_d;
3231   reloc_s->contents = reloc_d;
3232 }
3233
3234 void
3235 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
3236 {
3237   pe_dll_id_target (bfd_get_target (abfd));
3238   pe_output_file_set_long_section_names (abfd);
3239   image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3240
3241   generate_reloc (abfd, info);
3242   if (reloc_sz > 0)
3243     {
3244       bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3245
3246       /* Resize the sections.  */
3247       lang_reset_memory_regions ();
3248       lang_size_sections (NULL, TRUE);
3249
3250       /* Redo special stuff.  */
3251       ldemul_after_allocation ();
3252
3253       /* Do the assignments again.  */
3254       lang_do_assignments ();
3255     }
3256   reloc_s->contents = reloc_d;
3257 }
3258
3259 bfd_boolean
3260 pe_bfd_is_dll (bfd *abfd)
3261 {
3262   return (bfd_get_format (abfd) == bfd_object
3263           && obj_pe (abfd)
3264           && pe_data (abfd)->dll);
3265 }