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