• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# This shell script emits a C file. -*- C -*-
2# It does some substitutions.
3if [ -z "$MACHINE" ]; then
4  OUTPUT_ARCH=${ARCH}
5else
6  OUTPUT_ARCH=${ARCH}:${MACHINE}
7fi
8
9case ${target} in
10  *-*-cygwin*)
11    move_default_addr_high=1
12    ;;
13  *)
14    move_default_addr_high=0;
15    ;;
16esac
17
18rm -f e${EMULATION_NAME}.c
19(echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
20fragment <<EOF
21/* Copyright (C) 2006-2014 Free Software Foundation, Inc.
22   Written by Kai Tietz, OneVision Software GmbH&CoKg.
23
24   This file is part of the GNU Binutils.
25
26   This program is free software; you can redistribute it and/or modify
27   it under the terms of the GNU General Public License as published by
28   the Free Software Foundation; either version 3 of the License, or
29   (at your option) any later version.
30
31   This program is distributed in the hope that it will be useful,
32   but WITHOUT ANY WARRANTY; without even the implied warranty of
33   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
34   GNU General Public License for more details.
35
36   You should have received a copy of the GNU General Public License
37   along with this program; if not, write to the Free Software
38   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
39   MA 02110-1301, USA.  */
40
41
42/* For WINDOWS_XP64 and higher */
43/* Based on pe.em, but modified for 64 bit support.  */
44
45#define TARGET_IS_${EMULATION_NAME}
46
47#define COFF_IMAGE_WITH_PE
48#define COFF_WITH_PE
49#define COFF_WITH_pex64
50
51#include "sysdep.h"
52#include "bfd.h"
53#include "bfdlink.h"
54#include "getopt.h"
55#include "libiberty.h"
56#include "filenames.h"
57#include "ld.h"
58#include "ldmain.h"
59#include "ldexp.h"
60#include "ldlang.h"
61#include "ldfile.h"
62#include "ldemul.h"
63#include <ldgram.h>
64#include "ldlex.h"
65#include "ldmisc.h"
66#include "ldctor.h"
67#include "ldbuildid.h"
68#include "coff/internal.h"
69
70/* FIXME: See bfd/peXXigen.c for why we include an architecture specific
71   header in generic PE code.  */
72#include "coff/x86_64.h"
73#include "coff/pe.h"
74
75/* FIXME: These are BFD internal header files, and we should not be
76   using it here.  */
77#include "../bfd/libcoff.h"
78#include "../bfd/libpei.h"
79
80#undef  AOUTSZ
81#define AOUTSZ		PEPAOUTSZ
82#define PEAOUTHDR	PEPAOUTHDR
83
84#include "deffile.h"
85#include "pep-dll.h"
86#include "safe-ctype.h"
87
88/* Permit the emulation parameters to override the default section
89   alignment by setting OVERRIDE_SECTION_ALIGNMENT.  FIXME: This makes
90   it seem that include/coff/internal.h should not define
91   PE_DEF_SECTION_ALIGNMENT.  */
92#if PE_DEF_SECTION_ALIGNMENT != ${OVERRIDE_SECTION_ALIGNMENT:-PE_DEF_SECTION_ALIGNMENT}
93#undef  PE_DEF_SECTION_ALIGNMENT
94#define PE_DEF_SECTION_ALIGNMENT ${OVERRIDE_SECTION_ALIGNMENT}
95#endif
96
97#ifdef TARGET_IS_i386pep
98#define DLL_SUPPORT
99#endif
100
101#if defined(TARGET_IS_i386pep) || ! defined(DLL_SUPPORT)
102#define	PE_DEF_SUBSYSTEM		3
103#undef NT_EXE_IMAGE_BASE
104#define NT_EXE_IMAGE_BASE \
105  ((bfd_vma) (${move_default_addr_high} ? 0x100400000LL \
106					: 0x400000LL))
107#undef NT_DLL_IMAGE_BASE
108#define NT_DLL_IMAGE_BASE \
109  ((bfd_vma) (${move_default_addr_high} ? 0x400000000LL \
110					: 0x10000000LL))
111#undef NT_DLL_AUTO_IMAGE_BASE
112#define NT_DLL_AUTO_IMAGE_BASE \
113  ((bfd_vma) (${move_default_addr_high} ? 0x400000000LL \
114					: 0x61300000LL))
115#undef NT_DLL_AUTO_IMAGE_MASK
116#define NT_DLL_AUTO_IMAGE_MASK \
117  ((bfd_vma) (${move_default_addr_high} ? 0x1ffff0000LL \
118					: 0x0ffc0000LL))
119#else
120#undef  NT_EXE_IMAGE_BASE
121#define NT_EXE_IMAGE_BASE \
122  ((bfd_vma) (${move_default_addr_high} ? 0x100010000LL \
123					: 0x10000LL))
124#undef NT_DLL_IMAGE_BASE
125#define NT_DLL_IMAGE_BASE \
126  ((bfd_vma) (${move_default_addr_high} ? 0x110000000LL \
127					: 0x10000000LL))
128#undef NT_DLL_AUTO_IMAGE_BASE
129#define NT_DLL_AUTO_IMAGE_BASE \
130  ((bfd_vma) (${move_default_addr_high} ? 0x120000000LL \
131					: 0x61300000LL))
132#undef NT_DLL_AUTO_IMAGE_MASK
133#define NT_DLL_AUTO_IMAGE_MASK \
134  ((bfd_vma) (${move_default_addr_high} ? 0x0ffff0000LL \
135					: 0x0ffc0000LL))
136#undef  PE_DEF_SECTION_ALIGNMENT
137#define	PE_DEF_SUBSYSTEM		2
138#undef  PE_DEF_FILE_ALIGNMENT
139#define PE_DEF_FILE_ALIGNMENT		0x00000200
140#define PE_DEF_SECTION_ALIGNMENT	0x00000400
141#endif
142
143static struct internal_extra_pe_aouthdr pep;
144static int dll;
145static int pep_subsystem = ${SUBSYSTEM};
146static flagword real_flags = IMAGE_FILE_LARGE_ADDRESS_AWARE;
147static int support_old_code = 0;
148static lang_assignment_statement_type *image_base_statement = 0;
149static unsigned short pe_dll_characteristics = 0;
150static bfd_boolean insert_timestamp = TRUE;
151static const char *emit_build_id;
152
153#ifdef DLL_SUPPORT
154static int    pep_enable_stdcall_fixup = 1; /* 0=disable 1=enable (default).  */
155static char * pep_out_def_filename = NULL;
156static char * pep_implib_filename = NULL;
157static int    pep_enable_auto_image_base = 0;
158static char * pep_dll_search_prefix = NULL;
159#endif
160
161extern const char *output_filename;
162
163static int is_underscoring (void)
164{
165  int u = 0;
166  if (pep_leading_underscore != -1)
167    return pep_leading_underscore;
168  if (!bfd_get_target_info ("${OUTPUT_FORMAT}", NULL, NULL, &u, NULL))
169    bfd_get_target_info ("${RELOCATEABLE_OUTPUT_FORMAT}", NULL, NULL, &u, NULL);
170
171  if (u == -1)
172    abort ();
173  pep_leading_underscore = (u != 0 ? 1 : 0);
174  return pep_leading_underscore;
175}
176
177
178static void
179gld_${EMULATION_NAME}_before_parse (void)
180{
181  is_underscoring ();
182  ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
183  output_filename = "${EXECUTABLE_NAME:-a.exe}";
184#ifdef DLL_SUPPORT
185  input_flags.dynamic = TRUE;
186  config.has_shared = 1;
187  link_info.pei386_auto_import = 1;
188  link_info.pei386_runtime_pseudo_reloc = 2; /* Use by default version 2.  */
189#endif
190}
191
192/* PE format extra command line options.  */
193
194/* Used for setting flags in the PE header.  */
195enum options
196{
197  OPTION_BASE_FILE = 300 + 1,
198  OPTION_DLL,
199  OPTION_FILE_ALIGNMENT,
200  OPTION_IMAGE_BASE,
201  OPTION_MAJOR_IMAGE_VERSION,
202  OPTION_MAJOR_OS_VERSION,
203  OPTION_MAJOR_SUBSYSTEM_VERSION,
204  OPTION_MINOR_IMAGE_VERSION,
205  OPTION_MINOR_OS_VERSION,
206  OPTION_MINOR_SUBSYSTEM_VERSION,
207  OPTION_SECTION_ALIGNMENT,
208  OPTION_STACK,
209  OPTION_SUBSYSTEM,
210  OPTION_HEAP,
211  OPTION_SUPPORT_OLD_CODE,
212  OPTION_OUT_DEF,
213  OPTION_EXPORT_ALL,
214  OPTION_EXCLUDE_SYMBOLS,
215  OPTION_EXCLUDE_ALL_SYMBOLS,
216  OPTION_KILL_ATS,
217  OPTION_STDCALL_ALIASES,
218  OPTION_ENABLE_STDCALL_FIXUP,
219  OPTION_DISABLE_STDCALL_FIXUP,
220  OPTION_IMPLIB_FILENAME,
221  OPTION_WARN_DUPLICATE_EXPORTS,
222  OPTION_IMP_COMPAT,
223  OPTION_ENABLE_AUTO_IMAGE_BASE,
224  OPTION_DISABLE_AUTO_IMAGE_BASE,
225  OPTION_DLL_SEARCH_PREFIX,
226  OPTION_NO_DEFAULT_EXCLUDES,
227  OPTION_DLL_ENABLE_AUTO_IMPORT,
228  OPTION_DLL_DISABLE_AUTO_IMPORT,
229  OPTION_ENABLE_EXTRA_PE_DEBUG,
230  OPTION_EXCLUDE_LIBS,
231  OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC,
232  OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC,
233  OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2,
234  OPTION_EXCLUDE_MODULES_FOR_IMPLIB,
235  OPTION_USE_NUL_PREFIXED_IMPORT_TABLES,
236  OPTION_NO_LEADING_UNDERSCORE,
237  OPTION_LEADING_UNDERSCORE,
238  OPTION_ENABLE_LONG_SECTION_NAMES,
239  OPTION_DISABLE_LONG_SECTION_NAMES,
240  OPTION_HIGH_ENTROPY_VA,
241  OPTION_DYNAMIC_BASE,
242  OPTION_FORCE_INTEGRITY,
243  OPTION_NX_COMPAT,
244  OPTION_NO_ISOLATION,
245  OPTION_NO_SEH,
246  OPTION_NO_BIND,
247  OPTION_WDM_DRIVER,
248  OPTION_INSERT_TIMESTAMP,
249  OPTION_NO_INSERT_TIMESTAMP,
250  OPTION_TERMINAL_SERVER_AWARE,
251  OPTION_BUILD_ID
252};
253
254static void
255gld${EMULATION_NAME}_add_options
256  (int ns ATTRIBUTE_UNUSED,
257   char **shortopts ATTRIBUTE_UNUSED,
258   int nl,
259   struct option **longopts,
260   int nrl ATTRIBUTE_UNUSED,
261   struct option **really_longopts ATTRIBUTE_UNUSED)
262{
263  static const struct option xtra_long[] =
264  {
265    /* PE options */
266    {"base-file", required_argument, NULL, OPTION_BASE_FILE},
267    {"dll", no_argument, NULL, OPTION_DLL},
268    {"file-alignment", required_argument, NULL, OPTION_FILE_ALIGNMENT},
269    {"heap", required_argument, NULL, OPTION_HEAP},
270    {"image-base", required_argument, NULL, OPTION_IMAGE_BASE},
271    {"major-image-version", required_argument, NULL, OPTION_MAJOR_IMAGE_VERSION},
272    {"major-os-version", required_argument, NULL, OPTION_MAJOR_OS_VERSION},
273    {"major-subsystem-version", required_argument, NULL, OPTION_MAJOR_SUBSYSTEM_VERSION},
274    {"minor-image-version", required_argument, NULL, OPTION_MINOR_IMAGE_VERSION},
275    {"minor-os-version", required_argument, NULL, OPTION_MINOR_OS_VERSION},
276    {"minor-subsystem-version", required_argument, NULL, OPTION_MINOR_SUBSYSTEM_VERSION},
277    {"section-alignment", required_argument, NULL, OPTION_SECTION_ALIGNMENT},
278    {"stack", required_argument, NULL, OPTION_STACK},
279    {"subsystem", required_argument, NULL, OPTION_SUBSYSTEM},
280    {"support-old-code", no_argument, NULL, OPTION_SUPPORT_OLD_CODE},
281    {"use-nul-prefixed-import-tables", no_argument, NULL,
282     OPTION_USE_NUL_PREFIXED_IMPORT_TABLES},
283    {"no-leading-underscore", no_argument, NULL, OPTION_NO_LEADING_UNDERSCORE},
284    {"leading-underscore", no_argument, NULL, OPTION_LEADING_UNDERSCORE},
285#ifdef DLL_SUPPORT
286    /* getopt allows abbreviations, so we do this to stop it
287       from treating -o as an abbreviation for this option.  */
288    {"output-def", required_argument, NULL, OPTION_OUT_DEF},
289    {"output-def", required_argument, NULL, OPTION_OUT_DEF},
290    {"export-all-symbols", no_argument, NULL, OPTION_EXPORT_ALL},
291    {"exclude-symbols", required_argument, NULL, OPTION_EXCLUDE_SYMBOLS},
292    {"exclude-all-symbols", no_argument, NULL, OPTION_EXCLUDE_ALL_SYMBOLS},
293    {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
294    {"exclude-modules-for-implib", required_argument, NULL, OPTION_EXCLUDE_MODULES_FOR_IMPLIB},
295    {"kill-at", no_argument, NULL, OPTION_KILL_ATS},
296    {"add-stdcall-alias", no_argument, NULL, OPTION_STDCALL_ALIASES},
297    {"enable-stdcall-fixup", no_argument, NULL, OPTION_ENABLE_STDCALL_FIXUP},
298    {"disable-stdcall-fixup", no_argument, NULL, OPTION_DISABLE_STDCALL_FIXUP},
299    {"out-implib", required_argument, NULL, OPTION_IMPLIB_FILENAME},
300    {"warn-duplicate-exports", no_argument, NULL, OPTION_WARN_DUPLICATE_EXPORTS},
301    /* getopt() allows abbreviations, so we do this to stop it from
302       treating -c as an abbreviation for these --compat-implib.  */
303    {"compat-implib", no_argument, NULL, OPTION_IMP_COMPAT},
304    {"compat-implib", no_argument, NULL, OPTION_IMP_COMPAT},
305    {"enable-auto-image-base", no_argument, NULL, OPTION_ENABLE_AUTO_IMAGE_BASE},
306    {"disable-auto-image-base", no_argument, NULL, OPTION_DISABLE_AUTO_IMAGE_BASE},
307    {"dll-search-prefix", required_argument, NULL, OPTION_DLL_SEARCH_PREFIX},
308    {"no-default-excludes", no_argument, NULL, OPTION_NO_DEFAULT_EXCLUDES},
309    {"enable-auto-import", no_argument, NULL, OPTION_DLL_ENABLE_AUTO_IMPORT},
310    {"disable-auto-import", no_argument, NULL, OPTION_DLL_DISABLE_AUTO_IMPORT},
311    {"enable-extra-pep-debug", no_argument, NULL, OPTION_ENABLE_EXTRA_PE_DEBUG},
312    {"enable-runtime-pseudo-reloc", no_argument, NULL, OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC},
313    {"disable-runtime-pseudo-reloc", no_argument, NULL, OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC},
314    {"enable-runtime-pseudo-reloc-v2", no_argument, NULL, OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2},
315#endif
316    {"enable-long-section-names", no_argument, NULL, OPTION_ENABLE_LONG_SECTION_NAMES},
317    {"disable-long-section-names", no_argument, NULL, OPTION_DISABLE_LONG_SECTION_NAMES},
318    {"high-entropy-va", no_argument, NULL, OPTION_HIGH_ENTROPY_VA},
319    {"dynamicbase",no_argument, NULL, OPTION_DYNAMIC_BASE},
320    {"forceinteg", no_argument, NULL, OPTION_FORCE_INTEGRITY},
321    {"nxcompat", no_argument, NULL, OPTION_NX_COMPAT},
322    {"no-isolation", no_argument, NULL, OPTION_NO_ISOLATION},
323    {"no-seh", no_argument, NULL, OPTION_NO_SEH},
324    {"no-bind", no_argument, NULL, OPTION_NO_BIND},
325    {"wdmdriver", no_argument, NULL, OPTION_WDM_DRIVER},
326    {"tsaware", no_argument, NULL, OPTION_TERMINAL_SERVER_AWARE},
327    {"insert-timestamp", no_argument, NULL, OPTION_INSERT_TIMESTAMP},
328    {"no-insert-timestamp", no_argument, NULL, OPTION_NO_INSERT_TIMESTAMP},
329    {"build-id", optional_argument, NULL, OPTION_BUILD_ID},
330    {NULL, no_argument, NULL, 0}
331  };
332
333  *longopts
334    = xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
335  memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
336}
337
338/* PE/WIN32; added routines to get the subsystem type, heap and/or stack
339   parameters which may be input from the command line.  */
340
341typedef struct
342{
343  void *ptr;
344  int size;
345  bfd_vma value;
346  char *symbol;
347  int inited;
348  /* FALSE for an assembly level symbol and TRUE for a C visible symbol.
349     C visible symbols can be prefixed by underscore dependent on target's
350     settings.  */
351  bfd_boolean is_c_symbol;
352} definfo;
353
354#define GET_INIT_SYMBOL_NAME(IDX) \
355  (init[(IDX)].symbol \
356  + ((init[(IDX)].is_c_symbol == FALSE || (is_underscoring () == 1)) ? 0 : 1))
357
358/* Decorates the C visible symbol by underscore, if target requires.  */
359#define U(CSTR) \
360  ((is_underscoring () == 0) ? CSTR : "_" CSTR)
361
362/* Get size of constant string for a possible underscore prefixed
363   C visible symbol.  */
364#define U_SIZE(CSTR) \
365  (sizeof (CSTR) + (is_underscoring () == 0 ? 0 : 1))
366
367#define D(field,symbol,def,usc)  {&pep.field, sizeof (pep.field), def, symbol, 0, usc}
368
369static definfo init[] =
370{
371  /* imagebase must be first */
372#define IMAGEBASEOFF 0
373  D(ImageBase,"__image_base__", NT_EXE_IMAGE_BASE, FALSE),
374#define DLLOFF 1
375  {&dll, sizeof(dll), 0, "__dll__", 0, FALSE},
376#define MSIMAGEBASEOFF	2
377  D(ImageBase, "___ImageBase", NT_EXE_IMAGE_BASE, TRUE),
378  D(SectionAlignment,"__section_alignment__", PE_DEF_SECTION_ALIGNMENT, FALSE),
379  D(FileAlignment,"__file_alignment__", PE_DEF_FILE_ALIGNMENT, FALSE),
380  D(MajorOperatingSystemVersion,"__major_os_version__", 4, FALSE),
381  D(MinorOperatingSystemVersion,"__minor_os_version__", 0, FALSE),
382  D(MajorImageVersion,"__major_image_version__", 0, FALSE),
383  D(MinorImageVersion,"__minor_image_version__", 0, FALSE),
384  D(MajorSubsystemVersion,"__major_subsystem_version__", 5, FALSE),
385  D(MinorSubsystemVersion,"__minor_subsystem_version__", 2, FALSE),
386  D(Subsystem,"__subsystem__", ${SUBSYSTEM}, FALSE),
387  D(SizeOfStackReserve,"__size_of_stack_reserve__", 0x200000, FALSE),
388  D(SizeOfStackCommit,"__size_of_stack_commit__", 0x1000, FALSE),
389  D(SizeOfHeapReserve,"__size_of_heap_reserve__", 0x100000, FALSE),
390  D(SizeOfHeapCommit,"__size_of_heap_commit__", 0x1000, FALSE),
391  D(LoaderFlags,"__loader_flags__", 0x0, FALSE),
392  D(DllCharacteristics, "__dll_characteristics__", 0x0, FALSE),
393  { NULL, 0, 0, NULL, 0, FALSE}
394};
395
396
397static void
398gld_${EMULATION_NAME}_list_options (FILE *file)
399{
400  fprintf (file, _("  --base_file <basefile>             Generate a base file for relocatable DLLs\n"));
401  fprintf (file, _("  --dll                              Set image base to the default for DLLs\n"));
402  fprintf (file, _("  --file-alignment <size>            Set file alignment\n"));
403  fprintf (file, _("  --heap <size>                      Set initial size of the heap\n"));
404  fprintf (file, _("  --image-base <address>             Set start address of the executable\n"));
405  fprintf (file, _("  --major-image-version <number>     Set version number of the executable\n"));
406  fprintf (file, _("  --major-os-version <number>        Set minimum required OS version\n"));
407  fprintf (file, _("  --major-subsystem-version <number> Set minimum required OS subsystem version\n"));
408  fprintf (file, _("  --minor-image-version <number>     Set revision number of the executable\n"));
409  fprintf (file, _("  --minor-os-version <number>        Set minimum required OS revision\n"));
410  fprintf (file, _("  --minor-subsystem-version <number> Set minimum required OS subsystem revision\n"));
411  fprintf (file, _("  --section-alignment <size>         Set section alignment\n"));
412  fprintf (file, _("  --stack <size>                     Set size of the initial stack\n"));
413  fprintf (file, _("  --subsystem <name>[:<version>]     Set required OS subsystem [& version]\n"));
414  fprintf (file, _("  --support-old-code                 Support interworking with old code\n"));
415  fprintf (file, _("  --[no-]leading-underscore          Set explicit symbol underscore prefix mode\n"));
416  fprintf (file, _("  --[no-]insert-timestamp            Use a real timestamp rather than zero. (default)\n"));
417  fprintf (file, _("                                     This makes binaries non-deterministic\n"));
418#ifdef DLL_SUPPORT
419  fprintf (file, _("  --add-stdcall-alias                Export symbols with and without @nn\n"));
420  fprintf (file, _("  --disable-stdcall-fixup            Don't link _sym to _sym@nn\n"));
421  fprintf (file, _("  --enable-stdcall-fixup             Link _sym to _sym@nn without warnings\n"));
422  fprintf (file, _("  --exclude-symbols sym,sym,...      Exclude symbols from automatic export\n"));
423  fprintf (file, _("  --exclude-all-symbols              Exclude all symbols from automatic export\n"));
424  fprintf (file, _("  --exclude-libs lib,lib,...         Exclude libraries from automatic export\n"));
425  fprintf (file, _("  --exclude-modules-for-implib mod,mod,...\n"));
426  fprintf (file, _("                                     Exclude objects, archive members from auto\n"));
427  fprintf (file, _("                                     export, place into import library instead.\n"));
428  fprintf (file, _("  --export-all-symbols               Automatically export all globals to DLL\n"));
429  fprintf (file, _("  --kill-at                          Remove @nn from exported symbols\n"));
430  fprintf (file, _("  --out-implib <file>                Generate import library\n"));
431  fprintf (file, _("  --output-def <file>                Generate a .DEF file for the built DLL\n"));
432  fprintf (file, _("  --warn-duplicate-exports           Warn about duplicate exports.\n"));
433  fprintf (file, _("  --compat-implib                    Create backward compatible import libs;\n\
434                                       create __imp_<SYMBOL> as well.\n"));
435  fprintf (file, _("  --enable-auto-image-base           Automatically choose image base for DLLs\n\
436                                       unless user specifies one\n"));
437  fprintf (file, _("  --disable-auto-image-base          Do not auto-choose image base. (default)\n"));
438  fprintf (file, _("  --dll-search-prefix=<string>       When linking dynamically to a dll without\n\
439                                       an importlib, use <string><basename>.dll\n\
440                                       in preference to lib<basename>.dll \n"));
441  fprintf (file, _("  --enable-auto-import               Do sophisticated linking of _sym to\n\
442                                       __imp_sym for DATA references\n"));
443  fprintf (file, _("  --disable-auto-import              Do not auto-import DATA items from DLLs\n"));
444  fprintf (file, _("  --enable-runtime-pseudo-reloc      Work around auto-import limitations by\n\
445                                       adding pseudo-relocations resolved at\n\
446                                       runtime.\n"));
447  fprintf (file, _("  --disable-runtime-pseudo-reloc     Do not add runtime pseudo-relocations for\n\
448                                       auto-imported DATA.\n"));
449  fprintf (file, _("  --enable-extra-pep-debug            Enable verbose debug output when building\n\
450                                       or linking to DLLs (esp. auto-import)\n"));
451  fprintf (file, _("  --enable-long-section-names        Use long COFF section names even in\n\
452                                       executable image files\n"));
453  fprintf (file, _("  --disable-long-section-names       Never use long COFF section names, even\n\
454                                       in object files\n"));
455  fprintf (file, _("  --high-entropy-va                  Image is compatible with 64-bit address space\n\
456                                       layout randomization (ASLR)\n"));
457  fprintf (file, _("  --dynamicbase			 Image base address may be relocated using\n\
458				       address space layout randomization (ASLR)\n"));
459  fprintf (file, _("  --forceinteg		 Code integrity checks are enforced\n"));
460  fprintf (file, _("  --nxcompat		 Image is compatible with data execution prevention\n"));
461  fprintf (file, _("  --no-isolation		 Image understands isolation but do not isolate the image\n"));
462  fprintf (file, _("  --no-seh			 Image does not use SEH. No SE handler may\n\
463				       be called in this image\n"));
464  fprintf (file, _("  --no-bind			 Do not bind this image\n"));
465  fprintf (file, _("  --wdmdriver		 Driver uses the WDM model\n"));
466  fprintf (file, _("  --tsaware                  Image is Terminal Server aware\n"));
467  fprintf (file, _("  --build-id[=STYLE]         Generate build ID\n"));
468#endif
469}
470
471
472static void
473set_pep_name (char *name, bfd_vma val)
474{
475  int i;
476  is_underscoring ();
477  /* Find the name and set it.  */
478  for (i = 0; init[i].ptr; i++)
479    {
480      if (strcmp (name, GET_INIT_SYMBOL_NAME (i)) == 0)
481	{
482	  init[i].value = val;
483	  init[i].inited = 1;
484	  if (strcmp (name,"__image_base__") == 0)
485	    set_pep_name (U ("__ImageBase"), val);
486	  return;
487	}
488    }
489  abort ();
490}
491
492static void
493set_entry_point (void)
494{
495  const char *entry;
496  const char *initial_symbol_char;
497  int i;
498
499  static const struct
500    {
501      const int value;
502      const char *entry;
503    }
504  v[] =
505    {
506      { 1, "NtProcessStartup"  },
507      { 2, "WinMainCRTStartup" },
508      { 3, "mainCRTStartup"    },
509      { 7, "__PosixProcessStartup" },
510      { 9, "WinMainCRTStartup" },
511      {14, "mainCRTStartup"    },
512      { 0, NULL          }
513    };
514
515  /* Entry point name for arbitrary subsystem numbers.  */
516  static const char default_entry[] = "mainCRTStartup";
517
518  if (link_info.shared || dll)
519    {
520      entry = "DllMainCRTStartup";
521    }
522  else
523    {
524      for (i = 0; v[i].entry; i++)
525        if (v[i].value == pep_subsystem)
526          break;
527
528      /* If no match, use the default.  */
529      if (v[i].entry != NULL)
530        entry = v[i].entry;
531      else
532        entry = default_entry;
533    }
534
535  /* Now we check target's default for getting proper symbol_char.  */
536  initial_symbol_char = (is_underscoring () != 0 ? "_" : "");
537
538  if (*initial_symbol_char != '\0')
539    {
540      char *alc_entry;
541
542      /* lang_default_entry expects its argument to be permanently
543	 allocated, so we don't free this string.  */
544      alc_entry = xmalloc (strlen (initial_symbol_char)
545			   + strlen (entry)
546			   + 1);
547      strcpy (alc_entry, initial_symbol_char);
548      strcat (alc_entry, entry);
549      entry = alc_entry;
550    }
551
552  lang_default_entry (entry);
553}
554
555static void
556set_pep_subsystem (void)
557{
558  const char *sver;
559  char *end;
560  int len;
561  int i;
562  unsigned long temp_subsystem;
563  static const struct
564    {
565      const char *name;
566      const int value;
567    }
568  v[] =
569    {
570      { "native",  1 },
571      { "windows", 2 },
572      { "console", 3 },
573      { "posix",   7 },
574      { "wince",   9 },
575      { "xbox",   14 },
576      { NULL, 0 }
577    };
578
579  /* Check for the presence of a version number.  */
580  sver = strchr (optarg, ':');
581  if (sver == NULL)
582    len = strlen (optarg);
583  else
584    {
585      len = sver - optarg;
586      set_pep_name ("__major_subsystem_version__",
587		    strtoul (sver + 1, &end, 0));
588      if (*end == '.')
589	set_pep_name ("__minor_subsystem_version__",
590		      strtoul (end + 1, &end, 0));
591      if (*end != '\0')
592	einfo (_("%P: warning: bad version number in -subsystem option\n"));
593    }
594
595  /* Check for numeric subsystem.  */
596  temp_subsystem = strtoul (optarg, & end, 0);
597  if ((*end == ':' || *end == '\0') && (temp_subsystem < 65536))
598    {
599      /* Search list for a numeric match to use its entry point.  */
600      for (i = 0; v[i].name; i++)
601	if (v[i].value == (int) temp_subsystem)
602	  break;
603
604      /* Use this subsystem.  */
605      pep_subsystem = (int) temp_subsystem;
606    }
607  else
608    {
609      /* Search for subsystem by name.  */
610      for (i = 0; v[i].name; i++)
611	if (strncmp (optarg, v[i].name, len) == 0
612	    && v[i].name[len] == '\0')
613	  break;
614
615      if (v[i].name == NULL)
616	{
617	  einfo (_("%P%F: invalid subsystem type %s\n"), optarg);
618	  return;
619	}
620
621      pep_subsystem = v[i].value;
622    }
623
624  set_pep_name ("__subsystem__", pep_subsystem);
625
626  return;
627}
628
629
630static void
631set_pep_value (char *name)
632{
633  char *end;
634
635  set_pep_name (name,  (bfd_vma) strtoull (optarg, &end, 0));
636
637  if (end == optarg)
638    einfo (_("%P%F: invalid hex number for PE parameter '%s'\n"), optarg);
639
640  optarg = end;
641}
642
643
644static void
645set_pep_stack_heap (char *resname, char *comname)
646{
647  set_pep_value (resname);
648
649  if (*optarg == ',')
650    {
651      optarg++;
652      set_pep_value (comname);
653    }
654  else if (*optarg)
655    einfo (_("%P%F: strange hex info for PE parameter '%s'\n"), optarg);
656}
657
658#define DEFAULT_BUILD_ID_STYLE	"md5"
659
660static bfd_boolean
661gld${EMULATION_NAME}_handle_option (int optc)
662{
663  is_underscoring ();
664  switch (optc)
665    {
666    default:
667      return FALSE;
668
669    case OPTION_BASE_FILE:
670      link_info.base_file = fopen (optarg, FOPEN_WB);
671      if (link_info.base_file == NULL)
672	einfo (_("%F%P: cannot open base file %s\n"), optarg);
673      break;
674
675      /* PE options.  */
676    case OPTION_HEAP:
677      set_pep_stack_heap ("__size_of_heap_reserve__", "__size_of_heap_commit__");
678      break;
679    case OPTION_STACK:
680      set_pep_stack_heap ("__size_of_stack_reserve__", "__size_of_stack_commit__");
681      break;
682    case OPTION_SUBSYSTEM:
683      set_pep_subsystem ();
684      break;
685    case OPTION_MAJOR_OS_VERSION:
686      set_pep_value ("__major_os_version__");
687      break;
688    case OPTION_MINOR_OS_VERSION:
689      set_pep_value ("__minor_os_version__");
690      break;
691    case OPTION_MAJOR_SUBSYSTEM_VERSION:
692      set_pep_value ("__major_subsystem_version__");
693      break;
694    case OPTION_MINOR_SUBSYSTEM_VERSION:
695      set_pep_value ("__minor_subsystem_version__");
696      break;
697    case OPTION_MAJOR_IMAGE_VERSION:
698      set_pep_value ("__major_image_version__");
699      break;
700    case OPTION_MINOR_IMAGE_VERSION:
701      set_pep_value ("__minor_image_version__");
702      break;
703    case OPTION_FILE_ALIGNMENT:
704      set_pep_value ("__file_alignment__");
705      break;
706    case OPTION_SECTION_ALIGNMENT:
707      set_pep_value ("__section_alignment__");
708      break;
709    case OPTION_DLL:
710      set_pep_name ("__dll__", 1);
711      break;
712    case OPTION_IMAGE_BASE:
713      set_pep_value ("__image_base__");
714      break;
715    case OPTION_SUPPORT_OLD_CODE:
716      support_old_code = 1;
717      break;
718    case OPTION_USE_NUL_PREFIXED_IMPORT_TABLES:
719      pep_use_nul_prefixed_import_tables = TRUE;
720      break;
721    case OPTION_NO_LEADING_UNDERSCORE:
722      pep_leading_underscore = 0;
723      break;
724    case OPTION_LEADING_UNDERSCORE:
725      pep_leading_underscore = 1;
726      break;
727    case OPTION_INSERT_TIMESTAMP:
728      insert_timestamp = TRUE;
729      break;
730    case OPTION_NO_INSERT_TIMESTAMP:
731      insert_timestamp = FALSE;
732      break;
733#ifdef DLL_SUPPORT
734    case OPTION_OUT_DEF:
735      pep_out_def_filename = xstrdup (optarg);
736      break;
737    case OPTION_EXPORT_ALL:
738      pep_dll_export_everything = 1;
739      break;
740    case OPTION_EXCLUDE_SYMBOLS:
741      pep_dll_add_excludes (optarg, EXCLUDESYMS);
742      break;
743    case OPTION_EXCLUDE_ALL_SYMBOLS:
744      pep_dll_exclude_all_symbols = 1;
745      break;
746    case OPTION_EXCLUDE_LIBS:
747      pep_dll_add_excludes (optarg, EXCLUDELIBS);
748      break;
749    case OPTION_EXCLUDE_MODULES_FOR_IMPLIB:
750      pep_dll_add_excludes (optarg, EXCLUDEFORIMPLIB);
751      break;
752    case OPTION_KILL_ATS:
753      pep_dll_kill_ats = 1;
754      break;
755    case OPTION_STDCALL_ALIASES:
756      pep_dll_stdcall_aliases = 1;
757      break;
758    case OPTION_ENABLE_STDCALL_FIXUP:
759      pep_enable_stdcall_fixup = 1;
760      break;
761    case OPTION_DISABLE_STDCALL_FIXUP:
762      pep_enable_stdcall_fixup = 0;
763      break;
764    case OPTION_IMPLIB_FILENAME:
765      pep_implib_filename = xstrdup (optarg);
766      break;
767    case OPTION_WARN_DUPLICATE_EXPORTS:
768      pep_dll_warn_dup_exports = 1;
769      break;
770    case OPTION_IMP_COMPAT:
771      pep_dll_compat_implib = 1;
772      break;
773    case OPTION_ENABLE_AUTO_IMAGE_BASE:
774      pep_enable_auto_image_base = 1;
775      break;
776    case OPTION_DISABLE_AUTO_IMAGE_BASE:
777      pep_enable_auto_image_base = 0;
778      break;
779    case OPTION_DLL_SEARCH_PREFIX:
780      pep_dll_search_prefix = xstrdup (optarg);
781      break;
782    case OPTION_NO_DEFAULT_EXCLUDES:
783      pep_dll_do_default_excludes = 0;
784      break;
785    case OPTION_DLL_ENABLE_AUTO_IMPORT:
786      link_info.pei386_auto_import = 1;
787      break;
788    case OPTION_DLL_DISABLE_AUTO_IMPORT:
789      link_info.pei386_auto_import = 0;
790      break;
791    case OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC:
792      link_info.pei386_runtime_pseudo_reloc = 2;
793      break;
794    case OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC:
795      link_info.pei386_runtime_pseudo_reloc = 0;
796      break;
797    case OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2:
798      link_info.pei386_runtime_pseudo_reloc = 2;
799      break;
800    case OPTION_ENABLE_EXTRA_PE_DEBUG:
801      pep_dll_extra_pe_debug = 1;
802      break;
803#endif
804    case OPTION_ENABLE_LONG_SECTION_NAMES:
805      pep_use_coff_long_section_names = 1;
806      break;
807    case OPTION_DISABLE_LONG_SECTION_NAMES:
808      pep_use_coff_long_section_names = 0;
809      break;
810    /*  Get DLLCharacteristics bits  */
811    case OPTION_HIGH_ENTROPY_VA:
812      pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA;
813      break;
814    case OPTION_DYNAMIC_BASE:
815      pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE;
816      break;
817    case OPTION_FORCE_INTEGRITY:
818      pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY;
819      break;
820    case OPTION_NX_COMPAT:
821      pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_NX_COMPAT;
822      break;
823    case OPTION_NO_ISOLATION:
824      pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_NO_ISOLATION;
825      break;
826    case OPTION_NO_SEH:
827      pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_NO_SEH;
828      break;
829    case OPTION_NO_BIND:
830      pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_NO_BIND;
831      break;
832    case OPTION_WDM_DRIVER:
833      pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_WDM_DRIVER;
834      break;
835    case OPTION_TERMINAL_SERVER_AWARE:
836      pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE;
837      break;
838    case OPTION_BUILD_ID:
839      if (emit_build_id != NULL)
840	{
841	  free ((char *) emit_build_id);
842	  emit_build_id = NULL;
843	}
844      if (optarg == NULL)
845	optarg = DEFAULT_BUILD_ID_STYLE;
846      if (strcmp (optarg, "none"))
847	emit_build_id = xstrdup (optarg);
848      break;
849    }
850
851  /*  Set DLLCharacteristics bits  */
852  set_pep_name ("__dll_characteristics__", pe_dll_characteristics);
853
854  return TRUE;
855}
856
857
858#ifdef DLL_SUPPORT
859static unsigned long
860strhash (const char *str)
861{
862  const unsigned char *s;
863  unsigned long hash;
864  unsigned int c;
865  unsigned int len;
866
867  hash = 0;
868  len = 0;
869  s = (const unsigned char *) str;
870  while ((c = *s++) != '\0')
871    {
872      hash += c + (c << 17);
873      hash ^= hash >> 2;
874      ++len;
875    }
876  hash += len + (len << 17);
877  hash ^= hash >> 2;
878
879  return hash;
880}
881
882/* Use the output file to create a image base for relocatable DLLs.  */
883
884static bfd_vma
885compute_dll_image_base (const char *ofile)
886{
887  bfd_vma hash = (bfd_vma) strhash (ofile);
888  return NT_DLL_AUTO_IMAGE_BASE + ((hash << 16) & NT_DLL_AUTO_IMAGE_MASK);
889}
890#endif
891
892/* Assign values to the special symbols before the linker script is
893   read.  */
894
895static void
896gld_${EMULATION_NAME}_set_symbols (void)
897{
898  /* Run through and invent symbols for all the
899     names and insert the defaults.  */
900  int j;
901
902  is_underscoring ();
903
904  if (!init[IMAGEBASEOFF].inited)
905    {
906      if (link_info.relocatable)
907	init[IMAGEBASEOFF].value = 0;
908      else if (init[DLLOFF].value || (link_info.shared && !link_info.pie))
909	{
910#ifdef DLL_SUPPORT
911	  init[IMAGEBASEOFF].value = (pep_enable_auto_image_base
912				      ? compute_dll_image_base (output_filename)
913				      : NT_DLL_IMAGE_BASE);
914#else
915	  init[IMAGEBASEOFF].value = NT_DLL_IMAGE_BASE;
916#endif
917	}
918      else
919	init[IMAGEBASEOFF].value = NT_EXE_IMAGE_BASE;
920      init[MSIMAGEBASEOFF].value = init[IMAGEBASEOFF].value;
921    }
922
923  /* Don't do any symbol assignments if this is a relocatable link.  */
924  if (link_info.relocatable)
925    return;
926
927  /* Glue the assignments into the abs section.  */
928  push_stat_ptr (&abs_output_section->children);
929
930  for (j = 0; init[j].ptr; j++)
931    {
932      bfd_vma val = init[j].value;
933      lang_assignment_statement_type *rv;
934
935      rv = lang_add_assignment (exp_assign (GET_INIT_SYMBOL_NAME (j),
936					    exp_intop (val), FALSE));
937      if (init[j].size == sizeof (short))
938	*(short *) init[j].ptr = (short) val;
939      else if (init[j].size == sizeof (int))
940	*(int *) init[j].ptr = (int) val;
941      else if (init[j].size == sizeof (long))
942	*(long *) init[j].ptr = (long) val;
943      /* This might be a long long or other special type.  */
944      else if (init[j].size == sizeof (bfd_vma))
945	*(bfd_vma *) init[j].ptr = val;
946      else	abort ();
947      if (j == IMAGEBASEOFF)
948	image_base_statement = rv;
949    }
950  /* Restore the pointer.  */
951  pop_stat_ptr ();
952
953  if (pep.FileAlignment > pep.SectionAlignment)
954    {
955      einfo (_("%P: warning, file alignment > section alignment.\n"));
956    }
957}
958
959/* This is called after the linker script and the command line options
960   have been read.  */
961
962static void
963gld_${EMULATION_NAME}_after_parse (void)
964{
965  /* PR ld/6744:  Warn the user if they have used an ELF-only
966     option hoping it will work on PE+.  */
967  if (link_info.export_dynamic)
968    einfo (_("%P: warning: --export-dynamic is not supported for PE+ "
969      "targets, did you mean --export-all-symbols?\n"));
970
971  set_entry_point ();
972
973  after_parse_default ();
974}
975
976/* pep-dll.c directly accesses pep_data_import_dll,
977   so it must be defined outside of #ifdef DLL_SUPPORT.
978   Note - this variable is deliberately not initialised.
979   This allows it to be treated as a common varaible, and only
980   exist in one incarnation in a multiple target enabled linker.  */
981char * pep_data_import_dll;
982
983#ifdef DLL_SUPPORT
984static struct bfd_link_hash_entry *pep_undef_found_sym;
985
986static bfd_boolean
987pep_undef_cdecl_match (struct bfd_link_hash_entry *h, void *inf)
988{
989  int sl;
990  char *string = inf;
991  const char *hs = h->root.string;
992
993  sl = strlen (string);
994  if (h->type == bfd_link_hash_defined
995      && ((*hs == '@' && *string == '_'
996		   && strncmp (hs + 1, string + 1, sl - 1) == 0)
997		  || strncmp (hs, string, sl) == 0)
998      && h->root.string[sl] == '@')
999    {
1000      pep_undef_found_sym = h;
1001      return FALSE;
1002    }
1003  return TRUE;
1004}
1005
1006static void
1007pep_fixup_stdcalls (void)
1008{
1009  static int gave_warning_message = 0;
1010  struct bfd_link_hash_entry *undef, *sym;
1011
1012  if (pep_dll_extra_pe_debug)
1013    printf ("%s\n", __FUNCTION__);
1014
1015  for (undef = link_info.hash->undefs; undef; undef=undef->u.undef.next)
1016    if (undef->type == bfd_link_hash_undefined)
1017      {
1018	char* at = strchr (undef->root.string, '@');
1019	int lead_at = (*undef->root.string == '@');
1020	if (lead_at)
1021	  at = strchr (undef->root.string + 1, '@');
1022	if (at || lead_at)
1023	  {
1024	    /* The symbol is a stdcall symbol, so let's look for a
1025	       cdecl symbol with the same name and resolve to that.  */
1026	    char *cname = xstrdup (undef->root.string);
1027
1028	    if (lead_at)
1029	      *cname = '_';
1030	    at = strchr (cname, '@');
1031	    if (at)
1032	      *at = 0;
1033	    sym = bfd_link_hash_lookup (link_info.hash, cname, 0, 0, 1);
1034
1035	    if (sym && sym->type == bfd_link_hash_defined)
1036	      {
1037		undef->type = bfd_link_hash_defined;
1038		undef->u.def.value = sym->u.def.value;
1039		undef->u.def.section = sym->u.def.section;
1040
1041		if (pep_enable_stdcall_fixup == -1)
1042		  {
1043		    einfo (_("Warning: resolving %s by linking to %s\n"),
1044			   undef->root.string, cname);
1045		    if (! gave_warning_message)
1046		      {
1047			gave_warning_message = 1;
1048			einfo (_("Use --enable-stdcall-fixup to disable these warnings\n"));
1049			einfo (_("Use --disable-stdcall-fixup to disable these fixups\n"));
1050		      }
1051		  }
1052	      }
1053	  }
1054	else
1055	  {
1056	    /* The symbol is a cdecl symbol, so we look for stdcall
1057	       symbols - which means scanning the whole symbol table.  */
1058	    pep_undef_found_sym = 0;
1059	    bfd_link_hash_traverse (link_info.hash, pep_undef_cdecl_match,
1060				    (char *) undef->root.string);
1061	    sym = pep_undef_found_sym;
1062	    if (sym)
1063	      {
1064		undef->type = bfd_link_hash_defined;
1065		undef->u.def.value = sym->u.def.value;
1066		undef->u.def.section = sym->u.def.section;
1067
1068		if (pep_enable_stdcall_fixup == -1)
1069		  {
1070		    einfo (_("Warning: resolving %s by linking to %s\n"),
1071			   undef->root.string, sym->root.string);
1072		    if (! gave_warning_message)
1073		      {
1074			gave_warning_message = 1;
1075			einfo (_("Use --enable-stdcall-fixup to disable these warnings\n"));
1076			einfo (_("Use --disable-stdcall-fixup to disable these fixups\n"));
1077		      }
1078		  }
1079	      }
1080	  }
1081      }
1082}
1083
1084static int
1085make_import_fixup (arelent *rel, asection *s)
1086{
1087  struct bfd_symbol *sym = *rel->sym_ptr_ptr;
1088  char addend[8];
1089  bfd_vma _addend = 0;
1090  int suc = 0;
1091
1092  if (pep_dll_extra_pe_debug)
1093    printf ("arelent: %s@%#lx: add=%li\n", sym->name,
1094	    (unsigned long) rel->address, (long) rel->addend);
1095
1096  memset (addend, 0, sizeof (addend));
1097  switch ((rel->howto->bitsize))
1098    {
1099      case 8:
1100        suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 1);
1101        if (suc && rel->howto->pc_relative)
1102          _addend = (bfd_vma) ((bfd_signed_vma) ((char) bfd_get_8 (s->owner, addend)));
1103        else if (suc)
1104          _addend = ((bfd_vma) bfd_get_8 (s->owner, addend)) & 0xff;
1105        break;
1106      case 16:
1107        suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 2);
1108        if (suc && rel->howto->pc_relative)
1109          _addend = (bfd_vma) ((bfd_signed_vma) ((short) bfd_get_16 (s->owner, addend)));
1110        else if (suc)
1111          _addend = ((bfd_vma) bfd_get_16 (s->owner, addend)) & 0xffff;
1112        break;
1113      case 32:
1114        suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 4);
1115        if (suc && rel->howto->pc_relative)
1116          _addend = (bfd_vma) ((bfd_signed_vma) ((int) bfd_get_32 (s->owner, addend)));
1117        else if (suc)
1118          _addend = ((bfd_vma) bfd_get_32 (s->owner, addend)) & 0xffffffff;
1119        break;
1120      case 64:
1121        suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 8);
1122        if (suc)
1123          _addend = ((bfd_vma) bfd_get_64 (s->owner, addend));
1124        break;
1125    }
1126  if (! suc)
1127    einfo (_("%C: Cannot get section contents - auto-import exception\n"),
1128	   s->owner, s, rel->address);
1129
1130  if (pep_dll_extra_pe_debug)
1131    {
1132      printf ("import of 0x%lx(0x%lx) sec_addr=0x%lx", (long) _addend, (long) rel->addend, (long) rel->address);
1133      if (rel->howto->pc_relative) printf (" pcrel");
1134      printf (" %d bit rel.\n",(int) rel->howto->bitsize);
1135  }
1136  pep_create_import_fixup (rel, s, _addend);
1137
1138  return 1;
1139}
1140
1141static void
1142pep_find_data_imports (void)
1143{
1144  struct bfd_link_hash_entry *undef, *sym;
1145
1146  if (link_info.pei386_auto_import == 0)
1147    return;
1148
1149  for (undef = link_info.hash->undefs; undef; undef=undef->u.undef.next)
1150    {
1151      if (undef->type == bfd_link_hash_undefined)
1152	{
1153	  /* C++ symbols are *long*.  */
1154	  char buf[4096];
1155
1156	  if (pep_dll_extra_pe_debug)
1157	    printf ("%s:%s\n", __FUNCTION__, undef->root.string);
1158
1159	  sprintf (buf, "__imp_%s", undef->root.string);
1160
1161	  sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
1162
1163	  if (sym && sym->type == bfd_link_hash_defined)
1164	    {
1165	      bfd *b = sym->u.def.section->owner;
1166	      asymbol **symbols;
1167	      int nsyms, i;
1168
1169	      if (!bfd_generic_link_read_symbols (b))
1170		{
1171		  einfo (_("%B%F: could not read symbols: %E\n"), b);
1172		  return;
1173		}
1174
1175	      symbols = bfd_get_outsymbols (b);
1176	      nsyms = bfd_get_symcount (b);
1177
1178	      for (i = 0; i < nsyms; i++)
1179		{
1180		  if (! CONST_STRNEQ (symbols[i]->name, U ("_head_")))
1181		    continue;
1182
1183		  if (pep_dll_extra_pe_debug)
1184		    printf ("->%s\n", symbols[i]->name);
1185
1186		  pep_data_import_dll = (char*) (symbols[i]->name +
1187						 U_SIZE ("_head_") - 1);
1188		  break;
1189		}
1190
1191	      pep_walk_relocs_of_symbol (&link_info, undef->root.string,
1192					 make_import_fixup);
1193
1194	      /* Let's differentiate it somehow from defined.  */
1195	      undef->type = bfd_link_hash_defweak;
1196	      /* We replace original name with __imp_ prefixed, this
1197		 1) may trash memory 2) leads to duplicate symbol generation.
1198		 Still, IMHO it's better than having name poluted.  */
1199	      undef->root.string = sym->root.string;
1200	      undef->u.def.value = sym->u.def.value;
1201	      undef->u.def.section = sym->u.def.section;
1202	    }
1203	}
1204    }
1205}
1206
1207static bfd_boolean
1208pr_sym (struct bfd_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
1209{
1210  printf ("+%s\n", h->string);
1211
1212  return TRUE;
1213}
1214#endif /* DLL_SUPPORT */
1215
1216static void
1217debug_section_p (bfd *abfd ATTRIBUTE_UNUSED, asection *sect, void *obj)
1218{
1219  int *found = (int *) obj;
1220
1221  if (strncmp (".debug_", sect->name, sizeof (".debug_") - 1) == 0)
1222    *found = 1;
1223}
1224
1225static bfd_boolean
1226pecoff_checksum_contents (bfd *abfd,
1227			  void (*process) (const void *, size_t, void *),
1228			  void *arg)
1229{
1230  file_ptr filepos = (file_ptr) 0;
1231
1232  while (1)
1233    {
1234      unsigned char b;
1235      int status;
1236
1237      if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
1238	return 0;
1239
1240      status = bfd_bread (&b, (bfd_size_type) 1, abfd);
1241      if (status < 1)
1242        {
1243          break;
1244        }
1245
1246      (*process) (&b, 1, arg);
1247      filepos += 1;
1248    }
1249
1250  return TRUE;
1251}
1252
1253static bfd_boolean
1254write_build_id (bfd *abfd)
1255{
1256  struct pe_tdata *t = pe_data (abfd);
1257  asection *asec;
1258  struct bfd_link_order *link_order = NULL;
1259  unsigned char *contents;
1260  bfd_size_type size;
1261  bfd_size_type build_id_size;
1262  unsigned char *build_id;
1263
1264  /* Find the section the .buildid output section has been merged info.  */
1265  for (asec = abfd->sections; asec != NULL; asec = asec->next)
1266    {
1267      struct bfd_link_order *l = NULL;
1268      for (l = asec->map_head.link_order; l != NULL; l = l->next)
1269        {
1270          if ((l->type == bfd_indirect_link_order))
1271            {
1272              if (l->u.indirect.section == t->build_id.sec)
1273                {
1274                  link_order = l;
1275                  break;
1276                }
1277            }
1278        }
1279
1280      if (link_order)
1281        break;
1282    }
1283
1284  if (!link_order)
1285    {
1286      einfo (_("%P: warning: .buildid section discarded,"
1287               " --build-id ignored.\n"));
1288      return TRUE;
1289    }
1290
1291  const char * pdb_name = _bfd_XXi_get_codeview_pdb_name (abfd);
1292  unsigned int pdb_name_length = strlen(pdb_name);
1293
1294  if (t->build_id.sec->contents == NULL)
1295    t->build_id.sec->contents = (unsigned char *) xmalloc (t->build_id.sec->size);
1296  contents = t->build_id.sec->contents;
1297  size = t->build_id.sec->size;
1298
1299  build_id_size = compute_build_id_size (t->build_id.style);
1300  build_id = xmalloc (build_id_size);
1301  generate_build_id (abfd, t->build_id.style, pecoff_checksum_contents, build_id, build_id_size);
1302
1303  bfd_vma ib = pe_data (link_info.output_bfd)->pe_opthdr.ImageBase;
1304
1305  /* Construct a debug directory entry which points to an immediately following CodeView record.  */
1306  struct internal_IMAGE_DEBUG_DIRECTORY idd;
1307  idd.Characteristics = 0;
1308  idd.TimeDateStamp = 0;
1309  idd.MajorVersion = 0;
1310  idd.MinorVersion = 0;
1311  idd.Type = PE_IMAGE_DEBUG_TYPE_CODEVIEW;
1312  idd.SizeOfData = sizeof (CV_INFO_PDB70) + pdb_name_length + 1;
1313  idd.AddressOfRawData = asec->vma - ib + link_order->offset
1314    + sizeof (struct external_IMAGE_DEBUG_DIRECTORY);
1315  idd.PointerToRawData = asec->filepos + link_order->offset
1316    + sizeof (struct external_IMAGE_DEBUG_DIRECTORY);
1317
1318  struct external_IMAGE_DEBUG_DIRECTORY *ext = (struct external_IMAGE_DEBUG_DIRECTORY *)contents;
1319  _bfd_XXi_swap_debugdir_out (abfd, &idd, ext);
1320
1321  /* Write the debug directory enttry */
1322  if (bfd_seek (abfd, asec->filepos + link_order->offset, SEEK_SET) != 0)
1323    return 0;
1324
1325  if ((bfd_bwrite (contents, size, abfd) != size))
1326    return 0;
1327
1328  /* Construct the CodeView record.  */
1329  CODEVIEW_INFO cvinfo;
1330  cvinfo.CVSignature = CVINFO_PDB70_CVSIGNATURE;
1331  cvinfo.Age = 1;
1332
1333  /* Zero pad or truncate the generated build_id to fit in the CodeView record.  */
1334  memset (&(cvinfo.Signature), 0, CV_INFO_SIGNATURE_LENGTH);
1335  memcpy (&(cvinfo.Signature), build_id, (build_id_size > CV_INFO_SIGNATURE_LENGTH)
1336	  ? CV_INFO_SIGNATURE_LENGTH :  build_id_size);
1337
1338  free (build_id);
1339
1340  /* Write the codeview record.  */
1341  if (_bfd_XXi_write_codeview_record (abfd, idd.PointerToRawData, &cvinfo) == 0)
1342    return 0;
1343
1344  /* Record the location of the debug directory in the data directory.  */
1345  pe_data (link_info.output_bfd)->pe_opthdr.DataDirectory[PE_DEBUG_DATA].VirtualAddress
1346    = asec->vma  - ib + link_order->offset;
1347  pe_data (link_info.output_bfd)->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size
1348    = sizeof (struct external_IMAGE_DEBUG_DIRECTORY);
1349
1350  return TRUE;
1351}
1352
1353/* Make .buildid section, and set up coff_tdata->build_id. */
1354static bfd_boolean
1355setup_build_id (bfd *ibfd)
1356{
1357  asection *s;
1358  flagword flags;
1359
1360  if (!validate_build_id_style (emit_build_id))
1361    {
1362      einfo ("%P: warning: unrecognized --build-id style ignored.\n");
1363      return FALSE;
1364    }
1365
1366  flags = (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_IN_MEMORY
1367	   | SEC_LINKER_CREATED | SEC_READONLY | SEC_DATA);
1368  s = bfd_make_section_anyway_with_flags (ibfd, ".buildid", flags);
1369  if (s != NULL)
1370    {
1371      struct pe_tdata *t = pe_data (link_info.output_bfd);
1372      t->build_id.after_write_object_contents = &write_build_id;
1373      t->build_id.style = emit_build_id;
1374      t->build_id.sec = s;
1375
1376      /* Section is a variable size:
1377	 One IMAGE_DEBUG_DIRECTORY entry, of type IMAGE_DEBUG_TYPE_CODEVIEW,
1378	 pointing at a CV_INFO_PDB70 record containing the build-id, with a
1379	 null terminated string for PdbFileName.  */
1380      s->size = sizeof (struct external_IMAGE_DEBUG_DIRECTORY)
1381       + sizeof (CV_INFO_PDB70) + strlen(_bfd_XXi_get_codeview_pdb_name(link_info.output_bfd)) + 1;
1382
1383      return TRUE;
1384    }
1385
1386  einfo ("%P: warning: Cannot create .buildid section,"
1387	 " --build-id ignored.\n");
1388  return FALSE;
1389}
1390
1391static void
1392gld_${EMULATION_NAME}_after_open (void)
1393{
1394  after_open_default ();
1395
1396  is_underscoring ();
1397#ifdef DLL_SUPPORT
1398  if (pep_dll_extra_pe_debug)
1399    {
1400      bfd *a;
1401      struct bfd_link_hash_entry *sym;
1402
1403      printf ("%s()\n", __FUNCTION__);
1404
1405      for (sym = link_info.hash->undefs; sym; sym=sym->u.undef.next)
1406	printf ("-%s\n", sym->root.string);
1407      bfd_hash_traverse (&link_info.hash->table, pr_sym, NULL);
1408
1409      for (a = link_info.input_bfds; a; a = a->link.next)
1410	printf ("*%s\n",a->filename);
1411    }
1412#endif
1413
1414  if (emit_build_id != NULL)
1415    {
1416      bfd *abfd;
1417
1418      /* Find a COFF input.  */
1419      for (abfd = link_info.input_bfds;
1420	   abfd != (bfd *) NULL; abfd = abfd->link.next)
1421	if (bfd_get_flavour (abfd) == bfd_target_coff_flavour)
1422	  break;
1423
1424      /* If there are no COFF input files do not try to
1425	 add a build-id section.  */
1426      if (abfd == NULL
1427	  || !setup_build_id (abfd))
1428	{
1429	  free ((char *) emit_build_id);
1430	  emit_build_id = NULL;
1431	}
1432    }
1433
1434  /* Pass the wacky PE command line options into the output bfd.
1435     FIXME: This should be done via a function, rather than by
1436     including an internal BFD header.  */
1437
1438  if (coff_data (link_info.output_bfd) == NULL
1439      || coff_data (link_info.output_bfd)->pe == 0)
1440    einfo (_("%F%P: cannot perform PE operations on non PE output file '%B'.\n"),
1441	   link_info.output_bfd);
1442
1443  pe_data (link_info.output_bfd)->pe_opthdr = pep;
1444  pe_data (link_info.output_bfd)->dll = init[DLLOFF].value;
1445  pe_data (link_info.output_bfd)->real_flags |= real_flags;
1446  pe_data (link_info.output_bfd)->insert_timestamp = insert_timestamp;
1447
1448  /* At this point we must decide whether to use long section names
1449     in the output or not.  If the user hasn't explicitly specified
1450     on the command line, we leave it to the default for the format
1451     (object files yes, image files no), except if there is debug
1452     information present; GDB relies on the long section names to
1453     find it, so enable it in that case.  */
1454  if (pep_use_coff_long_section_names < 0 && link_info.strip == strip_none)
1455    {
1456      if (link_info.relocatable)
1457	pep_use_coff_long_section_names = 1;
1458      else
1459	{
1460	  /* Iterate over all sections of all input BFDs, checking
1461	     for any that begin 'debug_' and are long names.  */
1462	  LANG_FOR_EACH_INPUT_STATEMENT (is)
1463	  {
1464	    int found_debug = 0;
1465
1466	    bfd_map_over_sections (is->the_bfd, debug_section_p, &found_debug);
1467	    if (found_debug)
1468	      {
1469		pep_use_coff_long_section_names = 1;
1470		break;
1471	      }
1472	  }
1473	}
1474    }
1475
1476  pep_output_file_set_long_section_names (link_info.output_bfd);
1477
1478#ifdef DLL_SUPPORT
1479  if (pep_enable_stdcall_fixup) /* -1=warn or 1=disable */
1480    pep_fixup_stdcalls ();
1481
1482  pep_process_import_defs (link_info.output_bfd, &link_info);
1483
1484  pep_find_data_imports ();
1485
1486  /* As possibly new symbols are added by imports, we rerun
1487     stdcall/fastcall fixup here.  */
1488  if (pep_enable_stdcall_fixup) /* -1=warn or 1=disable */
1489    pep_fixup_stdcalls ();
1490
1491#ifndef TARGET_IS_i386pep
1492  if (link_info.shared)
1493#else
1494  if (!link_info.relocatable)
1495#endif
1496    pep_dll_build_sections (link_info.output_bfd, &link_info);
1497
1498#ifndef TARGET_IS_i386pep
1499  else
1500    pep_exe_build_sections (link_info.output_bfd, &link_info);
1501#endif
1502#endif /* DLL_SUPPORT */
1503
1504  {
1505    /* This next chunk of code tries to detect the case where you have
1506       two import libraries for the same DLL (specifically,
1507       symbolically linking libm.a and libc.a in cygwin to
1508       libcygwin.a).  In those cases, it's possible for function
1509       thunks from the second implib to be used but without the
1510       head/tail objects, causing an improper import table.  We detect
1511       those cases and rename the "other" import libraries to match
1512       the one the head/tail come from, so that the linker will sort
1513       things nicely and produce a valid import table.  */
1514
1515    LANG_FOR_EACH_INPUT_STATEMENT (is)
1516      {
1517	if (is->the_bfd->my_archive)
1518	  {
1519	    int idata2 = 0, reloc_count=0, is_imp = 0;
1520	    asection *sec;
1521
1522	    /* See if this is an import library thunk.  */
1523	    for (sec = is->the_bfd->sections; sec; sec = sec->next)
1524	      {
1525		if (strcmp (sec->name, ".idata\$2") == 0)
1526		  idata2 = 1;
1527		if (CONST_STRNEQ (sec->name, ".idata\$"))
1528		  is_imp = 1;
1529		reloc_count += sec->reloc_count;
1530	      }
1531
1532	    if (is_imp && !idata2 && reloc_count)
1533	      {
1534		/* It is, look for the reference to head and see if it's
1535		   from our own library.  */
1536		for (sec = is->the_bfd->sections; sec; sec = sec->next)
1537		  {
1538		    int i;
1539		    long relsize;
1540		    asymbol **symbols;
1541		    arelent **relocs;
1542		    int nrelocs;
1543
1544		    relsize = bfd_get_reloc_upper_bound (is->the_bfd, sec);
1545		    if (relsize < 1)
1546		      break;
1547
1548		    if (!bfd_generic_link_read_symbols (is->the_bfd))
1549		      {
1550			einfo (_("%B%F: could not read symbols: %E\n"),
1551			       is->the_bfd);
1552			return;
1553		      }
1554		    symbols = bfd_get_outsymbols (is->the_bfd);
1555
1556		    relocs = xmalloc ((size_t) relsize);
1557		    nrelocs = bfd_canonicalize_reloc (is->the_bfd, sec,
1558						      relocs, symbols);
1559		    if (nrelocs < 0)
1560		      {
1561			free (relocs);
1562			einfo ("%X%P: unable to process relocs: %E\n");
1563			return;
1564		      }
1565
1566		    for (i = 0; i < nrelocs; i++)
1567		      {
1568			struct bfd_symbol *s;
1569			struct bfd_link_hash_entry * blhe;
1570			char *other_bfd_filename;
1571			char *n;
1572
1573			s = (relocs[i]->sym_ptr_ptr)[0];
1574
1575			if (s->flags & BSF_LOCAL)
1576			  continue;
1577
1578			/* Thunk section with reloc to another bfd.  */
1579			blhe = bfd_link_hash_lookup (link_info.hash,
1580						     s->name,
1581						     FALSE, FALSE, TRUE);
1582
1583			if (blhe == NULL
1584			    || blhe->type != bfd_link_hash_defined)
1585			  continue;
1586
1587			other_bfd_filename
1588			  = blhe->u.def.section->owner->my_archive
1589			    ? bfd_get_filename (blhe->u.def.section->owner->my_archive)
1590			    : bfd_get_filename (blhe->u.def.section->owner);
1591
1592			if (filename_cmp (bfd_get_filename
1593					    (is->the_bfd->my_archive),
1594					  other_bfd_filename) == 0)
1595			  continue;
1596
1597			/* Rename this implib to match the other one.  */
1598			n = xmalloc (strlen (other_bfd_filename) + 1);
1599			strcpy (n, other_bfd_filename);
1600			is->the_bfd->my_archive->filename = n;
1601		      }
1602
1603		    free (relocs);
1604		    /* Note - we do not free the symbols,
1605		       they are now cached in the BFD.  */
1606		  }
1607	      }
1608	  }
1609      }
1610  }
1611
1612  {
1613    int is_ms_arch = 0;
1614    bfd *cur_arch = 0;
1615    lang_input_statement_type *is2;
1616    lang_input_statement_type *is3;
1617
1618    /* Careful - this is a shell script.  Watch those dollar signs! */
1619    /* Microsoft import libraries have every member named the same,
1620       and not in the right order for us to link them correctly.  We
1621       must detect these and rename the members so that they'll link
1622       correctly.  There are three types of objects: the head, the
1623       thunks, and the sentinel(s).  The head is easy; it's the one
1624       with idata2.  We assume that the sentinels won't have relocs,
1625       and the thunks will.  It's easier than checking the symbol
1626       table for external references.  */
1627    LANG_FOR_EACH_INPUT_STATEMENT (is)
1628      {
1629	if (is->the_bfd->my_archive)
1630	  {
1631	    char *pnt;
1632	    bfd *arch = is->the_bfd->my_archive;
1633
1634	    if (cur_arch != arch)
1635	      {
1636		cur_arch = arch;
1637		is_ms_arch = 1;
1638
1639		for (is3 = is;
1640		     is3 && is3->the_bfd->my_archive == arch;
1641		     is3 = (lang_input_statement_type *) is3->next)
1642		  {
1643		    /* A MS dynamic import library can also contain static
1644		       members, so look for the first element with a .dll
1645		       extension, and use that for the remainder of the
1646		       comparisons.  */
1647		    pnt = strrchr (is3->the_bfd->filename, '.');
1648		    if (pnt != NULL && filename_cmp (pnt, ".dll") == 0)
1649		      break;
1650		  }
1651
1652		if (is3 == NULL)
1653		  is_ms_arch = 0;
1654		else
1655		  {
1656		    /* OK, found one.  Now look to see if the remaining
1657		       (dynamic import) members use the same name.  */
1658		    for (is2 = is;
1659			 is2 && is2->the_bfd->my_archive == arch;
1660			 is2 = (lang_input_statement_type *) is2->next)
1661		      {
1662			/* Skip static members, ie anything with a .obj
1663			   extension.  */
1664			pnt = strrchr (is2->the_bfd->filename, '.');
1665			if (pnt != NULL && filename_cmp (pnt, ".obj") == 0)
1666			  continue;
1667
1668			if (filename_cmp (is3->the_bfd->filename,
1669					  is2->the_bfd->filename))
1670			  {
1671			    is_ms_arch = 0;
1672			    break;
1673			  }
1674		      }
1675		  }
1676	      }
1677
1678	    /* This fragment might have come from an .obj file in a Microsoft
1679	       import, and not an actual import record. If this is the case,
1680	       then leave the filename alone.  */
1681	    pnt = strrchr (is->the_bfd->filename, '.');
1682
1683	    if (is_ms_arch && (filename_cmp (pnt, ".dll") == 0))
1684	      {
1685		int idata2 = 0, reloc_count=0;
1686		asection *sec;
1687		char *new_name, seq;
1688
1689		for (sec = is->the_bfd->sections; sec; sec = sec->next)
1690		  {
1691		    if (strcmp (sec->name, ".idata\$2") == 0)
1692		      idata2 = 1;
1693		    reloc_count += sec->reloc_count;
1694		  }
1695
1696		if (idata2) /* .idata2 is the TOC */
1697		  seq = 'a';
1698		else if (reloc_count > 0) /* thunks */
1699		  seq = 'b';
1700		else /* sentinel */
1701		  seq = 'c';
1702
1703		new_name = xmalloc (strlen (is->the_bfd->filename) + 3);
1704		sprintf (new_name, "%s.%c", is->the_bfd->filename, seq);
1705		is->the_bfd->filename = new_name;
1706
1707		new_name = xmalloc (strlen (is->filename) + 3);
1708		sprintf (new_name, "%s.%c", is->filename, seq);
1709		is->filename = new_name;
1710	      }
1711	  }
1712      }
1713  }
1714}
1715
1716static void
1717gld_${EMULATION_NAME}_before_allocation (void)
1718{
1719  is_underscoring ();
1720  before_allocation_default ();
1721}
1722
1723#ifdef DLL_SUPPORT
1724/* This is called when an input file isn't recognized as a BFD.  We
1725   check here for .DEF files and pull them in automatically.  */
1726
1727static int
1728saw_option (char *option)
1729{
1730  int i;
1731
1732  is_underscoring ();
1733
1734  for (i = 0; init[i].ptr; i++)
1735    if (strcmp (GET_INIT_SYMBOL_NAME (i), option) == 0)
1736      return init[i].inited;
1737  return 0;
1738}
1739#endif /* DLL_SUPPORT */
1740
1741static bfd_boolean
1742gld_${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry ATTRIBUTE_UNUSED)
1743{
1744#ifdef DLL_SUPPORT
1745  const char *ext = entry->filename + strlen (entry->filename) - 4;
1746
1747  if (filename_cmp (ext, ".def") == 0 || filename_cmp (ext, ".DEF") == 0)
1748    {
1749      pep_def_file = def_file_parse (entry->filename, pep_def_file);
1750
1751      if (pep_def_file)
1752	{
1753	  int i, buflen=0, len;
1754	  char *buf;
1755
1756	  for (i = 0; i < pep_def_file->num_exports; i++)
1757	    {
1758	      len = strlen (pep_def_file->exports[i].internal_name);
1759	      if (buflen < len + 2)
1760		buflen = len + 2;
1761	    }
1762
1763	  buf = xmalloc (buflen);
1764
1765	  for (i = 0; i < pep_def_file->num_exports; i++)
1766	    {
1767	      struct bfd_link_hash_entry *h;
1768
1769	      sprintf (buf, "%s%s", U (""),
1770		       pep_def_file->exports[i].internal_name);
1771
1772	      h = bfd_link_hash_lookup (link_info.hash, buf, TRUE, TRUE, TRUE);
1773	      if (h == (struct bfd_link_hash_entry *) NULL)
1774		einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
1775	      if (h->type == bfd_link_hash_new)
1776		{
1777		  h->type = bfd_link_hash_undefined;
1778		  h->u.undef.abfd = NULL;
1779		  bfd_link_add_undef (link_info.hash, h);
1780		}
1781	    }
1782	  free (buf);
1783
1784	  /* def_file_print (stdout, pep_def_file); */
1785	  if (pep_def_file->is_dll == 1)
1786	    link_info.shared = 1;
1787
1788	  if (pep_def_file->base_address != (bfd_vma)(-1))
1789	    {
1790	      pep.ImageBase
1791		= pe_data (link_info.output_bfd)->pe_opthdr.ImageBase
1792		= init[IMAGEBASEOFF].value
1793		= pep_def_file->base_address;
1794	      init[IMAGEBASEOFF].inited = 1;
1795	      if (image_base_statement)
1796		image_base_statement->exp
1797		  = exp_assign ("__image_base__", exp_intop (pep.ImageBase),
1798				FALSE);
1799	    }
1800
1801	  if (pep_def_file->stack_reserve != -1
1802	      && ! saw_option ("__size_of_stack_reserve__"))
1803	    {
1804	      pep.SizeOfStackReserve = pep_def_file->stack_reserve;
1805	      if (pep_def_file->stack_commit != -1)
1806		pep.SizeOfStackCommit = pep_def_file->stack_commit;
1807	    }
1808	  if (pep_def_file->heap_reserve != -1
1809	      && ! saw_option ("__size_of_heap_reserve__"))
1810	    {
1811	      pep.SizeOfHeapReserve = pep_def_file->heap_reserve;
1812	      if (pep_def_file->heap_commit != -1)
1813		pep.SizeOfHeapCommit = pep_def_file->heap_commit;
1814	    }
1815	  return TRUE;
1816	}
1817    }
1818#endif
1819  return FALSE;
1820}
1821
1822static bfd_boolean
1823gld_${EMULATION_NAME}_recognized_file (lang_input_statement_type *entry ATTRIBUTE_UNUSED)
1824{
1825  is_underscoring ();
1826#ifdef DLL_SUPPORT
1827#ifdef TARGET_IS_i386pep
1828  pep_dll_id_target ("pei-x86-64");
1829#endif
1830  if (pep_bfd_is_dll (entry->the_bfd))
1831    return pep_implied_import_dll (entry->filename);
1832#endif
1833  return FALSE;
1834}
1835
1836static void
1837gld_${EMULATION_NAME}_finish (void)
1838{
1839  is_underscoring ();
1840  finish_default ();
1841
1842#ifdef DLL_SUPPORT
1843  if (link_info.shared
1844      || (!link_info.relocatable && pep_def_file->num_exports != 0))
1845    {
1846      pep_dll_fill_sections (link_info.output_bfd, &link_info);
1847      if (pep_implib_filename)
1848	pep_dll_generate_implib (pep_def_file, pep_implib_filename, &link_info);
1849    }
1850
1851  if (pep_out_def_filename)
1852    pep_dll_generate_def_file (pep_out_def_filename);
1853#endif /* DLL_SUPPORT */
1854
1855  /* I don't know where .idata gets set as code, but it shouldn't be.  */
1856  {
1857    asection *asec = bfd_get_section_by_name (link_info.output_bfd, ".idata");
1858
1859    if (asec)
1860      {
1861	asec->flags &= ~SEC_CODE;
1862	asec->flags |= SEC_DATA;
1863      }
1864  }
1865}
1866
1867
1868/* Place an orphan section.
1869
1870   We use this to put sections in a reasonable place in the file, and
1871   to ensure that they are aligned as required.
1872
1873   We handle grouped sections here as well.  A section named .foo\$nn
1874   goes into the output section .foo.  All grouped sections are sorted
1875   by name.
1876
1877   Grouped sections for the default sections are handled by the
1878   default linker script using wildcards, and are sorted by
1879   sort_sections.  */
1880
1881static lang_output_section_statement_type *
1882gld_${EMULATION_NAME}_place_orphan (asection *s,
1883				    const char *secname,
1884				    int constraint)
1885{
1886  const char *orig_secname = secname;
1887  char *dollar = NULL;
1888  lang_output_section_statement_type *os;
1889  lang_statement_list_type add_child;
1890  lang_output_section_statement_type *match_by_name = NULL;
1891  lang_statement_union_type **pl;
1892
1893  /* Look through the script to see where to place this section.  */
1894  if (!link_info.relocatable
1895      && (dollar = strchr (secname, '\$')) != NULL)
1896    {
1897      size_t len = dollar - secname;
1898      char *newname = xmalloc (len + 1);
1899      memcpy (newname, secname, len);
1900      newname[len] = '\0';
1901      secname = newname;
1902    }
1903
1904  lang_list_init (&add_child);
1905
1906  os = NULL;
1907  if (constraint == 0)
1908    for (os = lang_output_section_find (secname);
1909	 os != NULL;
1910	 os = next_matching_output_section_statement (os, 0))
1911      {
1912	/* If we don't match an existing output section, tell
1913	   lang_insert_orphan to create a new output section.  */
1914	constraint = SPECIAL;
1915
1916	if (os->bfd_section != NULL
1917	    && (os->bfd_section->flags == 0
1918		|| ((s->flags ^ os->bfd_section->flags)
1919		    & (SEC_LOAD | SEC_ALLOC)) == 0))
1920	  {
1921	    /* We already have an output section statement with this
1922	       name, and its bfd section has compatible flags.
1923	       If the section already exists but does not have any flags set,
1924	       then it has been created by the linker, probably as a result of
1925	       a --section-start command line switch.  */
1926	    lang_add_section (&add_child, s, NULL, os);
1927	    break;
1928	  }
1929
1930	/* Save unused output sections in case we can match them
1931	   against orphans later.  */
1932	if (os->bfd_section == NULL)
1933	  match_by_name = os;
1934      }
1935
1936  /* If we didn't match an active output section, see if we matched an
1937     unused one and use that.  */
1938  if (os == NULL && match_by_name)
1939    {
1940      lang_add_section (&match_by_name->children, s, NULL, match_by_name);
1941      return match_by_name;
1942    }
1943
1944  if (os == NULL)
1945    {
1946      static struct orphan_save hold[] =
1947	{
1948	  { ".text",
1949	    SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1950	    0, 0, 0, 0 },
1951	  { ".idata",
1952	    SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1953	    0, 0, 0, 0 },
1954	  { ".rdata",
1955	    SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1956	    0, 0, 0, 0 },
1957	  { ".data",
1958	    SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1959	    0, 0, 0, 0 },
1960	  { ".bss",
1961	    SEC_ALLOC,
1962	    0, 0, 0, 0 }
1963	};
1964      enum orphan_save_index
1965	{
1966	  orphan_text = 0,
1967	  orphan_idata,
1968	  orphan_rodata,
1969	  orphan_data,
1970	  orphan_bss
1971	};
1972      static int orphan_init_done = 0;
1973      struct orphan_save *place;
1974      lang_output_section_statement_type *after;
1975      etree_type *address;
1976
1977      if (!orphan_init_done)
1978	{
1979	  struct orphan_save *ho;
1980	  for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
1981	    if (ho->name != NULL)
1982	      {
1983		ho->os = lang_output_section_find (ho->name);
1984		if (ho->os != NULL && ho->os->flags == 0)
1985		  ho->os->flags = ho->flags;
1986	      }
1987	  orphan_init_done = 1;
1988	}
1989
1990      /* Try to put the new output section in a reasonable place based
1991	 on the section name and section flags.  */
1992
1993      place = NULL;
1994      if ((s->flags & SEC_ALLOC) == 0)
1995	;
1996      else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
1997	place = &hold[orphan_bss];
1998      else if ((s->flags & SEC_READONLY) == 0)
1999	place = &hold[orphan_data];
2000      else if ((s->flags & SEC_CODE) == 0)
2001	{
2002	  place = (!strncmp (secname, ".idata\$", 7) ? &hold[orphan_idata]
2003						     : &hold[orphan_rodata]);
2004	}
2005      else
2006	place = &hold[orphan_text];
2007
2008      after = NULL;
2009      if (place != NULL)
2010	{
2011	  if (place->os == NULL)
2012	    place->os = lang_output_section_find (place->name);
2013	  after = place->os;
2014	  if (after == NULL)
2015	    after = lang_output_section_find_by_flags (s, &place->os, NULL);
2016	  if (after == NULL)
2017	    /* *ABS* is always the first output section statement.  */
2018	    after = (&lang_output_section_statement.head
2019		     ->output_section_statement);
2020	}
2021
2022      /* All sections in an executable must be aligned to a page boundary.
2023	 In a relocatable link, just preserve the incoming alignment; the
2024	 address is discarded by lang_insert_orphan in that case, anyway.  */
2025      address = exp_unop (ALIGN_K, exp_nameop (NAME, "__section_alignment__"));
2026      os = lang_insert_orphan (s, secname, constraint, after, place, address,
2027			       &add_child);
2028      if (link_info.relocatable)
2029	{
2030	  os->section_alignment = s->alignment_power;
2031	  os->bfd_section->alignment_power = s->alignment_power;
2032	}
2033    }
2034
2035  /* If the section name has a '\$', sort it with the other '\$'
2036     sections.  */
2037  for (pl = &os->children.head; *pl != NULL; pl = &(*pl)->header.next)
2038    {
2039      lang_input_section_type *ls;
2040      const char *lname;
2041
2042      if ((*pl)->header.type != lang_input_section_enum)
2043	continue;
2044
2045      ls = &(*pl)->input_section;
2046
2047      lname = bfd_get_section_name (ls->section->owner, ls->section);
2048      if (strchr (lname, '\$') != NULL
2049	  && (dollar == NULL || strcmp (orig_secname, lname) < 0))
2050	break;
2051    }
2052
2053  if (add_child.head != NULL)
2054    {
2055      *add_child.tail = *pl;
2056      *pl = add_child.head;
2057    }
2058
2059  return os;
2060}
2061
2062static bfd_boolean
2063gld_${EMULATION_NAME}_open_dynamic_archive
2064  (const char *arch ATTRIBUTE_UNUSED,
2065   search_dirs_type *search,
2066   lang_input_statement_type *entry)
2067{
2068  static const struct
2069    {
2070      const char * format;
2071      bfd_boolean use_prefix;
2072    }
2073  libname_fmt [] =
2074    {
2075      /* Preferred explicit import library for dll's.  */
2076      { "lib%s.dll.a", FALSE },
2077      /* Alternate explicit import library for dll's.  */
2078      { "%s.dll.a", FALSE },
2079      /* "libfoo.a" could be either an import lib or a static lib.
2080          For backwards compatibility, libfoo.a needs to precede
2081          libfoo.dll and foo.dll in the search.  */
2082      { "lib%s.a", FALSE },
2083      /* The 'native' spelling of an import lib name is "foo.lib".  */
2084      { "%s.lib", FALSE },
2085#ifdef DLL_SUPPORT
2086      /* Try "<prefix>foo.dll" (preferred dll name, if specified).  */
2087      {	"%s%s.dll", TRUE },
2088#endif
2089      /* Try "libfoo.dll" (default preferred dll name).  */
2090      {	"lib%s.dll", FALSE },
2091      /* Finally try 'native' dll name "foo.dll".  */
2092      {  "%s.dll", FALSE },
2093      /* Note: If adding more formats to this table, make sure to check to
2094	 see if their length is longer than libname_fmt[0].format, and if
2095	 so, update the call to xmalloc() below.  */
2096      { NULL, FALSE }
2097    };
2098  static unsigned int format_max_len = 0;
2099  const char * filename;
2100  char * full_string;
2101  char * base_string;
2102  unsigned int i;
2103
2104
2105  if (! entry->flags.maybe_archive || entry->flags.full_name_provided)
2106    return FALSE;
2107
2108  filename = entry->filename;
2109
2110  if (format_max_len == 0)
2111    /* We need to allow space in the memory that we are going to allocate
2112       for the characters in the format string.  Since the format array is
2113       static we only need to calculate this information once.  In theory
2114       this value could also be computed statically, but this introduces
2115       the possibility for a discrepancy and hence a possible memory
2116       corruption.  The lengths we compute here will be too long because
2117       they will include any formating characters (%s) in the strings, but
2118       this will not matter.  */
2119    for (i = 0; libname_fmt[i].format; i++)
2120      if (format_max_len < strlen (libname_fmt[i].format))
2121	format_max_len = strlen (libname_fmt[i].format);
2122
2123  full_string = xmalloc (strlen (search->name)
2124			 + strlen (filename)
2125			 + format_max_len
2126#ifdef DLL_SUPPORT
2127			 + (pep_dll_search_prefix
2128			    ? strlen (pep_dll_search_prefix) : 0)
2129#endif
2130			 /* Allow for the terminating NUL and for the path
2131			    separator character that is inserted between
2132			    search->name and the start of the format string.  */
2133			 + 2);
2134
2135  sprintf (full_string, "%s/", search->name);
2136  base_string = full_string + strlen (full_string);
2137
2138  for (i = 0; libname_fmt[i].format; i++)
2139    {
2140#ifdef DLL_SUPPORT
2141      if (libname_fmt[i].use_prefix)
2142	{
2143	  if (!pep_dll_search_prefix)
2144	    continue;
2145	  sprintf (base_string, libname_fmt[i].format, pep_dll_search_prefix, filename);
2146	}
2147      else
2148#endif
2149	sprintf (base_string, libname_fmt[i].format, filename);
2150
2151      if (ldfile_try_open_bfd (full_string, entry))
2152	break;
2153    }
2154
2155  if (!libname_fmt[i].format)
2156    {
2157      free (full_string);
2158      return FALSE;
2159    }
2160
2161  entry->filename = full_string;
2162
2163  return TRUE;
2164}
2165
2166static int
2167gld_${EMULATION_NAME}_find_potential_libraries
2168  (char *name, lang_input_statement_type *entry)
2169{
2170  return ldfile_open_file_search (name, entry, "", ".lib");
2171}
2172
2173static char *
2174gld_${EMULATION_NAME}_get_script (int *isfile)
2175EOF
2176# Scripts compiled in.
2177# sed commands to quote an ld script as a C string.
2178sc="-f stringify.sed"
2179
2180fragment <<EOF
2181{
2182  *isfile = 0;
2183
2184  if (link_info.relocatable && config.build_constructors)
2185    return
2186EOF
2187sed $sc ldscripts/${EMULATION_NAME}.xu			>> e${EMULATION_NAME}.c
2188echo '  ; else if (link_info.relocatable) return'	>> e${EMULATION_NAME}.c
2189sed $sc ldscripts/${EMULATION_NAME}.xr			>> e${EMULATION_NAME}.c
2190echo '  ; else if (!config.text_read_only) return'	>> e${EMULATION_NAME}.c
2191sed $sc ldscripts/${EMULATION_NAME}.xbn			>> e${EMULATION_NAME}.c
2192echo '  ; else if (!config.magic_demand_paged) return'	>> e${EMULATION_NAME}.c
2193sed $sc ldscripts/${EMULATION_NAME}.xn			>> e${EMULATION_NAME}.c
2194if test -n "$GENERATE_AUTO_IMPORT_SCRIPT" ; then
2195echo '  ; else if (link_info.pei386_auto_import == 1 && link_info.pei386_runtime_pseudo_reloc != 2) return'	>> e${EMULATION_NAME}.c
2196sed $sc ldscripts/${EMULATION_NAME}.xa			>> e${EMULATION_NAME}.c
2197fi
2198echo '  ; else return'					>> e${EMULATION_NAME}.c
2199sed $sc ldscripts/${EMULATION_NAME}.x			>> e${EMULATION_NAME}.c
2200echo '; }'						>> e${EMULATION_NAME}.c
2201
2202fragment <<EOF
2203
2204
2205struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
2206{
2207  gld_${EMULATION_NAME}_before_parse,
2208  syslib_default,
2209  hll_default,
2210  gld_${EMULATION_NAME}_after_parse,
2211  gld_${EMULATION_NAME}_after_open,
2212  after_allocation_default,
2213  set_output_arch_default,
2214  ldemul_default_target,
2215  gld_${EMULATION_NAME}_before_allocation,
2216  gld_${EMULATION_NAME}_get_script,
2217  "${EMULATION_NAME}",
2218  "${OUTPUT_FORMAT}",
2219  gld_${EMULATION_NAME}_finish,
2220  NULL, /* Create output section statements.  */
2221  gld_${EMULATION_NAME}_open_dynamic_archive,
2222  gld_${EMULATION_NAME}_place_orphan,
2223  gld_${EMULATION_NAME}_set_symbols,
2224  NULL, /* parse_args */
2225  gld${EMULATION_NAME}_add_options,
2226  gld${EMULATION_NAME}_handle_option,
2227  gld_${EMULATION_NAME}_unrecognized_file,
2228  gld_${EMULATION_NAME}_list_options,
2229  gld_${EMULATION_NAME}_recognized_file,
2230  gld_${EMULATION_NAME}_find_potential_libraries,
2231  NULL,	/* new_vers_pattern.  */
2232  NULL	/* extra_map_file_text */
2233};
2234EOF
2235