OSDN Git Service

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