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