xref: /netbsd-src/external/gpl3/binutils/dist/ld/pe-dll.c (revision 6a493d6bc668897c91594964a732d38505b70cbb)
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   if (verbose)
2717     /* xgettext:c-format */
2718     info_msg (_("Creating library file: %s\n"), impfilename);
2719 
2720   bfd_set_format (outarch, bfd_archive);
2721   outarch->has_armap = 1;
2722 
2723   /* Work out a reasonable size of things to put onto one line.  */
2724   ar_head = make_head (outarch);
2725 
2726   /* Iterate the input BFDs, looking for exclude-modules-for-implib.  */
2727   for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link_next)
2728     {
2729       /* Iterate the exclude list.  */
2730       struct exclude_list_struct *ex;
2731       char found;
2732       for (ex = excludes, found = 0; ex && !found; ex = ex->next)
2733 	{
2734 	  if (ex->type != EXCLUDEFORIMPLIB)
2735 	    continue;
2736 	  found = (filename_cmp (ex->string, ibfd->filename) == 0);
2737 	}
2738       /* If it matched, we must open a fresh BFD for it (the original
2739         input BFD is still needed for the DLL's final link) and add
2740 	it into the archive member chain.  */
2741       if (found)
2742 	{
2743 	  bfd *newbfd = bfd_openr (ibfd->my_archive
2744 		? ibfd->my_archive->filename : ibfd->filename, NULL);
2745 	  if (!newbfd)
2746 	    {
2747 	      einfo (_("%Xbfd_openr %s: %E\n"), ibfd->filename);
2748 	      return;
2749 	    }
2750 	  if (ibfd->my_archive)
2751 	    {
2752 	      /* Must now iterate through archive until we find the
2753 		required member.  A minor shame that we'll open the
2754 		archive once per member that we require from it, and
2755 		leak those archive bfds rather than reuse them.  */
2756 	      bfd *arbfd = newbfd;
2757 	      if (!bfd_check_format_matches (arbfd, bfd_archive, NULL))
2758 		{
2759 		  einfo (_("%X%s(%s): can't find member in non-archive file"),
2760 		    ibfd->my_archive->filename, ibfd->filename);
2761 		  return;
2762 		}
2763 	      newbfd = NULL;
2764 	      while ((newbfd = bfd_openr_next_archived_file (arbfd, newbfd)) != 0)
2765 		{
2766 		  if (filename_cmp (newbfd->filename, ibfd->filename) == 0)
2767 		    break;
2768 		}
2769 	      if (!newbfd)
2770 		{
2771 		  einfo (_("%X%s(%s): can't find member in archive"),
2772 		    ibfd->my_archive->filename, ibfd->filename);
2773 		  return;
2774 		}
2775 	    }
2776 	  newbfd->archive_next = head;
2777 	  head = newbfd;
2778 	}
2779     }
2780 
2781   for (i = 0; i < def->num_exports; i++)
2782     {
2783       /* The import library doesn't know about the internal name.  */
2784       char *internal = def->exports[i].internal_name;
2785       bfd *n;
2786 
2787       /* Don't add PRIVATE entries to import lib.  */
2788       if (pe_def_file->exports[i].flag_private)
2789 	continue;
2790       def->exports[i].internal_name = def->exports[i].name;
2791       n = make_one (def->exports + i, outarch,
2792 		    ! (def->exports + i)->flag_data);
2793       n->archive_next = head;
2794       head = n;
2795       def->exports[i].internal_name = internal;
2796     }
2797 
2798   ar_tail = make_tail (outarch);
2799 
2800   if (ar_head == NULL || ar_tail == NULL)
2801     return;
2802 
2803   /* Now stick them all into the archive.  */
2804   ar_head->archive_next = head;
2805   ar_tail->archive_next = ar_head;
2806   head = ar_tail;
2807 
2808   if (! bfd_set_archive_head (outarch, head))
2809     einfo ("%Xbfd_set_archive_head: %E\n");
2810 
2811   if (! bfd_close (outarch))
2812     einfo ("%Xbfd_close %s: %E\n", impfilename);
2813 
2814   while (head != NULL)
2815     {
2816       bfd *n = head->archive_next;
2817       bfd_close (head);
2818       head = n;
2819     }
2820 }
2821 
2822 static int undef_count = 0;
2823 
2824 struct key_value
2825 {
2826   char *key;
2827   const char *oname;
2828 };
2829 
2830 static struct key_value *udef_table;
2831 
2832 static int undef_sort_cmp (const void *l1, const void *r1)
2833 {
2834   const struct key_value *l = l1;
2835   const struct key_value *r = r1;
2836 
2837   return strcmp (l->key, r->key);
2838 }
2839 
2840 static struct bfd_link_hash_entry *
2841 pe_find_cdecl_alias_match (struct bfd_link_info *linfo, char *name)
2842 {
2843   struct bfd_link_hash_entry *h = NULL;
2844   struct key_value *kv;
2845   struct key_value key;
2846   char *at, *lname = (char *) alloca (strlen (name) + 3);
2847 
2848   strcpy (lname, name);
2849 
2850   at = strchr (lname + (lname[0] == '@'), '@');
2851   if (at)
2852     at[1] = 0;
2853 
2854   key.key = lname;
2855   kv = bsearch (&key, udef_table, undef_count, sizeof (struct key_value),
2856 		undef_sort_cmp);
2857 
2858   if (kv)
2859     {
2860       h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
2861       if (h->type == bfd_link_hash_undefined)
2862         return h;
2863     }
2864   if (lname[0] == '?')
2865     return NULL;
2866   if (at || lname[0] == '@')
2867     {
2868       if (lname[0] == '@')
2869         {
2870 	  if (pe_details->underscored)
2871 	    lname[0] = '_';
2872 	  else
2873 	    strcpy (lname, lname + 1);
2874 	  key.key = lname;
2875 	  kv = bsearch (&key, udef_table, undef_count,
2876 			sizeof (struct key_value), undef_sort_cmp);
2877 	  if (kv)
2878 	    {
2879 	      h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
2880 	      if (h->type == bfd_link_hash_undefined)
2881 		return h;
2882 	    }
2883 	}
2884       if (at)
2885         *strchr (lname, '@') = 0;
2886       key.key = lname;
2887       kv = bsearch (&key, udef_table, undef_count,
2888 		    sizeof (struct key_value), undef_sort_cmp);
2889       if (kv)
2890 	{
2891 	  h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
2892 	  if (h->type == bfd_link_hash_undefined)
2893 	    return h;
2894 	}
2895       return NULL;
2896     }
2897 
2898   strcat (lname, "@");
2899   key.key = lname;
2900   kv = bsearch (&key, udef_table, undef_count,
2901 		sizeof (struct key_value), undef_sort_cmp);
2902 
2903   if (kv)
2904     {
2905       h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
2906       if (h->type == bfd_link_hash_undefined)
2907 	return h;
2908     }
2909 
2910   if (lname[0] == '_' && pe_details->underscored)
2911     lname[0] = '@';
2912   else
2913     {
2914       memmove (lname + 1, lname, strlen (lname) + 1);
2915       lname[0] = '@';
2916     }
2917   key.key = lname;
2918 
2919   kv = bsearch (&key, udef_table, undef_count,
2920 		sizeof (struct key_value), undef_sort_cmp);
2921 
2922   if (kv)
2923     {
2924       h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
2925       if (h->type == bfd_link_hash_undefined)
2926         return h;
2927     }
2928 
2929   return NULL;
2930 }
2931 
2932 static bfd_boolean
2933 pe_undef_count (struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED,
2934                 void *inf ATTRIBUTE_UNUSED)
2935 {
2936   if (h->type == bfd_link_hash_undefined)
2937     undef_count++;
2938   return TRUE;
2939 }
2940 
2941 static bfd_boolean
2942 pe_undef_fill (struct bfd_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
2943 {
2944   if (h->type == bfd_link_hash_undefined)
2945     {
2946       char *at;
2947 
2948       udef_table[undef_count].key = xstrdup (h->root.string);
2949       at = strchr (udef_table[undef_count].key
2950 		   + (udef_table[undef_count].key[0] == '@'), '@');
2951       if (at)
2952         at[1] = 0;
2953       udef_table[undef_count].oname = h->root.string;
2954       undef_count++;
2955     }
2956   return TRUE;
2957 }
2958 
2959 static void
2960 pe_create_undef_table (void)
2961 {
2962   undef_count = 0;
2963 
2964   /* count undefined symbols */
2965 
2966   bfd_link_hash_traverse (link_info.hash, pe_undef_count, "");
2967 
2968   /* create and fill the corresponding table */
2969   udef_table = xmalloc (undef_count * sizeof (struct key_value));
2970 
2971   undef_count = 0;
2972   bfd_link_hash_traverse (link_info.hash, pe_undef_fill, "");
2973 
2974   /* sort items */
2975   qsort (udef_table, undef_count, sizeof (struct key_value), undef_sort_cmp);
2976 }
2977 
2978 static void
2979 add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *linfo)
2980 {
2981   lang_input_statement_type *fake_file;
2982 
2983   fake_file = lang_add_input_file (name,
2984 				   lang_input_file_is_fake_enum,
2985 				   NULL);
2986   fake_file->the_bfd = abfd;
2987   ldlang_add_file (fake_file);
2988 
2989   if (!bfd_link_add_symbols (abfd, linfo))
2990     einfo ("%Xaddsym %s: %E\n", name);
2991 }
2992 
2993 void
2994 pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *linfo)
2995 {
2996   int i, j;
2997   def_file_module *module;
2998   def_file_import *imp;
2999 
3000   pe_dll_id_target (bfd_get_target (output_bfd));
3001 
3002   if (!pe_def_file)
3003     return;
3004 
3005   imp = pe_def_file->imports;
3006 
3007   pe_create_undef_table ();
3008 
3009   for (module = pe_def_file->modules; module; module = module->next)
3010     {
3011       int do_this_dll = 0;
3012 
3013       for (i = 0; i < pe_def_file->num_imports && imp[i].module != module; i++)
3014 	;
3015       if (i >= pe_def_file->num_imports)
3016         continue;
3017 
3018       dll_filename = module->name;
3019       dll_symname = xstrdup (module->name);
3020       for (j = 0; dll_symname[j]; j++)
3021 	if (!ISALNUM (dll_symname[j]))
3022 	  dll_symname[j] = '_';
3023 
3024       for (; i < pe_def_file->num_imports && imp[i].module == module; i++)
3025 	{
3026 	  def_file_export exp;
3027 	  struct bfd_link_hash_entry *blhe;
3028 	  int lead_at = (*imp[i].internal_name == '@');
3029 	  /* See if we need this import.  */
3030 	  size_t len = strlen (imp[i].internal_name);
3031 	  char *name = xmalloc (len + 2 + 6);
3032 	  bfd_boolean include_jmp_stub = FALSE;
3033 	  bfd_boolean is_cdecl = FALSE;
3034 	  bfd_boolean is_undef = FALSE;
3035 
3036 	  if (!lead_at && strchr (imp[i].internal_name, '@') == NULL)
3037 	      is_cdecl = TRUE;
3038 
3039 	  if (lead_at)
3040 	    sprintf (name, "%s", imp[i].internal_name);
3041 	  else
3042 	    sprintf (name, "%s%s",U (""), imp[i].internal_name);
3043 
3044 	  blhe = bfd_link_hash_lookup (linfo->hash, name,
3045 				       FALSE, FALSE, FALSE);
3046 
3047 	  /* Include the jump stub for <sym> only if the <sym>
3048 	     is undefined.  */
3049 	  if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
3050 	    {
3051 	      if (lead_at)
3052 		sprintf (name, "%s%s", "__imp_", imp[i].internal_name);
3053 	      else
3054 		sprintf (name, "%s%s%s", "__imp_", U (""),
3055 			 imp[i].internal_name);
3056 
3057 	      blhe = bfd_link_hash_lookup (linfo->hash, name,
3058 					   FALSE, FALSE, FALSE);
3059 	      if (blhe)
3060 	        is_undef = (blhe->type == bfd_link_hash_undefined);
3061 	    }
3062 	  else
3063 	    {
3064 	      include_jmp_stub = TRUE;
3065 	      is_undef = (blhe->type == bfd_link_hash_undefined);
3066 	    }
3067 
3068 	  if (is_cdecl && (!blhe || (blhe && blhe->type != bfd_link_hash_undefined)))
3069 	    {
3070 	      sprintf (name, "%s%s",U (""), imp[i].internal_name);
3071 	      blhe = pe_find_cdecl_alias_match (linfo, name);
3072 	      include_jmp_stub = TRUE;
3073 	      if (blhe)
3074 	        is_undef = (blhe->type == bfd_link_hash_undefined);
3075 	    }
3076 
3077 	  free (name);
3078 
3079 	  if (is_undef)
3080 	    {
3081 	      bfd *one;
3082 	      /* We do.  */
3083 	      if (!do_this_dll)
3084 		{
3085 		  bfd *ar_head = make_head (output_bfd);
3086 		  add_bfd_to_link (ar_head, ar_head->filename, linfo);
3087 		  do_this_dll = 1;
3088 		}
3089 	      exp.internal_name = imp[i].internal_name;
3090 	      exp.name = imp[i].name;
3091 	      exp.its_name = imp[i].its_name;
3092 	      exp.ordinal = imp[i].ordinal;
3093 	      exp.hint = exp.ordinal >= 0 ? exp.ordinal : 0;
3094 	      exp.flag_private = 0;
3095 	      exp.flag_constant = 0;
3096 	      exp.flag_data = imp[i].data;
3097 	      exp.flag_noname = exp.name ? 0 : 1;
3098 	      one = make_one (&exp, output_bfd, (! exp.flag_data) && include_jmp_stub);
3099 	      add_bfd_to_link (one, one->filename, linfo);
3100 	    }
3101 	}
3102       if (do_this_dll)
3103 	{
3104 	  bfd *ar_tail = make_tail (output_bfd);
3105 	  add_bfd_to_link (ar_tail, ar_tail->filename, linfo);
3106 	}
3107 
3108       free (dll_symname);
3109     }
3110 
3111   while (undef_count)
3112     {
3113       --undef_count;
3114       free (udef_table[undef_count].key);
3115     }
3116   free (udef_table);
3117 }
3118 
3119 /* We were handed a *.DLL file.  Parse it and turn it into a set of
3120    IMPORTS directives in the def file.  Return TRUE if the file was
3121    handled, FALSE if not.  */
3122 
3123 static unsigned int
3124 pe_get16 (bfd *abfd, int where)
3125 {
3126   unsigned char b[2];
3127 
3128   bfd_seek (abfd, (file_ptr) where, SEEK_SET);
3129   bfd_bread (b, (bfd_size_type) 2, abfd);
3130   return b[0] + (b[1] << 8);
3131 }
3132 
3133 static unsigned int
3134 pe_get32 (bfd *abfd, int where)
3135 {
3136   unsigned char b[4];
3137 
3138   bfd_seek (abfd, (file_ptr) where, SEEK_SET);
3139   bfd_bread (b, (bfd_size_type) 4, abfd);
3140   return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
3141 }
3142 
3143 static unsigned int
3144 pe_as32 (void *ptr)
3145 {
3146   unsigned char *b = ptr;
3147 
3148   return b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
3149 }
3150 
3151 bfd_boolean
3152 pe_implied_import_dll (const char *filename)
3153 {
3154   bfd *dll;
3155   bfd_vma pe_header_offset, opthdr_ofs, num_entries, i;
3156   bfd_vma export_rva, export_size, nsections, secptr, expptr;
3157   bfd_vma exp_funcbase;
3158   unsigned char *expdata;
3159   char *erva;
3160   bfd_vma name_rvas, nexp;
3161   const char *dllname;
3162   /* Initialization with start > end guarantees that is_data
3163      will not be set by mistake, and avoids compiler warning.  */
3164   bfd_vma data_start = 1;
3165   bfd_vma data_end = 0;
3166   bfd_vma rdata_start = 1;
3167   bfd_vma rdata_end = 0;
3168   bfd_vma bss_start = 1;
3169   bfd_vma bss_end = 0;
3170 
3171   /* No, I can't use bfd here.  kernel32.dll puts its export table in
3172      the middle of the .rdata section.  */
3173   dll = bfd_openr (filename, pe_details->target_name);
3174   if (!dll)
3175     {
3176       einfo ("%Xopen %s: %E\n", filename);
3177       return FALSE;
3178     }
3179 
3180   /* PEI dlls seem to be bfd_objects.  */
3181   if (!bfd_check_format (dll, bfd_object))
3182     {
3183       einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
3184       return FALSE;
3185     }
3186 
3187   /* Get pe_header, optional header and numbers of directory entries.  */
3188   pe_header_offset = pe_get32 (dll, 0x3c);
3189   opthdr_ofs = pe_header_offset + 4 + 20;
3190 #ifdef pe_use_x86_64
3191   num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /*  & NumberOfRvaAndSizes.  */
3192 #else
3193   num_entries = pe_get32 (dll, opthdr_ofs + 92);
3194 #endif
3195 
3196   /* No import or export directory entry.  */
3197   if (num_entries < 1)
3198     return FALSE;
3199 
3200 #ifdef pe_use_x86_64
3201   export_rva  = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
3202   export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
3203 #else
3204   export_rva = pe_get32 (dll, opthdr_ofs + 96);
3205   export_size = pe_get32 (dll, opthdr_ofs + 100);
3206 #endif
3207 
3208   /* No export table - nothing to export.  */
3209   if (export_size == 0)
3210     return FALSE;
3211 
3212   nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
3213   secptr = (pe_header_offset + 4 + 20 +
3214 	    pe_get16 (dll, pe_header_offset + 4 + 16));
3215   expptr = 0;
3216 
3217   /* Get the rva and size of the export section.  */
3218   for (i = 0; i < nsections; i++)
3219     {
3220       char sname[8];
3221       bfd_vma secptr1 = secptr + 40 * i;
3222       bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3223       bfd_vma vsize = pe_get32 (dll, secptr1 + 16);
3224       bfd_vma fptr = pe_get32 (dll, secptr1 + 20);
3225 
3226       bfd_seek (dll, (file_ptr) secptr1, SEEK_SET);
3227       bfd_bread (sname, (bfd_size_type) 8, dll);
3228 
3229       if (vaddr <= export_rva && vaddr + vsize > export_rva)
3230 	{
3231 	  expptr = fptr + (export_rva - vaddr);
3232 	  if (export_rva + export_size > vaddr + vsize)
3233 	    export_size = vsize - (export_rva - vaddr);
3234 	  break;
3235 	}
3236     }
3237 
3238   /* Scan sections and store the base and size of the
3239      data and bss segments in data/base_start/end.  */
3240   for (i = 0; i < nsections; i++)
3241     {
3242       bfd_vma secptr1 = secptr + 40 * i;
3243       bfd_vma vsize = pe_get32 (dll, secptr1 + 8);
3244       bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
3245       bfd_vma flags = pe_get32 (dll, secptr1 + 36);
3246       char sec_name[9];
3247 
3248       sec_name[8] = '\0';
3249       bfd_seek (dll, (file_ptr) secptr1 + 0, SEEK_SET);
3250       bfd_bread (sec_name, (bfd_size_type) 8, dll);
3251 
3252       if (strcmp(sec_name,".data") == 0)
3253 	{
3254 	  data_start = vaddr;
3255 	  data_end = vaddr + vsize;
3256 
3257 	  if (pe_dll_extra_pe_debug)
3258 	    printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3259 		    __FUNCTION__, sec_name, (unsigned long) vaddr,
3260 		    (unsigned long) (vaddr + vsize), (unsigned long) flags);
3261 	}
3262       else if (strcmp(sec_name,".rdata") == 0)
3263 	{
3264 	  rdata_start = vaddr;
3265 	  rdata_end = vaddr + vsize;
3266 
3267 	  if (pe_dll_extra_pe_debug)
3268 	    printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3269 		    __FUNCTION__, sec_name, (unsigned long) vaddr,
3270 		    (unsigned long) (vaddr + vsize), (unsigned long) flags);
3271 	}
3272       else if (strcmp (sec_name,".bss") == 0)
3273 	{
3274 	  bss_start = vaddr;
3275 	  bss_end = vaddr + vsize;
3276 
3277 	  if (pe_dll_extra_pe_debug)
3278 	    printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n",
3279 		    __FUNCTION__, sec_name, (unsigned long) vaddr,
3280 		    (unsigned long) (vaddr + vsize), (unsigned long) flags);
3281 	}
3282     }
3283 
3284   expdata = xmalloc (export_size);
3285   bfd_seek (dll, (file_ptr) expptr, SEEK_SET);
3286   bfd_bread (expdata, (bfd_size_type) export_size, dll);
3287   erva = (char *) expdata - export_rva;
3288 
3289   if (pe_def_file == 0)
3290     pe_def_file = def_file_empty ();
3291 
3292   nexp = pe_as32 (expdata + 24);
3293   name_rvas = pe_as32 (expdata + 32);
3294   exp_funcbase = pe_as32 (expdata + 28);
3295 
3296   /* Use internal dll name instead of filename
3297      to enable symbolic dll linking.  */
3298   dllname = erva + pe_as32 (expdata + 12);
3299 
3300   /* Check to see if the dll has already been added to
3301      the definition list and if so return without error.
3302      This avoids multiple symbol definitions.  */
3303   if (def_get_module (pe_def_file, dllname))
3304     {
3305       if (pe_dll_extra_pe_debug)
3306 	printf ("%s is already loaded\n", dllname);
3307       return TRUE;
3308     }
3309 
3310   /* Iterate through the list of symbols.  */
3311   for (i = 0; i < nexp; i++)
3312     {
3313       /* Pointer to the names vector.  */
3314       bfd_vma name_rva = pe_as32 (erva + name_rvas + i * 4);
3315       def_file_import *imp;
3316       /* Pointer to the function address vector.  */
3317       bfd_vma func_rva = pe_as32 (erva + exp_funcbase + i * 4);
3318       int is_data = 0;
3319 
3320       /* Skip unwanted symbols, which are
3321 	 exported in buggy auto-import releases.  */
3322       if (! CONST_STRNEQ (erva + name_rva, "__nm_"))
3323  	{
3324 	  int is_dup = 0;
3325  	  /* is_data is true if the address is in the data, rdata or bss
3326 	     segment.  */
3327  	  is_data =
3328 	    (func_rva >= data_start && func_rva < data_end)
3329 	    || (func_rva >= rdata_start && func_rva < rdata_end)
3330 	    || (func_rva >= bss_start && func_rva < bss_end);
3331 
3332 	  imp = def_file_add_import (pe_def_file, erva + name_rva,
3333 				     dllname, i, NULL, NULL, &is_dup);
3334  	  /* Mark symbol type.  */
3335  	  if (!is_dup)
3336  	    imp->data = is_data;
3337 
3338  	  if (pe_dll_extra_pe_debug)
3339 	    printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
3340 		    __FUNCTION__, dllname, erva + name_rva,
3341 		    (unsigned long) func_rva, is_data ? "(data)" : "");
3342  	}
3343     }
3344 
3345   return TRUE;
3346 }
3347 
3348 void
3349 pe_output_file_set_long_section_names (bfd *abfd)
3350 {
3351   if (pe_use_coff_long_section_names < 0)
3352     return;
3353   if (!bfd_coff_set_long_section_names (abfd, pe_use_coff_long_section_names))
3354     einfo (_("%XError: can't use long section names on this arch\n"));
3355 }
3356 
3357 /* These are the main functions, called from the emulation.  The first
3358    is called after the bfds are read, so we can guess at how much space
3359    we need.  The second is called after everything is placed, so we
3360    can put the right values in place.  */
3361 
3362 void
3363 pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info)
3364 {
3365   pe_dll_id_target (bfd_get_target (abfd));
3366   pe_output_file_set_long_section_names (abfd);
3367   process_def_file_and_drectve (abfd, info);
3368 
3369   if (pe_def_file->num_exports == 0 && !info->shared)
3370     return;
3371 
3372   generate_edata (abfd, info);
3373   build_filler_bfd (1);
3374   pe_output_file_set_long_section_names (filler_bfd);
3375 }
3376 
3377 void
3378 pe_exe_build_sections (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
3379 {
3380   pe_dll_id_target (bfd_get_target (abfd));
3381   pe_output_file_set_long_section_names (abfd);
3382   build_filler_bfd (0);
3383   pe_output_file_set_long_section_names (filler_bfd);
3384 }
3385 
3386 void
3387 pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
3388 {
3389   pe_dll_id_target (bfd_get_target (abfd));
3390   pe_output_file_set_long_section_names (abfd);
3391   image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3392 
3393   generate_reloc (abfd, info);
3394   if (reloc_sz > 0)
3395     {
3396       bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3397 
3398       /* Resize the sections.  */
3399       lang_reset_memory_regions ();
3400       lang_size_sections (NULL, TRUE);
3401 
3402       /* Redo special stuff.  */
3403       ldemul_after_allocation ();
3404 
3405       /* Do the assignments again.  */
3406       lang_do_assignments (lang_final_phase_enum);
3407     }
3408 
3409   fill_edata (abfd, info);
3410 
3411   if (info->shared && !info->pie)
3412     pe_data (abfd)->dll = 1;
3413 
3414   edata_s->contents = edata_d;
3415   reloc_s->contents = reloc_d;
3416 }
3417 
3418 void
3419 pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
3420 {
3421   pe_dll_id_target (bfd_get_target (abfd));
3422   pe_output_file_set_long_section_names (abfd);
3423   image_base = pe_data (abfd)->pe_opthdr.ImageBase;
3424 
3425   generate_reloc (abfd, info);
3426   if (reloc_sz > 0)
3427     {
3428       bfd_set_section_size (filler_bfd, reloc_s, reloc_sz);
3429 
3430       /* Resize the sections.  */
3431       lang_reset_memory_regions ();
3432       lang_size_sections (NULL, TRUE);
3433 
3434       /* Redo special stuff.  */
3435       ldemul_after_allocation ();
3436 
3437       /* Do the assignments again.  */
3438       lang_do_assignments (lang_final_phase_enum);
3439     }
3440   reloc_s->contents = reloc_d;
3441 }
3442 
3443 bfd_boolean
3444 pe_bfd_is_dll (bfd *abfd)
3445 {
3446   return (bfd_get_format (abfd) == bfd_object
3447           && obj_pe (abfd)
3448           && pe_data (abfd)->dll);
3449 }
3450