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