All NetBSD ELF targets should pass these tests.
[binutils.git] / ld / emultempl / pe.em
blob87a5bc26d54966e87bd0b67b52c94b4d298f3e2b
1 # This shell script emits a C file. -*- C -*-
2 # It does some substitutions.
3 if [ -z "$MACHINE" ]; then
4   OUTPUT_ARCH=${ARCH}
5 else
6   OUTPUT_ARCH=${ARCH}:${MACHINE}
7 fi
8 rm -f e${EMULATION_NAME}.c
9 (echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
10 cat >>e${EMULATION_NAME}.c <<EOF
11 /* This file is part of GLD, the Gnu Linker.
12    Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
13    Free Software Foundation, Inc.
15    This program is free software; you can redistribute it and/or modify
16    it under the terms of the GNU General Public License as published by
17    the Free Software Foundation; either version 2 of the License, or
18    (at your option) any later version.
20    This program is distributed in the hope that it will be useful,
21    but WITHOUT ANY WARRANTY; without even the implied warranty of
22    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23    GNU General Public License for more details.
25    You should have received a copy of the GNU General Public License
26    along with this program; if not, write to the Free Software
27    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
29 /* For WINDOWS_NT */
30 /* The original file generated returned different default scripts depending
31    on whether certain switches were set, but these switches pertain to the
32    Linux system and that particular version of coff.  In the NT case, we
33    only determine if the subsystem is console or windows in order to select
34    the correct entry point by default. */
36 #define TARGET_IS_${EMULATION_NAME}
38 /* Do this before including bfd.h, so we prototype the right functions.  */
39 #ifdef TARGET_IS_arm_epoc_pe
40 #define bfd_arm_pe_allocate_interworking_sections \
41         bfd_arm_epoc_pe_allocate_interworking_sections
42 #define bfd_arm_pe_get_bfd_for_interworking \
43         bfd_arm_epoc_pe_get_bfd_for_interworking
44 #define bfd_arm_pe_process_before_allocation \
45         bfd_arm_epoc_pe_process_before_allocation
46 #endif
48 #include "bfd.h"
49 #include "sysdep.h"
50 #include "bfdlink.h"
51 #include "getopt.h"
52 #include "libiberty.h"
53 #include "ld.h"
54 #include "ldmain.h"
55 #include "ldexp.h"
56 #include "ldlang.h"
57 #include "ldfile.h"
58 #include "ldemul.h"
59 #include <ldgram.h>
60 #include "ldlex.h"
61 #include "ldmisc.h"
62 #include "ldctor.h"
63 #include "coff/internal.h"
65 /* FIXME: This is a BFD internal header file, and we should not be
66    using it here.  */
67 #include "../bfd/libcoff.h"
69 #include "deffile.h"
70 #include "pe-dll.h"
72 #include <ctype.h>
74 /* Permit the emulation parameters to override the default section
75    alignment by setting OVERRIDE_SECTION_ALIGNMENT.  FIXME: This makes
76    it seem that include/coff/internal.h should not define
77    PE_DEF_SECTION_ALIGNMENT.  */
78 #if PE_DEF_SECTION_ALIGNMENT != ${OVERRIDE_SECTION_ALIGNMENT:-PE_DEF_SECTION_ALIGNMENT}
79 #undef PE_DEF_SECTION_ALIGNMENT
80 #define PE_DEF_SECTION_ALIGNMENT ${OVERRIDE_SECTION_ALIGNMENT}
81 #endif
83 #if defined(TARGET_IS_i386pe)
84 #define DLL_SUPPORT
85 #endif
86 #if defined(TARGET_IS_shpe) || defined(TARGET_IS_mipspe) || defined(TARGET_IS_armpe)
87 #define DLL_SUPPORT
88 #endif
90 #if defined(TARGET_IS_i386pe) || ! defined(DLL_SUPPORT)
91 #define PE_DEF_SUBSYSTEM                3
92 #else
93 #undef NT_EXE_IMAGE_BASE
94 #undef PE_DEF_SECTION_ALIGNMENT
95 #undef PE_DEF_FILE_ALIGNMENT
96 #define NT_EXE_IMAGE_BASE               0x00010000
97 #ifdef TARGET_IS_armpe
98 #define PE_DEF_SECTION_ALIGNMENT        0x00001000
99 #define PE_DEF_SUBSYSTEM                9
100 #else
101 #define PE_DEF_SECTION_ALIGNMENT        0x00000400
102 #define PE_DEF_SUBSYSTEM                2
103 #endif
104 #define PE_DEF_FILE_ALIGNMENT           0x00000200
105 #endif
107 static void gld_${EMULATION_NAME}_set_symbols PARAMS ((void));
108 static void gld_${EMULATION_NAME}_after_open PARAMS ((void));
109 static void gld_${EMULATION_NAME}_before_parse PARAMS ((void));
110 static void gld_${EMULATION_NAME}_after_parse PARAMS ((void));
111 static void gld_${EMULATION_NAME}_before_allocation PARAMS ((void));
112 static asection *output_prev_sec_find
113   PARAMS ((lang_output_section_statement_type *));
114 static bfd_boolean gld_${EMULATION_NAME}_place_orphan
115   PARAMS ((lang_input_statement_type *, asection *));
116 static char *gld_${EMULATION_NAME}_get_script PARAMS ((int *));
117 static int gld_${EMULATION_NAME}_parse_args PARAMS ((int, char **));
118 static void gld_${EMULATION_NAME}_finish PARAMS ((void));
119 static bfd_boolean gld_${EMULATION_NAME}_open_dynamic_archive
120   PARAMS ((const char *, search_dirs_type *, lang_input_statement_type *));
121 static void gld_${EMULATION_NAME}_list_options PARAMS ((FILE *));
122 static void set_pe_name PARAMS ((char *, long));
123 static void set_pe_subsystem PARAMS ((void));
124 static void set_pe_value PARAMS ((char *));
125 static void set_pe_stack_heap PARAMS ((char *, char *));
127 #ifdef DLL_SUPPORT
128 static bfd_boolean pe_undef_cdecl_match
129   PARAMS ((struct bfd_link_hash_entry *, PTR));
130 static void pe_fixup_stdcalls PARAMS ((void));
131 static int make_import_fixup PARAMS ((arelent *, asection *));
132 static void pe_find_data_imports PARAMS ((void));
133 #endif
135 static bfd_boolean pr_sym PARAMS ((struct bfd_hash_entry *, PTR));
136 static bfd_boolean gld_${EMULATION_NAME}_unrecognized_file
137   PARAMS ((lang_input_statement_type *));
138 static bfd_boolean gld_${EMULATION_NAME}_recognized_file
139   PARAMS ((lang_input_statement_type *));
140 static int gld_${EMULATION_NAME}_find_potential_libraries
141   PARAMS ((char *, lang_input_statement_type *));
144 static struct internal_extra_pe_aouthdr pe;
145 static int dll;
146 static int support_old_code = 0;
147 static char * thumb_entry_symbol = NULL;
148 static lang_assignment_statement_type *image_base_statement = 0;
150 #ifdef DLL_SUPPORT
151 static int pe_enable_stdcall_fixup = -1; /* 0=disable 1=enable.  */
152 static char *pe_out_def_filename = NULL;
153 static char *pe_implib_filename = NULL;
154 static int pe_enable_auto_image_base = 0;
155 static char *pe_dll_search_prefix = NULL;
156 #endif
158 extern const char *output_filename;
160 static void
161 gld_${EMULATION_NAME}_before_parse()
163   const bfd_arch_info_type *arch = bfd_scan_arch ("${OUTPUT_ARCH}");
164   if (arch)
165     {
166       ldfile_output_architecture = arch->arch;
167       ldfile_output_machine = arch->mach;
168       ldfile_output_machine_name = arch->printable_name;
169     }
170   else
171     ldfile_output_architecture = bfd_arch_${ARCH};
172   output_filename = "${EXECUTABLE_NAME:-a.exe}";
173 #ifdef DLL_SUPPORT
174   config.dynamic_link = TRUE;
175   config.has_shared = 1;
176   link_info.pei386_auto_import = -1;
177   link_info.pei386_runtime_pseudo_reloc = FALSE;
179 #if (PE_DEF_SUBSYSTEM == 9) || (PE_DEF_SUBSYSTEM == 2)
180 #if defined TARGET_IS_mipspe || defined TARGET_IS_armpe
181   lang_add_entry ("WinMainCRTStartup", 1);
182 #else
183   lang_add_entry ("_WinMainCRTStartup", 1);
184 #endif
185 #endif
186 #endif
189 /* PE format extra command line options.  */
191 /* Used for setting flags in the PE header.  */
192 #define OPTION_BASE_FILE                (300  + 1)
193 #define OPTION_DLL                      (OPTION_BASE_FILE + 1)
194 #define OPTION_FILE_ALIGNMENT           (OPTION_DLL + 1)
195 #define OPTION_IMAGE_BASE               (OPTION_FILE_ALIGNMENT + 1)
196 #define OPTION_MAJOR_IMAGE_VERSION      (OPTION_IMAGE_BASE + 1)
197 #define OPTION_MAJOR_OS_VERSION         (OPTION_MAJOR_IMAGE_VERSION + 1)
198 #define OPTION_MAJOR_SUBSYSTEM_VERSION  (OPTION_MAJOR_OS_VERSION + 1)
199 #define OPTION_MINOR_IMAGE_VERSION      (OPTION_MAJOR_SUBSYSTEM_VERSION + 1)
200 #define OPTION_MINOR_OS_VERSION         (OPTION_MINOR_IMAGE_VERSION + 1)
201 #define OPTION_MINOR_SUBSYSTEM_VERSION  (OPTION_MINOR_OS_VERSION + 1)
202 #define OPTION_SECTION_ALIGNMENT        (OPTION_MINOR_SUBSYSTEM_VERSION + 1)
203 #define OPTION_STACK                    (OPTION_SECTION_ALIGNMENT + 1)
204 #define OPTION_SUBSYSTEM                (OPTION_STACK + 1)
205 #define OPTION_HEAP                     (OPTION_SUBSYSTEM + 1)
206 #define OPTION_SUPPORT_OLD_CODE         (OPTION_HEAP + 1)
207 #define OPTION_OUT_DEF                  (OPTION_SUPPORT_OLD_CODE + 1)
208 #define OPTION_EXPORT_ALL               (OPTION_OUT_DEF + 1)
209 #define OPTION_EXCLUDE_SYMBOLS          (OPTION_EXPORT_ALL + 1)
210 #define OPTION_KILL_ATS                 (OPTION_EXCLUDE_SYMBOLS + 1)
211 #define OPTION_STDCALL_ALIASES          (OPTION_KILL_ATS + 1)
212 #define OPTION_ENABLE_STDCALL_FIXUP     (OPTION_STDCALL_ALIASES + 1)
213 #define OPTION_DISABLE_STDCALL_FIXUP    (OPTION_ENABLE_STDCALL_FIXUP + 1)
214 #define OPTION_IMPLIB_FILENAME          (OPTION_DISABLE_STDCALL_FIXUP + 1)
215 #define OPTION_THUMB_ENTRY              (OPTION_IMPLIB_FILENAME + 1)
216 #define OPTION_WARN_DUPLICATE_EXPORTS   (OPTION_THUMB_ENTRY + 1)
217 #define OPTION_IMP_COMPAT               (OPTION_WARN_DUPLICATE_EXPORTS + 1)
218 #define OPTION_ENABLE_AUTO_IMAGE_BASE   (OPTION_IMP_COMPAT + 1)
219 #define OPTION_DISABLE_AUTO_IMAGE_BASE  (OPTION_ENABLE_AUTO_IMAGE_BASE + 1)
220 #define OPTION_DLL_SEARCH_PREFIX        (OPTION_DISABLE_AUTO_IMAGE_BASE + 1)
221 #define OPTION_NO_DEFAULT_EXCLUDES      (OPTION_DLL_SEARCH_PREFIX + 1)
222 #define OPTION_DLL_ENABLE_AUTO_IMPORT   (OPTION_NO_DEFAULT_EXCLUDES + 1)
223 #define OPTION_DLL_DISABLE_AUTO_IMPORT  (OPTION_DLL_ENABLE_AUTO_IMPORT + 1)
224 #define OPTION_ENABLE_EXTRA_PE_DEBUG    (OPTION_DLL_DISABLE_AUTO_IMPORT + 1)
225 #define OPTION_EXCLUDE_LIBS             (OPTION_ENABLE_EXTRA_PE_DEBUG + 1)
226 #define OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC  \
227                                         (OPTION_EXCLUDE_LIBS + 1)
228 #define OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC \
229                                         (OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC + 1)
231 static struct option longopts[] = {
232   /* PE options */
233   {"base-file", required_argument, NULL, OPTION_BASE_FILE},
234   {"dll", no_argument, NULL, OPTION_DLL},
235   {"file-alignment", required_argument, NULL, OPTION_FILE_ALIGNMENT},
236   {"heap", required_argument, NULL, OPTION_HEAP},
237   {"image-base", required_argument, NULL, OPTION_IMAGE_BASE},
238   {"major-image-version", required_argument, NULL, OPTION_MAJOR_IMAGE_VERSION},
239   {"major-os-version", required_argument, NULL, OPTION_MAJOR_OS_VERSION},
240   {"major-subsystem-version", required_argument, NULL, OPTION_MAJOR_SUBSYSTEM_VERSION},
241   {"minor-image-version", required_argument, NULL, OPTION_MINOR_IMAGE_VERSION},
242   {"minor-os-version", required_argument, NULL, OPTION_MINOR_OS_VERSION},
243   {"minor-subsystem-version", required_argument, NULL, OPTION_MINOR_SUBSYSTEM_VERSION},
244   {"section-alignment", required_argument, NULL, OPTION_SECTION_ALIGNMENT},
245   {"stack", required_argument, NULL, OPTION_STACK},
246   {"subsystem", required_argument, NULL, OPTION_SUBSYSTEM},
247   {"support-old-code", no_argument, NULL, OPTION_SUPPORT_OLD_CODE},
248   {"thumb-entry", required_argument, NULL, OPTION_THUMB_ENTRY},
249 #ifdef DLL_SUPPORT
250   /* getopt allows abbreviations, so we do this to stop it from treating -o
251      as an abbreviation for this option */
252   {"output-def", required_argument, NULL, OPTION_OUT_DEF},
253   {"output-def", required_argument, NULL, OPTION_OUT_DEF},
254   {"export-all-symbols", no_argument, NULL, OPTION_EXPORT_ALL},
255   {"exclude-symbols", required_argument, NULL, OPTION_EXCLUDE_SYMBOLS},
256   {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
257   {"kill-at", no_argument, NULL, OPTION_KILL_ATS},
258   {"add-stdcall-alias", no_argument, NULL, OPTION_STDCALL_ALIASES},
259   {"enable-stdcall-fixup", no_argument, NULL, OPTION_ENABLE_STDCALL_FIXUP},
260   {"disable-stdcall-fixup", no_argument, NULL, OPTION_DISABLE_STDCALL_FIXUP},
261   {"out-implib", required_argument, NULL, OPTION_IMPLIB_FILENAME},
262   {"warn-duplicate-exports", no_argument, NULL, OPTION_WARN_DUPLICATE_EXPORTS},
263   /* getopt() allows abbreviations, so we do this to stop it from
264      treating -c as an abbreviation for these --compat-implib.  */
265   {"compat-implib", no_argument, NULL, OPTION_IMP_COMPAT},
266   {"compat-implib", no_argument, NULL, OPTION_IMP_COMPAT},
267   {"enable-auto-image-base", no_argument, NULL, OPTION_ENABLE_AUTO_IMAGE_BASE},
268   {"disable-auto-image-base", no_argument, NULL, OPTION_DISABLE_AUTO_IMAGE_BASE},
269   {"dll-search-prefix", required_argument, NULL, OPTION_DLL_SEARCH_PREFIX},
270   {"no-default-excludes", no_argument, NULL, OPTION_NO_DEFAULT_EXCLUDES},
271   {"enable-auto-import", no_argument, NULL, OPTION_DLL_ENABLE_AUTO_IMPORT},
272   {"disable-auto-import", no_argument, NULL, OPTION_DLL_DISABLE_AUTO_IMPORT},
273   {"enable-extra-pe-debug", no_argument, NULL, OPTION_ENABLE_EXTRA_PE_DEBUG},
274   {"enable-runtime-pseudo-reloc", no_argument, NULL, OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC},
275   {"disable-runtime-pseudo-reloc", no_argument, NULL, OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC},
276 #endif
277   {NULL, no_argument, NULL, 0}
281 /* PE/WIN32; added routines to get the subsystem type, heap and/or stack
282    parameters which may be input from the command line.  */
284 typedef struct
286   void *ptr;
287   int size;
288   int value;
289   char *symbol;
290   int inited;
291 } definfo;
293 #define D(field,symbol,def)  {&pe.field,sizeof(pe.field), def, symbol,0}
295 static definfo init[] =
297   /* imagebase must be first */
298 #define IMAGEBASEOFF 0
299   D(ImageBase,"__image_base__", NT_EXE_IMAGE_BASE),
300 #define DLLOFF 1
301   {&dll, sizeof(dll), 0, "__dll__", 0},
302   D(SectionAlignment,"__section_alignment__", PE_DEF_SECTION_ALIGNMENT),
303   D(FileAlignment,"__file_alignment__", PE_DEF_FILE_ALIGNMENT),
304   D(MajorOperatingSystemVersion,"__major_os_version__", 4),
305   D(MinorOperatingSystemVersion,"__minor_os_version__", 0),
306   D(MajorImageVersion,"__major_image_version__", 1),
307   D(MinorImageVersion,"__minor_image_version__", 0),
308 #ifdef TARGET_IS_armpe
309   D(MajorSubsystemVersion,"__major_subsystem_version__", 2),
310 #else
311   D(MajorSubsystemVersion,"__major_subsystem_version__", 4),
312 #endif
313   D(MinorSubsystemVersion,"__minor_subsystem_version__", 0),
314   D(Subsystem,"__subsystem__", ${SUBSYSTEM}),
315   D(SizeOfStackReserve,"__size_of_stack_reserve__", 0x200000),
316   D(SizeOfStackCommit,"__size_of_stack_commit__", 0x1000),
317   D(SizeOfHeapReserve,"__size_of_heap_reserve__", 0x100000),
318   D(SizeOfHeapCommit,"__size_of_heap_commit__", 0x1000),
319   D(LoaderFlags,"__loader_flags__", 0x0),
320   { NULL, 0, 0, NULL, 0 }
324 static void
325 gld_${EMULATION_NAME}_list_options (file)
326      FILE * file;
328   fprintf (file, _("  --base_file <basefile>             Generate a base file for relocatable DLLs\n"));
329   fprintf (file, _("  --dll                              Set image base to the default for DLLs\n"));
330   fprintf (file, _("  --file-alignment <size>            Set file alignment\n"));
331   fprintf (file, _("  --heap <size>                      Set initial size of the heap\n"));
332   fprintf (file, _("  --image-base <address>             Set start address of the executable\n"));
333   fprintf (file, _("  --major-image-version <number>     Set version number of the executable\n"));
334   fprintf (file, _("  --major-os-version <number>        Set minimum required OS version\n"));
335   fprintf (file, _("  --major-subsystem-version <number> Set minimum required OS subsystem version\n"));
336   fprintf (file, _("  --minor-image-version <number>     Set revision number of the executable\n"));
337   fprintf (file, _("  --minor-os-version <number>        Set minimum required OS revision\n"));
338   fprintf (file, _("  --minor-subsystem-version <number> Set minimum required OS subsystem revision\n"));
339   fprintf (file, _("  --section-alignment <size>         Set section alignment\n"));
340   fprintf (file, _("  --stack <size>                     Set size of the initial stack\n"));
341   fprintf (file, _("  --subsystem <name>[:<version>]     Set required OS subsystem [& version]\n"));
342   fprintf (file, _("  --support-old-code                 Support interworking with old code\n"));
343   fprintf (file, _("  --thumb-entry=<symbol>             Set the entry point to be Thumb <symbol>\n"));
344 #ifdef DLL_SUPPORT
345   fprintf (file, _("  --add-stdcall-alias                Export symbols with and without @nn\n"));
346   fprintf (file, _("  --disable-stdcall-fixup            Don't link _sym to _sym@nn\n"));
347   fprintf (file, _("  --enable-stdcall-fixup             Link _sym to _sym@nn without warnings\n"));
348   fprintf (file, _("  --exclude-symbols sym,sym,...      Exclude symbols from automatic export\n"));
349   fprintf (file, _("  --exclude-libs lib,lib,...         Exclude libraries from automatic export\n"));
350   fprintf (file, _("  --export-all-symbols               Automatically export all globals to DLL\n"));
351   fprintf (file, _("  --kill-at                          Remove @nn from exported symbols\n"));
352   fprintf (file, _("  --out-implib <file>                Generate import library\n"));
353   fprintf (file, _("  --output-def <file>                Generate a .DEF file for the built DLL\n"));
354   fprintf (file, _("  --warn-duplicate-exports           Warn about duplicate exports.\n"));
355   fprintf (file, _("  --compat-implib                    Create backward compatible import libs;\n\
356                                        create __imp_<SYMBOL> as well.\n"));
357   fprintf (file, _("  --enable-auto-image-base           Automatically choose image base for DLLs\n\
358                                        unless user specifies one\n"));
359   fprintf (file, _("  --disable-auto-image-base          Do not auto-choose image base. (default)\n"));
360   fprintf (file, _("  --dll-search-prefix=<string>       When linking dynamically to a dll without an\n\
361                                        importlib, use <string><basename>.dll \n\
362                                        in preference to lib<basename>.dll \n"));
363   fprintf (file, _("  --enable-auto-import               Do sophistcated linking of _sym to \n\
364                                        __imp_sym for DATA references\n"));
365   fprintf (file, _("  --disable-auto-import              Do not auto-import DATA items from DLLs\n"));
366   fprintf (file, _("  --enable-runtime-pseudo-reloc      Work around auto-import limitations by\n\
367                                        adding pseudo-relocations resolved at runtime.\n"));
368   fprintf (file, _("  --disable-runtime-pseudo-reloc     Do not add runtime pseudo-relocations for\n\
369                                        auto-imported DATA.\n"));
370   fprintf (file, _("  --enable-extra-pe-debug            Enable verbose debug output when building\n\
371                                        or linking to DLLs (esp. auto-import)\n"));
372 #endif
376 static void
377 set_pe_name (name, val)
378      char *name;
379      long val;
381   int i;
383   /* Find the name and set it.  */
384   for (i = 0; init[i].ptr; i++)
385     {
386       if (strcmp (name, init[i].symbol) == 0)
387         {
388           init[i].value = val;
389           init[i].inited = 1;
390           return;
391         }
392     }
393   abort ();
397 static void
398 set_pe_subsystem ()
400   const char *sver;
401   int len;
402   int i;
403   static const struct
404     {
405       const char *name;
406       const int value;
407       const char *entry;
408     }
409   v[] =
410     {
411       { "native", 1, "NtProcessStartup" },
412 #if defined TARGET_IS_mipspe || defined TARGET_IS_armpe
413       { "windows", 2, "WinMainCRTStartup" },
414 #else
415       { "windows", 2, "WinMainCRTStartup" },
416 #endif
417       { "console", 3, "mainCRTStartup" },
418 #if 0
419       /* The Microsoft linker does not recognize this.  */
420       { "os2", 5, "" },
421 #endif
422       { "posix", 7, "__PosixProcessStartup"},
423       { "wince", 9, "_WinMainCRTStartup" },
424       { 0, 0, 0 }
425     };
427   sver = strchr (optarg, ':');
428   if (sver == NULL)
429     len = strlen (optarg);
430   else
431     {
432       char *end;
434       len = sver - optarg;
435       set_pe_name ("__major_subsystem_version__",
436                    strtoul (sver + 1, &end, 0));
437       if (*end == '.')
438         set_pe_name ("__minor_subsystem_version__",
439                      strtoul (end + 1, &end, 0));
440       if (*end != '\0')
441         einfo (_("%P: warning: bad version number in -subsystem option\n"));
442     }
444   for (i = 0; v[i].name; i++)
445     {
446       if (strncmp (optarg, v[i].name, len) == 0
447           && v[i].name[len] == '\0')
448         {
449           const char *initial_symbol_char;
450           const char *entry;
452           set_pe_name ("__subsystem__", v[i].value);
454           initial_symbol_char = ${INITIAL_SYMBOL_CHAR};
455           if (*initial_symbol_char == '\0')
456             entry = v[i].entry;
457           else
458             {
459               char *alc_entry;
461               /* lang_add_entry expects its argument to be permanently
462                  allocated, so we don't free this string.  */
463               alc_entry = xmalloc (strlen (initial_symbol_char)
464                                    + strlen (v[i].entry)
465                                    + 1);
466               strcpy (alc_entry, initial_symbol_char);
467               strcat (alc_entry, v[i].entry);
468               entry = alc_entry;
469             }
471           lang_add_entry (entry, 0);
473           return;
474         }
475     }
477   einfo (_("%P%F: invalid subsystem type %s\n"), optarg);
481 static void
482 set_pe_value (name)
483      char *name;
486   char *end;
488   set_pe_name (name,  strtoul (optarg, &end, 0));
490   if (end == optarg)
491     einfo (_("%P%F: invalid hex number for PE parameter '%s'\n"), optarg);
493   optarg = end;
497 static void
498 set_pe_stack_heap (resname, comname)
499      char *resname;
500      char *comname;
502   set_pe_value (resname);
504   if (*optarg == ',')
505     {
506       optarg++;
507       set_pe_value (comname);
508     }
509   else if (*optarg)
510     einfo (_("%P%F: strange hex info for PE parameter '%s'\n"), optarg);
514 static int
515 gld_${EMULATION_NAME}_parse_args (argc, argv)
516      int argc;
517      char **argv;
519   int longind;
520   int optc;
521   int prevoptind = optind;
522   int prevopterr = opterr;
523   int wanterror;
524   static int lastoptind = -1;
526   if (lastoptind != optind)
527     opterr = 0;
528   wanterror = opterr;
530   lastoptind = optind;
532   optc = getopt_long_only (argc, argv, "-", longopts, &longind);
533   opterr = prevopterr;
535   switch (optc)
536     {
537     default:
538       if (wanterror)
539         xexit (1);
540       optind =  prevoptind;
541       return 0;
543     case OPTION_BASE_FILE:
544       link_info.base_file = (PTR) fopen (optarg, FOPEN_WB);
545       if (link_info.base_file == NULL)
546         {
547           /* xgettext:c-format */
548           fprintf (stderr, _("%s: Can't open base file %s\n"),
549                    program_name, optarg);
550           xexit (1);
551         }
552       break;
554       /* PE options.  */
555     case OPTION_HEAP:
556       set_pe_stack_heap ("__size_of_heap_reserve__", "__size_of_heap_commit__");
557       break;
558     case OPTION_STACK:
559       set_pe_stack_heap ("__size_of_stack_reserve__", "__size_of_stack_commit__");
560       break;
561     case OPTION_SUBSYSTEM:
562       set_pe_subsystem ();
563       break;
564     case OPTION_MAJOR_OS_VERSION:
565       set_pe_value ("__major_os_version__");
566       break;
567     case OPTION_MINOR_OS_VERSION:
568       set_pe_value ("__minor_os_version__");
569       break;
570     case OPTION_MAJOR_SUBSYSTEM_VERSION:
571       set_pe_value ("__major_subsystem_version__");
572       break;
573     case OPTION_MINOR_SUBSYSTEM_VERSION:
574       set_pe_value ("__minor_subsystem_version__");
575       break;
576     case OPTION_MAJOR_IMAGE_VERSION:
577       set_pe_value ("__major_image_version__");
578       break;
579     case OPTION_MINOR_IMAGE_VERSION:
580       set_pe_value ("__minor_image_version__");
581       break;
582     case OPTION_FILE_ALIGNMENT:
583       set_pe_value ("__file_alignment__");
584       break;
585     case OPTION_SECTION_ALIGNMENT:
586       set_pe_value ("__section_alignment__");
587       break;
588     case OPTION_DLL:
589       set_pe_name ("__dll__", 1);
590       break;
591     case OPTION_IMAGE_BASE:
592       set_pe_value ("__image_base__");
593       break;
594     case OPTION_SUPPORT_OLD_CODE:
595       support_old_code = 1;
596       break;
597     case OPTION_THUMB_ENTRY:
598       thumb_entry_symbol = optarg;
599       break;
600 #ifdef DLL_SUPPORT
601     case OPTION_OUT_DEF:
602       pe_out_def_filename = xstrdup (optarg);
603       break;
604     case OPTION_EXPORT_ALL:
605       pe_dll_export_everything = 1;
606       break;
607     case OPTION_EXCLUDE_SYMBOLS:
608       pe_dll_add_excludes (optarg, 0);
609       break;
610     case OPTION_EXCLUDE_LIBS:
611       pe_dll_add_excludes (optarg, 1);
612       break;
613     case OPTION_KILL_ATS:
614       pe_dll_kill_ats = 1;
615       break;
616     case OPTION_STDCALL_ALIASES:
617       pe_dll_stdcall_aliases = 1;
618       break;
619     case OPTION_ENABLE_STDCALL_FIXUP:
620       pe_enable_stdcall_fixup = 1;
621       break;
622     case OPTION_DISABLE_STDCALL_FIXUP:
623       pe_enable_stdcall_fixup = 0;
624       break;
625     case OPTION_IMPLIB_FILENAME:
626       pe_implib_filename = xstrdup (optarg);
627       break;
628     case OPTION_WARN_DUPLICATE_EXPORTS:
629       pe_dll_warn_dup_exports = 1;
630       break;
631     case OPTION_IMP_COMPAT:
632       pe_dll_compat_implib = 1;
633       break;
634     case OPTION_ENABLE_AUTO_IMAGE_BASE:
635       pe_enable_auto_image_base = 1;
636       break;
637     case OPTION_DISABLE_AUTO_IMAGE_BASE:
638       pe_enable_auto_image_base = 0;
639       break;
640     case OPTION_DLL_SEARCH_PREFIX:
641       pe_dll_search_prefix = xstrdup (optarg);
642       break;
643     case OPTION_NO_DEFAULT_EXCLUDES:
644       pe_dll_do_default_excludes = 0;
645       break;
646     case OPTION_DLL_ENABLE_AUTO_IMPORT:
647       link_info.pei386_auto_import = 1;
648       break;
649     case OPTION_DLL_DISABLE_AUTO_IMPORT:
650       link_info.pei386_auto_import = 0;
651       break;
652     case OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC:
653       link_info.pei386_runtime_pseudo_reloc = 1;
654       break;
655     case OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC:
656       link_info.pei386_runtime_pseudo_reloc = 0;
657       break;
658     case OPTION_ENABLE_EXTRA_PE_DEBUG:
659       pe_dll_extra_pe_debug = 1;
660       break;
661 #endif
662     }
663   return 1;
667 #ifdef DLL_SUPPORT
668 static unsigned long
669 strhash (const char *str)
671   const unsigned char *s;
672   unsigned long hash;
673   unsigned int c;
674   unsigned int len;
676   hash = 0;
677   len = 0;
678   s = (const unsigned char *) str;
679   while ((c = *s++) != '\0')
680     {
681       hash += c + (c << 17);
682       hash ^= hash >> 2;
683       ++len;
684     }
685   hash += len + (len << 17);
686   hash ^= hash >> 2;
688   return hash;
691 /* Use the output file to create a image base for relocatable DLLs.  */
693 static unsigned long
694 compute_dll_image_base (const char *ofile)
696   unsigned long hash = strhash (ofile);
697   return 0x60000000 | ((hash << 16) & 0x0FFC0000);
699 #endif
701 /* Assign values to the special symbols before the linker script is
702    read.  */
704 static void
705 gld_${EMULATION_NAME}_set_symbols ()
707   /* Run through and invent symbols for all the
708      names and insert the defaults.  */
709   int j;
710   lang_statement_list_type *save;
712   if (!init[IMAGEBASEOFF].inited)
713     {
714       if (link_info.relocateable)
715         init[IMAGEBASEOFF].value = 0;
716       else if (init[DLLOFF].value || link_info.shared)
717 #ifdef DLL_SUPPORT
718         init[IMAGEBASEOFF].value = (pe_enable_auto_image_base) ?
719           compute_dll_image_base (output_filename) : NT_DLL_IMAGE_BASE;
720 #else
721         init[IMAGEBASEOFF].value = NT_DLL_IMAGE_BASE;
722 #endif
723       else
724         init[IMAGEBASEOFF].value = NT_EXE_IMAGE_BASE;
725     }
727   /* Don't do any symbol assignments if this is a relocateable link.  */
728   if (link_info.relocateable)
729     return;
731   /* Glue the assignments into the abs section.  */
732   save = stat_ptr;
734   stat_ptr = &(abs_output_section->children);
736   for (j = 0; init[j].ptr; j++)
737     {
738       long val = init[j].value;
739       lang_assignment_statement_type *rv;
740       rv = lang_add_assignment (exp_assop ('=', init[j].symbol,
741                                            exp_intop (val)));
742       if (init[j].size == sizeof (short))
743         *(short *) init[j].ptr = val;
744       else if (init[j].size == sizeof (int))
745         *(int *) init[j].ptr = val;
746       else if (init[j].size == sizeof (long))
747         *(long *) init[j].ptr = val;
748       /* This might be a long long or other special type.  */
749       else if (init[j].size == sizeof (bfd_vma))
750         *(bfd_vma *) init[j].ptr = val;
751       else      abort ();
752       if (j == IMAGEBASEOFF)
753         image_base_statement = rv;
754     }
755   /* Restore the pointer.  */
756   stat_ptr = save;
758   if (pe.FileAlignment >
759       pe.SectionAlignment)
760     {
761       einfo (_("%P: warning, file alignment > section alignment.\n"));
762     }
765 /* This is called after the linker script and the command line options
766    have been read.  */
768 static void
769 gld_${EMULATION_NAME}_after_parse ()
771   /* The Windows libraries are designed for the linker to treat the
772      entry point as an undefined symbol.  Otherwise, the .obj that
773      defines mainCRTStartup is brought in because it is the first
774      encountered in libc.lib and it has other symbols in it which will
775      be pulled in by the link process.  To avoid this, we act as
776      though the user specified -u with the entry point symbol.
778      This function is called after the linker script and command line
779      options have been read, so at this point we know the right entry
780      point.  This function is called before the input files are
781      opened, so registering the symbol as undefined will make a
782      difference.  */
784   if (! link_info.relocateable && entry_symbol.name != NULL)
785     ldlang_add_undef (entry_symbol.name);
788 /* pe-dll.c directly accesses pe_data_import_dll,
789    so it must be defined outside of #ifdef DLL_SUPPORT.
790    Note - this variable is deliberately not initialised.
791    This allows it to be treated as a common varaible, and only
792    exist in one incarnation in a multiple target enabled linker.  */
793 char * pe_data_import_dll;
795 #ifdef DLL_SUPPORT
796 static struct bfd_link_hash_entry *pe_undef_found_sym;
798 static bfd_boolean
799 pe_undef_cdecl_match (h, string)
800   struct bfd_link_hash_entry *h;
801   PTR string;
803   int sl;
805   sl = strlen (string); /* Silence compiler warning.  */
806   if (h->type == bfd_link_hash_defined
807       && strncmp (h->root.string, string, sl) == 0
808       && h->root.string[sl] == '@')
809     {
810       pe_undef_found_sym = h;
811       return FALSE;
812     }
813   return TRUE;
816 static void
817 pe_fixup_stdcalls ()
819   static int gave_warning_message = 0;
820   struct bfd_link_hash_entry *undef, *sym;
822   if (pe_dll_extra_pe_debug)
823     printf ("%s\n", __FUNCTION__);
825   for (undef = link_info.hash->undefs; undef; undef=undef->next)
826     if (undef->type == bfd_link_hash_undefined)
827       {
828         char* at = strchr (undef->root.string, '@');
829         int lead_at = (*undef->root.string == '@');
830         /* For now, don't try to fixup fastcall symbols.  */
832         if (at && !lead_at)
833           {
834             /* The symbol is a stdcall symbol, so let's look for a
835                cdecl symbol with the same name and resolve to that.  */
836             char *cname = xstrdup (undef->root.string /* + lead_at */);
837             at = strchr (cname, '@');
838             *at = 0;
839             sym = bfd_link_hash_lookup (link_info.hash, cname, 0, 0, 1);
841             if (sym && sym->type == bfd_link_hash_defined)
842               {
843                 undef->type = bfd_link_hash_defined;
844                 undef->u.def.value = sym->u.def.value;
845                 undef->u.def.section = sym->u.def.section;
847                 if (pe_enable_stdcall_fixup == -1)
848                   {
849                     einfo (_("Warning: resolving %s by linking to %s\n"),
850                            undef->root.string, cname);
851                     if (! gave_warning_message)
852                       {
853                         gave_warning_message = 1;
854                         einfo (_("Use --enable-stdcall-fixup to disable these warnings\n"));
855                         einfo (_("Use --disable-stdcall-fixup to disable these fixups\n"));
856                       }
857                   }
858               }
859           }
860         else
861           {
862             /* The symbol is a cdecl symbol, so we look for stdcall
863                symbols - which means scanning the whole symbol table.  */
864             pe_undef_found_sym = 0;
865             bfd_link_hash_traverse (link_info.hash, pe_undef_cdecl_match,
866                                     (PTR) undef->root.string);
867             sym = pe_undef_found_sym;
868             if (sym)
869               {
870                 undef->type = bfd_link_hash_defined;
871                 undef->u.def.value = sym->u.def.value;
872                 undef->u.def.section = sym->u.def.section;
874                 if (pe_enable_stdcall_fixup == -1)
875                   {
876                     einfo (_("Warning: resolving %s by linking to %s\n"),
877                            undef->root.string, sym->root.string);
878                     if (! gave_warning_message)
879                       {
880                         gave_warning_message = 1;
881                         einfo (_("Use --enable-stdcall-fixup to disable these warnings\n"));
882                         einfo (_("Use --disable-stdcall-fixup to disable these fixups\n"));
883                       }
884                   }
885               }
886           }
887       }
890 static int
891 make_import_fixup (rel, s)
892   arelent *rel;
893   asection *s;
895   struct symbol_cache_entry *sym = *rel->sym_ptr_ptr;
896   int addend = 0;
898   if (pe_dll_extra_pe_debug)
899     printf ("arelent: %s@%#lx: add=%li\n", sym->name,
900             (long) rel->address, (long) rel->addend);
902   if (! bfd_get_section_contents (s->owner, s, &addend, rel->address, sizeof (addend)))
903     einfo (_("%C: Cannot get section contents - auto-import exception\n"),
904            s->owner, s, rel->address);
906   pe_create_import_fixup (rel, s, addend);
908   return 1;
911 static void
912 pe_find_data_imports ()
914   struct bfd_link_hash_entry *undef, *sym;
916   if (link_info.pei386_auto_import == 0)
917     return;
919   for (undef = link_info.hash->undefs; undef; undef=undef->next)
920     {
921       if (undef->type == bfd_link_hash_undefined)
922         {
923           /* C++ symbols are *long*.  */
924           char buf[4096];
926           if (pe_dll_extra_pe_debug)
927             printf ("%s:%s\n", __FUNCTION__, undef->root.string);
929           sprintf (buf, "__imp_%s", undef->root.string);
931           sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
933           if (sym && sym->type == bfd_link_hash_defined)
934             {
935               bfd *b = sym->u.def.section->owner;
936               asymbol **symbols;
937               int nsyms, symsize, i;
939               if (link_info.pei386_auto_import == -1)
940                 info_msg (_("Info: resolving %s by linking to %s (auto-import)\n"),
941                           undef->root.string, buf);
943               symsize = bfd_get_symtab_upper_bound (b);
944               symbols = (asymbol **) xmalloc (symsize);
945               nsyms = bfd_canonicalize_symtab (b, symbols);
947               for (i = 0; i < nsyms; i++)
948                 {
949                   if (memcmp (symbols[i]->name, "__head_",
950                               sizeof ("__head_") - 1))
951                     continue;
953                   if (pe_dll_extra_pe_debug)
954                     printf ("->%s\n", symbols[i]->name);
956                   pe_data_import_dll = (char*) (symbols[i]->name +
957                                                 sizeof ("__head_") - 1);
958                   break;
959                 }
961               pe_walk_relocs_of_symbol (&link_info, undef->root.string,
962                                         make_import_fixup);
964               /* Let's differentiate it somehow from defined.  */
965               undef->type = bfd_link_hash_defweak;
966               /* We replace original name with __imp_ prefixed, this
967                  1) may trash memory 2) leads to duplicate symbol generation.
968                  Still, IMHO it's better than having name poluted.  */
969               undef->root.string = sym->root.string;
970               undef->u.def.value = sym->u.def.value;
971               undef->u.def.section = sym->u.def.section;
972             }
973         }
974     }
976 #endif /* DLL_SUPPORT */
978 static bfd_boolean
979 pr_sym (h, string)
980   struct bfd_hash_entry *h;
981   PTR string ATTRIBUTE_UNUSED;
983   if (pe_dll_extra_pe_debug)
984     printf ("+%s\n",h->string);
986   return TRUE;
990 static void
991 gld_${EMULATION_NAME}_after_open ()
993   if (pe_dll_extra_pe_debug)
994     {
995       bfd *a;
996       struct bfd_link_hash_entry *sym;
998       printf ("%s()\n", __FUNCTION__);
1000       for (sym = link_info.hash->undefs; sym; sym=sym->next)
1001         printf ("-%s\n", sym->root.string);
1002       bfd_hash_traverse (&link_info.hash->table, pr_sym,NULL);
1004       for (a = link_info.input_bfds; a; a = a->link_next)
1005         printf ("*%s\n",a->filename);
1006     }
1008   /* Pass the wacky PE command line options into the output bfd.
1009      FIXME: This should be done via a function, rather than by
1010      including an internal BFD header.  */
1012   if (coff_data (output_bfd) == NULL || coff_data (output_bfd)->pe == 0)
1013     einfo (_("%F%P: PE operations on non PE file.\n"));
1015   pe_data (output_bfd)->pe_opthdr = pe;
1016   pe_data (output_bfd)->dll = init[DLLOFF].value;
1018 #ifdef DLL_SUPPORT
1019   if (pe_enable_stdcall_fixup) /* -1=warn or 1=disable */
1020     pe_fixup_stdcalls ();
1022   pe_process_import_defs (output_bfd, & link_info);
1024   pe_find_data_imports ();
1026   if (link_info.shared)
1027     pe_dll_build_sections (output_bfd, &link_info);
1029 #ifndef TARGET_IS_i386pe
1030 #ifndef TARGET_IS_armpe
1031   else
1032     pe_exe_build_sections (output_bfd, &link_info);
1033 #endif
1034 #endif
1035 #endif
1037 #if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe)
1038   if (strstr (bfd_get_target (output_bfd), "arm") == NULL)
1039     {
1040       /* The arm backend needs special fields in the output hash structure.
1041          These will only be created if the output format is an arm format,
1042          hence we do not support linking and changing output formats at the
1043          same time.  Use a link followed by objcopy to change output formats.  */
1044       einfo ("%F%X%P: error: cannot change output format whilst linking ARM binaries\n");
1045       return;
1046     }
1047   {
1048     /* Find a BFD that can hold the interworking stubs.  */
1049     LANG_FOR_EACH_INPUT_STATEMENT (is)
1050       {
1051         if (bfd_arm_pe_get_bfd_for_interworking (is->the_bfd, & link_info))
1052           break;
1053       }
1054   }
1055 #endif
1057   {
1058     /* This next chunk of code tries to detect the case where you have
1059        two import libraries for the same DLL (specifically,
1060        symbolically linking libm.a and libc.a in cygwin to
1061        libcygwin.a).  In those cases, it's possible for function
1062        thunks from the second implib to be used but without the
1063        head/tail objects, causing an improper import table.  We detect
1064        those cases and rename the "other" import libraries to match
1065        the one the head/tail come from, so that the linker will sort
1066        things nicely and produce a valid import table.  */
1068     LANG_FOR_EACH_INPUT_STATEMENT (is)
1069       {
1070         if (is->the_bfd->my_archive)
1071           {
1072             int idata2 = 0, reloc_count=0, is_imp = 0;
1073             asection *sec;
1075             /* See if this is an import library thunk.  */
1076             for (sec = is->the_bfd->sections; sec; sec = sec->next)
1077               {
1078                 if (strcmp (sec->name, ".idata\$2") == 0)
1079                   idata2 = 1;
1080                 if (strncmp (sec->name, ".idata\$", 7) == 0)
1081                   is_imp = 1;
1082                 reloc_count += sec->reloc_count;
1083               }
1085             if (is_imp && !idata2 && reloc_count)
1086               {
1087                 /* It is, look for the reference to head and see if it's
1088                    from our own library.  */
1089                 for (sec = is->the_bfd->sections; sec; sec = sec->next)
1090                   {
1091                     int i;
1092                     long symsize;
1093                     long relsize;
1094                     asymbol **symbols;
1095                     arelent **relocs;
1096                     int nrelocs;
1098                     symsize = bfd_get_symtab_upper_bound (is->the_bfd);
1099                     if (symsize < 1)
1100                       break;
1101                     relsize = bfd_get_reloc_upper_bound (is->the_bfd, sec);
1102                     if (relsize < 1)
1103                       break;
1105                     symbols = (asymbol **) xmalloc (symsize);
1106                     symsize = bfd_canonicalize_symtab (is->the_bfd, symbols);
1107                     if (symsize < 0)
1108                       {
1109                         einfo ("%X%P: unable to process symbols: %E");
1110                         return;
1111                       }
1113                     relocs = (arelent **) xmalloc ((size_t) relsize);
1114                     nrelocs = bfd_canonicalize_reloc (is->the_bfd, sec,
1115                                                           relocs, symbols);
1116                     if (nrelocs < 0)
1117                       {
1118                         free (relocs);
1119                         einfo ("%X%P: unable to process relocs: %E");
1120                         return;
1121                       }
1123                     for (i = 0; i < nrelocs; i++)
1124                       {
1125                         struct symbol_cache_entry *s;
1126                         struct bfd_link_hash_entry * blhe;
1127                         bfd *other_bfd;
1128                         char *n;
1130                         s = (relocs[i]->sym_ptr_ptr)[0];
1132                         if (s->flags & BSF_LOCAL)
1133                           continue;
1135                         /* Thunk section with reloc to another bfd.  */
1136                         blhe = bfd_link_hash_lookup (link_info.hash,
1137                                                      s->name,
1138                                                      FALSE, FALSE, TRUE);
1140                         if (blhe == NULL
1141                             || blhe->type != bfd_link_hash_defined)
1142                           continue;
1144                         other_bfd = blhe->u.def.section->owner;
1146                         if (strcmp (is->the_bfd->my_archive->filename,
1147                                     other_bfd->my_archive->filename) == 0)
1148                           continue;
1150                         /* Rename this implib to match the other.  */
1151                         n = (char *) xmalloc (strlen (other_bfd->my_archive->filename) + 1);
1153                         strcpy (n, other_bfd->my_archive->filename);
1155                         is->the_bfd->my_archive->filename = n;
1156                       }
1158                     free (relocs);
1159                     /* Note - we do not free the symbols,
1160                        they are now cached in the BFD.  */
1161                   }
1162               }
1163           }
1164       }
1165   }
1167   {
1168     int is_ms_arch = 0;
1169     bfd *cur_arch = 0;
1170     lang_input_statement_type *is2;
1172     /* Careful - this is a shell script.  Watch those dollar signs! */
1173     /* Microsoft import libraries have every member named the same,
1174        and not in the right order for us to link them correctly.  We
1175        must detect these and rename the members so that they'll link
1176        correctly.  There are three types of objects: the head, the
1177        thunks, and the sentinel(s).  The head is easy; it's the one
1178        with idata2.  We assume that the sentinels won't have relocs,
1179        and the thunks will.  It's easier than checking the symbol
1180        table for external references.  */
1181     LANG_FOR_EACH_INPUT_STATEMENT (is)
1182       {
1183         if (is->the_bfd->my_archive)
1184           {
1185             bfd *arch = is->the_bfd->my_archive;
1186             if (cur_arch != arch)
1187               {
1188                 cur_arch = arch;
1189                 is_ms_arch = 1;
1190                 for (is2 = is;
1191                      is2 && is2->the_bfd->my_archive == arch;
1192                      is2 = (lang_input_statement_type *)is2->next)
1193                   {
1194                     if (strcmp (is->the_bfd->filename, is2->the_bfd->filename))
1195                       is_ms_arch = 0;
1196                   }
1197               }
1199             if (is_ms_arch)
1200               {
1201                 int idata2 = 0, reloc_count=0;
1202                 asection *sec;
1203                 char *new_name, seq;
1205                 for (sec = is->the_bfd->sections; sec; sec = sec->next)
1206                   {
1207                     if (strcmp (sec->name, ".idata\$2") == 0)
1208                       idata2 = 1;
1209                     reloc_count += sec->reloc_count;
1210                   }
1212                 if (idata2) /* .idata2 is the TOC */
1213                   seq = 'a';
1214                 else if (reloc_count > 0) /* thunks */
1215                   seq = 'b';
1216                 else /* sentinel */
1217                   seq = 'c';
1219                 new_name = xmalloc (strlen (is->the_bfd->filename) + 3);
1220                 sprintf (new_name, "%s.%c", is->the_bfd->filename, seq);
1221                 is->the_bfd->filename = new_name;
1223                 new_name = xmalloc (strlen (is->filename) + 3);
1224                 sprintf (new_name, "%s.%c", is->filename, seq);
1225                 is->filename = new_name;
1226               }
1227           }
1228       }
1229   }
1232 static void
1233 gld_${EMULATION_NAME}_before_allocation ()
1235 #ifdef TARGET_IS_ppcpe
1236   /* Here we rummage through the found bfds to collect toc information.  */
1237   {
1238     LANG_FOR_EACH_INPUT_STATEMENT (is)
1239       {
1240         if (!ppc_process_before_allocation (is->the_bfd, &link_info))
1241           {
1242             /* xgettext:c-format */
1243             einfo (_("Errors encountered processing file %s\n"), is->filename);
1244           }
1245       }
1246   }
1248   /* We have seen it all. Allocate it, and carry on.  */
1249   ppc_allocate_toc_section (&link_info);
1250 #endif /* TARGET_IS_ppcpe */
1252 #if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe)
1253   /* FIXME: we should be able to set the size of the interworking stub
1254      section.
1256      Here we rummage through the found bfds to collect glue
1257      information.  FIXME: should this be based on a command line
1258      option?  krk@cygnus.com.  */
1259   {
1260     LANG_FOR_EACH_INPUT_STATEMENT (is)
1261       {
1262         if (! bfd_arm_pe_process_before_allocation
1263             (is->the_bfd, & link_info, support_old_code))
1264           {
1265             /* xgettext:c-format */
1266             einfo (_("Errors encountered processing file %s for interworking"),
1267                    is->filename);
1268           }
1269       }
1270   }
1272   /* We have seen it all. Allocate it, and carry on.  */
1273   bfd_arm_pe_allocate_interworking_sections (& link_info);
1274 #endif /* TARGET_IS_armpe */
1277 #ifdef DLL_SUPPORT
1278 /* This is called when an input file isn't recognized as a BFD.  We
1279    check here for .DEF files and pull them in automatically.  */
1281 static int
1282 saw_option (char * option)
1284   int i;
1286   for (i = 0; init[i].ptr; i++)
1287     if (strcmp (init[i].symbol, option) == 0)
1288       return init[i].inited;
1289   return 0;
1291 #endif /* DLL_SUPPORT */
1293 static bfd_boolean
1294 gld_${EMULATION_NAME}_unrecognized_file (entry)
1295      lang_input_statement_type *entry ATTRIBUTE_UNUSED;
1297 #ifdef DLL_SUPPORT
1298   const char *ext = entry->filename + strlen (entry->filename) - 4;
1300   if (strcmp (ext, ".def") == 0 || strcmp (ext, ".DEF") == 0)
1301     {
1302       if (pe_def_file == 0)
1303         pe_def_file = def_file_empty ();
1305       def_file_parse (entry->filename, pe_def_file);
1307       if (pe_def_file)
1308         {
1309           int i, buflen=0, len;
1310           char *buf;
1312           for (i = 0; i < pe_def_file->num_exports; i++)
1313             {
1314               len = strlen (pe_def_file->exports[i].internal_name);
1315               if (buflen < len + 2)
1316                 buflen = len + 2;
1317             }
1319           buf = (char *) xmalloc (buflen);
1321           for (i = 0; i < pe_def_file->num_exports; i++)
1322             {
1323               struct bfd_link_hash_entry *h;
1325               sprintf (buf, "_%s", pe_def_file->exports[i].internal_name);
1327               h = bfd_link_hash_lookup (link_info.hash, buf, TRUE, TRUE, TRUE);
1328               if (h == (struct bfd_link_hash_entry *) NULL)
1329                 einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
1330               if (h->type == bfd_link_hash_new)
1331                 {
1332                   h->type = bfd_link_hash_undefined;
1333                   h->u.undef.abfd = NULL;
1334                   bfd_link_add_undef (link_info.hash, h);
1335                 }
1336             }
1337           free (buf);
1339           /* def_file_print (stdout, pe_def_file); */
1340           if (pe_def_file->is_dll == 1)
1341             link_info.shared = 1;
1343           if (pe_def_file->base_address != (bfd_vma)(-1))
1344             {
1345               pe.ImageBase =
1346                 pe_data (output_bfd)->pe_opthdr.ImageBase =
1347                 init[IMAGEBASEOFF].value = pe_def_file->base_address;
1348               init[IMAGEBASEOFF].inited = 1;
1349               if (image_base_statement)
1350                 image_base_statement->exp =
1351                   exp_assop ('=', "__image_base__", exp_intop (pe.ImageBase));
1352             }
1354 #if 0
1355           /* Not sure if these *should* be set.  */
1356           if (pe_def_file->version_major != -1)
1357             {
1358               pe.MajorImageVersion = pe_def_file->version_major;
1359               pe.MinorImageVersion = pe_def_file->version_minor;
1360             }
1361 #endif
1362           if (pe_def_file->stack_reserve != -1
1363               && ! saw_option ("__size_of_stack_reserve__"))
1364             {
1365               pe.SizeOfStackReserve = pe_def_file->stack_reserve;
1366               if (pe_def_file->stack_commit != -1)
1367                 pe.SizeOfStackCommit = pe_def_file->stack_commit;
1368             }
1369           if (pe_def_file->heap_reserve != -1
1370               && ! saw_option ("__size_of_heap_reserve__"))
1371             {
1372               pe.SizeOfHeapReserve = pe_def_file->heap_reserve;
1373               if (pe_def_file->heap_commit != -1)
1374                 pe.SizeOfHeapCommit = pe_def_file->heap_commit;
1375             }
1376           return TRUE;
1377         }
1378     }
1379 #endif
1380   return FALSE;
1383 static bfd_boolean
1384 gld_${EMULATION_NAME}_recognized_file (entry)
1385   lang_input_statement_type *entry ATTRIBUTE_UNUSED;
1387 #ifdef DLL_SUPPORT
1388 #ifdef TARGET_IS_i386pe
1389   pe_dll_id_target ("pei-i386");
1390 #endif
1391 #ifdef TARGET_IS_shpe
1392   pe_dll_id_target ("pei-shl");
1393 #endif
1394 #ifdef TARGET_IS_mipspe
1395   pe_dll_id_target ("pei-mips");
1396 #endif
1397 #ifdef TARGET_IS_armpe
1398   pe_dll_id_target ("pei-arm-little");
1399 #endif
1400   if (bfd_get_format (entry->the_bfd) == bfd_object)
1401     {
1402       char fbuf[LD_PATHMAX + 1];
1403       const char *ext;
1405       if (REALPATH (entry->filename, fbuf) == NULL)
1406         strncpy (fbuf, entry->filename, sizeof (fbuf));
1408       ext = fbuf + strlen (fbuf) - 4;
1410       if (strcmp (ext, ".dll") == 0 || strcmp (ext, ".DLL") == 0)
1411         return pe_implied_import_dll (fbuf);
1412     }
1413 #endif
1414   return FALSE;
1417 static void
1418 gld_${EMULATION_NAME}_finish ()
1420 #if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe)
1421   struct bfd_link_hash_entry * h;
1423   if (thumb_entry_symbol != NULL)
1424     {
1425       h = bfd_link_hash_lookup (link_info.hash, thumb_entry_symbol,
1426                                 FALSE, FALSE, TRUE);
1428       if (h != (struct bfd_link_hash_entry *) NULL
1429           && (h->type == bfd_link_hash_defined
1430               || h->type == bfd_link_hash_defweak)
1431           && h->u.def.section->output_section != NULL)
1432         {
1433           static char buffer[32];
1434           bfd_vma val;
1436           /* Special procesing is required for a Thumb entry symbol.  The
1437              bottom bit of its address must be set.  */
1438           val = (h->u.def.value
1439                  + bfd_get_section_vma (output_bfd,
1440                                         h->u.def.section->output_section)
1441                  + h->u.def.section->output_offset);
1443           val |= 1;
1445           /* Now convert this value into a string and store it in entry_symbol
1446              where the lang_finish() function will pick it up.  */
1447           buffer[0] = '0';
1448           buffer[1] = 'x';
1450           sprintf_vma (buffer + 2, val);
1452           if (entry_symbol.name != NULL && entry_from_cmdline)
1453             einfo (_("%P: warning: '--thumb-entry %s' is overriding '-e %s'\n"),
1454                    thumb_entry_symbol, entry_symbol.name);
1455           entry_symbol.name = buffer;
1456         }
1457       else
1458         einfo (_("%P: warning: connot find thumb start symbol %s\n"), thumb_entry_symbol);
1459     }
1460 #endif /* defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) */
1462 #ifdef DLL_SUPPORT
1463   if (link_info.shared)
1464     {
1465       pe_dll_fill_sections (output_bfd, &link_info);
1466       if (pe_implib_filename)
1467         pe_dll_generate_implib (pe_def_file, pe_implib_filename);
1468     }
1469 #if defined(TARGET_IS_shpe) || defined(TARGET_IS_mipspe)
1470   /* ARM doesn't need relocs.  */
1471   else
1472     {
1473       pe_exe_fill_sections (output_bfd, &link_info);
1474     }
1475 #endif
1477   if (pe_out_def_filename)
1478     pe_dll_generate_def_file (pe_out_def_filename);
1479 #endif /* DLL_SUPPORT */
1481   /* I don't know where .idata gets set as code, but it shouldn't be.  */
1482   {
1483     asection *asec = bfd_get_section_by_name (output_bfd, ".idata");
1485     if (asec)
1486       {
1487         asec->flags &= ~SEC_CODE;
1488         asec->flags |= SEC_DATA;
1489       }
1490   }
1494 /* Find the last output section before given output statement.
1495    Used by place_orphan.  */
1497 static asection *
1498 output_prev_sec_find (os)
1499      lang_output_section_statement_type *os;
1501   asection *s = (asection *) NULL;
1502   lang_statement_union_type *u;
1503   lang_output_section_statement_type *lookup;
1505   for (u = lang_output_section_statement.head;
1506        u != (lang_statement_union_type *) NULL;
1507        u = lookup->next)
1508     {
1509       lookup = &u->output_section_statement;
1510       if (lookup == os)
1511         return s;
1513       if (lookup->bfd_section != NULL && lookup->bfd_section->owner != NULL)
1514         s = lookup->bfd_section;
1515     }
1517   return NULL;
1520 /* Place an orphan section.
1522    We use this to put sections in a reasonable place in the file, and
1523    to ensure that they are aligned as required.
1525    We handle grouped sections here as well.  A section named .foo$nn
1526    goes into the output section .foo.  All grouped sections are sorted
1527    by name.
1529    Grouped sections for the default sections are handled by the
1530    default linker script using wildcards, and are sorted by
1531    sort_sections.  */
1533 struct orphan_save
1535   lang_output_section_statement_type *os;
1536   asection **section;
1537   lang_statement_union_type **stmt;
1540 static bfd_boolean
1541 gld_${EMULATION_NAME}_place_orphan (file, s)
1542      lang_input_statement_type *file;
1543      asection *s;
1545   const char *secname;
1546   char *hold_section_name;
1547   char *dollar = NULL;
1548   const char *ps = NULL;
1549   lang_output_section_statement_type *os;
1550   lang_statement_list_type add_child;
1552   secname = bfd_get_section_name (s->owner, s);
1554   /* Look through the script to see where to place this section.  */
1555   hold_section_name = xstrdup (secname);
1556   if (!link_info.relocateable)
1557     {
1558       dollar = strchr (hold_section_name, '$');
1559       if (dollar != NULL)
1560         *dollar = '\0';
1561     }
1563   os = lang_output_section_find (hold_section_name);
1565   lang_list_init (&add_child);
1567   if (os != NULL
1568       && (os->bfd_section == NULL
1569           || ((s->flags ^ os->bfd_section->flags)
1570               & (SEC_LOAD | SEC_ALLOC)) == 0))
1571     {
1572       /* We already have an output section statement with this
1573          name, and its bfd section, if any, has compatible flags.  */
1574       lang_add_section (&add_child, s, os, file);
1575     }
1576   else
1577     {
1578       struct orphan_save *place;
1579       static struct orphan_save hold_text;
1580       static struct orphan_save hold_rdata;
1581       static struct orphan_save hold_data;
1582       static struct orphan_save hold_bss;
1583       char *outsecname;
1584       lang_statement_list_type *old;
1585       lang_statement_list_type add;
1586       etree_type *address;
1588       /* Try to put the new output section in a reasonable place based
1589          on the section name and section flags.  */
1590 #define HAVE_SECTION(hold, name) \
1591 (hold.os != NULL || (hold.os = lang_output_section_find (name)) != NULL)
1593       place = NULL;
1594       if ((s->flags & SEC_ALLOC) == 0)
1595         ;
1596       else if ((s->flags & SEC_HAS_CONTENTS) == 0
1597                && HAVE_SECTION (hold_bss, ".bss"))
1598         place = &hold_bss;
1599       else if ((s->flags & SEC_READONLY) == 0
1600                && HAVE_SECTION (hold_data, ".data"))
1601         place = &hold_data;
1602       else if ((s->flags & SEC_CODE) == 0
1603                && (s->flags & SEC_READONLY) != 0
1604                && HAVE_SECTION (hold_rdata, ".rdata"))
1605         place = &hold_rdata;
1606       else if ((s->flags & SEC_READONLY) != 0
1607                && HAVE_SECTION (hold_text, ".text"))
1608         place = &hold_text;
1610 #undef HAVE_SECTION
1612       /* Choose a unique name for the section.  This will be needed if
1613          the same section name appears in the input file with
1614          different loadable or allocatable characteristics.  */
1615       outsecname = xstrdup (hold_section_name);
1616       if (bfd_get_section_by_name (output_bfd, outsecname) != NULL)
1617         {
1618           unsigned int len;
1619           char *newname;
1620           unsigned int i;
1622           len = strlen (outsecname);
1623           newname = xmalloc (len + 5);
1624           strcpy (newname, outsecname);
1625           i = 0;
1626           do
1627             {
1628               sprintf (newname + len, "%d", i);
1629               ++i;
1630             }
1631           while (bfd_get_section_by_name (output_bfd, newname) != NULL);
1633           free (outsecname);
1634           outsecname = newname;
1635         }
1637       /* Start building a list of statements for this section.  */
1638       old = stat_ptr;
1639       stat_ptr = &add;
1640       lang_list_init (stat_ptr);
1642       if (config.build_constructors)
1643         {
1644           /* If the name of the section is representable in C, then create
1645              symbols to mark the start and the end of the section.  */
1646           for (ps = outsecname; *ps != '\0'; ps++)
1647             if (! isalnum ((unsigned char) *ps) && *ps != '_')
1648               break;
1649           if (*ps == '\0')
1650             {
1651               char *symname;
1652               etree_type *e_align;
1654               symname = (char *) xmalloc (ps - outsecname + sizeof "___start_");
1655               sprintf (symname, "___start_%s", outsecname);
1656               e_align = exp_unop (ALIGN_K,
1657                                   exp_intop ((bfd_vma) 1 << s->alignment_power));
1658               lang_add_assignment (exp_assop ('=', symname, e_align));
1659             }
1660         }
1662       if (link_info.relocateable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
1663         address = exp_intop ((bfd_vma) 0);
1664       else
1665         {
1666           /* All sections in an executable must be aligned to a page
1667              boundary.  */
1668           address = exp_unop (ALIGN_K,
1669                               exp_nameop (NAME, "__section_alignment__"));
1670         }
1672       os = lang_enter_output_section_statement (outsecname, address, 0,
1673                                                 (bfd_vma) 0,
1674                                                 (etree_type *) NULL,
1675                                                 (etree_type *) NULL,
1676                                                 (etree_type *) NULL);
1678       lang_add_section (&add_child, s, os, file);
1680       lang_leave_output_section_statement
1681         ((bfd_vma) 0, "*default*",
1682          (struct lang_output_section_phdr_list *) NULL, NULL);
1684       if (config.build_constructors && *ps == '\0')
1685         {
1686           char *symname;
1688           /* lang_leave_ouput_section_statement resets stat_ptr.
1689              Put stat_ptr back where we want it.  */
1690           if (place != NULL)
1691             stat_ptr = &add;
1693           symname = (char *) xmalloc (ps - outsecname + sizeof "___stop_");
1694           sprintf (symname, "___stop_%s", outsecname);
1695           lang_add_assignment (exp_assop ('=', symname,
1696                                           exp_nameop (NAME, ".")));
1697         }
1699       stat_ptr = old;
1701       if (place != NULL && os->bfd_section != NULL)
1702         {
1703           asection *snew, **pps;
1705           snew = os->bfd_section;
1707           /* Shuffle the bfd section list to make the output file look
1708              neater.  This is really only cosmetic.  */
1709           if (place->section == NULL)
1710             {
1711               asection *bfd_section = place->os->bfd_section;
1713               /* If the output statement hasn't been used to place
1714                  any input sections (and thus doesn't have an output
1715                  bfd_section), look for the closest prior output statement
1716                  having an output section.  */
1717               if (bfd_section == NULL)
1718                 bfd_section = output_prev_sec_find (place->os);
1720               if (bfd_section != NULL && bfd_section != snew)
1721                 place->section = &bfd_section->next;
1722             }
1724           if (place->section != NULL)
1725             {
1726               /* Unlink the section.  */
1727               for (pps = &output_bfd->sections;
1728                    *pps != snew;
1729                    pps = &(*pps)->next)
1730                 ;
1731               bfd_section_list_remove (output_bfd, pps);
1733               /* Now tack it on to the "place->os" section list.  */
1734               bfd_section_list_insert (output_bfd, place->section, snew);
1735             }
1737           /* Save the end of this list.  Further ophans of this type will
1738              follow the one we've just added.  */
1739           place->section = &snew->next;
1741           /* The following is non-cosmetic.  We try to put the output
1742              statements in some sort of reasonable order here, because
1743              they determine the final load addresses of the orphan
1744              sections.  In addition, placing output statements in the
1745              wrong order may require extra segments.  For instance,
1746              given a typical situation of all read-only sections placed
1747              in one segment and following that a segment containing all
1748              the read-write sections, we wouldn't want to place an orphan
1749              read/write section before or amongst the read-only ones.  */
1750           if (add.head != NULL)
1751             {
1752               if (place->stmt == NULL)
1753                 {
1754                   /* Put the new statement list right at the head.  */
1755                   *add.tail = place->os->header.next;
1756                   place->os->header.next = add.head;
1757                 }
1758               else
1759                 {
1760                   /* Put it after the last orphan statement we added.  */
1761                   *add.tail = *place->stmt;
1762                   *place->stmt = add.head;
1763                 }
1765               /* Fix the global list pointer if we happened to tack our
1766                  new list at the tail.  */
1767               if (*old->tail == add.head)
1768                 old->tail = add.tail;
1770               /* Save the end of this list.  */
1771               place->stmt = add.tail;
1772             }
1773         }
1774     }
1776   {
1777     lang_statement_union_type **pl = &os->children.head;
1779     if (dollar != NULL)
1780       {
1781         bfd_boolean found_dollar;
1783         /* The section name has a '$'.  Sort it with the other '$'
1784            sections.  */
1785         found_dollar = FALSE;
1786         for ( ; *pl != NULL; pl = &(*pl)->header.next)
1787           {
1788             lang_input_section_type *ls;
1789             const char *lname;
1791             if ((*pl)->header.type != lang_input_section_enum)
1792               continue;
1794             ls = &(*pl)->input_section;
1796             lname = bfd_get_section_name (ls->ifile->the_bfd, ls->section);
1797             if (strchr (lname, '$') == NULL)
1798               {
1799                 if (found_dollar)
1800                   break;
1801               }
1802             else
1803               {
1804                 found_dollar = TRUE;
1805                 if (strcmp (secname, lname) < 0)
1806                   break;
1807               }
1808           }
1809       }
1811     if (add_child.head != NULL)
1812       {
1813         add_child.head->header.next = *pl;
1814         *pl = add_child.head;
1815       }
1816   }
1818   free (hold_section_name);
1820   return TRUE;
1823 static bfd_boolean
1824 gld_${EMULATION_NAME}_open_dynamic_archive (arch, search, entry)
1825      const char * arch ATTRIBUTE_UNUSED;
1826      search_dirs_type * search;
1827      lang_input_statement_type * entry;
1829   const char * filename;
1830   char * string;
1832   if (! entry->is_archive)
1833     return FALSE;
1835   filename = entry->filename;
1837   string = (char *) xmalloc (strlen (search->name)
1838                              + strlen (filename)
1839                              + sizeof "/lib.a.dll"
1840 #ifdef DLL_SUPPORT
1841                              + (pe_dll_search_prefix ? strlen (pe_dll_search_prefix) : 0)
1842 #endif
1843                              + 1);
1845   /* Try "libfoo.dll.a" first (preferred explicit import library for dll's.  */
1846   sprintf (string, "%s/lib%s.dll.a", search->name, filename);
1848   if (! ldfile_try_open_bfd (string, entry))
1849     {
1850       /* Try "foo.dll.a" next (alternate explicit import library for dll's.  */
1851       sprintf (string, "%s/%s.dll.a", search->name, filename);
1852       if (! ldfile_try_open_bfd (string, entry))
1853         {
1854           /* Try libfoo.a next. Normally, this would be interpreted as a static
1855              library, but it *could* be an import library. For backwards compatibility,
1856              libfoo.a needs to ==precede== libfoo.dll and foo.dll in the search,
1857              or sometimes errors occur when building legacy packages.
1859              Putting libfoo.a here means that in a failure case (i.e. the library
1860              -lfoo is not found) we will search for libfoo.a twice before
1861              giving up -- once here, and once when searching for a "static" lib.
1862              for a "static" lib.  */
1863           /* Try "libfoo.a" (import lib, or static lib, but must
1864              take precedence over dll's).  */
1865           sprintf (string, "%s/lib%s.a", search->name, filename);
1866           if (! ldfile_try_open_bfd (string, entry))
1867             {
1868 #ifdef DLL_SUPPORT
1869               if (pe_dll_search_prefix)
1870                 {
1871                   /* Try "<prefix>foo.dll" (preferred dll name, if specified).  */
1872                   sprintf (string, "%s/%s%s.dll", search->name, pe_dll_search_prefix, filename);
1873                   if (! ldfile_try_open_bfd (string, entry))
1874                     {
1875                       /* Try "libfoo.dll" (default preferred dll name).  */
1876                       sprintf (string, "%s/lib%s.dll", search->name, filename);
1877                       if (! ldfile_try_open_bfd (string, entry))
1878                         {
1879                           /* Finally, try "foo.dll" (alternate dll name).  */
1880                           sprintf (string, "%s/%s.dll", search->name, filename);
1881                           if (! ldfile_try_open_bfd (string, entry))
1882                             {
1883                               free (string);
1884                               return FALSE;
1885                             }
1886                         }
1887                     }
1888                 }
1889               else /* pe_dll_search_prefix not specified.  */
1890 #endif
1891                 {
1892                   /* Try "libfoo.dll" (preferred dll name).  */
1893                   sprintf (string, "%s/lib%s.dll", search->name, filename);
1894                   if (! ldfile_try_open_bfd (string, entry))
1895                     {
1896                       /* Finally, try "foo.dll" (alternate dll name).  */
1897                       sprintf (string, "%s/%s.dll", search->name, filename);
1898                       if (! ldfile_try_open_bfd (string, entry))
1899                         {
1900                           free (string);
1901                           return FALSE;
1902                         }
1903                     }
1904                 }
1905             }
1906         }
1907     }
1909   entry->filename = string;
1911   return TRUE;
1914 static int
1915 gld_${EMULATION_NAME}_find_potential_libraries (name, entry)
1916      char * name;
1917      lang_input_statement_type * entry;
1919   return ldfile_open_file_search (name, entry, "", ".lib");
1922 static char *
1923 gld_${EMULATION_NAME}_get_script (isfile)
1924      int *isfile;
1926 # Scripts compiled in.
1927 # sed commands to quote an ld script as a C string.
1928 sc="-f stringify.sed"
1930 cat >>e${EMULATION_NAME}.c <<EOF
1932   *isfile = 0;
1934   if (link_info.relocateable && config.build_constructors)
1935     return
1937 sed $sc ldscripts/${EMULATION_NAME}.xu                 >> e${EMULATION_NAME}.c
1938 echo '  ; else if (link_info.relocateable) return'     >> e${EMULATION_NAME}.c
1939 sed $sc ldscripts/${EMULATION_NAME}.xr                 >> e${EMULATION_NAME}.c
1940 echo '  ; else if (!config.text_read_only) return'     >> e${EMULATION_NAME}.c
1941 sed $sc ldscripts/${EMULATION_NAME}.xbn                >> e${EMULATION_NAME}.c
1942 echo '  ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1943 sed $sc ldscripts/${EMULATION_NAME}.xn                 >> e${EMULATION_NAME}.c
1944 echo '  ; else return'                                 >> e${EMULATION_NAME}.c
1945 sed $sc ldscripts/${EMULATION_NAME}.x                  >> e${EMULATION_NAME}.c
1946 echo '; }'                                             >> e${EMULATION_NAME}.c
1948 cat >>e${EMULATION_NAME}.c <<EOF
1951 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1953   gld_${EMULATION_NAME}_before_parse,
1954   syslib_default,
1955   hll_default,
1956   gld_${EMULATION_NAME}_after_parse,
1957   gld_${EMULATION_NAME}_after_open,
1958   after_allocation_default,
1959   set_output_arch_default,
1960   ldemul_default_target,
1961   gld_${EMULATION_NAME}_before_allocation,
1962   gld_${EMULATION_NAME}_get_script,
1963   "${EMULATION_NAME}",
1964   "${OUTPUT_FORMAT}",
1965   gld_${EMULATION_NAME}_finish,
1966   NULL, /* Create output section statements.  */
1967   gld_${EMULATION_NAME}_open_dynamic_archive,
1968   gld_${EMULATION_NAME}_place_orphan,
1969   gld_${EMULATION_NAME}_set_symbols,
1970   gld_${EMULATION_NAME}_parse_args,
1971   gld_${EMULATION_NAME}_unrecognized_file,
1972   gld_${EMULATION_NAME}_list_options,
1973   gld_${EMULATION_NAME}_recognized_file,
1974   gld_${EMULATION_NAME}_find_potential_libraries,
1975   NULL  /* new_vers_pattern.  */