OSDN Git Service

Add -Wshadow to the gcc command line options used when compiling the binutils.
[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_link_hash_lookup (info->hash, sym->name,
1365                                                 FALSE, FALSE, FALSE);
1366                       if (!blhe || blhe->type != bfd_link_hash_defined)
1367                         continue;                     
1368                     }
1369
1370                   sym_vma = (relocs[i]->addend
1371                              + sym->value
1372                              + sym->section->vma
1373                              + sym->section->output_offset
1374                              + sym->section->output_section->vma);
1375                   reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
1376
1377 #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift)
1378
1379                   switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
1380                                          relocs[i]->howto->rightshift)
1381                     {
1382 #ifdef pe_use_x86_64
1383                     case BITS_AND_SHIFT (64, 0):
1384                       reloc_data[total_relocs].type = 10;
1385                       total_relocs++;
1386                       break;
1387 #endif
1388                     case BITS_AND_SHIFT (32, 0):
1389                       reloc_data[total_relocs].type = 3;
1390                       total_relocs++;
1391                       break;
1392                     case BITS_AND_SHIFT (16, 0):
1393                       reloc_data[total_relocs].type = 2;
1394                       total_relocs++;
1395                       break;
1396                     case BITS_AND_SHIFT (16, 16):
1397                       reloc_data[total_relocs].type = 4;
1398                       /* FIXME: we can't know the symbol's right value
1399                          yet, but we probably can safely assume that
1400                          CE will relocate us in 64k blocks, so leaving
1401                          it zero is safe.  */
1402                       reloc_data[total_relocs].extra = 0;
1403                       total_relocs++;
1404                       break;
1405                     case BITS_AND_SHIFT (26, 2):
1406                       reloc_data[total_relocs].type = 5;
1407                       total_relocs++;
1408                       break;
1409                     case BITS_AND_SHIFT (24, 2):
1410                       /* FIXME: 0 is ARM_26D, it is defined in bfd/coff-arm.c
1411                          Those ARM_xxx definitions should go in proper
1412                          header someday.  */
1413                       if (relocs[i]->howto->type == 0
1414                           /* Older GNU linkers used 5 instead of 0 for this reloc.  */
1415                           || relocs[i]->howto->type == 5)
1416                         /* This is an ARM_26D reloc, which is an ARM_26 reloc
1417                            that has already been fully processed during a
1418                            previous link stage, so ignore it here.  */
1419                         break;
1420                       /* Fall through.  */
1421                     default:
1422                       /* xgettext:c-format */
1423                       einfo (_("%XError: %d-bit reloc in dll\n"),
1424                              relocs[i]->howto->bitsize);
1425                       break;
1426                     }
1427                 }
1428             }
1429           free (relocs);
1430           /* Warning: the allocated symbols are remembered in BFD and
1431              reused later, so don't free them!  */
1432         }
1433     }
1434
1435   /* At this point, we have total_relocs relocation addresses in
1436      reloc_addresses, which are all suitable for the .reloc section.
1437      We must now create the new sections.  */
1438   qsort (reloc_data, total_relocs, sizeof (*reloc_data), reloc_sort);
1439
1440   for (i = 0; i < total_relocs; i++)
1441     {
1442       bfd_vma this_page = (reloc_data[i].vma >> 12);
1443
1444       if (this_page != sec_page)
1445         {
1446           reloc_sz = (reloc_sz + 3) & ~3;       /* 4-byte align.  */
1447           reloc_sz += 8;
1448           sec_page = this_page;
1449         }
1450
1451       reloc_sz += 2;
1452
1453       if (reloc_data[i].type == 4)
1454         reloc_sz += 2;
1455     }
1456
1457   reloc_sz = (reloc_sz + 3) & ~3;       /* 4-byte align.  */
1458   reloc_d = xmalloc (reloc_sz);
1459   sec_page = (bfd_vma) -1;
1460   reloc_sz = 0;
1461   page_ptr = (bfd_vma) -1;
1462   page_count = 0;
1463
1464   for (i = 0; i < total_relocs; i++)
1465     {
1466       bfd_vma rva = reloc_data[i].vma - image_base;
1467       bfd_vma this_page = (rva & ~0xfff);
1468
1469       if (this_page != sec_page)
1470         {
1471           while (reloc_sz & 3)
1472             reloc_d[reloc_sz++] = 0;
1473
1474           if (page_ptr != (bfd_vma) -1)
1475             bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1476
1477           bfd_put_32 (abfd, this_page, reloc_d + reloc_sz);
1478           page_ptr = reloc_sz;
1479           reloc_sz += 8;
1480           sec_page = this_page;
1481           page_count = 0;
1482         }
1483
1484       bfd_put_16 (abfd, (rva & 0xfff) + (reloc_data[i].type << 12),
1485                   reloc_d + reloc_sz);
1486       reloc_sz += 2;
1487
1488       if (reloc_data[i].type == 4)
1489         {
1490           bfd_put_16 (abfd, reloc_data[i].extra, reloc_d + reloc_sz);
1491           reloc_sz += 2;
1492         }
1493
1494       page_count++;
1495     }
1496
1497   while (reloc_sz & 3)
1498     reloc_d[reloc_sz++] = 0;
1499
1500   if (page_ptr != (bfd_vma) -1)
1501     bfd_put_32 (abfd, reloc_sz - page_ptr, reloc_d + page_ptr + 4);
1502
1503   while (reloc_sz < reloc_s->size)
1504     reloc_d[reloc_sz++] = 0;
1505 }
1506
1507 /* Given the exiting def_file structure, print out a .DEF file that
1508    corresponds to it.  */
1509
1510 static void
1511 quoteput (char *s, FILE *f, int needs_quotes)
1512 {
1513   char *cp;
1514
1515   for (cp = s; *cp; cp++)
1516     if (*cp == '\''
1517         || *cp == '"'
1518         || *cp == '\\'
1519         || ISSPACE (*cp)
1520         || *cp == ','
1521         || *cp == ';')
1522       needs_quotes = 1;
1523
1524   if (needs_quotes)
1525     {
1526       putc ('"', f);
1527
1528       while (*s)
1529         {
1530           if (*s == '"' || *s == '\\')
1531             putc ('\\', f);
1532
1533           putc (*s, f);
1534           s++;
1535         }
1536
1537       putc ('"', f);
1538     }
1539   else
1540     fputs (s, f);
1541 }
1542
1543 void
1544 pe_dll_generate_def_file (const char *pe_out_def_filename)
1545 {
1546   int i;
1547   FILE *out = fopen (pe_out_def_filename, "w");
1548
1549   if (out == NULL)
1550     /* xgettext:c-format */
1551     einfo (_("%s: Can't open output def file %s\n"),
1552            program_name, pe_out_def_filename);
1553
1554   if (pe_def_file)
1555     {
1556       if (pe_def_file->name)
1557         {
1558           if (pe_def_file->is_dll)
1559             fprintf (out, "LIBRARY ");
1560           else
1561             fprintf (out, "NAME ");
1562
1563           quoteput (pe_def_file->name, out, 1);
1564
1565           if (pe_data (link_info.output_bfd)->pe_opthdr.ImageBase)
1566             {
1567               fprintf (out, " BASE=0x");
1568               fprintf_vma (out, ((bfd_vma) pe_data (link_info.output_bfd)->pe_opthdr.ImageBase));
1569             }
1570           fprintf (out, "\n");
1571         }
1572
1573       if (pe_def_file->description)
1574         {
1575           fprintf (out, "DESCRIPTION ");
1576           quoteput (pe_def_file->description, out, 1);
1577           fprintf (out, "\n");
1578         }
1579
1580       if (pe_def_file->version_minor != -1)
1581         fprintf (out, "VERSION %d.%d\n", pe_def_file->version_major,
1582                  pe_def_file->version_minor);
1583       else if (pe_def_file->version_major != -1)
1584         fprintf (out, "VERSION %d\n", pe_def_file->version_major);
1585
1586       if (pe_def_file->stack_reserve != -1 || pe_def_file->heap_reserve != -1)
1587         fprintf (out, "\n");
1588
1589       if (pe_def_file->stack_commit != -1)
1590         fprintf (out, "STACKSIZE 0x%x,0x%x\n",
1591                  pe_def_file->stack_reserve, pe_def_file->stack_commit);
1592       else if (pe_def_file->stack_reserve != -1)
1593         fprintf (out, "STACKSIZE 0x%x\n", pe_def_file->stack_reserve);
1594
1595       if (pe_def_file->heap_commit != -1)
1596         fprintf (out, "HEAPSIZE 0x%x,0x%x\n",
1597                  pe_def_file->heap_reserve, pe_def_file->heap_commit);
1598       else if (pe_def_file->heap_reserve != -1)
1599         fprintf (out, "HEAPSIZE 0x%x\n", pe_def_file->heap_reserve);
1600
1601       if (pe_def_file->num_section_defs > 0)
1602         {
1603           fprintf (out, "\nSECTIONS\n\n");
1604
1605           for (i = 0; i < pe_def_file->num_section_defs; i++)
1606             {
1607               fprintf (out, "    ");
1608               quoteput (pe_def_file->section_defs[i].name, out, 0);
1609
1610               if (pe_def_file->section_defs[i].class)
1611                 {
1612                   fprintf (out, " CLASS ");
1613                   quoteput (pe_def_file->section_defs[i].class, out, 0);
1614                 }
1615
1616               if (pe_def_file->section_defs[i].flag_read)
1617                 fprintf (out, " READ");
1618
1619               if (pe_def_file->section_defs[i].flag_write)
1620                 fprintf (out, " WRITE");
1621
1622               if (pe_def_file->section_defs[i].flag_execute)
1623                 fprintf (out, " EXECUTE");
1624
1625               if (pe_def_file->section_defs[i].flag_shared)
1626                 fprintf (out, " SHARED");
1627
1628               fprintf (out, "\n");
1629             }
1630         }
1631
1632       if (pe_def_file->num_exports > 0)
1633         {
1634           fprintf (out, "EXPORTS\n");
1635
1636           for (i = 0; i < pe_def_file->num_exports; i++)
1637             {
1638               def_file_export *e = pe_def_file->exports + i;
1639               fprintf (out, "    ");
1640               quoteput (e->name, out, 0);
1641
1642               if (e->internal_name && strcmp (e->internal_name, e->name))
1643                 {
1644                   fprintf (out, " = ");
1645                   quoteput (e->internal_name, out, 0);
1646                 }
1647
1648               if (e->ordinal != -1)
1649                 fprintf (out, " @%d", e->ordinal);
1650
1651               if (e->flag_private)
1652                 fprintf (out, " PRIVATE");
1653
1654               if (e->flag_constant)
1655                 fprintf (out, " CONSTANT");
1656
1657               if (e->flag_noname)
1658                 fprintf (out, " NONAME");
1659
1660               if (e->flag_data)
1661                 fprintf (out, " DATA");
1662
1663               fprintf (out, "\n");
1664             }
1665         }
1666
1667       if (pe_def_file->num_imports > 0)
1668         {
1669           fprintf (out, "\nIMPORTS\n\n");
1670
1671           for (i = 0; i < pe_def_file->num_imports; i++)
1672             {
1673               def_file_import *im = pe_def_file->imports + i;
1674               fprintf (out, "    ");
1675
1676               if (im->internal_name
1677                   && (!im->name || strcmp (im->internal_name, im->name)))
1678                 {
1679                   quoteput (im->internal_name, out, 0);
1680                   fprintf (out, " = ");
1681                 }
1682
1683               quoteput (im->module->name, out, 0);
1684               fprintf (out, ".");
1685
1686               if (im->name)
1687                 quoteput (im->name, out, 0);
1688               else
1689                 fprintf (out, "%d", im->ordinal);
1690
1691               if (im->its_name)
1692                 {
1693                   fprintf (out, " == ");
1694                   quoteput (im->its_name, out, 0);
1695                 }
1696
1697               fprintf (out, "\n");
1698             }
1699         }
1700     }
1701   else
1702     fprintf (out, _("; no contents available\n"));
1703
1704   if (fclose (out) == EOF)
1705     /* xgettext:c-format */
1706     einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
1707 }
1708
1709 /* Generate the import library.  */
1710
1711 static asymbol **symtab;
1712 static int symptr;
1713 static int tmp_seq;
1714 static int tmp_seq2;
1715 static const char *dll_filename;
1716 static char *dll_symname;
1717
1718 #define UNDSEC (asection *) &bfd_und_section
1719
1720 static asection *
1721 quick_section (bfd *abfd, const char *name, int flags, int align)
1722 {
1723   asection *sec;
1724   asymbol *sym;
1725
1726   sec = bfd_make_section_old_way (abfd, name);
1727   bfd_set_section_flags (abfd, sec, flags | SEC_ALLOC | SEC_LOAD | SEC_KEEP);
1728   bfd_set_section_alignment (abfd, sec, align);
1729   /* Remember to undo this before trying to link internally!  */
1730   sec->output_section = sec;
1731
1732   sym = bfd_make_empty_symbol (abfd);
1733   symtab[symptr++] = sym;
1734   sym->name = sec->name;
1735   sym->section = sec;
1736   sym->flags = BSF_LOCAL;
1737   sym->value = 0;
1738
1739   return sec;
1740 }
1741
1742 static void
1743 quick_symbol (bfd *abfd,
1744               const char *n1,
1745               const char *n2,
1746               const char *n3,
1747               asection *sec,
1748               int flags,
1749               int addr)
1750 {
1751   asymbol *sym;
1752   char *name = xmalloc (strlen (n1) + strlen (n2) + strlen (n3) + 1);
1753
1754   strcpy (name, n1);
1755   strcat (name, n2);
1756   strcat (name, n3);
1757   sym = bfd_make_empty_symbol (abfd);
1758   sym->name = name;
1759   sym->section = sec;
1760   sym->flags = flags;
1761   sym->value = addr;
1762   symtab[symptr++] = sym;
1763 }
1764
1765 static arelent *reltab = 0;
1766 static int relcount = 0, relsize = 0;
1767
1768 static void
1769 quick_reloc (bfd *abfd, bfd_size_type address, int which_howto, int symidx)
1770 {
1771   if (relcount >= relsize - 1)
1772     {
1773       relsize += 10;
1774       if (reltab)
1775         reltab = xrealloc (reltab, relsize * sizeof (arelent));
1776       else
1777         reltab = xmalloc (relsize * sizeof (arelent));
1778     }
1779   reltab[relcount].address = address;
1780   reltab[relcount].addend = 0;
1781   reltab[relcount].howto = bfd_reloc_type_lookup (abfd, which_howto);
1782   reltab[relcount].sym_ptr_ptr = symtab + symidx;
1783   relcount++;
1784 }
1785
1786 static void
1787 save_relocs (asection *sec)
1788 {
1789   int i;
1790
1791   sec->relocation = reltab;
1792   sec->reloc_count = relcount;
1793   sec->orelocation = xmalloc ((relcount + 1) * sizeof (arelent *));
1794   for (i = 0; i < relcount; i++)
1795     sec->orelocation[i] = sec->relocation + i;
1796   sec->orelocation[relcount] = 0;
1797   sec->flags |= SEC_RELOC;
1798   reltab = 0;
1799   relcount = relsize = 0;
1800 }
1801
1802 /*      .section        .idata$2
1803         .global         __head_my_dll
1804    __head_my_dll:
1805         .rva            hname
1806         .long           0
1807         .long           0
1808         .rva            __my_dll_iname
1809         .rva            fthunk
1810
1811         .section        .idata$5
1812         .long           0
1813    fthunk:
1814
1815         .section        .idata$4
1816         .long           0
1817    hname:                              */
1818
1819 static bfd *
1820 make_head (bfd *parent)
1821 {
1822   asection *id2, *id5, *id4;
1823   unsigned char *d2, *d5, *d4;
1824   char *oname;
1825   bfd *abfd;
1826
1827   oname = xmalloc (20);
1828   sprintf (oname, "d%06d.o", tmp_seq);
1829   tmp_seq++;
1830
1831   abfd = bfd_create (oname, parent);
1832   bfd_find_target (pe_details->object_target, abfd);
1833   bfd_make_writable (abfd);
1834
1835   bfd_set_format (abfd, bfd_object);
1836   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1837
1838   symptr = 0;
1839   symtab = xmalloc (6 * sizeof (asymbol *));
1840   id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
1841   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1842   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1843   quick_symbol (abfd, U ("_head_"), dll_symname, "", id2, BSF_GLOBAL, 0);
1844   quick_symbol (abfd, U (""), dll_symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
1845
1846   /* OK, pay attention here.  I got confused myself looking back at
1847      it.  We create a four-byte section to mark the beginning of the
1848      list, and we include an offset of 4 in the section, so that the
1849      pointer to the list points to the *end* of this section, which is
1850      the start of the list of sections from other objects.  */
1851
1852   bfd_set_section_size (abfd, id2, 20);
1853   d2 = xmalloc (20);
1854   id2->contents = d2;
1855   memset (d2, 0, 20);
1856   if (pe_use_nul_prefixed_import_tables)
1857     d2[0] = d2[16] = PE_IDATA5_SIZE; /* Reloc addend.  */
1858   quick_reloc (abfd,  0, BFD_RELOC_RVA, 2);
1859   quick_reloc (abfd, 12, BFD_RELOC_RVA, 4);
1860   quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
1861   save_relocs (id2);
1862
1863   if (pe_use_nul_prefixed_import_tables)
1864     bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1865   else
1866     bfd_set_section_size (abfd, id5, 0);
1867   d5 = xmalloc (PE_IDATA5_SIZE);
1868   id5->contents = d5;
1869   memset (d5, 0, PE_IDATA5_SIZE);
1870   if (pe_use_nul_prefixed_import_tables)
1871     bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1872   else
1873     bfd_set_section_size (abfd, id4, 0);
1874   d4 = xmalloc (PE_IDATA4_SIZE);
1875   id4->contents = d4;
1876   memset (d4, 0, PE_IDATA4_SIZE);
1877
1878   bfd_set_symtab (abfd, symtab, symptr);
1879
1880   bfd_set_section_contents (abfd, id2, d2, 0, 20);
1881   if (pe_use_nul_prefixed_import_tables)
1882     {
1883       bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1884       bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1885     }
1886   else
1887     {
1888       bfd_set_section_contents (abfd, id5, d5, 0, 0);
1889       bfd_set_section_contents (abfd, id4, d4, 0, 0);
1890     }
1891
1892   bfd_make_readable (abfd);
1893   return abfd;
1894 }
1895
1896 /*      .section        .idata$4
1897         .long           0
1898         [.long          0] for PE+
1899         .section        .idata$5
1900         .long           0
1901         [.long          0] for PE+
1902         .section        idata$7
1903         .global         __my_dll_iname
1904   __my_dll_iname:
1905         .asciz          "my.dll"       */
1906
1907 static bfd *
1908 make_tail (bfd *parent)
1909 {
1910   asection *id4, *id5, *id7;
1911   unsigned char *d4, *d5, *d7;
1912   int len;
1913   char *oname;
1914   bfd *abfd;
1915
1916   oname = xmalloc (20);
1917   sprintf (oname, "d%06d.o", tmp_seq);
1918   tmp_seq++;
1919
1920   abfd = bfd_create (oname, parent);
1921   bfd_find_target (pe_details->object_target, abfd);
1922   bfd_make_writable (abfd);
1923
1924   bfd_set_format (abfd, bfd_object);
1925   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
1926
1927   symptr = 0;
1928   symtab = xmalloc (5 * sizeof (asymbol *));
1929   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
1930   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
1931   id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
1932   quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
1933
1934   bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
1935   d4 = xmalloc (PE_IDATA4_SIZE);
1936   id4->contents = d4;
1937   memset (d4, 0, PE_IDATA4_SIZE);
1938
1939   bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
1940   d5 = xmalloc (PE_IDATA5_SIZE);
1941   id5->contents = d5;
1942   memset (d5, 0, PE_IDATA5_SIZE);
1943
1944   len = strlen (dll_filename) + 1;
1945   if (len & 1)
1946     len++;
1947   bfd_set_section_size (abfd, id7, len);
1948   d7 = xmalloc (len);
1949   id7->contents = d7;
1950   strcpy ((char *) d7, dll_filename);
1951   /* If len was odd, the above
1952      strcpy leaves behind an undefined byte. That is harmless,
1953      but we set it to 0 just so the binary dumps are pretty.  */
1954   d7[len - 1] = 0;
1955
1956   bfd_set_symtab (abfd, symtab, symptr);
1957
1958   bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
1959   bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
1960   bfd_set_section_contents (abfd, id7, d7, 0, len);
1961
1962   bfd_make_readable (abfd);
1963   return abfd;
1964 }
1965
1966 /*      .text
1967         .global         _function
1968         .global         ___imp_function
1969         .global         __imp__function
1970   _function:
1971         jmp             *__imp__function:
1972
1973         .section        idata$7
1974         .long           __head_my_dll
1975
1976         .section        .idata$5
1977   ___imp_function:
1978   __imp__function:
1979   iat?
1980         .section        .idata$4
1981   iat?
1982         .section        .idata$6
1983   ID<ordinal>:
1984         .short          <hint>
1985         .asciz          "function" xlate? (add underscore, kill at)  */
1986
1987 static const unsigned char jmp_ix86_bytes[] =
1988 {
1989   0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90
1990 };
1991
1992 /* _function:
1993         mov.l   ip+8,r0
1994         mov.l   @r0,r0
1995         jmp     @r0
1996         nop
1997         .dw     __imp_function   */
1998
1999 static const unsigned char jmp_sh_bytes[] =
2000 {
2001   0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00
2002 };
2003
2004 /* _function:
2005         lui     $t0,<high:__imp_function>
2006         lw      $t0,<low:__imp_function>
2007         jr      $t0
2008         nop                              */
2009
2010 static const unsigned char jmp_mips_bytes[] =
2011 {
2012   0x00, 0x00, 0x08, 0x3c,  0x00, 0x00, 0x08, 0x8d,
2013   0x08, 0x00, 0x00, 0x01,  0x00, 0x00, 0x00, 0x00
2014 };
2015
2016 static const unsigned char jmp_arm_bytes[] =
2017 {
2018   0x00, 0xc0, 0x9f, 0xe5,       /* ldr  ip, [pc] */
2019   0x00, 0xf0, 0x9c, 0xe5,       /* ldr  pc, [ip] */
2020   0,    0,    0,    0
2021 };
2022
2023
2024 static bfd *
2025 make_one (def_file_export *exp, bfd *parent, bfd_boolean include_jmp_stub)
2026 {
2027   asection *tx, *id7, *id5, *id4, *id6;
2028   unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL;
2029   int len;
2030   char *oname;
2031   bfd *abfd;
2032   const unsigned char *jmp_bytes = NULL;
2033   int jmp_byte_count = 0;
2034
2035   /* Include the jump stub section only if it is needed. A jump
2036      stub is needed if the symbol being imported <sym> is a function
2037      symbol and there is at least one undefined reference to that
2038      symbol. In other words, if all the import references to <sym> are
2039      explicitly through _declspec(dllimport) then the jump stub is not
2040      needed.  */
2041   if (include_jmp_stub)
2042     {
2043       switch (pe_details->pe_arch)
2044         {
2045         case PE_ARCH_i386:
2046           jmp_bytes = jmp_ix86_bytes;
2047           jmp_byte_count = sizeof (jmp_ix86_bytes);
2048           break;
2049         case PE_ARCH_sh:
2050           jmp_bytes = jmp_sh_bytes;
2051           jmp_byte_count = sizeof (jmp_sh_bytes);
2052           break;
2053         case PE_ARCH_mips:
2054           jmp_bytes = jmp_mips_bytes;
2055           jmp_byte_count = sizeof (jmp_mips_bytes);
2056           break;
2057         case PE_ARCH_arm:
2058         case PE_ARCH_arm_epoc:
2059         case PE_ARCH_arm_wince:
2060           jmp_bytes = jmp_arm_bytes;
2061           jmp_byte_count = sizeof (jmp_arm_bytes);
2062           break;
2063         default:
2064           abort ();
2065         }
2066     }
2067
2068   oname = xmalloc (20);
2069   sprintf (oname, "d%06d.o", tmp_seq);
2070   tmp_seq++;
2071
2072   abfd = bfd_create (oname, parent);
2073   bfd_find_target (pe_details->object_target, abfd);
2074   bfd_make_writable (abfd);
2075
2076   bfd_set_format (abfd, bfd_object);
2077   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2078
2079   symptr = 0;
2080   symtab = xmalloc (11 * sizeof (asymbol *));
2081   tx  = quick_section (abfd, ".text",    SEC_CODE|SEC_HAS_CONTENTS, 2);
2082   id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
2083   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2084   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2085   id6 = quick_section (abfd, ".idata$6", SEC_HAS_CONTENTS, 2);
2086
2087   if  (*exp->internal_name == '@')
2088     {
2089       quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2090                     BSF_GLOBAL, 0);
2091       if (include_jmp_stub)
2092         quick_symbol (abfd, "", exp->internal_name, "", tx, BSF_GLOBAL, 0);
2093       quick_symbol (abfd, "__imp_", exp->internal_name, "", id5,
2094                     BSF_GLOBAL, 0);
2095       /* Fastcall applies only to functions,
2096          so no need for auto-import symbol.  */
2097     }
2098   else
2099     {
2100       quick_symbol (abfd, U ("_head_"), dll_symname, "", UNDSEC,
2101                     BSF_GLOBAL, 0);
2102       if (include_jmp_stub)
2103         quick_symbol (abfd, U (""), exp->internal_name, "", tx,
2104                       BSF_GLOBAL, 0);
2105       quick_symbol (abfd, "__imp_", U (""), exp->internal_name, id5,
2106                     BSF_GLOBAL, 0);
2107       /* Symbol to reference ord/name of imported
2108          data symbol, used to implement auto-import.  */
2109       if (exp->flag_data)
2110         quick_symbol (abfd, U ("_nm_"), U (""), exp->internal_name, id6,
2111                       BSF_GLOBAL,0);
2112     }
2113   if (pe_dll_compat_implib)
2114     quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", id5,
2115                   BSF_GLOBAL, 0);
2116
2117   if (include_jmp_stub)
2118     {
2119       bfd_set_section_size (abfd, tx, jmp_byte_count);
2120       td = xmalloc (jmp_byte_count);
2121       tx->contents = td;
2122       memcpy (td, jmp_bytes, jmp_byte_count);
2123
2124       switch (pe_details->pe_arch)
2125         {
2126         case PE_ARCH_i386:
2127 #ifdef pe_use_x86_64
2128           quick_reloc (abfd, 2, BFD_RELOC_32_PCREL, 2);
2129 #else
2130           quick_reloc (abfd, 2, BFD_RELOC_32, 2);
2131 #endif
2132           break;
2133         case PE_ARCH_sh:
2134           quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2135           break;
2136         case PE_ARCH_mips:
2137           quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2);
2138           quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */
2139           quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
2140           break;
2141         case PE_ARCH_arm:
2142         case PE_ARCH_arm_epoc:
2143         case PE_ARCH_arm_wince:
2144           quick_reloc (abfd, 8, BFD_RELOC_32, 2);
2145           break;
2146         default:
2147           abort ();
2148         }
2149       save_relocs (tx);
2150     }
2151   else
2152     bfd_set_section_size (abfd, tx, 0);
2153
2154   bfd_set_section_size (abfd, id7, 4);
2155   d7 = xmalloc (4);
2156   id7->contents = d7;
2157   memset (d7, 0, 4);
2158   quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
2159   save_relocs (id7);
2160
2161   bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
2162   d5 = xmalloc (PE_IDATA5_SIZE);
2163   id5->contents = d5;
2164   memset (d5, 0, PE_IDATA5_SIZE);
2165
2166   if (exp->flag_noname)
2167     {
2168       d5[0] = exp->ordinal;
2169       d5[1] = exp->ordinal >> 8;
2170       d5[PE_IDATA5_SIZE - 1] = 0x80;
2171     }
2172   else
2173     {
2174       quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2175       save_relocs (id5);
2176     }
2177
2178   bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
2179   d4 = xmalloc (PE_IDATA4_SIZE);
2180   id4->contents = d4;
2181   memset (d4, 0, PE_IDATA4_SIZE);
2182
2183   if (exp->flag_noname)
2184     {
2185       d4[0] = exp->ordinal;
2186       d4[1] = exp->ordinal >> 8;
2187       d4[PE_IDATA4_SIZE - 1] = 0x80;
2188     }
2189   else
2190     {
2191       quick_reloc (abfd, 0, BFD_RELOC_RVA, 4);
2192       save_relocs (id4);
2193     }
2194
2195   if (exp->flag_noname)
2196     {
2197       len = 0;
2198       bfd_set_section_size (abfd, id6, 0);
2199     }
2200   else
2201     {
2202       /* { short, asciz }  */
2203       if (exp->its_name)
2204         len = 2 + strlen (exp->its_name) + 1;
2205       else
2206         len = 2 + strlen (exp->name) + 1;
2207       if (len & 1)
2208         len++;
2209       bfd_set_section_size (abfd, id6, len);
2210       d6 = xmalloc (len);
2211       id6->contents = d6;
2212       memset (d6, 0, len);
2213       d6[0] = exp->hint & 0xff;
2214       d6[1] = exp->hint >> 8;
2215       if (exp->its_name)
2216         strcpy ((char*) d6 + 2, exp->its_name);
2217       else
2218         strcpy ((char *) d6 + 2, exp->name);
2219     }
2220
2221   bfd_set_symtab (abfd, symtab, symptr);
2222
2223   if (include_jmp_stub)
2224     bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
2225   bfd_set_section_contents (abfd, id7, d7, 0, 4);
2226   bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
2227   bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
2228   if (!exp->flag_noname)
2229     bfd_set_section_contents (abfd, id6, d6, 0, len);
2230
2231   bfd_make_readable (abfd);
2232   return abfd;
2233 }
2234
2235 static bfd *
2236 make_singleton_name_imp (const char *import, bfd *parent)
2237 {
2238   /* Name thunks go to idata$4.  */
2239   asection *id5;
2240   unsigned char *d5;
2241   char *oname;
2242   bfd *abfd;
2243
2244   oname = xmalloc (20);
2245   sprintf (oname, "nmimp%06d.o", tmp_seq2);
2246   tmp_seq2++;
2247
2248   abfd = bfd_create (oname, parent);
2249   bfd_find_target (pe_details->object_target, abfd);
2250   bfd_make_writable (abfd);
2251
2252   bfd_set_format (abfd, bfd_object);
2253   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2254
2255   symptr = 0;
2256   symtab = xmalloc (3 * sizeof (asymbol *));
2257   id5 = quick_section (abfd, ".idata$5", SEC_HAS_CONTENTS, 2);
2258   quick_symbol (abfd, U ("_imp_"), import, "", id5, BSF_GLOBAL, 0);
2259
2260   /* We need space for the real thunk and for the null terminator.  */
2261   bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE * 2);
2262   d5 = xmalloc (PE_IDATA5_SIZE * 2);
2263   id5->contents = d5;
2264   memset (d5, 0, PE_IDATA5_SIZE * 2);
2265   quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2266   save_relocs (id5);
2267
2268   bfd_set_symtab (abfd, symtab, symptr);
2269
2270   bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA4_SIZE * 2);
2271
2272   bfd_make_readable (abfd);
2273   return abfd;
2274 }
2275
2276 static bfd *
2277 make_singleton_name_thunk (const char *import, bfd *parent)
2278 {
2279   /* Name thunks go to idata$4.  */
2280   asection *id4;
2281   unsigned char *d4;
2282   char *oname;
2283   bfd *abfd;
2284
2285   oname = xmalloc (20);
2286   sprintf (oname, "nmth%06d.o", tmp_seq);
2287   tmp_seq++;
2288
2289   abfd = bfd_create (oname, parent);
2290   bfd_find_target (pe_details->object_target, abfd);
2291   bfd_make_writable (abfd);
2292
2293   bfd_set_format (abfd, bfd_object);
2294   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2295
2296   symptr = 0;
2297   symtab = xmalloc (3 * sizeof (asymbol *));
2298   id4 = quick_section (abfd, ".idata$4", SEC_HAS_CONTENTS, 2);
2299   quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
2300   quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
2301
2302   /* We need space for the real thunk and for the null terminator.  */
2303   bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE * 2);
2304   d4 = xmalloc (PE_IDATA4_SIZE * 2);
2305   id4->contents = d4;
2306   memset (d4, 0, PE_IDATA4_SIZE * 2);
2307   quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
2308   save_relocs (id4);
2309
2310   bfd_set_symtab (abfd, symtab, symptr);
2311
2312   bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE * 2);
2313
2314   bfd_make_readable (abfd);
2315   return abfd;
2316 }
2317
2318 static char *
2319 make_import_fixup_mark (arelent *rel)
2320 {
2321   /* We convert reloc to symbol, for later reference.  */
2322   static int counter;
2323   static char *fixup_name = NULL;
2324   static size_t buffer_len = 0;
2325
2326   struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2327
2328   bfd *abfd = bfd_asymbol_bfd (sym);
2329   struct bfd_link_hash_entry *bh;
2330
2331   if (!fixup_name)
2332     {
2333       fixup_name = xmalloc (384);
2334       buffer_len = 384;
2335     }
2336
2337   if (strlen (sym->name) + 25 > buffer_len)
2338   /* Assume 25 chars for "__fu" + counter + "_".  If counter is
2339      bigger than 20 digits long, we've got worse problems than
2340      overflowing this buffer...  */
2341     {
2342       free (fixup_name);
2343       /* New buffer size is length of symbol, plus 25, but
2344          then rounded up to the nearest multiple of 128.  */
2345       buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
2346       fixup_name = xmalloc (buffer_len);
2347     }
2348
2349   sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
2350
2351   bh = NULL;
2352   bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
2353                                 current_sec, /* sym->section, */
2354                                 rel->address, NULL, TRUE, FALSE, &bh);
2355
2356   return fixup_name;
2357 }
2358
2359 /*      .section        .idata$2
2360         .rva            __nm_thnk_SYM (singleton thunk with name of func)
2361         .long           0
2362         .long           0
2363         .rva            __my_dll_iname (name of dll)
2364         .rva            __fuNN_SYM (pointer to reference (address) in text)  */
2365
2366 static bfd *
2367 make_import_fixup_entry (const char *name,
2368                          const char *fixup_name,
2369                          const char *symname,
2370                          bfd *parent)
2371 {
2372   asection *id2;
2373   unsigned char *d2;
2374   char *oname;
2375   bfd *abfd;
2376
2377   oname = xmalloc (20);
2378   sprintf (oname, "fu%06d.o", tmp_seq);
2379   tmp_seq++;
2380
2381   abfd = bfd_create (oname, parent);
2382   bfd_find_target (pe_details->object_target, abfd);
2383   bfd_make_writable (abfd);
2384
2385   bfd_set_format (abfd, bfd_object);
2386   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2387
2388   symptr = 0;
2389   symtab = xmalloc (6 * sizeof (asymbol *));
2390   id2 = quick_section (abfd, ".idata$2", SEC_HAS_CONTENTS, 2);
2391
2392   quick_symbol (abfd, U ("_nm_thnk_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2393   quick_symbol (abfd, U (""), symname, "_iname", UNDSEC, BSF_GLOBAL, 0);
2394   /* For relocator v2 we have to use the .idata$5 element and not 
2395      fixup_name.  */
2396   if (link_info.pei386_runtime_pseudo_reloc == 2)
2397     quick_symbol (abfd, U ("_imp_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2398   else
2399     quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2400
2401   bfd_set_section_size (abfd, id2, 20);
2402   d2 = xmalloc (20);
2403   id2->contents = d2;
2404   memset (d2, 0, 20);
2405
2406   quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2407   quick_reloc (abfd, 12, BFD_RELOC_RVA, 2);
2408   quick_reloc (abfd, 16, BFD_RELOC_RVA, 3);
2409   save_relocs (id2);
2410
2411   bfd_set_symtab (abfd, symtab, symptr);
2412
2413   bfd_set_section_contents (abfd, id2, d2, 0, 20);
2414
2415   bfd_make_readable (abfd);
2416   return abfd;
2417 }
2418
2419 /*      .section        .rdata_runtime_pseudo_reloc
2420         .long           addend
2421         .rva            __fuNN_SYM (pointer to reference (address) in text)  */
2422
2423 static bfd *
2424 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
2425                            const char *fixup_name,
2426                            bfd_vma addend ATTRIBUTE_UNUSED,
2427                            bfd_vma bitsize,
2428                            bfd *parent)
2429 {
2430   asection *rt_rel;
2431   unsigned char *rt_rel_d;
2432   char *oname;
2433   bfd *abfd;
2434   oname = xmalloc (20);
2435   sprintf (oname, "rtr%06d.o", tmp_seq);
2436   tmp_seq++;
2437
2438   abfd = bfd_create (oname, parent);
2439   bfd_find_target (pe_details->object_target, abfd);
2440   bfd_make_writable (abfd);
2441
2442   bfd_set_format (abfd, bfd_object);
2443   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2444
2445   symptr = 0;
2446   if (link_info.pei386_runtime_pseudo_reloc == 2)
2447     {
2448       symtab = xmalloc ((runtime_pseudp_reloc_v2_init ? 3 : 6) * sizeof (asymbol *));
2449     }
2450   else
2451     {
2452       symtab = xmalloc (2 * sizeof (asymbol *));
2453     }
2454   rt_rel = quick_section (abfd, ".rdata_runtime_pseudo_reloc",
2455                           SEC_HAS_CONTENTS, 2);
2456
2457   quick_symbol (abfd, "", fixup_name, "", UNDSEC, BSF_GLOBAL, 0);
2458
2459   if (link_info.pei386_runtime_pseudo_reloc == 2)
2460     {
2461           size_t size = 12;
2462           if (! runtime_pseudp_reloc_v2_init)
2463             {
2464                   size += 12;
2465                   runtime_pseudp_reloc_v2_init = 1;
2466             }
2467       quick_symbol (abfd, U ("_imp_"), name, "", UNDSEC, BSF_GLOBAL, 0);
2468
2469       bfd_set_section_size (abfd, rt_rel, size);
2470       rt_rel_d = xmalloc (size);
2471       rt_rel->contents = rt_rel_d;
2472       memset (rt_rel_d, 0, size);
2473           quick_reloc (abfd, size - 8, BFD_RELOC_RVA, 1);
2474           quick_reloc (abfd, size - 12, BFD_RELOC_RVA, 2);
2475           bfd_put_32 (abfd, bitsize, rt_rel_d + (size - 4));
2476           if (size != 12)
2477             bfd_put_32 (abfd, 1, rt_rel_d + 8);
2478       save_relocs (rt_rel);
2479
2480       bfd_set_symtab (abfd, symtab, symptr);
2481
2482       bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, size);
2483    }
2484   else
2485    {
2486       bfd_set_section_size (abfd, rt_rel, 8);
2487       rt_rel_d = xmalloc (8);
2488       rt_rel->contents = rt_rel_d;
2489       memset (rt_rel_d, 0, 8);
2490
2491       bfd_put_32 (abfd, addend, rt_rel_d);
2492       quick_reloc (abfd, 4, BFD_RELOC_RVA, 1);
2493
2494       save_relocs (rt_rel);
2495
2496       bfd_set_symtab (abfd, symtab, symptr);
2497
2498       bfd_set_section_contents (abfd, rt_rel, rt_rel_d, 0, 8);
2499    }
2500   bfd_make_readable (abfd);
2501   return abfd;
2502 }
2503
2504 /*      .section        .rdata
2505         .rva            __pei386_runtime_relocator  */
2506
2507 static bfd *
2508 pe_create_runtime_relocator_reference (bfd *parent)
2509 {
2510   asection *extern_rt_rel;
2511   unsigned char *extern_rt_rel_d;
2512   char *oname;
2513   bfd *abfd;
2514
2515   oname = xmalloc (20);
2516   sprintf (oname, "ertr%06d.o", tmp_seq);
2517   tmp_seq++;
2518
2519   abfd = bfd_create (oname, parent);
2520   bfd_find_target (pe_details->object_target, abfd);
2521   bfd_make_writable (abfd);
2522
2523   bfd_set_format (abfd, bfd_object);
2524   bfd_set_arch_mach (abfd, pe_details->bfd_arch, 0);
2525
2526   symptr = 0;
2527   symtab = xmalloc (2 * sizeof (asymbol *));
2528   extern_rt_rel = quick_section (abfd, ".rdata", SEC_HAS_CONTENTS, 2);
2529
2530   quick_symbol (abfd, "", U ("_pei386_runtime_relocator"), "", UNDSEC,
2531                 BSF_NO_FLAGS, 0);
2532
2533   bfd_set_section_size (abfd, extern_rt_rel, PE_IDATA5_SIZE);
2534   extern_rt_rel_d = xmalloc (PE_IDATA5_SIZE);
2535   extern_rt_rel->contents = extern_rt_rel_d;
2536
2537   quick_reloc (abfd, 0, BFD_RELOC_RVA, 1);
2538   save_relocs (extern_rt_rel);
2539
2540   bfd_set_symtab (abfd, symtab, symptr);
2541
2542   bfd_set_section_contents (abfd, extern_rt_rel, extern_rt_rel_d, 0, PE_IDATA5_SIZE);
2543
2544   bfd_make_readable (abfd);
2545   return abfd;
2546 }
2547
2548 void
2549 pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend)
2550 {
2551   char buf[300];
2552   struct bfd_symbol *sym = *rel->sym_ptr_ptr;
2553   struct bfd_link_hash_entry *name_thunk_sym;
2554   struct bfd_link_hash_entry *name_imp_sym;
2555   const char *name = sym->name;
2556   char *fixup_name = make_import_fixup_mark (rel);
2557   bfd *b;
2558   int need_import_table = 1;
2559
2560   sprintf (buf, U ("_imp_%s"), name);
2561   name_imp_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2562
2563   sprintf (buf, U ("_nm_thnk_%s"), name);
2564
2565   name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
2566
2567   /* For version 2 pseudo relocation we don't need to add an import
2568      if the import symbol is already present.  */
2569   if (link_info.pei386_runtime_pseudo_reloc == 2
2570       && name_imp_sym
2571       && name_imp_sym->type == bfd_link_hash_defined)
2572     need_import_table = 0;
2573
2574   if (need_import_table == 1
2575       && (!name_thunk_sym || name_thunk_sym->type != bfd_link_hash_defined))
2576     {
2577       b = make_singleton_name_thunk (name, link_info.output_bfd);
2578       add_bfd_to_link (b, b->filename, &link_info);
2579
2580       /* If we ever use autoimport, we have to cast text section writable.
2581          But not for version 2.  */
2582       if (link_info.pei386_runtime_pseudo_reloc != 2)
2583         {
2584           config.text_read_only = FALSE;
2585           link_info.output_bfd->flags &= ~WP_TEXT;
2586         }
2587       if (link_info.pei386_runtime_pseudo_reloc == 2)
2588         {
2589           b = make_singleton_name_imp (name, link_info.output_bfd);
2590           add_bfd_to_link (b, b->filename, &link_info);
2591         }
2592     }
2593
2594   if ((addend == 0 || link_info.pei386_runtime_pseudo_reloc)
2595       && need_import_table == 1)
2596     {
2597       extern char * pe_data_import_dll;
2598       char * symname = pe_data_import_dll ? pe_data_import_dll : "unknown";
2599
2600       b = make_import_fixup_entry (name, fixup_name, symname,
2601                                    link_info.output_bfd);
2602       add_bfd_to_link (b, b->filename, &link_info);
2603     }
2604
2605     if ((link_info.pei386_runtime_pseudo_reloc != 0 && addend != 0)
2606         || link_info.pei386_runtime_pseudo_reloc == 2)
2607       {
2608         if (pe_dll_extra_pe_debug)
2609           printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
2610                   fixup_name, (int) addend);
2611
2612         b = make_runtime_pseudo_reloc (name, fixup_name, addend, rel->howto->bitsize,
2613                                        link_info.output_bfd);
2614         add_bfd_to_link (b, b->filename, &link_info);
2615
2616         if (runtime_pseudo_relocs_created == 0)
2617           {
2618             b = pe_create_runtime_relocator_reference (link_info.output_bfd);
2619             add_bfd_to_link (b, b->filename, &link_info);
2620           }
2621         runtime_pseudo_relocs_created++;
2622       }
2623     else if (addend != 0)
2624       {
2625         einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
2626                s->owner, s, rel->address, sym->name);
2627         einfo ("%X");
2628       }
2629 }
2630
2631
2632 void
2633 pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_info *info)
2634 {
2635   int i;
2636   bfd *ar_head;
2637   bfd *ar_tail;
2638   bfd *outarch;
2639   bfd *ibfd;
2640   bfd *head = 0;
2641
2642   dll_filename = (def->name) ? def->name : dll_name;
2643   dll_symname = xstrdup (dll_filename);
2644   for (i = 0; dll_symname[i]; i++)
2645     if (!ISALNUM (dll_symname[i]))
2646       dll_symname[i] = '_';
2647
2648   unlink_if_ordinary (impfilename);
2649
2650   outarch = bfd_openw (impfilename, 0);
2651
2652   if (!outarch)
2653     {
2654       /* xgettext:c-format */
2655       einfo (_("%XCan't open .lib file: %s\n"), impfilename);
2656       return;
2657     }
2658
2659   /* xgettext:c-format */
2660   info_msg (_("Creating library file: %s\n"), impfilename);
2661
2662   bfd_set_format (outarch, bfd_archive);
2663   outarch->has_armap = 1;
2664
2665   /* Work out a reasonable size of things to put onto one line.  */
2666   ar_head = make_head (outarch);
2667
2668   /* Iterate the input BFDs, looking for exclude-modules-for-implib.  */
2669   for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link_next)
2670     {
2671       /* Iterate the exclude list.  */
2672       struct exclude_list_struct *ex;
2673       char found;
2674       for (ex = excludes, found = 0; ex && !found; ex = ex->next)
2675         {
2676           if (ex->type != EXCLUDEFORIMPLIB)
2677             continue;
2678           found = (strcmp (ex->string, ibfd->filename) == 0);
2679         }
2680       /* If it matched, we must open a fresh BFD for it (the original
2681         input BFD is still needed for the DLL's final link) and add
2682         it into the archive member chain.  */
2683       if (found)
2684         {
2685           bfd *newbfd = bfd_openr (ibfd->my_archive
2686                 ? ibfd->my_archive->filename : ibfd->filename, NULL);
2687           if (!newbfd)
2688             {
2689               einfo (_("%Xbfd_openr %s: %E\n"), ibfd->filename);
2690               return;
2691             }
2692           if (ibfd->my_archive)
2693             {
2694               /* Must now iterate through archive until we find the
2695                 required member.  A minor shame that we'll open the
2696                 archive once per member that we require from it, and
2697                 leak those archive bfds rather than reuse them.  */
2698               bfd *arbfd = newbfd;
2699               if (!bfd_check_format_matches (arbfd, bfd_archive, NULL))
2700                 {
2701                   einfo (_("%X%s(%s): can't find member in non-archive file"),
2702                     ibfd->my_archive->filename, ibfd->filename);
2703                   return;
2704                 }
2705               newbfd = NULL;
2706               while ((newbfd = bfd_openr_next_archived_file (arbfd, newbfd)) != 0)
2707                 {
2708                   if (strcmp (newbfd->filename, ibfd->filename) == 0)
2709                     break;
2710                 }
2711               if (!newbfd)
2712                 {
2713                   einfo (_("%X%s(%s): can't find member in archive"),
2714                     ibfd->my_archive->filename, ibfd->filename);
2715                   return;
2716                 }
2717             }
2718           newbfd->archive_next = head;
2719           head = newbfd;
2720         }
2721     }
2722
2723   for (i = 0; i < def->num_exports; i++)
2724     {
2725       /* The import library doesn't know about the internal name.  */
2726       char *internal = def->exports[i].internal_name;
2727       bfd *n;
2728
2729       /* Don't add PRIVATE entries to import lib.  */
2730       if (pe_def_file->exports[i].flag_private)
2731         continue;
2732       def->exports[i].internal_name = def->exports[i].name;
2733       n = make_one (def->exports + i, outarch,
2734                     ! (def->exports + i)->flag_data);
2735       n->archive_next = head;
2736       head = n;
2737       def->exports[i].internal_name = internal;
2738     }
2739
2740   ar_tail = make_tail (outarch);
2741
2742   if (ar_head == NULL || ar_tail == NULL)
2743     return;
2744
2745   /* Now stick them all into the archive.  */
2746   ar_head->archive_next = head;
2747   ar_tail->archive_next = ar_head;
2748   head = ar_tail;
2749
2750   if (! bfd_set_archive_head (outarch, head))
2751     einfo ("%Xbfd_set_archive_head: %E\n");
2752
2753   if (! bfd_close (outarch))
2754     einfo ("%Xbfd_close %s: %E\n", impfilename);
2755
2756   while (head != NULL)
2757     {
2758       bfd *n = head->archive_next;
2759       bfd_close (head);
2760       head = n;
2761     }
2762 }
2763
2764 static struct bfd_link_hash_entry *found_sym;
2765
2766 static bfd_boolean
2767 pe_undef_alias_cdecl_match (struct bfd_link_hash_entry *h, void *inf)
2768 {
2769   int sl;
2770   char *string = inf;
2771   const char *hs = h->root.string;
2772
2773   sl = strlen (string);
2774   if (h->type == bfd_link_hash_undefined
2775       && ((*hs == '@' && *string == '_'
2776            && strncmp (hs + 1, string + 1, sl - 1) == 0)
2777           || strncmp (hs, string, sl) == 0)
2778       && h->root.string[sl] == '@')
2779     {
2780       found_sym = h;
2781       return FALSE;
2782     }
2783   return TRUE;
2784 }
2785
2786 static struct bfd_link_hash_entry *
2787 pe_find_cdecl_alias_match (char *name)
2788 {
2789   found_sym = 0;
2790   bfd_link_hash_traverse (link_info.hash, pe_undef_alias_cdecl_match,
2791                           (char *) name);
2792   return found_sym;
2793 }
2794
2795 static void
2796 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *linfo)
2797 {
2798   lang_input_statement_type *fake_file;
2799
2800   fake_file = lang_add_input_file (name,
2801                                    lang_input_file_is_fake_enum,
2802                                    NULL);
2803   fake_file->the_bfd = abfd;
2804   ldlang_add_file (fake_file);
2805
2806   if (!bfd_link_add_symbols (abfd, linfo))
2807     einfo ("%Xaddsym %s: %E\n", name);
2808 }
2809
2810 void
2811 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *linfo)
2812 {
2813   def_file_module *module;
2814
2815   pe_dll_id_target (bfd_get_target (output_bfd));
2816
2817   if (!pe_def_file)
2818     return;
2819
2820   for (module = pe_def_file->modules; module; module = module->next)
2821     {
2822       int i, do_this_dll;
2823
2824       dll_filename = module->name;
2825       dll_symname = xstrdup (module->name);
2826       for (i = 0; dll_symname[i]; i++)
2827         if (!ISALNUM (dll_symname[i]))
2828           dll_symname[i] = '_';
2829
2830       do_this_dll = 0;
2831
2832       for (i = 0; i < pe_def_file->num_imports; i++)
2833         if (pe_def_file->imports[i].module == module)
2834           {
2835             def_file_export exp;
2836             struct bfd_link_hash_entry *blhe;
2837             int lead_at = (*pe_def_file->imports[i].internal_name == '@');
2838             /* See if we need this import.  */
2839             size_t len = strlen (pe_def_file->imports[i].internal_name);
2840             char *name = xmalloc (len + 2 + 6);
2841             bfd_boolean include_jmp_stub = FALSE;
2842             bfd_boolean is_cdecl = FALSE;
2843             if (!lead_at && strchr (pe_def_file->imports[i].internal_name, '@') == NULL)
2844                 is_cdecl = TRUE;
2845
2846             if (lead_at)
2847               sprintf (name, "%s",
2848                        pe_def_file->imports[i].internal_name);
2849             else
2850               sprintf (name, "%s%s",U (""),
2851                        pe_def_file->imports[i].internal_name);
2852
2853             blhe = bfd_link_hash_lookup (linfo->hash, name,
2854                                          FALSE, FALSE, FALSE);
2855
2856             /* Include the jump stub for <sym> only if the <sym>
2857                is undefined.  */
2858             if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
2859               {
2860                 if (lead_at)
2861                   sprintf (name, "%s%s", "__imp_",
2862                            pe_def_file->imports[i].internal_name);
2863                 else
2864                   sprintf (name, "%s%s%s", "__imp_", U (""),
2865                            pe_def_file->imports[i].internal_name);
2866
2867                 blhe = bfd_link_hash_lookup (linfo->hash, name,
2868                                              FALSE, FALSE, FALSE);
2869               }
2870             else
2871               include_jmp_stub = TRUE;
2872
2873             if (is_cdecl && !blhe)
2874               {
2875                 sprintf (name, "%s%s",U (""),
2876                          pe_def_file->imports[i].internal_name);
2877                 blhe = pe_find_cdecl_alias_match (name);
2878                 include_jmp_stub = TRUE;
2879               }
2880
2881             free (name);
2882
2883             if (blhe && blhe->type == bfd_link_hash_undefined)
2884               {
2885                 bfd *one;
2886                 /* We do.  */
2887                 if (!do_this_dll)
2888                   {
2889                     bfd *ar_head = make_head (output_bfd);
2890                     add_bfd_to_link (ar_head, ar_head->filename, linfo);
2891                     do_this_dll = 1;
2892                   }
2893                 exp.internal_name = pe_def_file->imports[i].internal_name;
2894                 exp.name = pe_def_file->imports[i].name;
2895                 exp.its_name = pe_def_file->imports[i].its_name;
2896                 exp.ordinal = pe_def_file->imports[i].ordinal;
2897                 exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
2898                 exp.flag_private = 0;
2899                 exp.flag_constant = 0;
2900                 exp.flag_data = pe_def_file->imports[i].data;
2901                 exp.flag_noname = exp.name ? 0 : 1;
2902                 one = make_one (&exp, output_bfd, (! exp.flag_data) && include_jmp_stub);
2903                 add_bfd_to_link (one, one->filename, linfo);
2904               }
2905           }
2906       if (do_this_dll)
2907         {
2908           bfd *ar_tail = make_tail (output_bfd);
2909           add_bfd_to_link (ar_tail, ar_tail->filename, linfo);
2910         }
2911
2912       free (dll_symname);
2913     }
2914 }
2915
2916 /* We were handed a *.DLL file.  Parse it and turn it into a set of
2917    IMPORTS directives in the def file.  Return TRUE if the file was
2918    handled, FALSE if not.  */
2919
2920 static unsigned int
2921 pe_get16 (bfd *abfd, int where)
2922 {
2923   unsigned char b[2];
2924
2925   bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2926   bfd_bread (b, (bfd_size_type) 2, abfd);
2927   return b[0] + (b[1] << 8);
2928 }
2929
2930 static unsigned int
2931 pe_get32 (bfd *abfd, int where)
2932 {
2933   unsigned char b[4];
2934
2935   bfd_seek (abfd, (file_ptr) where, SEEK_SET);
2936   bfd_bread (b, (bfd_size_type) 4, abfd);
2937   return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2938 }
2939
2940 static unsigned int
2941 pe_as32 (void *ptr)
2942 {
2943   unsigned char *b = ptr;
2944
2945   return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
2946 }
2947
2948 bfd_boolean
2949 pe_implied_import_dll (const char *filename)
2950 {
2951   bfd *dll;
2952   bfd_vma pe_header_offset, opthdr_ofs, num_entries, i;
2953   bfd_vma export_rva, export_size, nsections, secptr, expptr;
2954   bfd_vma exp_funcbase;
2955   unsigned char *expdata;
2956   char *erva;
2957   bfd_vma name_rvas, ordinals, nexp, ordbase;
2958   const char *dllname;
2959   /* Initialization with start > end guarantees that is_data
2960      will not be set by mistake, and avoids compiler warning.  */
2961   bfd_vma data_start = 1;
2962   bfd_vma data_end = 0;
2963   bfd_vma rdata_start = 1;
2964   bfd_vma rdata_end = 0;
2965   bfd_vma bss_start = 1;
2966   bfd_vma bss_end = 0;
2967
2968   /* No, I can't use bfd here.  kernel32.dll puts its export table in
2969      the middle of the .rdata section.  */
2970   dll = bfd_openr (filename, pe_details->target_name);
2971   if (!dll)
2972     {
2973       einfo ("%Xopen %s: %E\n", filename);
2974       return FALSE;
2975     }
2976
2977   /* PEI dlls seem to be bfd_objects.  */
2978   if (!bfd_check_format (dll, bfd_object))
2979     {
2980       einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
2981       return FALSE;
2982     }
2983
2984   /* Get pe_header, optional header and numbers of directory entries.  */
2985   pe_header_offset = pe_get32 (dll, 0x3c);
2986   opthdr_ofs = pe_header_offset + 4 + 20;
2987 #ifdef pe_use_x86_64
2988   num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /*  & NumberOfRvaAndSizes.  */
2989 #else
2990   num_entries = pe_get32 (dll, opthdr_ofs + 92);
2991 #endif
2992
2993   /* No import or export directory entry.  */
2994   if (num_entries < 1)
2995     return FALSE;
2996
2997 #ifdef pe_use_x86_64
2998   export_rva  = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
2999   export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
3000 #else
3001   export_rva = pe_get32 (dll, opthdr_ofs + 96);
3002   export_size = pe_get32 (dll, opthdr_ofs + 100);
3003 #endif
3004
3005   /* No export table - nothing to export.  */
3006   if (export_size == 0)
3007     return FALSE;
3008
3009   nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
3010   secptr = (pe_header_offset + 4 + 20 +
3011             pe_get16 (dll, pe_header_offset + 4 + 16));
3012   expptr = 0;
3013
3014   /* Get the rva and size of the export section.  */
3015   for (i = 0; i < nsections; i++)
3016     {
3017       char sname[8];
3018       bfd_vma secptr1 = secptr + 40 * i;
3019       bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3020       bfd_vma vsize = pe_get32 (dll, secptr1 + 16);
3021       bfd_vma fptr = pe_get32 (dll, secptr1 + 20);
3022
3023       bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
3024       bfd_bread (sname, (bfd_size_type) 8, dll);
3025
3026       if (vaddr <= export_rva && vaddr + vsize > export_rva)
3027         {
3028           expptr = fptr + (export_rva - vaddr);
3029           if (export_rva + export_size > vaddr + vsize)
3030             export_size = vsize - (export_rva - vaddr);
3031           break;
3032         }
3033     }
3034
3035   /* Scan sections and store the base and size of the
3036      data and bss segments in data/base_start/end.  */
3037   for (i = 0; i < nsections; i++)
3038     {
3039       bfd_vma secptr1 = secptr + 40 * i;
3040       bfd_vma vsize = pe_get32 (dll, secptr1 + 8);
3041       bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3042       bfd_vma flags = pe_get32 (dll, secptr1 + 36);
3043       char sec_name[9];
3044
3045       sec_name[8] = '\0';
3046       bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
3047       bfd_bread (sec_name, (bfd_size_type) 8, dll);
3048
3049       if (strcmp(sec_name,".data") == 0)
3050         {
3051           data_start = vaddr;
3052           data_end = vaddr + vsize;
3053
3054           if (pe_dll_extra_pe_debug)
3055             printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3056                     __FUNCTION__, sec_name, (unsigned long) vaddr,
3057                     (unsigned long) (vaddr + vsize), (unsigned long) flags);
3058         }
3059       else if (strcmp(sec_name,".rdata") == 0)
3060         {
3061           rdata_start = vaddr;
3062           rdata_end = vaddr + vsize;
3063
3064           if (pe_dll_extra_pe_debug)
3065             printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3066                     __FUNCTION__, sec_name, (unsigned long) vaddr,
3067                     (unsigned long) (vaddr + vsize), (unsigned long) flags);
3068         }
3069       else if (strcmp (sec_name,".bss") == 0)
3070         {
3071           bss_start = vaddr;
3072           bss_end = vaddr + vsize;
3073
3074           if (pe_dll_extra_pe_debug)
3075             printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3076                     __FUNCTION__, sec_name, (unsigned long) vaddr,
3077                     (unsigned long) (vaddr + vsize), (unsigned long) flags);
3078         }
3079     }
3080
3081   expdata = xmalloc (export_size);
3082   bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
3083   bfd_bread (expdata, (bfd_size_type) export_size, dll);
3084   erva = (char *) expdata - export_rva;
3085
3086   if (pe_def_file == 0)
3087     pe_def_file = def_file_empty ();
3088
3089   nexp = pe_as32 (expdata + 24);
3090   name_rvas = pe_as32 (expdata + 32);
3091   ordinals = pe_as32 (expdata + 36);
3092   ordbase = pe_as32 (expdata + 16);
3093   exp_funcbase = pe_as32 (expdata + 28);
3094
3095   /* Use internal dll name instead of filename
3096      to enable symbolic dll linking.  */
3097   dllname = erva + pe_as32 (expdata + 12);
3098
3099   /* Check to see if the dll has already been added to
3100      the definition list and if so return without error.
3101      This avoids multiple symbol definitions.  */
3102   if (def_get_module (pe_def_file, dllname))
3103     {
3104       if (pe_dll_extra_pe_debug)
3105         printf ("%s is already loaded\n", dllname);
3106       return TRUE;
3107     }
3108
3109   /* Iterate through the list of symbols.  */
3110   for (i = 0; i < nexp; i++)
3111     {
3112       /* Pointer to the names vector.  */
3113       bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
3114       def_file_import *imp;
3115       /* Pointer to the function address vector.  */
3116       bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
3117       int is_data = 0;
3118
3119       /* Skip unwanted symbols, which are
3120          exported in buggy auto-import releases.  */
3121       if (! CONST_STRNEQ (erva + name_rva, "_nm_"))
3122         {
3123           /* is_data is true if the address is in the data, rdata or bss
3124              segment.  */
3125           is_data =
3126             (func_rva >= data_start && func_rva < data_end)
3127             || (func_rva >= rdata_start && func_rva < rdata_end)
3128             || (func_rva >= bss_start && func_rva < bss_end);
3129
3130           imp = def_file_add_import (pe_def_file, erva + name_rva,
3131                                      dllname, i, 0, NULL);
3132           /* Mark symbol type.  */
3133           imp->data = is_data;
3134
3135           if (pe_dll_extra_pe_debug)
3136             printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3137                     __FUNCTION__, dllname, erva + name_rva,
3138                     (unsigned long) func_rva, is_data ? "(data)" : "");
3139         }
3140     }
3141
3142   return TRUE;
3143 }
3144
3145 void
3146 pe_output_file_set_long_section_names (bfd *abfd)
3147 {
3148   if (pe_use_coff_long_section_names < 0)
3149     return;
3150   if (!bfd_coff_set_long_section_names (abfd, pe_use_coff_long_section_names))
3151     einfo (_("%XError: can't use long section names on this arch\n"));
3152 }
3153
3154 /* These are the main functions, called from the emulation.  The first
3155    is called after the bfds are read, so we can guess at how much space
3156    we need.  The second is called after everything is placed, so we
3157    can put the right values in place.  */
3158
3159 void
3160 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
3161 {
3162   pe_dll_id_target (bfd_get_target (abfd));
3163   pe_output_file_set_long_section_names (abfd);
3164   process_def_file_and_drectve (abfd, info);
3165
3166   if (pe_def_file->num_exports == 0 && !info->shared)
3167     return;
3168
3169   generate_edata (abfd, info);
3170   build_filler_bfd (1);
3171   pe_output_file_set_long_section_names (filler_bfd);
3172 }
3173
3174 void
3175 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
3176 {
3177   pe_dll_id_target (bfd_get_target (abfd));
3178   pe_output_file_set_long_section_names (abfd);
3179   build_filler_bfd (0);
3180   pe_output_file_set_long_section_names (filler_bfd);
3181 }
3182
3183 void
3184 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
3185 {
3186   pe_dll_id_target (bfd_get_target (abfd));
3187   pe_output_file_set_long_section_names (abfd);
3188   image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3189
3190   generate_reloc (abfd, info);
3191   if (reloc_sz > 0)
3192     {
3193       bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3194
3195       /* Resize the sections.  */
3196       lang_reset_memory_regions ();
3197       lang_size_sections (NULL, TRUE);
3198
3199       /* Redo special stuff.  */
3200       ldemul_after_allocation ();
3201
3202       /* Do the assignments again.  */
3203       lang_do_assignments ();
3204     }
3205
3206   fill_edata (abfd, info);
3207
3208   if (info->shared && !info->pie)
3209     pe_data (abfd)->dll = 1;
3210
3211   edata_s->contents = edata_d;
3212   reloc_s->contents = reloc_d;
3213 }
3214
3215 void
3216 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
3217 {
3218   pe_dll_id_target (bfd_get_target (abfd));
3219   pe_output_file_set_long_section_names (abfd);
3220   image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3221
3222   generate_reloc (abfd, info);
3223   if (reloc_sz > 0)
3224     {
3225       bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3226
3227       /* Resize the sections.  */
3228       lang_reset_memory_regions ();
3229       lang_size_sections (NULL, TRUE);
3230
3231       /* Redo special stuff.  */
3232       ldemul_after_allocation ();
3233
3234       /* Do the assignments again.  */
3235       lang_do_assignments ();
3236     }
3237   reloc_s->contents = reloc_d;
3238 }
3239
3240 bfd_boolean
3241 pe_bfd_is_dll (bfd *abfd)
3242 {
3243   return (bfd_get_format (abfd) == bfd_object
3244           && obj_pe (abfd)
3245           && pe_data (abfd)->dll);
3246 }