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