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