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