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