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