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
7 OUTPUT_ARCH=${ARCH}:${MACHINE}
9 rm -f e${EMULATION_NAME}.c
10 (echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
12 /* Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
13 2005, 2006, 2007, 2008 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. */
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
59 #include "libiberty.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"
77 /* FIXME: This is a BFD internal header file, and we should not be
79 #include "../bfd/libcoff.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}
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)
103 #if defined(TARGET_IS_i386pe) || ! defined(DLL_SUPPORT)
104 #define PE_DEF_SUBSYSTEM 3
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
115 #define PE_DEF_SECTION_ALIGNMENT 0x00000400
116 #define PE_DEF_SUBSYSTEM 2
118 #define PE_DEF_FILE_ALIGNMENT 0x00000200
121 #define U(S) ${INITIAL_SYMBOL_CHAR} S
123 static struct internal_extra_pe_aouthdr pe;
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;
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;
138 extern const char *output_filename;
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}";
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; /* Use by default version 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");
155 lang_default_entry ("_WinMainCRTStartup");
158 lang_default_entry ("${ENTRY}");
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)
206 #define OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V1 \
207 (OPTION_LARGE_ADDRESS_AWARE + 1)
208 #define OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2 \
209 (OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V1 + 1)
210 #define OPTION_EXCLUDE_MODULES_FOR_IMPLIB \
211 (OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2 + 1)
214 gld${EMULATION_NAME}_add_options
215 (int ns ATTRIBUTE_UNUSED, char **shortopts ATTRIBUTE_UNUSED, int nl,
216 struct option **longopts, int nrl ATTRIBUTE_UNUSED,
217 struct option **really_longopts ATTRIBUTE_UNUSED)
219 static const struct option xtra_long[] = {
221 {"base-file", required_argument, NULL, OPTION_BASE_FILE},
222 {"dll", no_argument, NULL, OPTION_DLL},
223 {"file-alignment", required_argument, NULL, OPTION_FILE_ALIGNMENT},
224 {"heap", required_argument, NULL, OPTION_HEAP},
225 {"image-base", required_argument, NULL, OPTION_IMAGE_BASE},
226 {"major-image-version", required_argument, NULL, OPTION_MAJOR_IMAGE_VERSION},
227 {"major-os-version", required_argument, NULL, OPTION_MAJOR_OS_VERSION},
228 {"major-subsystem-version", required_argument, NULL, OPTION_MAJOR_SUBSYSTEM_VERSION},
229 {"minor-image-version", required_argument, NULL, OPTION_MINOR_IMAGE_VERSION},
230 {"minor-os-version", required_argument, NULL, OPTION_MINOR_OS_VERSION},
231 {"minor-subsystem-version", required_argument, NULL, OPTION_MINOR_SUBSYSTEM_VERSION},
232 {"section-alignment", required_argument, NULL, OPTION_SECTION_ALIGNMENT},
233 {"stack", required_argument, NULL, OPTION_STACK},
234 {"subsystem", required_argument, NULL, OPTION_SUBSYSTEM},
235 {"support-old-code", no_argument, NULL, OPTION_SUPPORT_OLD_CODE},
236 {"thumb-entry", required_argument, NULL, OPTION_THUMB_ENTRY},
238 /* getopt allows abbreviations, so we do this to stop it from treating -o
239 as an abbreviation for this option */
240 {"output-def", required_argument, NULL, OPTION_OUT_DEF},
241 {"output-def", required_argument, NULL, OPTION_OUT_DEF},
242 {"export-all-symbols", no_argument, NULL, OPTION_EXPORT_ALL},
243 {"exclude-symbols", required_argument, NULL, OPTION_EXCLUDE_SYMBOLS},
244 {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
245 {"exclude-modules-for-implib", required_argument, NULL, OPTION_EXCLUDE_MODULES_FOR_IMPLIB},
246 {"kill-at", no_argument, NULL, OPTION_KILL_ATS},
247 {"add-stdcall-alias", no_argument, NULL, OPTION_STDCALL_ALIASES},
248 {"enable-stdcall-fixup", no_argument, NULL, OPTION_ENABLE_STDCALL_FIXUP},
249 {"disable-stdcall-fixup", no_argument, NULL, OPTION_DISABLE_STDCALL_FIXUP},
250 {"out-implib", required_argument, NULL, OPTION_IMPLIB_FILENAME},
251 {"warn-duplicate-exports", no_argument, NULL, OPTION_WARN_DUPLICATE_EXPORTS},
252 /* getopt() allows abbreviations, so we do this to stop it from
253 treating -c as an abbreviation for these --compat-implib. */
254 {"compat-implib", no_argument, NULL, OPTION_IMP_COMPAT},
255 {"compat-implib", no_argument, NULL, OPTION_IMP_COMPAT},
256 {"enable-auto-image-base", no_argument, NULL, OPTION_ENABLE_AUTO_IMAGE_BASE},
257 {"disable-auto-image-base", no_argument, NULL, OPTION_DISABLE_AUTO_IMAGE_BASE},
258 {"dll-search-prefix", required_argument, NULL, OPTION_DLL_SEARCH_PREFIX},
259 {"no-default-excludes", no_argument, NULL, OPTION_NO_DEFAULT_EXCLUDES},
260 {"enable-auto-import", no_argument, NULL, OPTION_DLL_ENABLE_AUTO_IMPORT},
261 {"disable-auto-import", no_argument, NULL, OPTION_DLL_DISABLE_AUTO_IMPORT},
262 {"enable-extra-pe-debug", no_argument, NULL, OPTION_ENABLE_EXTRA_PE_DEBUG},
263 {"enable-runtime-pseudo-reloc", no_argument, NULL, OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC},
264 {"disable-runtime-pseudo-reloc", no_argument, NULL, OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC},
265 {"enable-runtime-pseudo-reloc-v1", no_argument, NULL, OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V1},
266 {"enable-runtime-pseudo-reloc-v2", no_argument, NULL, OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2},
268 {"large-address-aware", no_argument, NULL, OPTION_LARGE_ADDRESS_AWARE},
269 {NULL, no_argument, NULL, 0}
272 *longopts = (struct option *)
273 xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
274 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
277 /* PE/WIN32; added routines to get the subsystem type, heap and/or stack
278 parameters which may be input from the command line. */
289 #define D(field,symbol,def) {&pe.field,sizeof(pe.field), def, symbol,0}
291 static definfo init[] =
293 /* imagebase must be first */
294 #define IMAGEBASEOFF 0
295 D(ImageBase,"__image_base__", NT_EXE_IMAGE_BASE),
297 {&dll, sizeof(dll), 0, "__dll__", 0},
298 #define MSIMAGEBASEOFF 2
299 D(ImageBase, U ("__ImageBase"), NT_EXE_IMAGE_BASE),
300 D(SectionAlignment,"__section_alignment__", PE_DEF_SECTION_ALIGNMENT),
301 D(FileAlignment,"__file_alignment__", PE_DEF_FILE_ALIGNMENT),
302 D(MajorOperatingSystemVersion,"__major_os_version__", 4),
303 D(MinorOperatingSystemVersion,"__minor_os_version__", 0),
304 D(MajorImageVersion,"__major_image_version__", 1),
305 D(MinorImageVersion,"__minor_image_version__", 0),
306 #if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_wince_pe)
307 D(MajorSubsystemVersion,"__major_subsystem_version__", 3),
309 D(MajorSubsystemVersion,"__major_subsystem_version__", 4),
311 D(MinorSubsystemVersion,"__minor_subsystem_version__", 0),
312 D(Subsystem,"__subsystem__", ${SUBSYSTEM}),
313 D(SizeOfStackReserve,"__size_of_stack_reserve__", 0x200000),
314 D(SizeOfStackCommit,"__size_of_stack_commit__", 0x1000),
315 D(SizeOfHeapReserve,"__size_of_heap_reserve__", 0x100000),
316 D(SizeOfHeapCommit,"__size_of_heap_commit__", 0x1000),
317 D(LoaderFlags,"__loader_flags__", 0x0),
318 { NULL, 0, 0, NULL, 0 }
323 gld_${EMULATION_NAME}_list_options (FILE *file)
325 fprintf (file, _(" --base_file <basefile> Generate a base file for relocatable DLLs\n"));
326 fprintf (file, _(" --dll Set image base to the default for DLLs\n"));
327 fprintf (file, _(" --file-alignment <size> Set file alignment\n"));
328 fprintf (file, _(" --heap <size> Set initial size of the heap\n"));
329 fprintf (file, _(" --image-base <address> Set start address of the executable\n"));
330 fprintf (file, _(" --major-image-version <number> Set version number of the executable\n"));
331 fprintf (file, _(" --major-os-version <number> Set minimum required OS version\n"));
332 fprintf (file, _(" --major-subsystem-version <number> Set minimum required OS subsystem version\n"));
333 fprintf (file, _(" --minor-image-version <number> Set revision number of the executable\n"));
334 fprintf (file, _(" --minor-os-version <number> Set minimum required OS revision\n"));
335 fprintf (file, _(" --minor-subsystem-version <number> Set minimum required OS subsystem revision\n"));
336 fprintf (file, _(" --section-alignment <size> Set section alignment\n"));
337 fprintf (file, _(" --stack <size> Set size of the initial stack\n"));
338 fprintf (file, _(" --subsystem <name>[:<version>] Set required OS subsystem [& version]\n"));
339 fprintf (file, _(" --support-old-code Support interworking with old code\n"));
340 fprintf (file, _(" --thumb-entry=<symbol> Set the entry point to be Thumb <symbol>\n"));
342 fprintf (file, _(" --add-stdcall-alias Export symbols with and without @nn\n"));
343 fprintf (file, _(" --disable-stdcall-fixup Don't link _sym to _sym@nn\n"));
344 fprintf (file, _(" --enable-stdcall-fixup Link _sym to _sym@nn without warnings\n"));
345 fprintf (file, _(" --exclude-symbols sym,sym,... Exclude symbols from automatic export\n"));
346 fprintf (file, _(" --exclude-libs lib,lib,... Exclude libraries from automatic export\n"));
347 fprintf (file, _(" --exclude-modules-for-implib mod,mod,...\n"));
348 fprintf (file, _(" Exclude objects, archive members from auto\n"));
349 fprintf (file, _(" export, place into import library instead.\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\n\
361 an 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\n\
369 fprintf (file, _(" --disable-runtime-pseudo-reloc Do not add runtime pseudo-relocations for\n\
370 auto-imported DATA.\n"));
371 fprintf (file, _(" --enable-extra-pe-debug Enable verbose debug output when building\n\
372 or linking to DLLs (esp. auto-import)\n"));
374 fprintf (file, _(" --large-address-aware Executable supports virtual addresses\n\
375 greater than 2 gigabytes\n"));
380 set_pe_name (char *name, long val)
384 /* Find the name and set it. */
385 for (i = 0; init[i].ptr; i++)
387 if (strcmp (name, init[i].symbol) == 0)
391 if (strcmp (name,"__image_base__") == 0)
392 set_pe_name (U ("__ImageBase"), val);
401 set_pe_subsystem (void)
405 const char *initial_symbol_char;
410 unsigned long temp_subsystem;
419 { "native", 1, "NtProcessStartup" },
420 { "windows", 2, "WinMainCRTStartup" },
421 { "console", 3, "mainCRTStartup" },
422 { "posix", 7, "__PosixProcessStartup"},
423 { "wince", 9, "WinMainCRTStartup" },
424 { "xbox", 14, "mainCRTStartup" },
427 /* Entry point name for arbitrary subsystem numbers. */
428 static const char default_entry[] = "mainCRTStartup";
430 /* Check for the presence of a version number. */
431 sver = strchr (optarg, ':');
433 len = strlen (optarg);
437 set_pe_name ("__major_subsystem_version__",
438 strtoul (sver + 1, &end, 0));
440 set_pe_name ("__minor_subsystem_version__",
441 strtoul (end + 1, &end, 0));
443 einfo (_("%P: warning: bad version number in -subsystem option\n"));
446 /* Check for numeric subsystem. */
447 temp_subsystem = strtoul (optarg, & end, 0);
448 if ((*end == ':' || *end == '\0') && (temp_subsystem < 65536))
450 /* Search list for a numeric match to use its entry point. */
451 for (i = 0; v[i].name; i++)
452 if (v[i].value == (int) temp_subsystem)
455 /* If no match, use the default. */
456 if (v[i].name != NULL)
459 entry = default_entry;
461 /* Use this subsystem. */
462 subsystem = (int) temp_subsystem;
466 /* Search for subsystem by name. */
467 for (i = 0; v[i].name; i++)
468 if (strncmp (optarg, v[i].name, len) == 0
469 && v[i].name[len] == '\0')
472 if (v[i].name == NULL)
474 einfo (_("%P%F: invalid subsystem type %s\n"), optarg);
479 subsystem = v[i].value;
482 set_pe_name ("__subsystem__", subsystem);
484 initial_symbol_char = ${INITIAL_SYMBOL_CHAR};
485 if (*initial_symbol_char != '\0')
489 /* lang_default_entry expects its argument to be permanently
490 allocated, so we don't free this string. */
491 alc_entry = xmalloc (strlen (initial_symbol_char)
494 strcpy (alc_entry, initial_symbol_char);
495 strcat (alc_entry, entry);
499 lang_default_entry (entry);
506 set_pe_value (char *name)
510 set_pe_name (name, strtoul (optarg, &end, 0));
513 einfo (_("%P%F: invalid hex number for PE parameter '%s'\n"), optarg);
520 set_pe_stack_heap (char *resname, char *comname)
522 set_pe_value (resname);
527 set_pe_value (comname);
530 einfo (_("%P%F: strange hex info for PE parameter '%s'\n"), optarg);
535 gld${EMULATION_NAME}_handle_option (int optc)
542 case OPTION_BASE_FILE:
543 link_info.base_file = fopen (optarg, FOPEN_WB);
544 if (link_info.base_file == NULL)
546 /* xgettext:c-format */
547 fprintf (stderr, _("%s: Can't open base file %s\n"),
548 program_name, optarg);
555 set_pe_stack_heap ("__size_of_heap_reserve__", "__size_of_heap_commit__");
558 set_pe_stack_heap ("__size_of_stack_reserve__", "__size_of_stack_commit__");
560 case OPTION_SUBSYSTEM:
563 case OPTION_MAJOR_OS_VERSION:
564 set_pe_value ("__major_os_version__");
566 case OPTION_MINOR_OS_VERSION:
567 set_pe_value ("__minor_os_version__");
569 case OPTION_MAJOR_SUBSYSTEM_VERSION:
570 set_pe_value ("__major_subsystem_version__");
572 case OPTION_MINOR_SUBSYSTEM_VERSION:
573 set_pe_value ("__minor_subsystem_version__");
575 case OPTION_MAJOR_IMAGE_VERSION:
576 set_pe_value ("__major_image_version__");
578 case OPTION_MINOR_IMAGE_VERSION:
579 set_pe_value ("__minor_image_version__");
581 case OPTION_FILE_ALIGNMENT:
582 set_pe_value ("__file_alignment__");
584 case OPTION_SECTION_ALIGNMENT:
585 set_pe_value ("__section_alignment__");
588 set_pe_name ("__dll__", 1);
590 case OPTION_IMAGE_BASE:
591 set_pe_value ("__image_base__");
593 case OPTION_SUPPORT_OLD_CODE:
594 support_old_code = 1;
596 case OPTION_THUMB_ENTRY:
597 thumb_entry_symbol = optarg;
601 pe_out_def_filename = xstrdup (optarg);
603 case OPTION_EXPORT_ALL:
604 pe_dll_export_everything = 1;
606 case OPTION_EXCLUDE_SYMBOLS:
607 pe_dll_add_excludes (optarg, EXCLUDESYMS);
609 case OPTION_EXCLUDE_LIBS:
610 pe_dll_add_excludes (optarg, EXCLUDELIBS);
612 case OPTION_EXCLUDE_MODULES_FOR_IMPLIB:
613 pe_dll_add_excludes (optarg, EXCLUDEFORIMPLIB);
615 case OPTION_KILL_ATS:
618 case OPTION_STDCALL_ALIASES:
619 pe_dll_stdcall_aliases = 1;
621 case OPTION_ENABLE_STDCALL_FIXUP:
622 pe_enable_stdcall_fixup = 1;
624 case OPTION_DISABLE_STDCALL_FIXUP:
625 pe_enable_stdcall_fixup = 0;
627 case OPTION_IMPLIB_FILENAME:
628 pe_implib_filename = xstrdup (optarg);
630 case OPTION_WARN_DUPLICATE_EXPORTS:
631 pe_dll_warn_dup_exports = 1;
633 case OPTION_IMP_COMPAT:
634 pe_dll_compat_implib = 1;
636 case OPTION_ENABLE_AUTO_IMAGE_BASE:
637 pe_enable_auto_image_base = 1;
639 case OPTION_DISABLE_AUTO_IMAGE_BASE:
640 pe_enable_auto_image_base = 0;
642 case OPTION_DLL_SEARCH_PREFIX:
643 pe_dll_search_prefix = xstrdup (optarg);
645 case OPTION_NO_DEFAULT_EXCLUDES:
646 pe_dll_do_default_excludes = 0;
648 case OPTION_DLL_ENABLE_AUTO_IMPORT:
649 link_info.pei386_auto_import = 1;
651 case OPTION_DLL_DISABLE_AUTO_IMPORT:
652 link_info.pei386_auto_import = 0;
654 case OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC:
655 link_info.pei386_runtime_pseudo_reloc = 1;
657 case OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V1:
658 link_info.pei386_runtime_pseudo_reloc = 1;
660 case OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2:
661 link_info.pei386_runtime_pseudo_reloc = 2;
663 case OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC:
664 link_info.pei386_runtime_pseudo_reloc = 0;
666 case OPTION_ENABLE_EXTRA_PE_DEBUG:
667 pe_dll_extra_pe_debug = 1;
670 case OPTION_LARGE_ADDRESS_AWARE:
671 real_flags |= IMAGE_FILE_LARGE_ADDRESS_AWARE;
680 strhash (const char *str)
682 const unsigned char *s;
689 s = (const unsigned char *) str;
690 while ((c = *s++) != '\0')
692 hash += c + (c << 17);
696 hash += len + (len << 17);
702 /* Use the output file to create a image base for relocatable DLLs. */
705 compute_dll_image_base (const char *ofile)
707 unsigned long hash = strhash (ofile);
708 return 0x61300000 + ((hash << 16) & 0x0FFC0000);
712 /* Assign values to the special symbols before the linker script is
716 gld_${EMULATION_NAME}_set_symbols (void)
718 /* Run through and invent symbols for all the
719 names and insert the defaults. */
721 lang_statement_list_type *save;
723 if (!init[IMAGEBASEOFF].inited)
725 if (link_info.relocatable)
726 init[IMAGEBASEOFF].value = 0;
727 else if (init[DLLOFF].value || (link_info.shared && !link_info.pie))
729 init[IMAGEBASEOFF].value = (pe_enable_auto_image_base) ?
730 compute_dll_image_base (output_filename) : NT_DLL_IMAGE_BASE;
732 init[IMAGEBASEOFF].value = NT_DLL_IMAGE_BASE;
735 init[IMAGEBASEOFF].value = NT_EXE_IMAGE_BASE;
736 init[MSIMAGEBASEOFF].value = init[IMAGEBASEOFF].value;
739 /* Don't do any symbol assignments if this is a relocatable link. */
740 if (link_info.relocatable)
743 /* Glue the assignments into the abs section. */
746 stat_ptr = &(abs_output_section->children);
748 for (j = 0; init[j].ptr; j++)
750 long val = init[j].value;
751 lang_assignment_statement_type *rv;
752 rv = lang_add_assignment (exp_assop ('=', init[j].symbol,
754 if (init[j].size == sizeof (short))
755 *(short *) init[j].ptr = val;
756 else if (init[j].size == sizeof (int))
757 *(int *) init[j].ptr = val;
758 else if (init[j].size == sizeof (long))
759 *(long *) init[j].ptr = val;
760 /* This might be a long long or other special type. */
761 else if (init[j].size == sizeof (bfd_vma))
762 *(bfd_vma *) init[j].ptr = val;
764 if (j == IMAGEBASEOFF)
765 image_base_statement = rv;
767 /* Restore the pointer. */
770 if (pe.FileAlignment >
773 einfo (_("%P: warning, file alignment > section alignment.\n"));
777 /* This is called after the linker script and the command line options
781 gld_${EMULATION_NAME}_after_parse (void)
783 /* The Windows libraries are designed for the linker to treat the
784 entry point as an undefined symbol. Otherwise, the .obj that
785 defines mainCRTStartup is brought in because it is the first
786 encountered in libc.lib and it has other symbols in it which will
787 be pulled in by the link process. To avoid this, we act as
788 though the user specified -u with the entry point symbol.
790 This function is called after the linker script and command line
791 options have been read, so at this point we know the right entry
792 point. This function is called before the input files are
793 opened, so registering the symbol as undefined will make a
796 if (! link_info.relocatable && entry_symbol.name != NULL)
797 ldlang_add_undef (entry_symbol.name);
800 /* pe-dll.c directly accesses pe_data_import_dll,
801 so it must be defined outside of #ifdef DLL_SUPPORT.
802 Note - this variable is deliberately not initialised.
803 This allows it to be treated as a common varaible, and only
804 exist in one incarnation in a multiple target enabled linker. */
805 char * pe_data_import_dll;
808 static struct bfd_link_hash_entry *pe_undef_found_sym;
811 pe_undef_cdecl_match (struct bfd_link_hash_entry *h, void *inf)
816 sl = strlen (string);
817 if (h->type == bfd_link_hash_defined
818 && strncmp (h->root.string, string, sl) == 0
819 && h->root.string[sl] == '@')
821 pe_undef_found_sym = h;
828 pe_fixup_stdcalls (void)
830 static int gave_warning_message = 0;
831 struct bfd_link_hash_entry *undef, *sym;
833 if (pe_dll_extra_pe_debug)
834 printf ("%s\n", __FUNCTION__);
836 for (undef = link_info.hash->undefs; undef; undef=undef->u.undef.next)
837 if (undef->type == bfd_link_hash_undefined)
839 char* at = strchr (undef->root.string, '@');
840 int lead_at = (*undef->root.string == '@');
841 /* For now, don't try to fixup fastcall symbols. */
845 /* The symbol is a stdcall symbol, so let's look for a
846 cdecl symbol with the same name and resolve to that. */
847 char *cname = xstrdup (undef->root.string /* + lead_at */);
848 at = strchr (cname, '@');
850 sym = bfd_link_hash_lookup (link_info.hash, cname, 0, 0, 1);
852 if (sym && sym->type == bfd_link_hash_defined)
854 undef->type = bfd_link_hash_defined;
855 undef->u.def.value = sym->u.def.value;
856 undef->u.def.section = sym->u.def.section;
858 if (pe_enable_stdcall_fixup == -1)
860 einfo (_("Warning: resolving %s by linking to %s\n"),
861 undef->root.string, cname);
862 if (! gave_warning_message)
864 gave_warning_message = 1;
865 einfo (_("Use --enable-stdcall-fixup to disable these warnings\n"));
866 einfo (_("Use --disable-stdcall-fixup to disable these fixups\n"));
873 /* The symbol is a cdecl symbol, so we look for stdcall
874 symbols - which means scanning the whole symbol table. */
875 pe_undef_found_sym = 0;
876 bfd_link_hash_traverse (link_info.hash, pe_undef_cdecl_match,
877 (char *) undef->root.string);
878 sym = pe_undef_found_sym;
881 undef->type = bfd_link_hash_defined;
882 undef->u.def.value = sym->u.def.value;
883 undef->u.def.section = sym->u.def.section;
885 if (pe_enable_stdcall_fixup == -1)
887 einfo (_("Warning: resolving %s by linking to %s\n"),
888 undef->root.string, sym->root.string);
889 if (! gave_warning_message)
891 gave_warning_message = 1;
892 einfo (_("Use --enable-stdcall-fixup to disable these warnings\n"));
893 einfo (_("Use --disable-stdcall-fixup to disable these fixups\n"));
902 make_import_fixup (arelent *rel, asection *s)
904 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
907 if (pe_dll_extra_pe_debug)
908 printf ("arelent: %s@%#lx: add=%li\n", sym->name,
909 (unsigned long) rel->address, (long) rel->addend);
911 if (! bfd_get_section_contents (s->owner, s, addend, rel->address, sizeof (addend)))
912 einfo (_("%C: Cannot get section contents - auto-import exception\n"),
913 s->owner, s, rel->address);
915 pe_create_import_fixup (rel, s, bfd_get_32 (s->owner, addend));
921 pe_find_data_imports (void)
923 struct bfd_link_hash_entry *undef, *sym;
925 if (link_info.pei386_auto_import == 0)
928 for (undef = link_info.hash->undefs; undef; undef=undef->u.undef.next)
930 if (undef->type == bfd_link_hash_undefined)
932 /* C++ symbols are *long*. */
935 if (pe_dll_extra_pe_debug)
936 printf ("%s:%s\n", __FUNCTION__, undef->root.string);
938 sprintf (buf, "__imp_%s", undef->root.string);
940 sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
942 if (sym && sym->type == bfd_link_hash_defined)
944 bfd *b = sym->u.def.section->owner;
948 if (link_info.pei386_auto_import == -1)
950 static bfd_boolean warned = FALSE;
952 info_msg (_("Info: resolving %s by linking to %s (auto-import)\n"),
953 undef->root.string, buf);
955 /* PR linker/4844. */
959 einfo (_("%P: warning: auto-importing has been activated without --enable-auto-import specified on the command line.\n\
960 This should work unless it involves constant data structures referencing symbols from auto-imported DLLs.\n"));
964 if (!bfd_generic_link_read_symbols (b))
966 einfo (_("%B%F: could not read symbols: %E\n"), b);
970 symbols = bfd_get_outsymbols (b);
971 nsyms = bfd_get_symcount (b);
973 for (i = 0; i < nsyms; i++)
975 if (! CONST_STRNEQ (symbols[i]->name, U ("_head_")))
978 if (pe_dll_extra_pe_debug)
979 printf ("->%s\n", symbols[i]->name);
981 pe_data_import_dll = (char*) (symbols[i]->name +
982 sizeof (U ("_head_")) - 1);
986 pe_walk_relocs_of_symbol (&link_info, undef->root.string,
989 /* Let's differentiate it somehow from defined. */
990 undef->type = bfd_link_hash_defweak;
991 /* We replace original name with __imp_ prefixed, this
992 1) may trash memory 2) leads to duplicate symbol generation.
993 Still, IMHO it's better than having name poluted. */
994 undef->root.string = sym->root.string;
995 undef->u.def.value = sym->u.def.value;
996 undef->u.def.section = sym->u.def.section;
1003 pr_sym (struct bfd_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
1005 if (pe_dll_extra_pe_debug)
1006 printf ("+%s\n", h->string);
1010 #endif /* DLL_SUPPORT */
1014 gld_${EMULATION_NAME}_after_open (void)
1017 if (pe_dll_extra_pe_debug)
1020 struct bfd_link_hash_entry *sym;
1022 printf ("%s()\n", __FUNCTION__);
1024 for (sym = link_info.hash->undefs; sym; sym=sym->u.undef.next)
1025 printf ("-%s\n", sym->root.string);
1026 bfd_hash_traverse (&link_info.hash->table, pr_sym, NULL);
1028 for (a = link_info.input_bfds; a; a = a->link_next)
1029 printf ("*%s\n",a->filename);
1033 /* Pass the wacky PE command line options into the output bfd.
1034 FIXME: This should be done via a function, rather than by
1035 including an internal BFD header. */
1037 if (coff_data (link_info.output_bfd) == NULL
1038 || coff_data (link_info.output_bfd)->pe == 0)
1039 einfo (_("%F%P: cannot perform PE operations on non PE output file '%B'.\n"),
1040 link_info.output_bfd);
1042 pe_data (link_info.output_bfd)->pe_opthdr = pe;
1043 pe_data (link_info.output_bfd)->dll = init[DLLOFF].value;
1044 pe_data (link_info.output_bfd)->real_flags |= real_flags;
1047 if (pe_enable_stdcall_fixup) /* -1=warn or 1=disable */
1048 pe_fixup_stdcalls ();
1050 pe_process_import_defs (link_info.output_bfd, &link_info);
1052 pe_find_data_imports ();
1054 #if defined (TARGET_IS_i386pe) \
1055 || defined (TARGET_IS_armpe) \
1056 || defined (TARGET_IS_arm_epoc_pe) \
1057 || defined (TARGET_IS_arm_wince_pe)
1058 if (!link_info.relocatable)
1059 pe_dll_build_sections (link_info.output_bfd, &link_info);
1061 pe_exe_build_sections (link_info.output_bfd, &link_info);
1063 if (link_info.shared)
1064 pe_dll_build_sections (link_info.output_bfd, &link_info);
1066 #endif /* DLL_SUPPORT */
1068 #if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe)
1069 if (strstr (bfd_get_target (link_info.output_bfd), "arm") == NULL)
1071 /* The arm backend needs special fields in the output hash structure.
1072 These will only be created if the output format is an arm format,
1073 hence we do not support linking and changing output formats at the
1074 same time. Use a link followed by objcopy to change output formats. */
1075 einfo ("%F%X%P: error: cannot change output format whilst linking ARM binaries\n");
1079 /* Find a BFD that can hold the interworking stubs. */
1080 LANG_FOR_EACH_INPUT_STATEMENT (is)
1082 if (bfd_arm_get_bfd_for_interworking (is->the_bfd, & link_info))
1089 /* This next chunk of code tries to detect the case where you have
1090 two import libraries for the same DLL (specifically,
1091 symbolically linking libm.a and libc.a in cygwin to
1092 libcygwin.a). In those cases, it's possible for function
1093 thunks from the second implib to be used but without the
1094 head/tail objects, causing an improper import table. We detect
1095 those cases and rename the "other" import libraries to match
1096 the one the head/tail come from, so that the linker will sort
1097 things nicely and produce a valid import table. */
1099 LANG_FOR_EACH_INPUT_STATEMENT (is)
1101 if (is->the_bfd->my_archive)
1103 int idata2 = 0, reloc_count=0, is_imp = 0;
1106 /* See if this is an import library thunk. */
1107 for (sec = is->the_bfd->sections; sec; sec = sec->next)
1109 if (strcmp (sec->name, ".idata\$2") == 0)
1111 if (CONST_STRNEQ (sec->name, ".idata\$"))
1113 reloc_count += sec->reloc_count;
1116 if (is_imp && !idata2 && reloc_count)
1118 /* It is, look for the reference to head and see if it's
1119 from our own library. */
1120 for (sec = is->the_bfd->sections; sec; sec = sec->next)
1128 relsize = bfd_get_reloc_upper_bound (is->the_bfd, sec);
1132 if (!bfd_generic_link_read_symbols (is->the_bfd))
1134 einfo (_("%B%F: could not read symbols: %E\n"),
1138 symbols = bfd_get_outsymbols (is->the_bfd);
1140 relocs = (arelent **) xmalloc ((size_t) relsize);
1141 nrelocs = bfd_canonicalize_reloc (is->the_bfd, sec,
1146 einfo ("%X%P: unable to process relocs: %E\n");
1150 for (i = 0; i < nrelocs; i++)
1152 struct bfd_symbol *s;
1153 struct bfd_link_hash_entry * blhe;
1154 char *other_bfd_filename;
1157 s = (relocs[i]->sym_ptr_ptr)[0];
1159 if (s->flags & BSF_LOCAL)
1162 /* Thunk section with reloc to another bfd. */
1163 blhe = bfd_link_hash_lookup (link_info.hash,
1165 FALSE, FALSE, TRUE);
1168 || blhe->type != bfd_link_hash_defined)
1172 = blhe->u.def.section->owner->my_archive
1173 ? bfd_get_filename (blhe->u.def.section->owner->my_archive)
1174 : bfd_get_filename (blhe->u.def.section->owner);
1176 if (strcmp (bfd_get_filename (is->the_bfd->my_archive),
1177 other_bfd_filename) == 0)
1180 /* Rename this implib to match the other one. */
1181 n = xmalloc (strlen (other_bfd_filename) + 1);
1182 strcpy (n, other_bfd_filename);
1183 is->the_bfd->my_archive->filename = n;
1187 /* Note - we do not free the symbols,
1188 they are now cached in the BFD. */
1198 lang_input_statement_type *is2;
1199 lang_input_statement_type *is3;
1201 /* Careful - this is a shell script. Watch those dollar signs! */
1202 /* Microsoft import libraries have every member named the same,
1203 and not in the right order for us to link them correctly. We
1204 must detect these and rename the members so that they'll link
1205 correctly. There are three types of objects: the head, the
1206 thunks, and the sentinel(s). The head is easy; it's the one
1207 with idata2. We assume that the sentinels won't have relocs,
1208 and the thunks will. It's easier than checking the symbol
1209 table for external references. */
1210 LANG_FOR_EACH_INPUT_STATEMENT (is)
1212 if (is->the_bfd->my_archive)
1215 bfd *arch = is->the_bfd->my_archive;
1217 if (cur_arch != arch)
1223 is3 && is3->the_bfd->my_archive == arch;
1224 is3 = (lang_input_statement_type *) is3->next)
1226 /* A MS dynamic import library can also contain static
1227 members, so look for the first element with a .dll
1228 extension, and use that for the remainder of the
1230 pnt = strrchr (is3->the_bfd->filename, '.');
1231 if (pnt != NULL && strcmp (pnt, ".dll") == 0)
1239 /* OK, found one. Now look to see if the remaining
1240 (dynamic import) members use the same name. */
1242 is2 && is2->the_bfd->my_archive == arch;
1243 is2 = (lang_input_statement_type *) is2->next)
1245 /* Skip static members, ie anything with a .obj
1247 pnt = strrchr (is2->the_bfd->filename, '.');
1248 if (pnt != NULL && strcmp (pnt, ".obj") == 0)
1251 if (strcmp (is3->the_bfd->filename,
1252 is2->the_bfd->filename))
1261 /* This fragment might have come from an .obj file in a Microsoft
1262 import, and not an actual import record. If this is the case,
1263 then leave the filename alone. */
1264 pnt = strrchr (is->the_bfd->filename, '.');
1266 if (is_ms_arch && (strcmp (pnt, ".dll") == 0))
1268 int idata2 = 0, reloc_count=0;
1270 char *new_name, seq;
1272 for (sec = is->the_bfd->sections; sec; sec = sec->next)
1274 if (strcmp (sec->name, ".idata\$2") == 0)
1276 reloc_count += sec->reloc_count;
1279 if (idata2) /* .idata2 is the TOC */
1281 else if (reloc_count > 0) /* thunks */
1286 new_name = xmalloc (strlen (is->the_bfd->filename) + 3);
1287 sprintf (new_name, "%s.%c", is->the_bfd->filename, seq);
1288 is->the_bfd->filename = new_name;
1290 new_name = xmalloc (strlen (is->filename) + 3);
1291 sprintf (new_name, "%s.%c", is->filename, seq);
1292 is->filename = new_name;
1299 /* The following chunk of code tries to identify jump stubs in
1300 import libraries which are dead code and eliminates them
1301 from the final link. For each exported symbol <sym>, there
1302 is a object file in the import library with a .text section
1303 and several .idata$* sections. The .text section contains the
1304 symbol definition for <sym> which is a jump stub of the form
1305 jmp *__imp_<sym>. The .idata$5 contains the symbol definition
1306 for __imp_<sym> which is the address of the slot for <sym> in
1307 the import address table. When a symbol is imported explicitly
1308 using __declspec(dllimport) declaration, the compiler generates
1309 a reference to __imp_<sym> which directly resolves to the
1310 symbol in .idata$5, in which case the jump stub code is not
1311 needed. The following code tries to identify jump stub sections
1312 in import libraries which are not referred to by anyone and
1313 marks them for exclusion from the final link. */
1314 LANG_FOR_EACH_INPUT_STATEMENT (is)
1316 if (is->the_bfd->my_archive)
1319 asection *sec, *stub_sec = NULL;
1321 /* See if this is an import library thunk. */
1322 for (sec = is->the_bfd->sections; sec; sec = sec->next)
1324 if (strncmp (sec->name, ".idata\$", 7) == 0)
1326 /* The section containing the jmp stub has code
1328 if ((sec->flags & SEC_CODE) && sec->reloc_count)
1332 if (is_imp && stub_sec)
1335 long nsyms, src_count;
1336 struct bfd_link_hash_entry * blhe;
1338 if (!bfd_generic_link_read_symbols (is->the_bfd))
1340 einfo (_("%B%F: could not read symbols: %E\n"),
1344 symbols = bfd_get_outsymbols (is->the_bfd);
1345 nsyms = bfd_get_symcount (is->the_bfd);
1347 for (src_count = 0; src_count < nsyms; src_count++)
1349 if (symbols[src_count]->section->id == stub_sec->id)
1351 /* This symbol belongs to the section containing
1353 blhe = bfd_link_hash_lookup (link_info.hash,
1354 symbols[src_count]->name,
1355 FALSE, FALSE, TRUE);
1356 /* If the symbol in the stub section has no other
1357 undefined references, exclude the stub section
1358 from the final link. */
1359 if (blhe && (blhe->type == bfd_link_hash_defined)
1360 && (blhe->u.undef.next == NULL))
1361 stub_sec->flags |= SEC_EXCLUDE;
1371 gld_${EMULATION_NAME}_before_allocation (void)
1373 #ifdef TARGET_IS_ppcpe
1374 /* Here we rummage through the found bfds to collect toc information. */
1376 LANG_FOR_EACH_INPUT_STATEMENT (is)
1378 if (!ppc_process_before_allocation (is->the_bfd, &link_info))
1380 /* xgettext:c-format */
1381 einfo (_("Errors encountered processing file %s\n"), is->filename);
1386 /* We have seen it all. Allocate it, and carry on. */
1387 ppc_allocate_toc_section (&link_info);
1388 #endif /* TARGET_IS_ppcpe */
1390 #if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe)
1391 /* FIXME: we should be able to set the size of the interworking stub
1394 Here we rummage through the found bfds to collect glue
1395 information. FIXME: should this be based on a command line
1396 option? krk@cygnus.com. */
1398 LANG_FOR_EACH_INPUT_STATEMENT (is)
1400 if (! bfd_arm_process_before_allocation
1401 (is->the_bfd, & link_info, support_old_code))
1403 /* xgettext:c-format */
1404 einfo (_("Errors encountered processing file %s for interworking\n"),
1410 /* We have seen it all. Allocate it, and carry on. */
1411 bfd_arm_allocate_interworking_sections (& link_info);
1412 #endif /* TARGET_IS_armpe || TARGET_IS_arm_epoc_pe || TARGET_IS_arm_wince_pe */
1414 before_allocation_default ();
1418 /* This is called when an input file isn't recognized as a BFD. We
1419 check here for .DEF files and pull them in automatically. */
1422 saw_option (char *option)
1426 for (i = 0; init[i].ptr; i++)
1427 if (strcmp (init[i].symbol, option) == 0)
1428 return init[i].inited;
1431 #endif /* DLL_SUPPORT */
1434 gld_${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry ATTRIBUTE_UNUSED)
1437 const char *ext = entry->filename + strlen (entry->filename) - 4;
1439 if (strcmp (ext, ".def") == 0 || strcmp (ext, ".DEF") == 0)
1441 pe_def_file = def_file_parse (entry->filename, pe_def_file);
1445 int i, buflen=0, len;
1448 for (i = 0; i < pe_def_file->num_exports; i++)
1450 len = strlen (pe_def_file->exports[i].internal_name);
1451 if (buflen < len + 2)
1455 buf = (char *) xmalloc (buflen);
1457 for (i = 0; i < pe_def_file->num_exports; i++)
1459 struct bfd_link_hash_entry *h;
1461 sprintf (buf, "%s%s", U (""), pe_def_file->exports[i].internal_name);
1463 h = bfd_link_hash_lookup (link_info.hash, buf, TRUE, TRUE, TRUE);
1464 if (h == (struct bfd_link_hash_entry *) NULL)
1465 einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
1466 if (h->type == bfd_link_hash_new)
1468 h->type = bfd_link_hash_undefined;
1469 h->u.undef.abfd = NULL;
1470 bfd_link_add_undef (link_info.hash, h);
1475 /* def_file_print (stdout, pe_def_file); */
1476 if (pe_def_file->is_dll == 1)
1477 link_info.shared = 1;
1479 if (pe_def_file->base_address != (bfd_vma)(-1))
1482 = pe_data (link_info.output_bfd)->pe_opthdr.ImageBase
1483 = init[IMAGEBASEOFF].value
1484 = pe_def_file->base_address;
1485 init[IMAGEBASEOFF].inited = 1;
1486 if (image_base_statement)
1487 image_base_statement->exp = exp_assop ('=', "__image_base__",
1488 exp_intop (pe.ImageBase));
1491 if (pe_def_file->stack_reserve != -1
1492 && ! saw_option ("__size_of_stack_reserve__"))
1494 pe.SizeOfStackReserve = pe_def_file->stack_reserve;
1495 if (pe_def_file->stack_commit != -1)
1496 pe.SizeOfStackCommit = pe_def_file->stack_commit;
1498 if (pe_def_file->heap_reserve != -1
1499 && ! saw_option ("__size_of_heap_reserve__"))
1501 pe.SizeOfHeapReserve = pe_def_file->heap_reserve;
1502 if (pe_def_file->heap_commit != -1)
1503 pe.SizeOfHeapCommit = pe_def_file->heap_commit;
1513 gld_${EMULATION_NAME}_recognized_file (lang_input_statement_type *entry ATTRIBUTE_UNUSED)
1516 #ifdef TARGET_IS_i386pe
1517 pe_dll_id_target ("pei-i386");
1519 #ifdef TARGET_IS_shpe
1520 pe_dll_id_target ("pei-shl");
1522 #ifdef TARGET_IS_mipspe
1523 pe_dll_id_target ("pei-mips");
1525 #ifdef TARGET_IS_armpe
1526 pe_dll_id_target ("pei-arm-little");
1528 #ifdef TARGET_IS_arm_epoc_pe
1529 pe_dll_id_target ("epoc-pei-arm-little");
1531 #ifdef TARGET_IS_arm_wince_pe
1532 pe_dll_id_target ("pei-arm-wince-little");
1534 if (pe_bfd_is_dll (entry->the_bfd))
1535 return pe_implied_import_dll (entry->filename);
1541 gld_${EMULATION_NAME}_finish (void)
1543 #if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe)
1544 struct bfd_link_hash_entry * h;
1546 if (thumb_entry_symbol != NULL)
1548 h = bfd_link_hash_lookup (link_info.hash, thumb_entry_symbol,
1549 FALSE, FALSE, TRUE);
1551 if (h != (struct bfd_link_hash_entry *) NULL
1552 && (h->type == bfd_link_hash_defined
1553 || h->type == bfd_link_hash_defweak)
1554 && h->u.def.section->output_section != NULL)
1556 static char buffer[32];
1559 /* Special procesing is required for a Thumb entry symbol. The
1560 bottom bit of its address must be set. */
1561 val = (h->u.def.value
1562 + bfd_get_section_vma (link_info.output_bfd,
1563 h->u.def.section->output_section)
1564 + h->u.def.section->output_offset);
1568 /* Now convert this value into a string and store it in entry_symbol
1569 where the lang_finish() function will pick it up. */
1573 sprintf_vma (buffer + 2, val);
1575 if (entry_symbol.name != NULL && entry_from_cmdline)
1576 einfo (_("%P: warning: '--thumb-entry %s' is overriding '-e %s'\n"),
1577 thumb_entry_symbol, entry_symbol.name);
1578 entry_symbol.name = buffer;
1581 einfo (_("%P: warning: cannot find thumb start symbol %s\n"), thumb_entry_symbol);
1583 #endif /* defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe) */
1588 if (link_info.shared
1589 #if !defined(TARGET_IS_shpe) && !defined(TARGET_IS_mipspe)
1590 || (!link_info.relocatable && pe_def_file->num_exports != 0)
1594 pe_dll_fill_sections (link_info.output_bfd, &link_info);
1595 if (pe_implib_filename)
1596 pe_dll_generate_implib (pe_def_file, pe_implib_filename, &link_info);
1598 #if defined(TARGET_IS_shpe) || defined(TARGET_IS_mipspe)
1599 /* ARM doesn't need relocs. */
1602 pe_exe_fill_sections (link_info.output_bfd, &link_info);
1606 if (pe_out_def_filename)
1607 pe_dll_generate_def_file (pe_out_def_filename);
1608 #endif /* DLL_SUPPORT */
1610 /* I don't know where .idata gets set as code, but it shouldn't be. */
1612 asection *asec = bfd_get_section_by_name (link_info.output_bfd, ".idata");
1616 asec->flags &= ~SEC_CODE;
1617 asec->flags |= SEC_DATA;
1623 /* Place an orphan section.
1625 We use this to put sections in a reasonable place in the file, and
1626 to ensure that they are aligned as required.
1628 We handle grouped sections here as well. A section named .foo$nn
1629 goes into the output section .foo. All grouped sections are sorted
1632 Grouped sections for the default sections are handled by the
1633 default linker script using wildcards, and are sorted by
1636 static lang_output_section_statement_type *
1637 gld_${EMULATION_NAME}_place_orphan (asection *s,
1638 const char *secname,
1641 const char *orig_secname = secname;
1642 char *dollar = NULL;
1643 lang_output_section_statement_type *os;
1644 lang_statement_list_type add_child;
1646 /* Look through the script to see where to place this section. */
1647 if (!link_info.relocatable
1648 && (dollar = strchr (secname, '$')) != NULL)
1650 size_t len = dollar - secname;
1651 char *newname = xmalloc (len + 1);
1652 memcpy (newname, secname, len);
1653 newname[len] = '\0';
1657 lang_list_init (&add_child);
1660 && (os = lang_output_section_find (secname)) != NULL
1661 && os->bfd_section != NULL
1662 && (os->bfd_section->flags == 0
1663 || ((s->flags ^ os->bfd_section->flags)
1664 & (SEC_LOAD | SEC_ALLOC)) == 0))
1666 /* We already have an output section statement with this
1667 name, and its bfd section has compatible flags.
1668 If the section already exists but does not have any flags set,
1669 then it has been created by the linker, probably as a result of
1670 a --section-start command line switch. */
1671 lang_add_section (&add_child, s, os);
1675 static struct orphan_save hold[] =
1678 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1681 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1684 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1690 enum orphan_save_index
1697 static int orphan_init_done = 0;
1698 struct orphan_save *place;
1699 lang_output_section_statement_type *after;
1700 etree_type *address;
1702 if (!orphan_init_done)
1704 struct orphan_save *ho;
1705 for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
1706 if (ho->name != NULL)
1708 ho->os = lang_output_section_find (ho->name);
1709 if (ho->os != NULL && ho->os->flags == 0)
1710 ho->os->flags = ho->flags;
1712 orphan_init_done = 1;
1715 /* Try to put the new output section in a reasonable place based
1716 on the section name and section flags. */
1719 if ((s->flags & SEC_ALLOC) == 0)
1721 else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
1722 place = &hold[orphan_bss];
1723 else if ((s->flags & SEC_READONLY) == 0)
1724 place = &hold[orphan_data];
1725 else if ((s->flags & SEC_CODE) == 0)
1726 place = &hold[orphan_rodata];
1728 place = &hold[orphan_text];
1733 if (place->os == NULL)
1734 place->os = lang_output_section_find (place->name);
1737 after = lang_output_section_find_by_flags (s, &place->os, NULL);
1739 /* *ABS* is always the first output section statement. */
1740 after = (&lang_output_section_statement.head
1741 ->output_section_statement);
1744 /* All sections in an executable must be aligned to a page boundary. */
1745 address = exp_unop (ALIGN_K, exp_nameop (NAME, "__section_alignment__"));
1746 os = lang_insert_orphan (s, secname, constraint, after, place, address,
1751 lang_statement_union_type **pl = &os->children.head;
1755 bfd_boolean found_dollar;
1757 /* The section name has a '$'. Sort it with the other '$'
1759 found_dollar = FALSE;
1760 for ( ; *pl != NULL; pl = &(*pl)->header.next)
1762 lang_input_section_type *ls;
1765 if ((*pl)->header.type != lang_input_section_enum)
1768 ls = &(*pl)->input_section;
1770 lname = bfd_get_section_name (ls->section->owner, ls->section);
1771 if (strchr (lname, '$') == NULL)
1778 found_dollar = TRUE;
1779 if (strcmp (orig_secname, lname) < 0)
1785 if (add_child.head != NULL)
1787 add_child.head->header.next = *pl;
1788 *pl = add_child.head;
1796 gld_${EMULATION_NAME}_open_dynamic_archive
1797 (const char *arch ATTRIBUTE_UNUSED, search_dirs_type *search,
1798 lang_input_statement_type *entry)
1802 const char * format;
1803 bfd_boolean use_prefix;
1807 /* Preferred explicit import library for dll's. */
1808 { "lib%s.dll.a", FALSE },
1809 /* Alternate explicit import library for dll's. */
1810 { "%s.dll.a", FALSE },
1811 /* "libfoo.a" could be either an import lib or a static lib.
1812 For backwards compatibility, libfoo.a needs to precede
1813 libfoo.dll and foo.dll in the search. */
1814 { "lib%s.a", FALSE },
1815 /* The 'native' spelling of an import lib name is "foo.lib". */
1816 { "%s.lib", FALSE },
1818 /* Try "<prefix>foo.dll" (preferred dll name, if specified). */
1819 { "%s%s.dll", TRUE },
1821 /* Try "libfoo.dll" (default preferred dll name). */
1822 { "lib%s.dll", FALSE },
1823 /* Finally try 'native' dll name "foo.dll". */
1824 { "%s.dll", FALSE },
1825 /* Note: If adding more formats to this table, make sure to check to
1826 see if their length is longer than libname_fmt[0].format, and if
1827 so, update the call to xmalloc() below. */
1830 static unsigned int format_max_len = 0;
1831 const char * filename;
1837 if (! entry->is_archive)
1840 filename = entry->filename;
1842 if (format_max_len == 0)
1843 /* We need to allow space in the memory that we are going to allocate
1844 for the characters in the format string. Since the format array is
1845 static we only need to calculate this information once. In theory
1846 this value could also be computed statically, but this introduces
1847 the possibility for a discrepancy and hence a possible memory
1848 corruption. The lengths we compute here will be too long because
1849 they will include any formating characters (%s) in the strings, but
1850 this will not matter. */
1851 for (i = 0; libname_fmt[i].format; i++)
1852 if (format_max_len < strlen (libname_fmt[i].format))
1853 format_max_len = strlen (libname_fmt[i].format);
1855 full_string = xmalloc (strlen (search->name)
1859 + (pe_dll_search_prefix
1860 ? strlen (pe_dll_search_prefix) : 0)
1862 /* Allow for the terminating NUL and for the path
1863 separator character that is inserted between
1864 search->name and the start of the format string. */
1867 sprintf (full_string, "%s/", search->name);
1868 base_string = full_string + strlen (full_string);
1870 for (i = 0; libname_fmt[i].format; i++)
1873 if (libname_fmt[i].use_prefix)
1875 if (!pe_dll_search_prefix)
1877 sprintf (base_string, libname_fmt[i].format, pe_dll_search_prefix, filename);
1881 sprintf (base_string, libname_fmt[i].format, filename);
1883 if (ldfile_try_open_bfd (full_string, entry))
1887 if (!libname_fmt[i].format)
1893 entry->filename = full_string;
1899 gld_${EMULATION_NAME}_find_potential_libraries
1900 (char *name, lang_input_statement_type *entry)
1902 return ldfile_open_file_search (name, entry, "", ".lib");
1906 gld_${EMULATION_NAME}_get_script (int *isfile)
1908 # Scripts compiled in.
1909 # sed commands to quote an ld script as a C string.
1910 sc="-f stringify.sed"
1916 if (link_info.relocatable && config.build_constructors)
1919 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1920 echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c
1921 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1922 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1923 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1924 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1925 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1926 if test -n "$GENERATE_AUTO_IMPORT_SCRIPT" ; then
1927 echo ' ; else if (link_info.pei386_auto_import == 1) return' >> e${EMULATION_NAME}.c
1928 sed $sc ldscripts/${EMULATION_NAME}.xa >> e${EMULATION_NAME}.c
1930 echo ' ; else return' >> e${EMULATION_NAME}.c
1931 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1932 echo '; }' >> e${EMULATION_NAME}.c
1937 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1939 gld_${EMULATION_NAME}_before_parse,
1942 gld_${EMULATION_NAME}_after_parse,
1943 gld_${EMULATION_NAME}_after_open,
1944 after_allocation_default,
1945 set_output_arch_default,
1946 ldemul_default_target,
1947 gld_${EMULATION_NAME}_before_allocation,
1948 gld_${EMULATION_NAME}_get_script,
1949 "${EMULATION_NAME}",
1951 gld_${EMULATION_NAME}_finish,
1952 NULL, /* Create output section statements. */
1953 gld_${EMULATION_NAME}_open_dynamic_archive,
1954 gld_${EMULATION_NAME}_place_orphan,
1955 gld_${EMULATION_NAME}_set_symbols,
1956 NULL, /* parse_args */
1957 gld${EMULATION_NAME}_add_options,
1958 gld${EMULATION_NAME}_handle_option,
1959 gld_${EMULATION_NAME}_unrecognized_file,
1960 gld_${EMULATION_NAME}_list_options,
1961 gld_${EMULATION_NAME}_recognized_file,
1962 gld_${EMULATION_NAME}_find_potential_libraries,
1963 NULL /* new_vers_pattern. */