Import binutils 2.18
[nacl-binutils.git] / ld / emultempl / pe.em
blobddee01125bbe4feaa28a48ba9545ba910eb54b33
1 # This shell script emits a C file. -*- C -*-
2 # It does some substitutions.
3 test -z "${ENTRY}" && ENTRY="_mainCRTStartup"
4 if [ -z "$MACHINE" ]; then
5   OUTPUT_ARCH=${ARCH}
6 else
7   OUTPUT_ARCH=${ARCH}:${MACHINE}
8 fi
9 rm -f e${EMULATION_NAME}.c
10 (echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
11 fragment <<EOF
12 /* Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
13    2005, 2006, 2007 Free Software Foundation, Inc.
15    This file is part of the GNU Binutils.
17    This program is free software; you can redistribute it and/or modify
18    it under the terms of the GNU General Public License as published by
19    the Free Software Foundation; either version 3 of the License, or
20    (at your option) any later version.
22    This program is distributed in the hope that it will be useful,
23    but WITHOUT ANY WARRANTY; without even the implied warranty of
24    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25    GNU General Public License for more details.
27    You should have received a copy of the GNU General Public License
28    along with this program; if not, write to the Free Software
29    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
30    MA 02110-1301, USA.  */
33 /* For WINDOWS_NT */
34 /* The original file generated returned different default scripts depending
35    on whether certain switches were set, but these switches pertain to the
36    Linux system and that particular version of coff.  In the NT case, we
37    only determine if the subsystem is console or windows in order to select
38    the correct entry point by default. */
40 #define TARGET_IS_${EMULATION_NAME}
42 /* Do this before including bfd.h, so we prototype the right functions.  */
44 #if defined(TARGET_IS_armpe) \
45     || defined(TARGET_IS_arm_epoc_pe) \
46     || defined(TARGET_IS_arm_wince_pe)
47 #define bfd_arm_allocate_interworking_sections \
48         bfd_${EMULATION_NAME}_allocate_interworking_sections
49 #define bfd_arm_get_bfd_for_interworking \
50         bfd_${EMULATION_NAME}_get_bfd_for_interworking
51 #define bfd_arm_process_before_allocation \
52         bfd_${EMULATION_NAME}_process_before_allocation
53 #endif
55 #include "sysdep.h"
56 #include "bfd.h"
57 #include "bfdlink.h"
58 #include "getopt.h"
59 #include "libiberty.h"
60 #include "ld.h"
61 #include "ldmain.h"
62 #include "ldexp.h"
63 #include "ldlang.h"
64 #include "ldfile.h"
65 #include "ldemul.h"
66 #include <ldgram.h>
67 #include "ldlex.h"
68 #include "ldmisc.h"
69 #include "ldctor.h"
70 #include "coff/internal.h"
72 /* FIXME: See bfd/peXXigen.c for why we include an architecture specific
73    header in generic PE code.  */
74 #include "coff/i386.h"
75 #include "coff/pe.h"
77 /* FIXME: This is a BFD internal header file, and we should not be
78    using it here.  */
79 #include "../bfd/libcoff.h"
81 #include "deffile.h"
82 #include "pe-dll.h"
83 #include "safe-ctype.h"
85 /* Permit the emulation parameters to override the default section
86    alignment by setting OVERRIDE_SECTION_ALIGNMENT.  FIXME: This makes
87    it seem that include/coff/internal.h should not define
88    PE_DEF_SECTION_ALIGNMENT.  */
89 #if PE_DEF_SECTION_ALIGNMENT != ${OVERRIDE_SECTION_ALIGNMENT:-PE_DEF_SECTION_ALIGNMENT}
90 #undef PE_DEF_SECTION_ALIGNMENT
91 #define PE_DEF_SECTION_ALIGNMENT ${OVERRIDE_SECTION_ALIGNMENT}
92 #endif
94 #if defined(TARGET_IS_i386pe) \
95     || defined(TARGET_IS_shpe) \
96     || defined(TARGET_IS_mipspe) \
97     || defined(TARGET_IS_armpe) \
98     || defined(TARGET_IS_arm_epoc_pe) \
99     || defined(TARGET_IS_arm_wince_pe)
100 #define DLL_SUPPORT
101 #endif
103 #if defined(TARGET_IS_i386pe) || ! defined(DLL_SUPPORT)
104 #define PE_DEF_SUBSYSTEM                3
105 #else
106 #undef NT_EXE_IMAGE_BASE
107 #undef PE_DEF_SECTION_ALIGNMENT
108 #undef PE_DEF_FILE_ALIGNMENT
109 #define NT_EXE_IMAGE_BASE               0x00010000
111 #if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_wince_pe)
112 #define PE_DEF_SECTION_ALIGNMENT        0x00001000
113 #define PE_DEF_SUBSYSTEM                9
114 #else
115 #define PE_DEF_SECTION_ALIGNMENT        0x00000400
116 #define PE_DEF_SUBSYSTEM                2
117 #endif
118 #define PE_DEF_FILE_ALIGNMENT           0x00000200
119 #endif
121 #define U(S) ${INITIAL_SYMBOL_CHAR} S
123 static struct internal_extra_pe_aouthdr pe;
124 static int dll;
125 static flagword real_flags = 0;
126 static int support_old_code = 0;
127 static char * thumb_entry_symbol = NULL;
128 static lang_assignment_statement_type *image_base_statement = 0;
130 #ifdef DLL_SUPPORT
131 static int pe_enable_stdcall_fixup = -1; /* 0=disable 1=enable.  */
132 static char *pe_out_def_filename = NULL;
133 static char *pe_implib_filename = NULL;
134 static int pe_enable_auto_image_base = 0;
135 static char *pe_dll_search_prefix = NULL;
136 #endif
138 extern const char *output_filename;
140 static void
141 gld_${EMULATION_NAME}_before_parse (void)
143   ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
144   output_filename = "${EXECUTABLE_NAME:-a.exe}";
145 #ifdef DLL_SUPPORT
146   config.dynamic_link = TRUE;
147   config.has_shared = 1;
148   link_info.pei386_auto_import = -1;
149   link_info.pei386_runtime_pseudo_reloc = -1;
151 #if (PE_DEF_SUBSYSTEM == 9) || (PE_DEF_SUBSYSTEM == 2)
152 #if defined TARGET_IS_mipspe || defined TARGET_IS_armpe || defined TARGET_IS_arm_wince_pe
153   lang_default_entry ("WinMainCRTStartup");
154 #else
155   lang_default_entry ("_WinMainCRTStartup");
156 #endif
157 #else
158   lang_default_entry ("${ENTRY}");
159 #endif
160 #endif
163 /* PE format extra command line options.  */
165 /* Used for setting flags in the PE header.  */
166 #define OPTION_BASE_FILE                (300  + 1)
167 #define OPTION_DLL                      (OPTION_BASE_FILE + 1)
168 #define OPTION_FILE_ALIGNMENT           (OPTION_DLL + 1)
169 #define OPTION_IMAGE_BASE               (OPTION_FILE_ALIGNMENT + 1)
170 #define OPTION_MAJOR_IMAGE_VERSION      (OPTION_IMAGE_BASE + 1)
171 #define OPTION_MAJOR_OS_VERSION         (OPTION_MAJOR_IMAGE_VERSION + 1)
172 #define OPTION_MAJOR_SUBSYSTEM_VERSION  (OPTION_MAJOR_OS_VERSION + 1)
173 #define OPTION_MINOR_IMAGE_VERSION      (OPTION_MAJOR_SUBSYSTEM_VERSION + 1)
174 #define OPTION_MINOR_OS_VERSION         (OPTION_MINOR_IMAGE_VERSION + 1)
175 #define OPTION_MINOR_SUBSYSTEM_VERSION  (OPTION_MINOR_OS_VERSION + 1)
176 #define OPTION_SECTION_ALIGNMENT        (OPTION_MINOR_SUBSYSTEM_VERSION + 1)
177 #define OPTION_STACK                    (OPTION_SECTION_ALIGNMENT + 1)
178 #define OPTION_SUBSYSTEM                (OPTION_STACK + 1)
179 #define OPTION_HEAP                     (OPTION_SUBSYSTEM + 1)
180 #define OPTION_SUPPORT_OLD_CODE         (OPTION_HEAP + 1)
181 #define OPTION_OUT_DEF                  (OPTION_SUPPORT_OLD_CODE + 1)
182 #define OPTION_EXPORT_ALL               (OPTION_OUT_DEF + 1)
183 #define OPTION_EXCLUDE_SYMBOLS          (OPTION_EXPORT_ALL + 1)
184 #define OPTION_KILL_ATS                 (OPTION_EXCLUDE_SYMBOLS + 1)
185 #define OPTION_STDCALL_ALIASES          (OPTION_KILL_ATS + 1)
186 #define OPTION_ENABLE_STDCALL_FIXUP     (OPTION_STDCALL_ALIASES + 1)
187 #define OPTION_DISABLE_STDCALL_FIXUP    (OPTION_ENABLE_STDCALL_FIXUP + 1)
188 #define OPTION_IMPLIB_FILENAME          (OPTION_DISABLE_STDCALL_FIXUP + 1)
189 #define OPTION_THUMB_ENTRY              (OPTION_IMPLIB_FILENAME + 1)
190 #define OPTION_WARN_DUPLICATE_EXPORTS   (OPTION_THUMB_ENTRY + 1)
191 #define OPTION_IMP_COMPAT               (OPTION_WARN_DUPLICATE_EXPORTS + 1)
192 #define OPTION_ENABLE_AUTO_IMAGE_BASE   (OPTION_IMP_COMPAT + 1)
193 #define OPTION_DISABLE_AUTO_IMAGE_BASE  (OPTION_ENABLE_AUTO_IMAGE_BASE + 1)
194 #define OPTION_DLL_SEARCH_PREFIX        (OPTION_DISABLE_AUTO_IMAGE_BASE + 1)
195 #define OPTION_NO_DEFAULT_EXCLUDES      (OPTION_DLL_SEARCH_PREFIX + 1)
196 #define OPTION_DLL_ENABLE_AUTO_IMPORT   (OPTION_NO_DEFAULT_EXCLUDES + 1)
197 #define OPTION_DLL_DISABLE_AUTO_IMPORT  (OPTION_DLL_ENABLE_AUTO_IMPORT + 1)
198 #define OPTION_ENABLE_EXTRA_PE_DEBUG    (OPTION_DLL_DISABLE_AUTO_IMPORT + 1)
199 #define OPTION_EXCLUDE_LIBS             (OPTION_ENABLE_EXTRA_PE_DEBUG + 1)
200 #define OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC  \
201                                         (OPTION_EXCLUDE_LIBS + 1)
202 #define OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC \
203                                         (OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC + 1)
204 #define OPTION_LARGE_ADDRESS_AWARE \
205                                         (OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC + 1)
207 static void
208 gld${EMULATION_NAME}_add_options
209   (int ns ATTRIBUTE_UNUSED, char **shortopts ATTRIBUTE_UNUSED, int nl,
210     struct option **longopts, int nrl ATTRIBUTE_UNUSED,
211     struct option **really_longopts ATTRIBUTE_UNUSED)
213   static const struct option xtra_long[] = {
214     /* PE options */
215     {"base-file", required_argument, NULL, OPTION_BASE_FILE},
216     {"dll", no_argument, NULL, OPTION_DLL},
217     {"file-alignment", required_argument, NULL, OPTION_FILE_ALIGNMENT},
218     {"heap", required_argument, NULL, OPTION_HEAP},
219     {"image-base", required_argument, NULL, OPTION_IMAGE_BASE},
220     {"major-image-version", required_argument, NULL, OPTION_MAJOR_IMAGE_VERSION},
221     {"major-os-version", required_argument, NULL, OPTION_MAJOR_OS_VERSION},
222     {"major-subsystem-version", required_argument, NULL, OPTION_MAJOR_SUBSYSTEM_VERSION},
223     {"minor-image-version", required_argument, NULL, OPTION_MINOR_IMAGE_VERSION},
224     {"minor-os-version", required_argument, NULL, OPTION_MINOR_OS_VERSION},
225     {"minor-subsystem-version", required_argument, NULL, OPTION_MINOR_SUBSYSTEM_VERSION},
226     {"section-alignment", required_argument, NULL, OPTION_SECTION_ALIGNMENT},
227     {"stack", required_argument, NULL, OPTION_STACK},
228     {"subsystem", required_argument, NULL, OPTION_SUBSYSTEM},
229     {"support-old-code", no_argument, NULL, OPTION_SUPPORT_OLD_CODE},
230     {"thumb-entry", required_argument, NULL, OPTION_THUMB_ENTRY},
231 #ifdef DLL_SUPPORT
232     /* getopt allows abbreviations, so we do this to stop it from treating -o
233        as an abbreviation for this option */
234     {"output-def", required_argument, NULL, OPTION_OUT_DEF},
235     {"output-def", required_argument, NULL, OPTION_OUT_DEF},
236     {"export-all-symbols", no_argument, NULL, OPTION_EXPORT_ALL},
237     {"exclude-symbols", required_argument, NULL, OPTION_EXCLUDE_SYMBOLS},
238     {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
239     {"kill-at", no_argument, NULL, OPTION_KILL_ATS},
240     {"add-stdcall-alias", no_argument, NULL, OPTION_STDCALL_ALIASES},
241     {"enable-stdcall-fixup", no_argument, NULL, OPTION_ENABLE_STDCALL_FIXUP},
242     {"disable-stdcall-fixup", no_argument, NULL, OPTION_DISABLE_STDCALL_FIXUP},
243     {"out-implib", required_argument, NULL, OPTION_IMPLIB_FILENAME},
244     {"warn-duplicate-exports", no_argument, NULL, OPTION_WARN_DUPLICATE_EXPORTS},
245     /* getopt() allows abbreviations, so we do this to stop it from
246        treating -c as an abbreviation for these --compat-implib.  */
247     {"compat-implib", no_argument, NULL, OPTION_IMP_COMPAT},
248     {"compat-implib", no_argument, NULL, OPTION_IMP_COMPAT},
249     {"enable-auto-image-base", no_argument, NULL, OPTION_ENABLE_AUTO_IMAGE_BASE},
250     {"disable-auto-image-base", no_argument, NULL, OPTION_DISABLE_AUTO_IMAGE_BASE},
251     {"dll-search-prefix", required_argument, NULL, OPTION_DLL_SEARCH_PREFIX},
252     {"no-default-excludes", no_argument, NULL, OPTION_NO_DEFAULT_EXCLUDES},
253     {"enable-auto-import", no_argument, NULL, OPTION_DLL_ENABLE_AUTO_IMPORT},
254     {"disable-auto-import", no_argument, NULL, OPTION_DLL_DISABLE_AUTO_IMPORT},
255     {"enable-extra-pe-debug", no_argument, NULL, OPTION_ENABLE_EXTRA_PE_DEBUG},
256     {"enable-runtime-pseudo-reloc", no_argument, NULL, OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC},
257     {"disable-runtime-pseudo-reloc", no_argument, NULL, OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC},
258 #endif
259     {"large-address-aware", no_argument, NULL, OPTION_LARGE_ADDRESS_AWARE},
260     {NULL, no_argument, NULL, 0}
261   };
263   *longopts = (struct option *)
264     xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
265   memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
268 /* PE/WIN32; added routines to get the subsystem type, heap and/or stack
269    parameters which may be input from the command line.  */
271 typedef struct
273   void *ptr;
274   int size;
275   int value;
276   char *symbol;
277   int inited;
278 } definfo;
280 #define D(field,symbol,def)  {&pe.field,sizeof(pe.field), def, symbol,0}
282 static definfo init[] =
284   /* imagebase must be first */
285 #define IMAGEBASEOFF 0
286   D(ImageBase,"__image_base__", NT_EXE_IMAGE_BASE),
287 #define DLLOFF 1
288   {&dll, sizeof(dll), 0, "__dll__", 0},
289   D(SectionAlignment,"__section_alignment__", PE_DEF_SECTION_ALIGNMENT),
290   D(FileAlignment,"__file_alignment__", PE_DEF_FILE_ALIGNMENT),
291   D(MajorOperatingSystemVersion,"__major_os_version__", 4),
292   D(MinorOperatingSystemVersion,"__minor_os_version__", 0),
293   D(MajorImageVersion,"__major_image_version__", 1),
294   D(MinorImageVersion,"__minor_image_version__", 0),
295 #if defined(TARGET_IS_armpe)  || defined(TARGET_IS_arm_wince_pe)
296   D(MajorSubsystemVersion,"__major_subsystem_version__", 3),
297 #else
298   D(MajorSubsystemVersion,"__major_subsystem_version__", 4),
299 #endif
300   D(MinorSubsystemVersion,"__minor_subsystem_version__", 0),
301   D(Subsystem,"__subsystem__", ${SUBSYSTEM}),
302   D(SizeOfStackReserve,"__size_of_stack_reserve__", 0x200000),
303   D(SizeOfStackCommit,"__size_of_stack_commit__", 0x1000),
304   D(SizeOfHeapReserve,"__size_of_heap_reserve__", 0x100000),
305   D(SizeOfHeapCommit,"__size_of_heap_commit__", 0x1000),
306   D(LoaderFlags,"__loader_flags__", 0x0),
307   { NULL, 0, 0, NULL, 0 }
311 static void
312 gld_${EMULATION_NAME}_list_options (FILE *file)
314   fprintf (file, _("  --base_file <basefile>             Generate a base file for relocatable DLLs\n"));
315   fprintf (file, _("  --dll                              Set image base to the default for DLLs\n"));
316   fprintf (file, _("  --file-alignment <size>            Set file alignment\n"));
317   fprintf (file, _("  --heap <size>                      Set initial size of the heap\n"));
318   fprintf (file, _("  --image-base <address>             Set start address of the executable\n"));
319   fprintf (file, _("  --major-image-version <number>     Set version number of the executable\n"));
320   fprintf (file, _("  --major-os-version <number>        Set minimum required OS version\n"));
321   fprintf (file, _("  --major-subsystem-version <number> Set minimum required OS subsystem version\n"));
322   fprintf (file, _("  --minor-image-version <number>     Set revision number of the executable\n"));
323   fprintf (file, _("  --minor-os-version <number>        Set minimum required OS revision\n"));
324   fprintf (file, _("  --minor-subsystem-version <number> Set minimum required OS subsystem revision\n"));
325   fprintf (file, _("  --section-alignment <size>         Set section alignment\n"));
326   fprintf (file, _("  --stack <size>                     Set size of the initial stack\n"));
327   fprintf (file, _("  --subsystem <name>[:<version>]     Set required OS subsystem [& version]\n"));
328   fprintf (file, _("  --support-old-code                 Support interworking with old code\n"));
329   fprintf (file, _("  --thumb-entry=<symbol>             Set the entry point to be Thumb <symbol>\n"));
330 #ifdef DLL_SUPPORT
331   fprintf (file, _("  --add-stdcall-alias                Export symbols with and without @nn\n"));
332   fprintf (file, _("  --disable-stdcall-fixup            Don't link _sym to _sym@nn\n"));
333   fprintf (file, _("  --enable-stdcall-fixup             Link _sym to _sym@nn without warnings\n"));
334   fprintf (file, _("  --exclude-symbols sym,sym,...      Exclude symbols from automatic export\n"));
335   fprintf (file, _("  --exclude-libs lib,lib,...         Exclude libraries from automatic export\n"));
336   fprintf (file, _("  --export-all-symbols               Automatically export all globals to DLL\n"));
337   fprintf (file, _("  --kill-at                          Remove @nn from exported symbols\n"));
338   fprintf (file, _("  --out-implib <file>                Generate import library\n"));
339   fprintf (file, _("  --output-def <file>                Generate a .DEF file for the built DLL\n"));
340   fprintf (file, _("  --warn-duplicate-exports           Warn about duplicate exports.\n"));
341   fprintf (file, _("  --compat-implib                    Create backward compatible import libs;\n\
342                                        create __imp_<SYMBOL> as well.\n"));
343   fprintf (file, _("  --enable-auto-image-base           Automatically choose image base for DLLs\n\
344                                        unless user specifies one\n"));
345   fprintf (file, _("  --disable-auto-image-base          Do not auto-choose image base. (default)\n"));
346   fprintf (file, _("  --dll-search-prefix=<string>       When linking dynamically to a dll without\n\
347                                        an importlib, use <string><basename>.dll\n\
348                                        in preference to lib<basename>.dll \n"));
349   fprintf (file, _("  --enable-auto-import               Do sophistcated linking of _sym to\n\
350                                        __imp_sym for DATA references\n"));
351   fprintf (file, _("  --disable-auto-import              Do not auto-import DATA items from DLLs\n"));
352   fprintf (file, _("  --enable-runtime-pseudo-reloc      Work around auto-import limitations by\n\
353                                        adding pseudo-relocations resolved at\n\
354                                        runtime.\n"));
355   fprintf (file, _("  --disable-runtime-pseudo-reloc     Do not add runtime pseudo-relocations for\n\
356                                        auto-imported DATA.\n"));
357   fprintf (file, _("  --enable-extra-pe-debug            Enable verbose debug output when building\n\
358                                        or linking to DLLs (esp. auto-import)\n"));
359 #endif
360   fprintf (file, _("  --large-address-aware              Executable supports virtual addresses\n\
361                                        greater than 2 gigabytes\n"));
365 static void
366 set_pe_name (char *name, long val)
368   int i;
370   /* Find the name and set it.  */
371   for (i = 0; init[i].ptr; i++)
372     {
373       if (strcmp (name, init[i].symbol) == 0)
374         {
375           init[i].value = val;
376           init[i].inited = 1;
377           return;
378         }
379     }
380   abort ();
384 static void
385 set_pe_subsystem (void)
387   const char *sver;
388   const char *entry;
389   const char *initial_symbol_char;
390   char *end;
391   int len;
392   int i;
393   int subsystem;
394   unsigned long temp_subsystem;
395   static const struct
396     {
397       const char *name;
398       const int value;
399       const char *entry;
400     }
401   v[] =
402     {
403       { "native",  1, "NtProcessStartup" },
404       { "windows", 2, "WinMainCRTStartup" },
405       { "console", 3, "mainCRTStartup" },
406       { "posix",   7, "__PosixProcessStartup"},
407       { "wince",   9, "WinMainCRTStartup" },
408       { "xbox",   14, "mainCRTStartup" },
409       { NULL, 0, NULL }
410     };
411   /* Entry point name for arbitrary subsystem numbers.  */
412   static const char default_entry[] = "mainCRTStartup";
414   /* Check for the presence of a version number.  */
415   sver = strchr (optarg, ':');
416   if (sver == NULL)
417     len = strlen (optarg);
418   else
419     {
420       len = sver - optarg;
421       set_pe_name ("__major_subsystem_version__",
422                    strtoul (sver + 1, &end, 0));
423       if (*end == '.')
424         set_pe_name ("__minor_subsystem_version__",
425                      strtoul (end + 1, &end, 0));
426       if (*end != '\0')
427         einfo (_("%P: warning: bad version number in -subsystem option\n"));
428     }
430   /* Check for numeric subsystem.  */
431   temp_subsystem = strtoul (optarg, & end, 0);
432   if ((*end == ':' || *end == '\0') && (temp_subsystem < 65536))
433     {
434       /* Search list for a numeric match to use its entry point.  */
435       for (i = 0; v[i].name; i++)
436         if (v[i].value == (int) temp_subsystem)
437           break;
439       /* If no match, use the default.  */
440       if (v[i].name != NULL)
441         entry = v[i].entry;
442       else
443         entry = default_entry;
445       /* Use this subsystem.  */
446       subsystem = (int) temp_subsystem;
447     }
448   else
449     {
450       /* Search for subsystem by name.  */
451       for (i = 0; v[i].name; i++)
452         if (strncmp (optarg, v[i].name, len) == 0
453             && v[i].name[len] == '\0')
454           break;
456       if (v[i].name == NULL)
457         {
458           einfo (_("%P%F: invalid subsystem type %s\n"), optarg);
459           return;
460         }
462       entry = v[i].entry;
463       subsystem = v[i].value;
464     }
466   set_pe_name ("__subsystem__", subsystem);
468   initial_symbol_char = ${INITIAL_SYMBOL_CHAR};
469   if (*initial_symbol_char != '\0')
470     {
471       char *alc_entry;
473       /* lang_default_entry expects its argument to be permanently
474          allocated, so we don't free this string.  */
475       alc_entry = xmalloc (strlen (initial_symbol_char)
476                            + strlen (entry)
477                            + 1);
478       strcpy (alc_entry, initial_symbol_char);
479       strcat (alc_entry, entry);
480       entry = alc_entry;
481     }
483   lang_default_entry (entry);
485   return;
489 static void
490 set_pe_value (char *name)
492   char *end;
494   set_pe_name (name,  strtoul (optarg, &end, 0));
496   if (end == optarg)
497     einfo (_("%P%F: invalid hex number for PE parameter '%s'\n"), optarg);
499   optarg = end;
503 static void
504 set_pe_stack_heap (char *resname, char *comname)
506   set_pe_value (resname);
508   if (*optarg == ',')
509     {
510       optarg++;
511       set_pe_value (comname);
512     }
513   else if (*optarg)
514     einfo (_("%P%F: strange hex info for PE parameter '%s'\n"), optarg);
518 static bfd_boolean
519 gld${EMULATION_NAME}_handle_option (int optc)
521   switch (optc)
522     {
523     default:
524       return FALSE;
526     case OPTION_BASE_FILE:
527       link_info.base_file = fopen (optarg, FOPEN_WB);
528       if (link_info.base_file == NULL)
529         {
530           /* xgettext:c-format */
531           fprintf (stderr, _("%s: Can't open base file %s\n"),
532                    program_name, optarg);
533           xexit (1);
534         }
535       break;
537       /* PE options.  */
538     case OPTION_HEAP:
539       set_pe_stack_heap ("__size_of_heap_reserve__", "__size_of_heap_commit__");
540       break;
541     case OPTION_STACK:
542       set_pe_stack_heap ("__size_of_stack_reserve__", "__size_of_stack_commit__");
543       break;
544     case OPTION_SUBSYSTEM:
545       set_pe_subsystem ();
546       break;
547     case OPTION_MAJOR_OS_VERSION:
548       set_pe_value ("__major_os_version__");
549       break;
550     case OPTION_MINOR_OS_VERSION:
551       set_pe_value ("__minor_os_version__");
552       break;
553     case OPTION_MAJOR_SUBSYSTEM_VERSION:
554       set_pe_value ("__major_subsystem_version__");
555       break;
556     case OPTION_MINOR_SUBSYSTEM_VERSION:
557       set_pe_value ("__minor_subsystem_version__");
558       break;
559     case OPTION_MAJOR_IMAGE_VERSION:
560       set_pe_value ("__major_image_version__");
561       break;
562     case OPTION_MINOR_IMAGE_VERSION:
563       set_pe_value ("__minor_image_version__");
564       break;
565     case OPTION_FILE_ALIGNMENT:
566       set_pe_value ("__file_alignment__");
567       break;
568     case OPTION_SECTION_ALIGNMENT:
569       set_pe_value ("__section_alignment__");
570       break;
571     case OPTION_DLL:
572       set_pe_name ("__dll__", 1);
573       break;
574     case OPTION_IMAGE_BASE:
575       set_pe_value ("__image_base__");
576       break;
577     case OPTION_SUPPORT_OLD_CODE:
578       support_old_code = 1;
579       break;
580     case OPTION_THUMB_ENTRY:
581       thumb_entry_symbol = optarg;
582       break;
583 #ifdef DLL_SUPPORT
584     case OPTION_OUT_DEF:
585       pe_out_def_filename = xstrdup (optarg);
586       break;
587     case OPTION_EXPORT_ALL:
588       pe_dll_export_everything = 1;
589       break;
590     case OPTION_EXCLUDE_SYMBOLS:
591       pe_dll_add_excludes (optarg, 0);
592       break;
593     case OPTION_EXCLUDE_LIBS:
594       pe_dll_add_excludes (optarg, 1);
595       break;
596     case OPTION_KILL_ATS:
597       pe_dll_kill_ats = 1;
598       break;
599     case OPTION_STDCALL_ALIASES:
600       pe_dll_stdcall_aliases = 1;
601       break;
602     case OPTION_ENABLE_STDCALL_FIXUP:
603       pe_enable_stdcall_fixup = 1;
604       break;
605     case OPTION_DISABLE_STDCALL_FIXUP:
606       pe_enable_stdcall_fixup = 0;
607       break;
608     case OPTION_IMPLIB_FILENAME:
609       pe_implib_filename = xstrdup (optarg);
610       break;
611     case OPTION_WARN_DUPLICATE_EXPORTS:
612       pe_dll_warn_dup_exports = 1;
613       break;
614     case OPTION_IMP_COMPAT:
615       pe_dll_compat_implib = 1;
616       break;
617     case OPTION_ENABLE_AUTO_IMAGE_BASE:
618       pe_enable_auto_image_base = 1;
619       break;
620     case OPTION_DISABLE_AUTO_IMAGE_BASE:
621       pe_enable_auto_image_base = 0;
622       break;
623     case OPTION_DLL_SEARCH_PREFIX:
624       pe_dll_search_prefix = xstrdup (optarg);
625       break;
626     case OPTION_NO_DEFAULT_EXCLUDES:
627       pe_dll_do_default_excludes = 0;
628       break;
629     case OPTION_DLL_ENABLE_AUTO_IMPORT:
630       link_info.pei386_auto_import = 1;
631       break;
632     case OPTION_DLL_DISABLE_AUTO_IMPORT:
633       link_info.pei386_auto_import = 0;
634       break;
635     case OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC:
636       link_info.pei386_runtime_pseudo_reloc = 1;
637       break;
638     case OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC:
639       link_info.pei386_runtime_pseudo_reloc = 0;
640       break;
641     case OPTION_ENABLE_EXTRA_PE_DEBUG:
642       pe_dll_extra_pe_debug = 1;
643       break;
644 #endif
645     case OPTION_LARGE_ADDRESS_AWARE:
646       real_flags |= IMAGE_FILE_LARGE_ADDRESS_AWARE;
647       break;
648     }
649   return TRUE;
653 #ifdef DLL_SUPPORT
654 static unsigned long
655 strhash (const char *str)
657   const unsigned char *s;
658   unsigned long hash;
659   unsigned int c;
660   unsigned int len;
662   hash = 0;
663   len = 0;
664   s = (const unsigned char *) str;
665   while ((c = *s++) != '\0')
666     {
667       hash += c + (c << 17);
668       hash ^= hash >> 2;
669       ++len;
670     }
671   hash += len + (len << 17);
672   hash ^= hash >> 2;
674   return hash;
677 /* Use the output file to create a image base for relocatable DLLs.  */
679 static unsigned long
680 compute_dll_image_base (const char *ofile)
682   unsigned long hash = strhash (ofile);
683   return 0x61300000 + ((hash << 16) & 0x0FFC0000);
685 #endif
687 /* Assign values to the special symbols before the linker script is
688    read.  */
690 static void
691 gld_${EMULATION_NAME}_set_symbols (void)
693   /* Run through and invent symbols for all the
694      names and insert the defaults.  */
695   int j;
696   lang_statement_list_type *save;
698   if (!init[IMAGEBASEOFF].inited)
699     {
700       if (link_info.relocatable)
701         init[IMAGEBASEOFF].value = 0;
702       else if (init[DLLOFF].value || (link_info.shared && !link_info.pie))
703 #ifdef DLL_SUPPORT
704         init[IMAGEBASEOFF].value = (pe_enable_auto_image_base) ?
705           compute_dll_image_base (output_filename) : NT_DLL_IMAGE_BASE;
706 #else
707         init[IMAGEBASEOFF].value = NT_DLL_IMAGE_BASE;
708 #endif
709       else
710         init[IMAGEBASEOFF].value = NT_EXE_IMAGE_BASE;
711     }
713   /* Don't do any symbol assignments if this is a relocatable link.  */
714   if (link_info.relocatable)
715     return;
717   /* Glue the assignments into the abs section.  */
718   save = stat_ptr;
720   stat_ptr = &(abs_output_section->children);
722   for (j = 0; init[j].ptr; j++)
723     {
724       long val = init[j].value;
725       lang_assignment_statement_type *rv;
726       rv = lang_add_assignment (exp_assop ('=', init[j].symbol,
727                                            exp_intop (val)));
728       if (init[j].size == sizeof (short))
729         *(short *) init[j].ptr = val;
730       else if (init[j].size == sizeof (int))
731         *(int *) init[j].ptr = val;
732       else if (init[j].size == sizeof (long))
733         *(long *) init[j].ptr = val;
734       /* This might be a long long or other special type.  */
735       else if (init[j].size == sizeof (bfd_vma))
736         *(bfd_vma *) init[j].ptr = val;
737       else      abort ();
738       if (j == IMAGEBASEOFF)
739         image_base_statement = rv;
740     }
741   /* Restore the pointer.  */
742   stat_ptr = save;
744   if (pe.FileAlignment >
745       pe.SectionAlignment)
746     {
747       einfo (_("%P: warning, file alignment > section alignment.\n"));
748     }
751 /* This is called after the linker script and the command line options
752    have been read.  */
754 static void
755 gld_${EMULATION_NAME}_after_parse (void)
757   /* The Windows libraries are designed for the linker to treat the
758      entry point as an undefined symbol.  Otherwise, the .obj that
759      defines mainCRTStartup is brought in because it is the first
760      encountered in libc.lib and it has other symbols in it which will
761      be pulled in by the link process.  To avoid this, we act as
762      though the user specified -u with the entry point symbol.
764      This function is called after the linker script and command line
765      options have been read, so at this point we know the right entry
766      point.  This function is called before the input files are
767      opened, so registering the symbol as undefined will make a
768      difference.  */
770   if (! link_info.relocatable && entry_symbol.name != NULL)
771     ldlang_add_undef (entry_symbol.name);
774 /* pe-dll.c directly accesses pe_data_import_dll,
775    so it must be defined outside of #ifdef DLL_SUPPORT.
776    Note - this variable is deliberately not initialised.
777    This allows it to be treated as a common varaible, and only
778    exist in one incarnation in a multiple target enabled linker.  */
779 char * pe_data_import_dll;
781 #ifdef DLL_SUPPORT
782 static struct bfd_link_hash_entry *pe_undef_found_sym;
784 static bfd_boolean
785 pe_undef_cdecl_match (struct bfd_link_hash_entry *h, void *inf)
787   int sl;
788   char *string = inf;
790   sl = strlen (string);
791   if (h->type == bfd_link_hash_defined
792       && strncmp (h->root.string, string, sl) == 0
793       && h->root.string[sl] == '@')
794     {
795       pe_undef_found_sym = h;
796       return FALSE;
797     }
798   return TRUE;
801 static void
802 pe_fixup_stdcalls (void)
804   static int gave_warning_message = 0;
805   struct bfd_link_hash_entry *undef, *sym;
807   if (pe_dll_extra_pe_debug)
808     printf ("%s\n", __FUNCTION__);
810   for (undef = link_info.hash->undefs; undef; undef=undef->u.undef.next)
811     if (undef->type == bfd_link_hash_undefined)
812       {
813         char* at = strchr (undef->root.string, '@');
814         int lead_at = (*undef->root.string == '@');
815         /* For now, don't try to fixup fastcall symbols.  */
817         if (at && !lead_at)
818           {
819             /* The symbol is a stdcall symbol, so let's look for a
820                cdecl symbol with the same name and resolve to that.  */
821             char *cname = xstrdup (undef->root.string /* + lead_at */);
822             at = strchr (cname, '@');
823             *at = 0;
824             sym = bfd_link_hash_lookup (link_info.hash, cname, 0, 0, 1);
826             if (sym && sym->type == bfd_link_hash_defined)
827               {
828                 undef->type = bfd_link_hash_defined;
829                 undef->u.def.value = sym->u.def.value;
830                 undef->u.def.section = sym->u.def.section;
832                 if (pe_enable_stdcall_fixup == -1)
833                   {
834                     einfo (_("Warning: resolving %s by linking to %s\n"),
835                            undef->root.string, cname);
836                     if (! gave_warning_message)
837                       {
838                         gave_warning_message = 1;
839                         einfo (_("Use --enable-stdcall-fixup to disable these warnings\n"));
840                         einfo (_("Use --disable-stdcall-fixup to disable these fixups\n"));
841                       }
842                   }
843               }
844           }
845         else
846           {
847             /* The symbol is a cdecl symbol, so we look for stdcall
848                symbols - which means scanning the whole symbol table.  */
849             pe_undef_found_sym = 0;
850             bfd_link_hash_traverse (link_info.hash, pe_undef_cdecl_match,
851                                     (char *) undef->root.string);
852             sym = pe_undef_found_sym;
853             if (sym)
854               {
855                 undef->type = bfd_link_hash_defined;
856                 undef->u.def.value = sym->u.def.value;
857                 undef->u.def.section = sym->u.def.section;
859                 if (pe_enable_stdcall_fixup == -1)
860                   {
861                     einfo (_("Warning: resolving %s by linking to %s\n"),
862                            undef->root.string, sym->root.string);
863                     if (! gave_warning_message)
864                       {
865                         gave_warning_message = 1;
866                         einfo (_("Use --enable-stdcall-fixup to disable these warnings\n"));
867                         einfo (_("Use --disable-stdcall-fixup to disable these fixups\n"));
868                       }
869                   }
870               }
871           }
872       }
875 static int
876 make_import_fixup (arelent *rel, asection *s)
878   struct bfd_symbol *sym = *rel->sym_ptr_ptr;
879   char addend[4];
881   if (pe_dll_extra_pe_debug)
882     printf ("arelent: %s@%#lx: add=%li\n", sym->name,
883             (long) rel->address, (long) rel->addend);
885   if (! bfd_get_section_contents (s->owner, s, addend, rel->address, sizeof (addend)))
886     einfo (_("%C: Cannot get section contents - auto-import exception\n"),
887            s->owner, s, rel->address);
889   pe_create_import_fixup (rel, s, bfd_get_32 (s->owner, addend));
891   return 1;
894 static void
895 pe_find_data_imports (void)
897   struct bfd_link_hash_entry *undef, *sym;
899   if (link_info.pei386_auto_import == 0)
900     return;
902   for (undef = link_info.hash->undefs; undef; undef=undef->u.undef.next)
903     {
904       if (undef->type == bfd_link_hash_undefined)
905         {
906           /* C++ symbols are *long*.  */
907           char buf[4096];
909           if (pe_dll_extra_pe_debug)
910             printf ("%s:%s\n", __FUNCTION__, undef->root.string);
912           sprintf (buf, "__imp_%s", undef->root.string);
914           sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
916           if (sym && sym->type == bfd_link_hash_defined)
917             {
918               bfd *b = sym->u.def.section->owner;
919               asymbol **symbols;
920               int nsyms, symsize, i;
922               if (link_info.pei386_auto_import == -1)
923                 info_msg (_("Info: resolving %s by linking to %s (auto-import)\n"),
924                           undef->root.string, buf);
926               symsize = bfd_get_symtab_upper_bound (b);
927               symbols = (asymbol **) xmalloc (symsize);
928               nsyms = bfd_canonicalize_symtab (b, symbols);
930               for (i = 0; i < nsyms; i++)
931                 {
932                   if (! CONST_STRNEQ (symbols[i]->name, U ("_head_")))
933                     continue;
935                   if (pe_dll_extra_pe_debug)
936                     printf ("->%s\n", symbols[i]->name);
938                   pe_data_import_dll = (char*) (symbols[i]->name +
939                                                 sizeof (U ("_head_")) - 1);
940                   break;
941                 }
943               pe_walk_relocs_of_symbol (&link_info, undef->root.string,
944                                         make_import_fixup);
946               /* Let's differentiate it somehow from defined.  */
947               undef->type = bfd_link_hash_defweak;
948               /* We replace original name with __imp_ prefixed, this
949                  1) may trash memory 2) leads to duplicate symbol generation.
950                  Still, IMHO it's better than having name poluted.  */
951               undef->root.string = sym->root.string;
952               undef->u.def.value = sym->u.def.value;
953               undef->u.def.section = sym->u.def.section;
954             }
955         }
956     }
959 static bfd_boolean
960 pr_sym (struct bfd_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
962   if (pe_dll_extra_pe_debug)
963     printf ("+%s\n", h->string);
965   return TRUE;
967 #endif /* DLL_SUPPORT */
970 static void
971 gld_${EMULATION_NAME}_after_open (void)
973 #ifdef DLL_SUPPORT
974   if (pe_dll_extra_pe_debug)
975     {
976       bfd *a;
977       struct bfd_link_hash_entry *sym;
979       printf ("%s()\n", __FUNCTION__);
981       for (sym = link_info.hash->undefs; sym; sym=sym->u.undef.next)
982         printf ("-%s\n", sym->root.string);
983       bfd_hash_traverse (&link_info.hash->table, pr_sym, NULL);
985       for (a = link_info.input_bfds; a; a = a->link_next)
986         printf ("*%s\n",a->filename);
987     }
988 #endif
990   /* Pass the wacky PE command line options into the output bfd.
991      FIXME: This should be done via a function, rather than by
992      including an internal BFD header.  */
994   if (coff_data (output_bfd) == NULL || coff_data (output_bfd)->pe == 0)
995     einfo (_("%F%P: cannot perform PE operations on non PE output file '%B'.\n"), output_bfd);
997   pe_data (output_bfd)->pe_opthdr = pe;
998   pe_data (output_bfd)->dll = init[DLLOFF].value;
999   pe_data (output_bfd)->real_flags |= real_flags;
1001 #ifdef DLL_SUPPORT
1002   if (pe_enable_stdcall_fixup) /* -1=warn or 1=disable */
1003     pe_fixup_stdcalls ();
1005   pe_process_import_defs (output_bfd, & link_info);
1007   pe_find_data_imports ();
1009 #if defined (TARGET_IS_i386pe) \
1010     || defined (TARGET_IS_armpe) \
1011     || defined (TARGET_IS_arm_epoc_pe) \
1012     || defined (TARGET_IS_arm_wince_pe)
1013   if (!link_info.relocatable)
1014     pe_dll_build_sections (output_bfd, &link_info);
1015   else
1016     pe_exe_build_sections (output_bfd, &link_info);
1017 #else
1018   if (link_info.shared)
1019     pe_dll_build_sections (output_bfd, &link_info);
1020 #endif
1021 #endif /* DLL_SUPPORT */
1023 #if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe)
1024   if (strstr (bfd_get_target (output_bfd), "arm") == NULL)
1025     {
1026       /* The arm backend needs special fields in the output hash structure.
1027          These will only be created if the output format is an arm format,
1028          hence we do not support linking and changing output formats at the
1029          same time.  Use a link followed by objcopy to change output formats.  */
1030       einfo ("%F%X%P: error: cannot change output format whilst linking ARM binaries\n");
1031       return;
1032     }
1033   {
1034     /* Find a BFD that can hold the interworking stubs.  */
1035     LANG_FOR_EACH_INPUT_STATEMENT (is)
1036       {
1037         if (bfd_arm_get_bfd_for_interworking (is->the_bfd, & link_info))
1038           break;
1039       }
1040   }
1041 #endif
1043   {
1044     /* This next chunk of code tries to detect the case where you have
1045        two import libraries for the same DLL (specifically,
1046        symbolically linking libm.a and libc.a in cygwin to
1047        libcygwin.a).  In those cases, it's possible for function
1048        thunks from the second implib to be used but without the
1049        head/tail objects, causing an improper import table.  We detect
1050        those cases and rename the "other" import libraries to match
1051        the one the head/tail come from, so that the linker will sort
1052        things nicely and produce a valid import table.  */
1054     LANG_FOR_EACH_INPUT_STATEMENT (is)
1055       {
1056         if (is->the_bfd->my_archive)
1057           {
1058             int idata2 = 0, reloc_count=0, is_imp = 0;
1059             asection *sec;
1061             /* See if this is an import library thunk.  */
1062             for (sec = is->the_bfd->sections; sec; sec = sec->next)
1063               {
1064                 if (strcmp (sec->name, ".idata\$2") == 0)
1065                   idata2 = 1;
1066                 if (CONST_STRNEQ (sec->name, ".idata\$"))
1067                   is_imp = 1;
1068                 reloc_count += sec->reloc_count;
1069               }
1071             if (is_imp && !idata2 && reloc_count)
1072               {
1073                 /* It is, look for the reference to head and see if it's
1074                    from our own library.  */
1075                 for (sec = is->the_bfd->sections; sec; sec = sec->next)
1076                   {
1077                     int i;
1078                     long symsize;
1079                     long relsize;
1080                     asymbol **symbols;
1081                     arelent **relocs;
1082                     int nrelocs;
1084                     symsize = bfd_get_symtab_upper_bound (is->the_bfd);
1085                     if (symsize < 1)
1086                       break;
1087                     relsize = bfd_get_reloc_upper_bound (is->the_bfd, sec);
1088                     if (relsize < 1)
1089                       break;
1091                     symbols = (asymbol **) xmalloc (symsize);
1092                     symsize = bfd_canonicalize_symtab (is->the_bfd, symbols);
1093                     if (symsize < 0)
1094                       {
1095                         einfo ("%X%P: unable to process symbols: %E");
1096                         return;
1097                       }
1099                     relocs = (arelent **) xmalloc ((size_t) relsize);
1100                     nrelocs = bfd_canonicalize_reloc (is->the_bfd, sec,
1101                                                       relocs, symbols);
1102                     if (nrelocs < 0)
1103                       {
1104                         free (relocs);
1105                         einfo ("%X%P: unable to process relocs: %E");
1106                         return;
1107                       }
1109                     for (i = 0; i < nrelocs; i++)
1110                       {
1111                         struct bfd_symbol *s;
1112                         struct bfd_link_hash_entry * blhe;
1113                         char *other_bfd_filename;
1114                         char *n;
1116                         s = (relocs[i]->sym_ptr_ptr)[0];
1118                         if (s->flags & BSF_LOCAL)
1119                           continue;
1121                         /* Thunk section with reloc to another bfd.  */
1122                         blhe = bfd_link_hash_lookup (link_info.hash,
1123                                                      s->name,
1124                                                      FALSE, FALSE, TRUE);
1126                         if (blhe == NULL
1127                             || blhe->type != bfd_link_hash_defined)
1128                           continue;
1130                         other_bfd_filename
1131                           = blhe->u.def.section->owner->my_archive
1132                             ? bfd_get_filename (blhe->u.def.section->owner->my_archive)
1133                             : bfd_get_filename (blhe->u.def.section->owner);
1135                         if (strcmp (bfd_get_filename (is->the_bfd->my_archive),
1136                                     other_bfd_filename) == 0)
1137                           continue;
1139                         /* Rename this implib to match the other one.  */
1140                         n = xmalloc (strlen (other_bfd_filename) + 1);
1141                         strcpy (n, other_bfd_filename);
1142                         is->the_bfd->my_archive->filename = n;
1143                       }
1145                     free (relocs);
1146                     /* Note - we do not free the symbols,
1147                        they are now cached in the BFD.  */
1148                   }
1149               }
1150           }
1151       }
1152   }
1154   {
1155     int is_ms_arch = 0;
1156     bfd *cur_arch = 0;
1157     lang_input_statement_type *is2;
1158     lang_input_statement_type *is3;
1160     /* Careful - this is a shell script.  Watch those dollar signs! */
1161     /* Microsoft import libraries have every member named the same,
1162        and not in the right order for us to link them correctly.  We
1163        must detect these and rename the members so that they'll link
1164        correctly.  There are three types of objects: the head, the
1165        thunks, and the sentinel(s).  The head is easy; it's the one
1166        with idata2.  We assume that the sentinels won't have relocs,
1167        and the thunks will.  It's easier than checking the symbol
1168        table for external references.  */
1169     LANG_FOR_EACH_INPUT_STATEMENT (is)
1170       {
1171         if (is->the_bfd->my_archive)
1172           {
1173             char *pnt;
1174             bfd *arch = is->the_bfd->my_archive;
1176             if (cur_arch != arch)
1177               {
1178                 cur_arch = arch;
1179                 is_ms_arch = 1;
1181                 for (is3 = is;
1182                      is3 && is3->the_bfd->my_archive == arch;
1183                      is3 = (lang_input_statement_type *) is3->next)
1184                   {
1185                     /* A MS dynamic import library can also contain static
1186                        members, so look for the first element with a .dll
1187                        extension, and use that for the remainder of the
1188                        comparisons.  */
1189                     pnt = strrchr (is3->the_bfd->filename, '.');
1190                     if (pnt != NULL && strcmp (pnt, ".dll") == 0)
1191                       break;
1192                   }
1194                 if (is3 == NULL)
1195                   is_ms_arch = 0;
1196                 else
1197                   {
1198                     /* OK, found one.  Now look to see if the remaining
1199                        (dynamic import) members use the same name.  */
1200                     for (is2 = is;
1201                          is2 && is2->the_bfd->my_archive == arch;
1202                          is2 = (lang_input_statement_type *) is2->next)
1203                       {
1204                         /* Skip static members, ie anything with a .obj
1205                            extension.  */
1206                         pnt = strrchr (is2->the_bfd->filename, '.');
1207                         if (pnt != NULL && strcmp (pnt, ".obj") == 0)
1208                           continue;
1210                         if (strcmp (is3->the_bfd->filename,
1211                                     is2->the_bfd->filename))
1212                           {
1213                             is_ms_arch = 0;
1214                             break;
1215                           }
1216                       }
1217                   }
1218               }
1220             /* This fragment might have come from an .obj file in a Microsoft
1221                import, and not an actual import record. If this is the case,
1222                then leave the filename alone.  */
1223             pnt = strrchr (is->the_bfd->filename, '.');
1225             if (is_ms_arch && (strcmp (pnt, ".dll") == 0))
1226               {
1227                 int idata2 = 0, reloc_count=0;
1228                 asection *sec;
1229                 char *new_name, seq;
1231                 for (sec = is->the_bfd->sections; sec; sec = sec->next)
1232                   {
1233                     if (strcmp (sec->name, ".idata\$2") == 0)
1234                       idata2 = 1;
1235                     reloc_count += sec->reloc_count;
1236                   }
1238                 if (idata2) /* .idata2 is the TOC */
1239                   seq = 'a';
1240                 else if (reloc_count > 0) /* thunks */
1241                   seq = 'b';
1242                 else /* sentinel */
1243                   seq = 'c';
1245                 new_name = xmalloc (strlen (is->the_bfd->filename) + 3);
1246                 sprintf (new_name, "%s.%c", is->the_bfd->filename, seq);
1247                 is->the_bfd->filename = new_name;
1249                 new_name = xmalloc (strlen (is->filename) + 3);
1250                 sprintf (new_name, "%s.%c", is->filename, seq);
1251                 is->filename = new_name;
1252               }
1253           }
1254       }
1255   }
1257   {
1258     /* The following chunk of code tries to identify jump stubs in
1259        import libraries which are dead code and eliminates them
1260        from the final link. For each exported symbol <sym>, there
1261        is a object file in the import library with a .text section
1262        and several .idata$* sections. The .text section contains the
1263        symbol definition for <sym> which is a jump stub of the form
1264        jmp *__imp_<sym>. The .idata$5 contains the symbol definition
1265        for __imp_<sym> which is the address of the slot for <sym> in
1266        the import address table. When a symbol is imported explicitly
1267        using __declspec(dllimport) declaration, the compiler generates
1268        a reference to __imp_<sym> which directly resolves to the
1269        symbol in .idata$5, in which case the jump stub code is not
1270        needed. The following code tries to identify jump stub sections
1271        in import libraries which are not referred to by anyone and
1272        marks them for exclusion from the final link.  */
1273     LANG_FOR_EACH_INPUT_STATEMENT (is)
1274       {
1275         if (is->the_bfd->my_archive)
1276           {
1277             int is_imp = 0;
1278             asection *sec, *stub_sec = NULL;
1280             /* See if this is an import library thunk.  */
1281             for (sec = is->the_bfd->sections; sec; sec = sec->next)
1282               {
1283                 if (strncmp (sec->name, ".idata\$", 7) == 0)
1284                   is_imp = 1;
1285                 /* The section containing the jmp stub has code
1286                    and has a reloc.  */
1287                 if ((sec->flags & SEC_CODE) && sec->reloc_count)
1288                   stub_sec = sec;
1289               }
1291             if (is_imp && stub_sec)
1292               {
1293                 long symsize;
1294                 asymbol **symbols;
1295                 long src_count;
1296                 struct bfd_link_hash_entry * blhe;
1298                 symsize = bfd_get_symtab_upper_bound (is->the_bfd);
1299                 symbols = xmalloc (symsize);
1300                 symsize = bfd_canonicalize_symtab (is->the_bfd, symbols);
1302                 for (src_count = 0; src_count < symsize; src_count++)
1303                   {
1304                     if (symbols[src_count]->section->id == stub_sec->id)
1305                       {
1306                         /* This symbol belongs to the section containing
1307                            the stub.  */
1308                         blhe = bfd_link_hash_lookup (link_info.hash,
1309                                                      symbols[src_count]->name,
1310                                                      FALSE, FALSE, TRUE);
1311                         /* If the symbol in the stub section has no other
1312                            undefined references, exclude the stub section
1313                            from the final link.  */
1314                         if (blhe && (blhe->type == bfd_link_hash_defined)
1315                             && (blhe->u.undef.next == NULL))
1316                           stub_sec->flags |= SEC_EXCLUDE;
1317                       }
1318                   }
1319                 free (symbols);
1320               }
1321           }
1322       }
1323   }
1326 static void
1327 gld_${EMULATION_NAME}_before_allocation (void)
1329 #ifdef TARGET_IS_ppcpe
1330   /* Here we rummage through the found bfds to collect toc information.  */
1331   {
1332     LANG_FOR_EACH_INPUT_STATEMENT (is)
1333       {
1334         if (!ppc_process_before_allocation (is->the_bfd, &link_info))
1335           {
1336             /* xgettext:c-format */
1337             einfo (_("Errors encountered processing file %s\n"), is->filename);
1338           }
1339       }
1340   }
1342   /* We have seen it all. Allocate it, and carry on.  */
1343   ppc_allocate_toc_section (&link_info);
1344 #endif /* TARGET_IS_ppcpe */
1346 #if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe)
1347   /* FIXME: we should be able to set the size of the interworking stub
1348      section.
1350      Here we rummage through the found bfds to collect glue
1351      information.  FIXME: should this be based on a command line
1352      option?  krk@cygnus.com.  */
1353   {
1354     LANG_FOR_EACH_INPUT_STATEMENT (is)
1355       {
1356         if (! bfd_arm_process_before_allocation
1357             (is->the_bfd, & link_info, support_old_code))
1358           {
1359             /* xgettext:c-format */
1360             einfo (_("Errors encountered processing file %s for interworking"),
1361                    is->filename);
1362           }
1363       }
1364   }
1366   /* We have seen it all. Allocate it, and carry on.  */
1367   bfd_arm_allocate_interworking_sections (& link_info);
1368 #endif /* TARGET_IS_armpe || TARGET_IS_arm_epoc_pe || TARGET_IS_arm_wince_pe */
1370   before_allocation_default ();
1373 #ifdef DLL_SUPPORT
1374 /* This is called when an input file isn't recognized as a BFD.  We
1375    check here for .DEF files and pull them in automatically.  */
1377 static int
1378 saw_option (char *option)
1380   int i;
1382   for (i = 0; init[i].ptr; i++)
1383     if (strcmp (init[i].symbol, option) == 0)
1384       return init[i].inited;
1385   return 0;
1387 #endif /* DLL_SUPPORT */
1389 static bfd_boolean
1390 gld_${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry ATTRIBUTE_UNUSED)
1392 #ifdef DLL_SUPPORT
1393   const char *ext = entry->filename + strlen (entry->filename) - 4;
1395   if (strcmp (ext, ".def") == 0 || strcmp (ext, ".DEF") == 0)
1396     {
1397       pe_def_file = def_file_parse (entry->filename, pe_def_file);
1399       if (pe_def_file)
1400         {
1401           int i, buflen=0, len;
1402           char *buf;
1404           for (i = 0; i < pe_def_file->num_exports; i++)
1405             {
1406               len = strlen (pe_def_file->exports[i].internal_name);
1407               if (buflen < len + 2)
1408                 buflen = len + 2;
1409             }
1411           buf = (char *) xmalloc (buflen);
1413           for (i = 0; i < pe_def_file->num_exports; i++)
1414             {
1415               struct bfd_link_hash_entry *h;
1417               sprintf (buf, "%s%s", U (""), pe_def_file->exports[i].internal_name);
1419               h = bfd_link_hash_lookup (link_info.hash, buf, TRUE, TRUE, TRUE);
1420               if (h == (struct bfd_link_hash_entry *) NULL)
1421                 einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
1422               if (h->type == bfd_link_hash_new)
1423                 {
1424                   h->type = bfd_link_hash_undefined;
1425                   h->u.undef.abfd = NULL;
1426                   bfd_link_add_undef (link_info.hash, h);
1427                 }
1428             }
1429           free (buf);
1431           /* def_file_print (stdout, pe_def_file); */
1432           if (pe_def_file->is_dll == 1)
1433             link_info.shared = 1;
1435           if (pe_def_file->base_address != (bfd_vma)(-1))
1436             {
1437               pe.ImageBase =
1438                 pe_data (output_bfd)->pe_opthdr.ImageBase =
1439                 init[IMAGEBASEOFF].value = pe_def_file->base_address;
1440               init[IMAGEBASEOFF].inited = 1;
1441               if (image_base_statement)
1442                 image_base_statement->exp =
1443                   exp_assop ('=', "__image_base__", exp_intop (pe.ImageBase));
1444             }
1446           if (pe_def_file->stack_reserve != -1
1447               && ! saw_option ("__size_of_stack_reserve__"))
1448             {
1449               pe.SizeOfStackReserve = pe_def_file->stack_reserve;
1450               if (pe_def_file->stack_commit != -1)
1451                 pe.SizeOfStackCommit = pe_def_file->stack_commit;
1452             }
1453           if (pe_def_file->heap_reserve != -1
1454               && ! saw_option ("__size_of_heap_reserve__"))
1455             {
1456               pe.SizeOfHeapReserve = pe_def_file->heap_reserve;
1457               if (pe_def_file->heap_commit != -1)
1458                 pe.SizeOfHeapCommit = pe_def_file->heap_commit;
1459             }
1460           return TRUE;
1461         }
1462     }
1463 #endif
1464   return FALSE;
1467 static bfd_boolean
1468 gld_${EMULATION_NAME}_recognized_file (lang_input_statement_type *entry ATTRIBUTE_UNUSED)
1470 #ifdef DLL_SUPPORT
1471 #ifdef TARGET_IS_i386pe
1472   pe_dll_id_target ("pei-i386");
1473 #endif
1474 #ifdef TARGET_IS_shpe
1475   pe_dll_id_target ("pei-shl");
1476 #endif
1477 #ifdef TARGET_IS_mipspe
1478   pe_dll_id_target ("pei-mips");
1479 #endif
1480 #ifdef TARGET_IS_armpe
1481   pe_dll_id_target ("pei-arm-little");
1482 #endif
1483 #ifdef TARGET_IS_arm_epoc_pe
1484   pe_dll_id_target ("epoc-pei-arm-little");
1485 #endif
1486 #ifdef TARGET_IS_arm_wince_pe
1487   pe_dll_id_target ("pei-arm-wince-little");
1488 #endif
1489   if (pe_bfd_is_dll (entry->the_bfd))
1490     return pe_implied_import_dll (entry->filename);
1491 #endif
1492   return FALSE;
1495 static void
1496 gld_${EMULATION_NAME}_finish (void)
1498 #if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe)
1499   struct bfd_link_hash_entry * h;
1501   if (thumb_entry_symbol != NULL)
1502     {
1503       h = bfd_link_hash_lookup (link_info.hash, thumb_entry_symbol,
1504                                 FALSE, FALSE, TRUE);
1506       if (h != (struct bfd_link_hash_entry *) NULL
1507           && (h->type == bfd_link_hash_defined
1508               || h->type == bfd_link_hash_defweak)
1509           && h->u.def.section->output_section != NULL)
1510         {
1511           static char buffer[32];
1512           bfd_vma val;
1514           /* Special procesing is required for a Thumb entry symbol.  The
1515              bottom bit of its address must be set.  */
1516           val = (h->u.def.value
1517                  + bfd_get_section_vma (output_bfd,
1518                                         h->u.def.section->output_section)
1519                  + h->u.def.section->output_offset);
1521           val |= 1;
1523           /* Now convert this value into a string and store it in entry_symbol
1524              where the lang_finish() function will pick it up.  */
1525           buffer[0] = '0';
1526           buffer[1] = 'x';
1528           sprintf_vma (buffer + 2, val);
1530           if (entry_symbol.name != NULL && entry_from_cmdline)
1531             einfo (_("%P: warning: '--thumb-entry %s' is overriding '-e %s'\n"),
1532                    thumb_entry_symbol, entry_symbol.name);
1533           entry_symbol.name = buffer;
1534         }
1535       else
1536         einfo (_("%P: warning: connot find thumb start symbol %s\n"), thumb_entry_symbol);
1537     }
1538 #endif /* defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe) */
1540   finish_default ();
1542 #ifdef DLL_SUPPORT
1543   if (link_info.shared
1544 #if !defined(TARGET_IS_shpe) && !defined(TARGET_IS_mipspe)
1545     || (!link_info.relocatable && pe_def_file->num_exports != 0)
1546 #endif
1547     )
1548     {
1549       pe_dll_fill_sections (output_bfd, &link_info);
1550       if (pe_implib_filename)
1551         pe_dll_generate_implib (pe_def_file, pe_implib_filename);
1552     }
1553 #if defined(TARGET_IS_shpe) || defined(TARGET_IS_mipspe)
1554   /* ARM doesn't need relocs.  */
1555   else
1556     {
1557       pe_exe_fill_sections (output_bfd, &link_info);
1558     }
1559 #endif
1561   if (pe_out_def_filename)
1562     pe_dll_generate_def_file (pe_out_def_filename);
1563 #endif /* DLL_SUPPORT */
1565   /* I don't know where .idata gets set as code, but it shouldn't be.  */
1566   {
1567     asection *asec = bfd_get_section_by_name (output_bfd, ".idata");
1569     if (asec)
1570       {
1571         asec->flags &= ~SEC_CODE;
1572         asec->flags |= SEC_DATA;
1573       }
1574   }
1578 /* Place an orphan section.
1580    We use this to put sections in a reasonable place in the file, and
1581    to ensure that they are aligned as required.
1583    We handle grouped sections here as well.  A section named .foo$nn
1584    goes into the output section .foo.  All grouped sections are sorted
1585    by name.
1587    Grouped sections for the default sections are handled by the
1588    default linker script using wildcards, and are sorted by
1589    sort_sections.  */
1591 static bfd_boolean
1592 gld_${EMULATION_NAME}_place_orphan (asection *s)
1594   const char *secname;
1595   const char *orig_secname;
1596   char *dollar = NULL;
1597   lang_output_section_statement_type *os;
1598   lang_statement_list_type add_child;
1600   secname = bfd_get_section_name (s->owner, s);
1602   /* Look through the script to see where to place this section.  */
1603   orig_secname = secname;
1604   if (!link_info.relocatable
1605       && (dollar = strchr (secname, '$')) != NULL)
1606     {
1607       size_t len = dollar - orig_secname;
1608       char *newname = xmalloc (len + 1);
1609       memcpy (newname, orig_secname, len);
1610       newname[len] = '\0';
1611       secname = newname;
1612     }
1614   os = lang_output_section_find (secname);
1616   lang_list_init (&add_child);
1618   if (os != NULL
1619       && (os->bfd_section == NULL
1620           || os->bfd_section->flags == 0
1621           || ((s->flags ^ os->bfd_section->flags)
1622               & (SEC_LOAD | SEC_ALLOC)) == 0))
1623     {
1624       /* We already have an output section statement with this
1625          name, and its bfd section, if any, has compatible flags.
1626          If the section already exists but does not have any flags set,
1627          then it has been created by the linker, probably as a result of
1628          a --section-start command line switch.  */
1629       lang_add_section (&add_child, s, os);
1630     }
1631   else
1632     {
1633       static struct orphan_save hold[] =
1634         {
1635           { ".text",
1636             SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1637             0, 0, 0, 0 },
1638           { ".rdata",
1639             SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1640             0, 0, 0, 0 },
1641           { ".data",
1642             SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1643             0, 0, 0, 0 },
1644           { ".bss",
1645             SEC_ALLOC,
1646             0, 0, 0, 0 }
1647         };
1648       enum orphan_save_index
1649         {
1650           orphan_text = 0,
1651           orphan_rodata,
1652           orphan_data,
1653           orphan_bss
1654         };
1655       static int orphan_init_done = 0;
1656       struct orphan_save *place;
1657       lang_output_section_statement_type *after;
1658       etree_type *address;
1660       if (!orphan_init_done)
1661         {
1662           struct orphan_save *ho;
1663           for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
1664             if (ho->name != NULL)
1665               {
1666                 ho->os = lang_output_section_find (ho->name);
1667                 if (ho->os != NULL && ho->os->flags == 0)
1668                   ho->os->flags = ho->flags;
1669               }
1670           orphan_init_done = 1;
1671         }
1673       /* Try to put the new output section in a reasonable place based
1674          on the section name and section flags.  */
1676       place = NULL;
1677       if ((s->flags & SEC_ALLOC) == 0)
1678         ;
1679       else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
1680         place = &hold[orphan_bss];
1681       else if ((s->flags & SEC_READONLY) == 0)
1682         place = &hold[orphan_data];
1683       else if ((s->flags & SEC_CODE) == 0)
1684         place = &hold[orphan_rodata];
1685       else
1686         place = &hold[orphan_text];
1688       after = NULL;
1689       if (place != NULL)
1690         {
1691           if (place->os == NULL)
1692             place->os = lang_output_section_find (place->name);
1693           after = place->os;
1694           if (after == NULL)
1695             after = lang_output_section_find_by_flags (s, &place->os, NULL);
1696           if (after == NULL)
1697             /* *ABS* is always the first output section statement.  */
1698             after = (&lang_output_section_statement.head
1699                      ->output_section_statement);
1700         }
1702       /* Choose a unique name for the section.  This will be needed if the
1703          same section name appears in the input file with different
1704          loadable or allocatable characteristics.  */
1705       if (bfd_get_section_by_name (output_bfd, secname) != NULL)
1706         {
1707           static int count = 1;
1708           secname = bfd_get_unique_section_name (output_bfd, secname, &count);
1709           if (secname == NULL)
1710             einfo ("%F%P: place_orphan failed: %E\n");
1711         }
1713       /* All sections in an executable must be aligned to a page boundary.  */
1714       address = exp_unop (ALIGN_K, exp_nameop (NAME, "__section_alignment__"));
1715       os = lang_insert_orphan (s, secname, after, place, address, &add_child);
1716     }
1718   {
1719     lang_statement_union_type **pl = &os->children.head;
1721     if (dollar != NULL)
1722       {
1723         bfd_boolean found_dollar;
1725         /* The section name has a '$'.  Sort it with the other '$'
1726            sections.  */
1727         found_dollar = FALSE;
1728         for ( ; *pl != NULL; pl = &(*pl)->header.next)
1729           {
1730             lang_input_section_type *ls;
1731             const char *lname;
1733             if ((*pl)->header.type != lang_input_section_enum)
1734               continue;
1736             ls = &(*pl)->input_section;
1738             lname = bfd_get_section_name (ls->section->owner, ls->section);
1739             if (strchr (lname, '$') == NULL)
1740               {
1741                 if (found_dollar)
1742                   break;
1743               }
1744             else
1745               {
1746                 found_dollar = TRUE;
1747                 if (strcmp (orig_secname, lname) < 0)
1748                   break;
1749               }
1750           }
1751       }
1753     if (add_child.head != NULL)
1754       {
1755         add_child.head->header.next = *pl;
1756         *pl = add_child.head;
1757       }
1758   }
1760   return TRUE;
1763 static bfd_boolean
1764 gld_${EMULATION_NAME}_open_dynamic_archive
1765   (const char *arch ATTRIBUTE_UNUSED, search_dirs_type *search,
1766    lang_input_statement_type *entry)
1768   static const struct
1769     {
1770       const char * format;
1771       bfd_boolean use_prefix;
1772     }
1773   libname_fmt [] =
1774     {
1775       /* Preferred explicit import library for dll's.  */
1776       { "lib%s.dll.a", FALSE },
1777       /* Alternate explicit import library for dll's.  */
1778       { "%s.dll.a", FALSE },
1779       /* "libfoo.a" could be either an import lib or a static lib.
1780           For backwards compatibility, libfoo.a needs to precede
1781           libfoo.dll and foo.dll in the search.  */
1782       { "lib%s.a", FALSE },
1783       /* The 'native' spelling of an import lib name is "foo.lib".  */
1784       { "%s.lib", FALSE },
1785 #ifdef DLL_SUPPORT
1786       /* Try "<prefix>foo.dll" (preferred dll name, if specified).  */
1787       { "%s%s.dll", TRUE },
1788 #endif
1789       /* Try "libfoo.dll" (default preferred dll name).  */
1790       { "lib%s.dll", FALSE },
1791       /* Finally try 'native' dll name "foo.dll".  */
1792       {  "%s.dll", FALSE },
1793       /* Note: If adding more formats to this table, make sure to check to
1794          see if their length is longer than libname_fmt[0].format, and if
1795          so, update the call to xmalloc() below.  */
1796       { NULL, FALSE }
1797     };
1798   static unsigned int format_max_len = 0;
1799   const char * filename;
1800   char * full_string;
1801   char * base_string;
1802   unsigned int i;
1805   if (! entry->is_archive)
1806     return FALSE;
1808   filename = entry->filename;
1810   if (format_max_len == 0)
1811     /* We need to allow space in the memory that we are going to allocate
1812        for the characters in the format string.  Since the format array is
1813        static we only need to calculate this information once.  In theory
1814        this value could also be computed statically, but this introduces
1815        the possibility for a discrepancy and hence a possible memory
1816        corruption.  The lengths we compute here will be too long because
1817        they will include any formating characters (%s) in the strings, but
1818        this will not matter.  */
1819     for (i = 0; libname_fmt[i].format; i++)
1820       if (format_max_len < strlen (libname_fmt[i].format))
1821         format_max_len = strlen (libname_fmt[i].format);
1823   full_string = xmalloc (strlen (search->name)
1824                          + strlen (filename)
1825                          + format_max_len
1826 #ifdef DLL_SUPPORT
1827                          + (pe_dll_search_prefix
1828                             ? strlen (pe_dll_search_prefix) : 0)
1829 #endif
1830                          /* Allow for the terminating NUL and for the path
1831                             separator character that is inserted between
1832                             search->name and the start of the format string.  */
1833                          + 2);
1835   sprintf (full_string, "%s/", search->name);
1836   base_string = full_string + strlen (full_string);
1838   for (i = 0; libname_fmt[i].format; i++)
1839     {
1840 #ifdef DLL_SUPPORT
1841       if (libname_fmt[i].use_prefix)
1842         {
1843           if (!pe_dll_search_prefix)
1844             continue;
1845           sprintf (base_string, libname_fmt[i].format, pe_dll_search_prefix, filename);
1846         }
1847       else
1848 #endif
1849         sprintf (base_string, libname_fmt[i].format, filename);
1851       if (ldfile_try_open_bfd (full_string, entry))
1852         break;
1853     }
1855   if (!libname_fmt[i].format)
1856     {
1857       free (full_string);
1858       return FALSE;
1859     }
1861   entry->filename = full_string;
1863   return TRUE;
1866 static int
1867 gld_${EMULATION_NAME}_find_potential_libraries
1868   (char *name, lang_input_statement_type *entry)
1870   return ldfile_open_file_search (name, entry, "", ".lib");
1873 static char *
1874 gld_${EMULATION_NAME}_get_script (int *isfile)
1876 # Scripts compiled in.
1877 # sed commands to quote an ld script as a C string.
1878 sc="-f stringify.sed"
1880 fragment <<EOF
1882   *isfile = 0;
1884   if (link_info.relocatable && config.build_constructors)
1885     return
1887 sed $sc ldscripts/${EMULATION_NAME}.xu                  >> e${EMULATION_NAME}.c
1888 echo '  ; else if (link_info.relocatable) return'       >> e${EMULATION_NAME}.c
1889 sed $sc ldscripts/${EMULATION_NAME}.xr                  >> e${EMULATION_NAME}.c
1890 echo '  ; else if (!config.text_read_only) return'      >> e${EMULATION_NAME}.c
1891 sed $sc ldscripts/${EMULATION_NAME}.xbn                 >> e${EMULATION_NAME}.c
1892 echo '  ; else if (!config.magic_demand_paged) return'  >> e${EMULATION_NAME}.c
1893 sed $sc ldscripts/${EMULATION_NAME}.xn                  >> e${EMULATION_NAME}.c
1894 echo '  ; else return'                                  >> e${EMULATION_NAME}.c
1895 sed $sc ldscripts/${EMULATION_NAME}.x                   >> e${EMULATION_NAME}.c
1896 echo '; }'                                              >> e${EMULATION_NAME}.c
1898 fragment <<EOF
1901 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1903   gld_${EMULATION_NAME}_before_parse,
1904   syslib_default,
1905   hll_default,
1906   gld_${EMULATION_NAME}_after_parse,
1907   gld_${EMULATION_NAME}_after_open,
1908   after_allocation_default,
1909   set_output_arch_default,
1910   ldemul_default_target,
1911   gld_${EMULATION_NAME}_before_allocation,
1912   gld_${EMULATION_NAME}_get_script,
1913   "${EMULATION_NAME}",
1914   "${OUTPUT_FORMAT}",
1915   gld_${EMULATION_NAME}_finish,
1916   NULL, /* Create output section statements.  */
1917   gld_${EMULATION_NAME}_open_dynamic_archive,
1918   gld_${EMULATION_NAME}_place_orphan,
1919   gld_${EMULATION_NAME}_set_symbols,
1920   NULL, /* parse_args */
1921   gld${EMULATION_NAME}_add_options,
1922   gld${EMULATION_NAME}_handle_option,
1923   gld_${EMULATION_NAME}_unrecognized_file,
1924   gld_${EMULATION_NAME}_list_options,
1925   gld_${EMULATION_NAME}_recognized_file,
1926   gld_${EMULATION_NAME}_find_potential_libraries,
1927   NULL  /* new_vers_pattern.  */