1 # This shell script emits a C file. -*- C -*-
2 # It does some substitutions.
3 if [ -z "$MACHINE" ]; then
6 OUTPUT_ARCH=${ARCH}:${MACHINE}
11 move_default_addr_high=1
14 move_default_addr_high=0;
18 rm -f e${EMULATION_NAME}.c
19 (echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
21 /* Copyright (C) 2006-2017 Free Software Foundation, Inc.
22 Written by Kai Tietz, OneVision Software GmbH&CoKg.
24 This file is part of the GNU Binutils.
26 This program is free software; you can redistribute it and/or modify
27 it under the terms of the GNU General Public License as published by
28 the Free Software Foundation; either version 3 of the License, or
29 (at your option) any later version.
31 This program is distributed in the hope that it will be useful,
32 but WITHOUT ANY WARRANTY; without even the implied warranty of
33 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
34 GNU General Public License for more details.
36 You should have received a copy of the GNU General Public License
37 along with this program; if not, write to the Free Software
38 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
39 MA 02110-1301, USA. */
42 /* For WINDOWS_XP64 and higher */
43 /* Based on pe.em, but modified for 64 bit support. */
45 #define TARGET_IS_${EMULATION_NAME}
47 #define COFF_IMAGE_WITH_PE
49 #define COFF_WITH_pex64
55 #include "libiberty.h"
56 #include "filenames.h"
67 #include "ldbuildid.h"
68 #include "coff/internal.h"
70 /* FIXME: See bfd/peXXigen.c for why we include an architecture specific
71 header in generic PE code. */
72 #include "coff/x86_64.h"
75 /* FIXME: These are BFD internal header files, and we should not be
77 #include "../bfd/libcoff.h"
78 #include "../bfd/libpei.h"
81 #define AOUTSZ PEPAOUTSZ
82 #define PEAOUTHDR PEPAOUTHDR
86 #include "safe-ctype.h"
88 /* Permit the emulation parameters to override the default section
89 alignment by setting OVERRIDE_SECTION_ALIGNMENT. FIXME: This makes
90 it seem that include/coff/internal.h should not define
91 PE_DEF_SECTION_ALIGNMENT. */
92 #if PE_DEF_SECTION_ALIGNMENT != ${OVERRIDE_SECTION_ALIGNMENT:-PE_DEF_SECTION_ALIGNMENT}
93 #undef PE_DEF_SECTION_ALIGNMENT
94 #define PE_DEF_SECTION_ALIGNMENT ${OVERRIDE_SECTION_ALIGNMENT}
97 #ifdef TARGET_IS_i386pep
101 #if defined(TARGET_IS_i386pep) || ! defined(DLL_SUPPORT)
102 #define PE_DEF_SUBSYSTEM 3
103 #undef NT_EXE_IMAGE_BASE
104 #define NT_EXE_IMAGE_BASE \
105 ((bfd_vma) (${move_default_addr_high} ? 0x100400000LL \
107 #undef NT_DLL_IMAGE_BASE
108 #define NT_DLL_IMAGE_BASE \
109 ((bfd_vma) (${move_default_addr_high} ? 0x400000000LL \
111 #undef NT_DLL_AUTO_IMAGE_BASE
112 #define NT_DLL_AUTO_IMAGE_BASE \
113 ((bfd_vma) (${move_default_addr_high} ? 0x400000000LL \
115 #undef NT_DLL_AUTO_IMAGE_MASK
116 #define NT_DLL_AUTO_IMAGE_MASK \
117 ((bfd_vma) (${move_default_addr_high} ? 0x1ffff0000LL \
120 #undef NT_EXE_IMAGE_BASE
121 #define NT_EXE_IMAGE_BASE \
122 ((bfd_vma) (${move_default_addr_high} ? 0x100010000LL \
124 #undef NT_DLL_IMAGE_BASE
125 #define NT_DLL_IMAGE_BASE \
126 ((bfd_vma) (${move_default_addr_high} ? 0x110000000LL \
128 #undef NT_DLL_AUTO_IMAGE_BASE
129 #define NT_DLL_AUTO_IMAGE_BASE \
130 ((bfd_vma) (${move_default_addr_high} ? 0x120000000LL \
132 #undef NT_DLL_AUTO_IMAGE_MASK
133 #define NT_DLL_AUTO_IMAGE_MASK \
134 ((bfd_vma) (${move_default_addr_high} ? 0x0ffff0000LL \
136 #undef PE_DEF_SECTION_ALIGNMENT
137 #define PE_DEF_SUBSYSTEM 2
138 #undef PE_DEF_FILE_ALIGNMENT
139 #define PE_DEF_FILE_ALIGNMENT 0x00000200
140 #define PE_DEF_SECTION_ALIGNMENT 0x00000400
143 static struct internal_extra_pe_aouthdr pep;
145 static int pep_subsystem = ${SUBSYSTEM};
146 static flagword real_flags = IMAGE_FILE_LARGE_ADDRESS_AWARE;
147 static int support_old_code = 0;
148 static lang_assignment_statement_type *image_base_statement = 0;
149 static unsigned short pe_dll_characteristics = 0;
150 static bfd_boolean insert_timestamp = TRUE;
151 static const char *emit_build_id;
154 static int pep_enable_stdcall_fixup = 1; /* 0=disable 1=enable (default). */
155 static char * pep_out_def_filename = NULL;
156 static int pep_enable_auto_image_base = 0;
157 static char * pep_dll_search_prefix = NULL;
160 extern const char *output_filename;
162 static int is_underscoring (void)
165 if (pep_leading_underscore != -1)
166 return pep_leading_underscore;
167 if (!bfd_get_target_info ("${OUTPUT_FORMAT}", NULL, NULL, &u, NULL))
168 bfd_get_target_info ("${RELOCATEABLE_OUTPUT_FORMAT}", NULL, NULL, &u, NULL);
172 pep_leading_underscore = (u != 0 ? 1 : 0);
173 return pep_leading_underscore;
178 gld_${EMULATION_NAME}_before_parse (void)
181 ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
182 output_filename = "${EXECUTABLE_NAME:-a.exe}";
184 input_flags.dynamic = TRUE;
185 config.has_shared = 1;
186 link_info.pei386_auto_import = 1;
187 link_info.pei386_runtime_pseudo_reloc = 2; /* Use by default version 2. */
191 /* PE format extra command line options. */
193 /* Used for setting flags in the PE header. */
196 OPTION_BASE_FILE = 300 + 1,
198 OPTION_FILE_ALIGNMENT,
200 OPTION_MAJOR_IMAGE_VERSION,
201 OPTION_MAJOR_OS_VERSION,
202 OPTION_MAJOR_SUBSYSTEM_VERSION,
203 OPTION_MINOR_IMAGE_VERSION,
204 OPTION_MINOR_OS_VERSION,
205 OPTION_MINOR_SUBSYSTEM_VERSION,
206 OPTION_SECTION_ALIGNMENT,
210 OPTION_SUPPORT_OLD_CODE,
213 OPTION_EXCLUDE_SYMBOLS,
214 OPTION_EXCLUDE_ALL_SYMBOLS,
216 OPTION_STDCALL_ALIASES,
217 OPTION_ENABLE_STDCALL_FIXUP,
218 OPTION_DISABLE_STDCALL_FIXUP,
219 OPTION_WARN_DUPLICATE_EXPORTS,
221 OPTION_ENABLE_AUTO_IMAGE_BASE,
222 OPTION_DISABLE_AUTO_IMAGE_BASE,
223 OPTION_DLL_SEARCH_PREFIX,
224 OPTION_NO_DEFAULT_EXCLUDES,
225 OPTION_DLL_ENABLE_AUTO_IMPORT,
226 OPTION_DLL_DISABLE_AUTO_IMPORT,
227 OPTION_ENABLE_EXTRA_PE_DEBUG,
229 OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC,
230 OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC,
231 OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2,
232 OPTION_EXCLUDE_MODULES_FOR_IMPLIB,
233 OPTION_USE_NUL_PREFIXED_IMPORT_TABLES,
234 OPTION_NO_LEADING_UNDERSCORE,
235 OPTION_LEADING_UNDERSCORE,
236 OPTION_ENABLE_LONG_SECTION_NAMES,
237 OPTION_DISABLE_LONG_SECTION_NAMES,
238 OPTION_HIGH_ENTROPY_VA,
240 OPTION_FORCE_INTEGRITY,
246 OPTION_INSERT_TIMESTAMP,
247 OPTION_NO_INSERT_TIMESTAMP,
248 OPTION_TERMINAL_SERVER_AWARE,
253 gld${EMULATION_NAME}_add_options
254 (int ns ATTRIBUTE_UNUSED,
255 char **shortopts ATTRIBUTE_UNUSED,
257 struct option **longopts,
258 int nrl ATTRIBUTE_UNUSED,
259 struct option **really_longopts ATTRIBUTE_UNUSED)
261 static const struct option xtra_long[] =
264 {"base-file", required_argument, NULL, OPTION_BASE_FILE},
265 {"dll", no_argument, NULL, OPTION_DLL},
266 {"file-alignment", required_argument, NULL, OPTION_FILE_ALIGNMENT},
267 {"heap", required_argument, NULL, OPTION_HEAP},
268 {"image-base", required_argument, NULL, OPTION_IMAGE_BASE},
269 {"major-image-version", required_argument, NULL, OPTION_MAJOR_IMAGE_VERSION},
270 {"major-os-version", required_argument, NULL, OPTION_MAJOR_OS_VERSION},
271 {"major-subsystem-version", required_argument, NULL, OPTION_MAJOR_SUBSYSTEM_VERSION},
272 {"minor-image-version", required_argument, NULL, OPTION_MINOR_IMAGE_VERSION},
273 {"minor-os-version", required_argument, NULL, OPTION_MINOR_OS_VERSION},
274 {"minor-subsystem-version", required_argument, NULL, OPTION_MINOR_SUBSYSTEM_VERSION},
275 {"section-alignment", required_argument, NULL, OPTION_SECTION_ALIGNMENT},
276 {"stack", required_argument, NULL, OPTION_STACK},
277 {"subsystem", required_argument, NULL, OPTION_SUBSYSTEM},
278 {"support-old-code", no_argument, NULL, OPTION_SUPPORT_OLD_CODE},
279 {"use-nul-prefixed-import-tables", no_argument, NULL,
280 OPTION_USE_NUL_PREFIXED_IMPORT_TABLES},
281 {"no-leading-underscore", no_argument, NULL, OPTION_NO_LEADING_UNDERSCORE},
282 {"leading-underscore", no_argument, NULL, OPTION_LEADING_UNDERSCORE},
284 /* getopt allows abbreviations, so we do this to stop it
285 from treating -o as an abbreviation for this option. */
286 {"output-def", required_argument, NULL, OPTION_OUT_DEF},
287 {"output-def", required_argument, NULL, OPTION_OUT_DEF},
288 {"export-all-symbols", no_argument, NULL, OPTION_EXPORT_ALL},
289 {"exclude-symbols", required_argument, NULL, OPTION_EXCLUDE_SYMBOLS},
290 {"exclude-all-symbols", no_argument, NULL, OPTION_EXCLUDE_ALL_SYMBOLS},
291 {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
292 {"exclude-modules-for-implib", required_argument, NULL, OPTION_EXCLUDE_MODULES_FOR_IMPLIB},
293 {"kill-at", no_argument, NULL, OPTION_KILL_ATS},
294 {"add-stdcall-alias", no_argument, NULL, OPTION_STDCALL_ALIASES},
295 {"enable-stdcall-fixup", no_argument, NULL, OPTION_ENABLE_STDCALL_FIXUP},
296 {"disable-stdcall-fixup", no_argument, NULL, OPTION_DISABLE_STDCALL_FIXUP},
297 {"warn-duplicate-exports", no_argument, NULL, OPTION_WARN_DUPLICATE_EXPORTS},
298 /* getopt() allows abbreviations, so we do this to stop it from
299 treating -c as an abbreviation for these --compat-implib. */
300 {"compat-implib", no_argument, NULL, OPTION_IMP_COMPAT},
301 {"compat-implib", no_argument, NULL, OPTION_IMP_COMPAT},
302 {"enable-auto-image-base", no_argument, NULL, OPTION_ENABLE_AUTO_IMAGE_BASE},
303 {"disable-auto-image-base", no_argument, NULL, OPTION_DISABLE_AUTO_IMAGE_BASE},
304 {"dll-search-prefix", required_argument, NULL, OPTION_DLL_SEARCH_PREFIX},
305 {"no-default-excludes", no_argument, NULL, OPTION_NO_DEFAULT_EXCLUDES},
306 {"enable-auto-import", no_argument, NULL, OPTION_DLL_ENABLE_AUTO_IMPORT},
307 {"disable-auto-import", no_argument, NULL, OPTION_DLL_DISABLE_AUTO_IMPORT},
308 {"enable-extra-pep-debug", no_argument, NULL, OPTION_ENABLE_EXTRA_PE_DEBUG},
309 {"enable-runtime-pseudo-reloc", no_argument, NULL, OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC},
310 {"disable-runtime-pseudo-reloc", no_argument, NULL, OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC},
311 {"enable-runtime-pseudo-reloc-v2", no_argument, NULL, OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2},
313 {"enable-long-section-names", no_argument, NULL, OPTION_ENABLE_LONG_SECTION_NAMES},
314 {"disable-long-section-names", no_argument, NULL, OPTION_DISABLE_LONG_SECTION_NAMES},
315 {"high-entropy-va", no_argument, NULL, OPTION_HIGH_ENTROPY_VA},
316 {"dynamicbase",no_argument, NULL, OPTION_DYNAMIC_BASE},
317 {"forceinteg", no_argument, NULL, OPTION_FORCE_INTEGRITY},
318 {"nxcompat", no_argument, NULL, OPTION_NX_COMPAT},
319 {"no-isolation", no_argument, NULL, OPTION_NO_ISOLATION},
320 {"no-seh", no_argument, NULL, OPTION_NO_SEH},
321 {"no-bind", no_argument, NULL, OPTION_NO_BIND},
322 {"wdmdriver", no_argument, NULL, OPTION_WDM_DRIVER},
323 {"tsaware", no_argument, NULL, OPTION_TERMINAL_SERVER_AWARE},
324 {"insert-timestamp", no_argument, NULL, OPTION_INSERT_TIMESTAMP},
325 {"no-insert-timestamp", no_argument, NULL, OPTION_NO_INSERT_TIMESTAMP},
326 {"build-id", optional_argument, NULL, OPTION_BUILD_ID},
327 {NULL, no_argument, NULL, 0}
331 = xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
332 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
335 /* PE/WIN32; added routines to get the subsystem type, heap and/or stack
336 parameters which may be input from the command line. */
345 /* FALSE for an assembly level symbol and TRUE for a C visible symbol.
346 C visible symbols can be prefixed by underscore dependent on target's
348 bfd_boolean is_c_symbol;
351 #define GET_INIT_SYMBOL_NAME(IDX) \
352 (init[(IDX)].symbol \
353 + ((!init[(IDX)].is_c_symbol || is_underscoring () == 1) ? 0 : 1))
355 /* Decorates the C visible symbol by underscore, if target requires. */
357 ((is_underscoring () == 0) ? CSTR : "_" CSTR)
359 /* Get size of constant string for a possible underscore prefixed
361 #define U_SIZE(CSTR) \
362 (sizeof (CSTR) + (is_underscoring () == 0 ? 0 : 1))
364 #define D(field,symbol,def,usc) {&pep.field, sizeof (pep.field), def, symbol, 0, usc}
366 static definfo init[] =
368 /* imagebase must be first */
369 #define IMAGEBASEOFF 0
370 D(ImageBase,"__image_base__", NT_EXE_IMAGE_BASE, FALSE),
372 {&dll, sizeof(dll), 0, "__dll__", 0, FALSE},
373 #define MSIMAGEBASEOFF 2
374 D(ImageBase, "___ImageBase", NT_EXE_IMAGE_BASE, TRUE),
375 D(SectionAlignment,"__section_alignment__", PE_DEF_SECTION_ALIGNMENT, FALSE),
376 D(FileAlignment,"__file_alignment__", PE_DEF_FILE_ALIGNMENT, FALSE),
377 D(MajorOperatingSystemVersion,"__major_os_version__", 4, FALSE),
378 D(MinorOperatingSystemVersion,"__minor_os_version__", 0, FALSE),
379 D(MajorImageVersion,"__major_image_version__", 0, FALSE),
380 D(MinorImageVersion,"__minor_image_version__", 0, FALSE),
381 D(MajorSubsystemVersion,"__major_subsystem_version__", 5, FALSE),
382 D(MinorSubsystemVersion,"__minor_subsystem_version__", 2, FALSE),
383 D(Subsystem,"__subsystem__", ${SUBSYSTEM}, FALSE),
384 D(SizeOfStackReserve,"__size_of_stack_reserve__", 0x200000, FALSE),
385 D(SizeOfStackCommit,"__size_of_stack_commit__", 0x1000, FALSE),
386 D(SizeOfHeapReserve,"__size_of_heap_reserve__", 0x100000, FALSE),
387 D(SizeOfHeapCommit,"__size_of_heap_commit__", 0x1000, FALSE),
388 D(LoaderFlags,"__loader_flags__", 0x0, FALSE),
389 D(DllCharacteristics, "__dll_characteristics__", 0x0, FALSE),
390 { NULL, 0, 0, NULL, 0, FALSE}
395 gld_${EMULATION_NAME}_list_options (FILE *file)
397 fprintf (file, _(" --base_file <basefile> Generate a base file for relocatable DLLs\n"));
398 fprintf (file, _(" --dll Set image base to the default for DLLs\n"));
399 fprintf (file, _(" --file-alignment <size> Set file alignment\n"));
400 fprintf (file, _(" --heap <size> Set initial size of the heap\n"));
401 fprintf (file, _(" --image-base <address> Set start address of the executable\n"));
402 fprintf (file, _(" --major-image-version <number> Set version number of the executable\n"));
403 fprintf (file, _(" --major-os-version <number> Set minimum required OS version\n"));
404 fprintf (file, _(" --major-subsystem-version <number> Set minimum required OS subsystem version\n"));
405 fprintf (file, _(" --minor-image-version <number> Set revision number of the executable\n"));
406 fprintf (file, _(" --minor-os-version <number> Set minimum required OS revision\n"));
407 fprintf (file, _(" --minor-subsystem-version <number> Set minimum required OS subsystem revision\n"));
408 fprintf (file, _(" --section-alignment <size> Set section alignment\n"));
409 fprintf (file, _(" --stack <size> Set size of the initial stack\n"));
410 fprintf (file, _(" --subsystem <name>[:<version>] Set required OS subsystem [& version]\n"));
411 fprintf (file, _(" --support-old-code Support interworking with old code\n"));
412 fprintf (file, _(" --[no-]leading-underscore Set explicit symbol underscore prefix mode\n"));
413 fprintf (file, _(" --[no-]insert-timestamp Use a real timestamp rather than zero. (default)\n"));
414 fprintf (file, _(" This makes binaries non-deterministic\n"));
416 fprintf (file, _(" --add-stdcall-alias Export symbols with and without @nn\n"));
417 fprintf (file, _(" --disable-stdcall-fixup Don't link _sym to _sym@nn\n"));
418 fprintf (file, _(" --enable-stdcall-fixup Link _sym to _sym@nn without warnings\n"));
419 fprintf (file, _(" --exclude-symbols sym,sym,... Exclude symbols from automatic export\n"));
420 fprintf (file, _(" --exclude-all-symbols Exclude all symbols from automatic export\n"));
421 fprintf (file, _(" --exclude-libs lib,lib,... Exclude libraries from automatic export\n"));
422 fprintf (file, _(" --exclude-modules-for-implib mod,mod,...\n"));
423 fprintf (file, _(" Exclude objects, archive members from auto\n"));
424 fprintf (file, _(" export, place into import library instead.\n"));
425 fprintf (file, _(" --export-all-symbols Automatically export all globals to DLL\n"));
426 fprintf (file, _(" --kill-at Remove @nn from exported symbols\n"));
427 fprintf (file, _(" --output-def <file> Generate a .DEF file for the built DLL\n"));
428 fprintf (file, _(" --warn-duplicate-exports Warn about duplicate exports.\n"));
429 fprintf (file, _(" --compat-implib Create backward compatible import libs;\n\
430 create __imp_<SYMBOL> as well.\n"));
431 fprintf (file, _(" --enable-auto-image-base Automatically choose image base for DLLs\n\
432 unless user specifies one\n"));
433 fprintf (file, _(" --disable-auto-image-base Do not auto-choose image base. (default)\n"));
434 fprintf (file, _(" --dll-search-prefix=<string> When linking dynamically to a dll without\n\
435 an importlib, use <string><basename>.dll\n\
436 in preference to lib<basename>.dll \n"));
437 fprintf (file, _(" --enable-auto-import Do sophisticated linking of _sym to\n\
438 __imp_sym for DATA references\n"));
439 fprintf (file, _(" --disable-auto-import Do not auto-import DATA items from DLLs\n"));
440 fprintf (file, _(" --enable-runtime-pseudo-reloc Work around auto-import limitations by\n\
441 adding pseudo-relocations resolved at\n\
443 fprintf (file, _(" --disable-runtime-pseudo-reloc Do not add runtime pseudo-relocations for\n\
444 auto-imported DATA.\n"));
445 fprintf (file, _(" --enable-extra-pep-debug Enable verbose debug output when building\n\
446 or linking to DLLs (esp. auto-import)\n"));
447 fprintf (file, _(" --enable-long-section-names Use long COFF section names even in\n\
448 executable image files\n"));
449 fprintf (file, _(" --disable-long-section-names Never use long COFF section names, even\n\
450 in object files\n"));
451 fprintf (file, _(" --high-entropy-va Image is compatible with 64-bit address space\n\
452 layout randomization (ASLR)\n"));
453 fprintf (file, _(" --dynamicbase Image base address may be relocated using\n\
454 address space layout randomization (ASLR)\n"));
455 fprintf (file, _(" --forceinteg Code integrity checks are enforced\n"));
456 fprintf (file, _(" --nxcompat Image is compatible with data execution prevention\n"));
457 fprintf (file, _(" --no-isolation Image understands isolation but do not isolate the image\n"));
458 fprintf (file, _(" --no-seh Image does not use SEH. No SE handler may\n\
459 be called in this image\n"));
460 fprintf (file, _(" --no-bind Do not bind this image\n"));
461 fprintf (file, _(" --wdmdriver Driver uses the WDM model\n"));
462 fprintf (file, _(" --tsaware Image is Terminal Server aware\n"));
463 fprintf (file, _(" --build-id[=STYLE] Generate build ID\n"));
469 set_pep_name (char *name, bfd_vma val)
473 /* Find the name and set it. */
474 for (i = 0; init[i].ptr; i++)
476 if (strcmp (name, GET_INIT_SYMBOL_NAME (i)) == 0)
480 if (strcmp (name,"__image_base__") == 0)
481 set_pep_name (U ("__ImageBase"), val);
489 set_entry_point (void)
492 const char *initial_symbol_char;
502 { 1, "NtProcessStartup" },
503 { 2, "WinMainCRTStartup" },
504 { 3, "mainCRTStartup" },
505 { 7, "__PosixProcessStartup" },
506 { 9, "WinMainCRTStartup" },
507 {14, "mainCRTStartup" },
511 /* Entry point name for arbitrary subsystem numbers. */
512 static const char default_entry[] = "mainCRTStartup";
514 if (bfd_link_pic (&link_info) || dll)
516 entry = "DllMainCRTStartup";
520 for (i = 0; v[i].entry; i++)
521 if (v[i].value == pep_subsystem)
524 /* If no match, use the default. */
525 if (v[i].entry != NULL)
528 entry = default_entry;
531 /* Now we check target's default for getting proper symbol_char. */
532 initial_symbol_char = (is_underscoring () != 0 ? "_" : "");
534 if (*initial_symbol_char != '\0')
538 /* lang_default_entry expects its argument to be permanently
539 allocated, so we don't free this string. */
540 alc_entry = xmalloc (strlen (initial_symbol_char)
543 strcpy (alc_entry, initial_symbol_char);
544 strcat (alc_entry, entry);
548 lang_default_entry (entry);
552 set_pep_subsystem (void)
558 unsigned long temp_subsystem;
575 /* Check for the presence of a version number. */
576 sver = strchr (optarg, ':');
578 len = strlen (optarg);
582 set_pep_name ("__major_subsystem_version__",
583 strtoul (sver + 1, &end, 0));
585 set_pep_name ("__minor_subsystem_version__",
586 strtoul (end + 1, &end, 0));
588 einfo (_("%P: warning: bad version number in -subsystem option\n"));
591 /* Check for numeric subsystem. */
592 temp_subsystem = strtoul (optarg, & end, 0);
593 if ((*end == ':' || *end == '\0') && (temp_subsystem < 65536))
595 /* Search list for a numeric match to use its entry point. */
596 for (i = 0; v[i].name; i++)
597 if (v[i].value == (int) temp_subsystem)
600 /* Use this subsystem. */
601 pep_subsystem = (int) temp_subsystem;
605 /* Search for subsystem by name. */
606 for (i = 0; v[i].name; i++)
607 if (strncmp (optarg, v[i].name, len) == 0
608 && v[i].name[len] == '\0')
611 if (v[i].name == NULL)
613 einfo (_("%P%F: invalid subsystem type %s\n"), optarg);
617 pep_subsystem = v[i].value;
620 set_pep_name ("__subsystem__", pep_subsystem);
627 set_pep_value (char *name)
631 set_pep_name (name, (bfd_vma) strtoull (optarg, &end, 0));
634 einfo (_("%P%F: invalid hex number for PE parameter '%s'\n"), optarg);
641 set_pep_stack_heap (char *resname, char *comname)
643 set_pep_value (resname);
648 set_pep_value (comname);
651 einfo (_("%P%F: strange hex info for PE parameter '%s'\n"), optarg);
654 #define DEFAULT_BUILD_ID_STYLE "md5"
657 gld${EMULATION_NAME}_handle_option (int optc)
665 case OPTION_BASE_FILE:
666 link_info.base_file = fopen (optarg, FOPEN_WB);
667 if (link_info.base_file == NULL)
668 einfo (_("%F%P: cannot open base file %s\n"), optarg);
673 set_pep_stack_heap ("__size_of_heap_reserve__", "__size_of_heap_commit__");
676 set_pep_stack_heap ("__size_of_stack_reserve__", "__size_of_stack_commit__");
678 case OPTION_SUBSYSTEM:
679 set_pep_subsystem ();
681 case OPTION_MAJOR_OS_VERSION:
682 set_pep_value ("__major_os_version__");
684 case OPTION_MINOR_OS_VERSION:
685 set_pep_value ("__minor_os_version__");
687 case OPTION_MAJOR_SUBSYSTEM_VERSION:
688 set_pep_value ("__major_subsystem_version__");
690 case OPTION_MINOR_SUBSYSTEM_VERSION:
691 set_pep_value ("__minor_subsystem_version__");
693 case OPTION_MAJOR_IMAGE_VERSION:
694 set_pep_value ("__major_image_version__");
696 case OPTION_MINOR_IMAGE_VERSION:
697 set_pep_value ("__minor_image_version__");
699 case OPTION_FILE_ALIGNMENT:
700 set_pep_value ("__file_alignment__");
702 case OPTION_SECTION_ALIGNMENT:
703 set_pep_value ("__section_alignment__");
706 set_pep_name ("__dll__", 1);
708 case OPTION_IMAGE_BASE:
709 set_pep_value ("__image_base__");
711 case OPTION_SUPPORT_OLD_CODE:
712 support_old_code = 1;
714 case OPTION_USE_NUL_PREFIXED_IMPORT_TABLES:
715 pep_use_nul_prefixed_import_tables = TRUE;
717 case OPTION_NO_LEADING_UNDERSCORE:
718 pep_leading_underscore = 0;
720 case OPTION_LEADING_UNDERSCORE:
721 pep_leading_underscore = 1;
723 case OPTION_INSERT_TIMESTAMP:
724 insert_timestamp = TRUE;
726 case OPTION_NO_INSERT_TIMESTAMP:
727 insert_timestamp = FALSE;
731 pep_out_def_filename = xstrdup (optarg);
733 case OPTION_EXPORT_ALL:
734 pep_dll_export_everything = 1;
736 case OPTION_EXCLUDE_SYMBOLS:
737 pep_dll_add_excludes (optarg, EXCLUDESYMS);
739 case OPTION_EXCLUDE_ALL_SYMBOLS:
740 pep_dll_exclude_all_symbols = 1;
742 case OPTION_EXCLUDE_LIBS:
743 pep_dll_add_excludes (optarg, EXCLUDELIBS);
745 case OPTION_EXCLUDE_MODULES_FOR_IMPLIB:
746 pep_dll_add_excludes (optarg, EXCLUDEFORIMPLIB);
748 case OPTION_KILL_ATS:
749 pep_dll_kill_ats = 1;
751 case OPTION_STDCALL_ALIASES:
752 pep_dll_stdcall_aliases = 1;
754 case OPTION_ENABLE_STDCALL_FIXUP:
755 pep_enable_stdcall_fixup = 1;
757 case OPTION_DISABLE_STDCALL_FIXUP:
758 pep_enable_stdcall_fixup = 0;
760 case OPTION_WARN_DUPLICATE_EXPORTS:
761 pep_dll_warn_dup_exports = 1;
763 case OPTION_IMP_COMPAT:
764 pep_dll_compat_implib = 1;
766 case OPTION_ENABLE_AUTO_IMAGE_BASE:
767 pep_enable_auto_image_base = 1;
769 case OPTION_DISABLE_AUTO_IMAGE_BASE:
770 pep_enable_auto_image_base = 0;
772 case OPTION_DLL_SEARCH_PREFIX:
773 pep_dll_search_prefix = xstrdup (optarg);
775 case OPTION_NO_DEFAULT_EXCLUDES:
776 pep_dll_do_default_excludes = 0;
778 case OPTION_DLL_ENABLE_AUTO_IMPORT:
779 link_info.pei386_auto_import = 1;
781 case OPTION_DLL_DISABLE_AUTO_IMPORT:
782 link_info.pei386_auto_import = 0;
784 case OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC:
785 link_info.pei386_runtime_pseudo_reloc = 2;
787 case OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC:
788 link_info.pei386_runtime_pseudo_reloc = 0;
790 case OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2:
791 link_info.pei386_runtime_pseudo_reloc = 2;
793 case OPTION_ENABLE_EXTRA_PE_DEBUG:
794 pep_dll_extra_pe_debug = 1;
797 case OPTION_ENABLE_LONG_SECTION_NAMES:
798 pep_use_coff_long_section_names = 1;
800 case OPTION_DISABLE_LONG_SECTION_NAMES:
801 pep_use_coff_long_section_names = 0;
803 /* Get DLLCharacteristics bits */
804 case OPTION_HIGH_ENTROPY_VA:
805 pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA;
807 case OPTION_DYNAMIC_BASE:
808 pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE;
810 case OPTION_FORCE_INTEGRITY:
811 pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY;
813 case OPTION_NX_COMPAT:
814 pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_NX_COMPAT;
816 case OPTION_NO_ISOLATION:
817 pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_NO_ISOLATION;
820 pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_NO_SEH;
823 pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_NO_BIND;
825 case OPTION_WDM_DRIVER:
826 pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_WDM_DRIVER;
828 case OPTION_TERMINAL_SERVER_AWARE:
829 pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE;
831 case OPTION_BUILD_ID:
832 if (emit_build_id != NULL)
834 free ((char *) emit_build_id);
835 emit_build_id = NULL;
838 optarg = DEFAULT_BUILD_ID_STYLE;
839 if (strcmp (optarg, "none"))
840 emit_build_id = xstrdup (optarg);
844 /* Set DLLCharacteristics bits */
845 set_pep_name ("__dll_characteristics__", pe_dll_characteristics);
853 strhash (const char *str)
855 const unsigned char *s;
862 s = (const unsigned char *) str;
863 while ((c = *s++) != '\0')
865 hash += c + (c << 17);
869 hash += len + (len << 17);
875 /* Use the output file to create a image base for relocatable DLLs. */
878 compute_dll_image_base (const char *ofile)
880 bfd_vma hash = (bfd_vma) strhash (ofile);
881 return NT_DLL_AUTO_IMAGE_BASE + ((hash << 16) & NT_DLL_AUTO_IMAGE_MASK);
885 /* Assign values to the special symbols before the linker script is
889 gld_${EMULATION_NAME}_set_symbols (void)
891 /* Run through and invent symbols for all the
892 names and insert the defaults. */
897 if (!init[IMAGEBASEOFF].inited)
899 if (bfd_link_relocatable (&link_info))
900 init[IMAGEBASEOFF].value = 0;
901 else if (init[DLLOFF].value || bfd_link_dll (&link_info))
904 init[IMAGEBASEOFF].value = (pep_enable_auto_image_base
905 ? compute_dll_image_base (output_filename)
906 : NT_DLL_IMAGE_BASE);
908 init[IMAGEBASEOFF].value = NT_DLL_IMAGE_BASE;
912 init[IMAGEBASEOFF].value = NT_EXE_IMAGE_BASE;
913 init[MSIMAGEBASEOFF].value = init[IMAGEBASEOFF].value;
916 /* Don't do any symbol assignments if this is a relocatable link. */
917 if (bfd_link_relocatable (&link_info))
920 /* Glue the assignments into the abs section. */
921 push_stat_ptr (&abs_output_section->children);
923 for (j = 0; init[j].ptr; j++)
925 bfd_vma val = init[j].value;
926 lang_assignment_statement_type *rv;
928 rv = lang_add_assignment (exp_assign (GET_INIT_SYMBOL_NAME (j),
929 exp_intop (val), FALSE));
930 if (init[j].size == sizeof (short))
931 *(short *) init[j].ptr = (short) val;
932 else if (init[j].size == sizeof (int))
933 *(int *) init[j].ptr = (int) val;
934 else if (init[j].size == sizeof (long))
935 *(long *) init[j].ptr = (long) val;
936 /* This might be a long long or other special type. */
937 else if (init[j].size == sizeof (bfd_vma))
938 *(bfd_vma *) init[j].ptr = val;
940 if (j == IMAGEBASEOFF)
941 image_base_statement = rv;
943 /* Restore the pointer. */
946 if (pep.FileAlignment > pep.SectionAlignment)
948 einfo (_("%P: warning, file alignment > section alignment.\n"));
952 /* This is called after the linker script and the command line options
956 gld_${EMULATION_NAME}_after_parse (void)
958 /* PR ld/6744: Warn the user if they have used an ELF-only
959 option hoping it will work on PE+. */
960 if (link_info.export_dynamic)
961 einfo (_("%P: warning: --export-dynamic is not supported for PE+ "
962 "targets, did you mean --export-all-symbols?\n"));
966 after_parse_default ();
969 /* pep-dll.c directly accesses pep_data_import_dll,
970 so it must be defined outside of #ifdef DLL_SUPPORT.
971 Note - this variable is deliberately not initialised.
972 This allows it to be treated as a common varaible, and only
973 exist in one incarnation in a multiple target enabled linker. */
974 char * pep_data_import_dll;
977 static struct bfd_link_hash_entry *pep_undef_found_sym;
980 pep_undef_cdecl_match (struct bfd_link_hash_entry *h, void *inf)
984 const char *hs = h->root.string;
986 sl = strlen (string);
987 if (h->type == bfd_link_hash_defined
988 && ((*hs == '@' && *string == '_'
989 && strncmp (hs + 1, string + 1, sl - 1) == 0)
990 || strncmp (hs, string, sl) == 0)
991 && h->root.string[sl] == '@')
993 pep_undef_found_sym = h;
1000 pep_fixup_stdcalls (void)
1002 static int gave_warning_message = 0;
1003 struct bfd_link_hash_entry *undef, *sym;
1005 if (pep_dll_extra_pe_debug)
1006 printf ("%s\n", __FUNCTION__);
1008 for (undef = link_info.hash->undefs; undef; undef=undef->u.undef.next)
1009 if (undef->type == bfd_link_hash_undefined)
1011 char* at = strchr (undef->root.string, '@');
1012 int lead_at = (*undef->root.string == '@');
1014 at = strchr (undef->root.string + 1, '@');
1017 /* The symbol is a stdcall symbol, so let's look for a
1018 cdecl symbol with the same name and resolve to that. */
1019 char *cname = xstrdup (undef->root.string);
1023 at = strchr (cname, '@');
1026 sym = bfd_link_hash_lookup (link_info.hash, cname, 0, 0, 1);
1028 if (sym && sym->type == bfd_link_hash_defined)
1030 undef->type = bfd_link_hash_defined;
1031 undef->u.def.value = sym->u.def.value;
1032 undef->u.def.section = sym->u.def.section;
1034 if (pep_enable_stdcall_fixup == -1)
1036 einfo (_("Warning: resolving %s by linking to %s\n"),
1037 undef->root.string, cname);
1038 if (! gave_warning_message)
1040 gave_warning_message = 1;
1041 einfo (_("Use --enable-stdcall-fixup to disable these warnings\n"));
1042 einfo (_("Use --disable-stdcall-fixup to disable these fixups\n"));
1049 /* The symbol is a cdecl symbol, so we look for stdcall
1050 symbols - which means scanning the whole symbol table. */
1051 pep_undef_found_sym = 0;
1052 bfd_link_hash_traverse (link_info.hash, pep_undef_cdecl_match,
1053 (char *) undef->root.string);
1054 sym = pep_undef_found_sym;
1057 undef->type = bfd_link_hash_defined;
1058 undef->u.def.value = sym->u.def.value;
1059 undef->u.def.section = sym->u.def.section;
1061 if (pep_enable_stdcall_fixup == -1)
1063 einfo (_("Warning: resolving %s by linking to %s\n"),
1064 undef->root.string, sym->root.string);
1065 if (! gave_warning_message)
1067 gave_warning_message = 1;
1068 einfo (_("Use --enable-stdcall-fixup to disable these warnings\n"));
1069 einfo (_("Use --disable-stdcall-fixup to disable these fixups\n"));
1078 make_import_fixup (arelent *rel, asection *s, char *name)
1080 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
1082 bfd_vma _addend = 0;
1085 if (pep_dll_extra_pe_debug)
1086 printf ("arelent: %s@%#lx: add=%li\n", sym->name,
1087 (unsigned long) rel->address, (long) rel->addend);
1089 memset (addend, 0, sizeof (addend));
1090 switch ((rel->howto->bitsize))
1093 suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 1);
1094 if (suc && rel->howto->pc_relative)
1095 _addend = bfd_get_signed_8 (s->owner, addend);
1097 _addend = bfd_get_8 (s->owner, addend);
1100 suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 2);
1101 if (suc && rel->howto->pc_relative)
1102 _addend = bfd_get_signed_16 (s->owner, addend);
1104 _addend = bfd_get_16 (s->owner, addend);
1107 suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 4);
1108 if (suc && rel->howto->pc_relative)
1109 _addend = bfd_get_signed_32 (s->owner, addend);
1111 _addend = bfd_get_32 (s->owner, addend);
1114 suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 8);
1116 _addend = bfd_get_64 (s->owner, addend);
1120 einfo (_("%C: Cannot get section contents - auto-import exception\n"),
1121 s->owner, s, rel->address);
1123 if (pep_dll_extra_pe_debug)
1125 printf ("import of 0x%lx(0x%lx) sec_addr=0x%lx",
1126 (long) _addend, (long) rel->addend, (long) rel->address);
1127 if (rel->howto->pc_relative)
1129 printf (" %d bit rel.\n", (int) rel->howto->bitsize);
1131 pep_create_import_fixup (rel, s, _addend, name);
1137 pep_find_data_imports (void)
1139 struct bfd_link_hash_entry *undef, *sym;
1143 if (link_info.pei386_auto_import == 0)
1147 for (undef = link_info.hash->undefs; undef; undef = undef->u.undef.next)
1149 if (undef->type == bfd_link_hash_undefined)
1151 size_t len = strlen (undef->root.string);
1159 /* We are being a bit cunning here. The buffer will have space for
1160 prefixes at the beginning. The prefix is modified here and in a
1161 number of functions called from this function. */
1162 #define PREFIX_LEN 32
1163 buf = xmalloc (PREFIX_LEN + namelen + 1);
1164 name = buf + PREFIX_LEN;
1166 for (undef = link_info.hash->undefs; undef; undef = undef->u.undef.next)
1168 if (undef->type == bfd_link_hash_undefined)
1172 if (pep_dll_extra_pe_debug)
1173 printf ("%s:%s\n", __FUNCTION__, undef->root.string);
1175 strcpy (name, undef->root.string);
1176 impname = name - (sizeof "__imp_" - 1);
1177 memcpy (impname, "__imp_", sizeof "__imp_" - 1);
1179 sym = bfd_link_hash_lookup (link_info.hash, impname, 0, 0, 1);
1181 if (sym && sym->type == bfd_link_hash_defined)
1183 bfd *b = sym->u.def.section->owner;
1187 if (!bfd_generic_link_read_symbols (b))
1189 einfo (_("%B%F: could not read symbols: %E\n"), b);
1193 symbols = bfd_get_outsymbols (b);
1194 nsyms = bfd_get_symcount (b);
1196 for (i = 0; i < nsyms; i++)
1198 if (! CONST_STRNEQ (symbols[i]->name, U ("_head_")))
1201 if (pep_dll_extra_pe_debug)
1202 printf ("->%s\n", symbols[i]->name);
1204 pep_data_import_dll = (char *) (symbols[i]->name
1205 + U_SIZE ("_head_") - 1);
1209 pep_walk_relocs_of_symbol (&link_info, name, make_import_fixup);
1211 /* Let's differentiate it somehow from defined. */
1212 undef->type = bfd_link_hash_defweak;
1213 /* We replace original name with __imp_ prefixed, this
1214 1) may trash memory 2) leads to duplicate symbol generation.
1215 Still, IMHO it's better than having name polluted. */
1216 undef->root.string = sym->root.string;
1217 undef->u.def.value = sym->u.def.value;
1218 undef->u.def.section = sym->u.def.section;
1226 pr_sym (struct bfd_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
1228 printf ("+%s\n", h->string);
1232 #endif /* DLL_SUPPORT */
1235 debug_section_p (bfd *abfd ATTRIBUTE_UNUSED, asection *sect, void *obj)
1237 int *found = (int *) obj;
1239 if (strncmp (".debug_", sect->name, sizeof (".debug_") - 1) == 0)
1244 pecoff_checksum_contents (bfd *abfd,
1245 void (*process) (const void *, size_t, void *),
1248 file_ptr filepos = (file_ptr) 0;
1255 if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
1258 status = bfd_bread (&b, (bfd_size_type) 1, abfd);
1264 (*process) (&b, 1, arg);
1272 write_build_id (bfd *abfd)
1274 struct pe_tdata *t = pe_data (abfd);
1276 struct bfd_link_order *link_order = NULL;
1277 unsigned char *contents;
1279 bfd_size_type build_id_size;
1280 unsigned char *build_id;
1282 /* Find the section the .buildid output section has been merged info. */
1283 for (asec = abfd->sections; asec != NULL; asec = asec->next)
1285 struct bfd_link_order *l = NULL;
1286 for (l = asec->map_head.link_order; l != NULL; l = l->next)
1288 if (l->type == bfd_indirect_link_order)
1290 if (l->u.indirect.section == t->build_id.sec)
1304 einfo (_("%P: warning: .buildid section discarded,"
1305 " --build-id ignored.\n"));
1309 if (t->build_id.sec->contents == NULL)
1310 t->build_id.sec->contents = (unsigned char *) xmalloc (t->build_id.sec->size);
1311 contents = t->build_id.sec->contents;
1312 size = t->build_id.sec->size;
1314 build_id_size = compute_build_id_size (t->build_id.style);
1315 build_id = xmalloc (build_id_size);
1316 generate_build_id (abfd, t->build_id.style, pecoff_checksum_contents, build_id, build_id_size);
1318 bfd_vma ib = pe_data (link_info.output_bfd)->pe_opthdr.ImageBase;
1320 /* Construct a debug directory entry which points to an immediately following CodeView record. */
1321 struct internal_IMAGE_DEBUG_DIRECTORY idd;
1322 idd.Characteristics = 0;
1323 idd.TimeDateStamp = 0;
1324 idd.MajorVersion = 0;
1325 idd.MinorVersion = 0;
1326 idd.Type = PE_IMAGE_DEBUG_TYPE_CODEVIEW;
1327 idd.SizeOfData = sizeof (CV_INFO_PDB70) + 1;
1328 idd.AddressOfRawData = asec->vma - ib + link_order->offset
1329 + sizeof (struct external_IMAGE_DEBUG_DIRECTORY);
1330 idd.PointerToRawData = asec->filepos + link_order->offset
1331 + sizeof (struct external_IMAGE_DEBUG_DIRECTORY);
1333 struct external_IMAGE_DEBUG_DIRECTORY *ext = (struct external_IMAGE_DEBUG_DIRECTORY *)contents;
1334 _bfd_XXi_swap_debugdir_out (abfd, &idd, ext);
1336 /* Write the debug directory enttry */
1337 if (bfd_seek (abfd, asec->filepos + link_order->offset, SEEK_SET) != 0)
1340 if (bfd_bwrite (contents, size, abfd) != size)
1343 /* Construct the CodeView record. */
1344 CODEVIEW_INFO cvinfo;
1345 cvinfo.CVSignature = CVINFO_PDB70_CVSIGNATURE;
1348 /* Zero pad or truncate the generated build_id to fit in the CodeView record. */
1349 memset (&(cvinfo.Signature), 0, CV_INFO_SIGNATURE_LENGTH);
1350 memcpy (&(cvinfo.Signature), build_id, (build_id_size > CV_INFO_SIGNATURE_LENGTH)
1351 ? CV_INFO_SIGNATURE_LENGTH : build_id_size);
1355 /* Write the codeview record. */
1356 if (_bfd_XXi_write_codeview_record (abfd, idd.PointerToRawData, &cvinfo) == 0)
1359 /* Record the location of the debug directory in the data directory. */
1360 pe_data (link_info.output_bfd)->pe_opthdr.DataDirectory[PE_DEBUG_DATA].VirtualAddress
1361 = asec->vma - ib + link_order->offset;
1362 pe_data (link_info.output_bfd)->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size
1363 = sizeof (struct external_IMAGE_DEBUG_DIRECTORY);
1368 /* Make .buildid section, and set up coff_tdata->build_id. */
1370 setup_build_id (bfd *ibfd)
1375 if (!validate_build_id_style (emit_build_id))
1377 einfo ("%P: warning: unrecognized --build-id style ignored.\n");
1381 flags = (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_IN_MEMORY
1382 | SEC_LINKER_CREATED | SEC_READONLY | SEC_DATA);
1383 s = bfd_make_section_anyway_with_flags (ibfd, ".buildid", flags);
1386 struct pe_tdata *t = pe_data (link_info.output_bfd);
1387 t->build_id.after_write_object_contents = &write_build_id;
1388 t->build_id.style = emit_build_id;
1389 t->build_id.sec = s;
1391 /* Section is a fixed size:
1392 One IMAGE_DEBUG_DIRECTORY entry, of type IMAGE_DEBUG_TYPE_CODEVIEW,
1393 pointing at a CV_INFO_PDB70 record containing the build-id, with a
1394 null byte for PdbFileName. */
1395 s->size = sizeof (struct external_IMAGE_DEBUG_DIRECTORY)
1396 + sizeof (CV_INFO_PDB70) + 1;
1401 einfo ("%P: warning: Cannot create .buildid section,"
1402 " --build-id ignored.\n");
1407 gld_${EMULATION_NAME}_after_open (void)
1409 after_open_default ();
1413 if (pep_dll_extra_pe_debug)
1416 struct bfd_link_hash_entry *sym;
1418 printf ("%s()\n", __FUNCTION__);
1420 for (sym = link_info.hash->undefs; sym; sym=sym->u.undef.next)
1421 printf ("-%s\n", sym->root.string);
1422 bfd_hash_traverse (&link_info.hash->table, pr_sym, NULL);
1424 for (a = link_info.input_bfds; a; a = a->link.next)
1425 printf ("*%s\n",a->filename);
1429 if (emit_build_id != NULL)
1433 /* Find a COFF input. */
1434 for (abfd = link_info.input_bfds;
1435 abfd != (bfd *) NULL; abfd = abfd->link.next)
1436 if (bfd_get_flavour (abfd) == bfd_target_coff_flavour)
1439 /* If there are no COFF input files do not try to
1440 add a build-id section. */
1442 || !setup_build_id (abfd))
1444 free ((char *) emit_build_id);
1445 emit_build_id = NULL;
1449 /* Pass the wacky PE command line options into the output bfd.
1450 FIXME: This should be done via a function, rather than by
1451 including an internal BFD header. */
1453 if (coff_data (link_info.output_bfd) == NULL
1454 || coff_data (link_info.output_bfd)->pe == 0)
1455 einfo (_("%F%P: cannot perform PE operations on non PE output file '%B'.\n"),
1456 link_info.output_bfd);
1458 pe_data (link_info.output_bfd)->pe_opthdr = pep;
1459 pe_data (link_info.output_bfd)->dll = init[DLLOFF].value;
1460 pe_data (link_info.output_bfd)->real_flags |= real_flags;
1461 pe_data (link_info.output_bfd)->insert_timestamp = insert_timestamp;
1463 /* At this point we must decide whether to use long section names
1464 in the output or not. If the user hasn't explicitly specified
1465 on the command line, we leave it to the default for the format
1466 (object files yes, image files no), except if there is debug
1467 information present; GDB relies on the long section names to
1468 find it, so enable it in that case. */
1469 if (pep_use_coff_long_section_names < 0 && link_info.strip == strip_none)
1471 if (bfd_link_relocatable (&link_info))
1472 pep_use_coff_long_section_names = 1;
1475 /* Iterate over all sections of all input BFDs, checking
1476 for any that begin 'debug_' and are long names. */
1477 LANG_FOR_EACH_INPUT_STATEMENT (is)
1479 int found_debug = 0;
1481 bfd_map_over_sections (is->the_bfd, debug_section_p, &found_debug);
1484 pep_use_coff_long_section_names = 1;
1491 pep_output_file_set_long_section_names (link_info.output_bfd);
1494 if (pep_enable_stdcall_fixup) /* -1=warn or 1=disable */
1495 pep_fixup_stdcalls ();
1497 pep_process_import_defs (link_info.output_bfd, &link_info);
1499 pep_find_data_imports ();
1501 /* As possibly new symbols are added by imports, we rerun
1502 stdcall/fastcall fixup here. */
1503 if (pep_enable_stdcall_fixup) /* -1=warn or 1=disable */
1504 pep_fixup_stdcalls ();
1506 #ifndef TARGET_IS_i386pep
1507 if (bfd_link_pic (&link_info))
1509 if (!bfd_link_relocatable (&link_info))
1511 pep_dll_build_sections (link_info.output_bfd, &link_info);
1513 #ifndef TARGET_IS_i386pep
1515 pep_exe_build_sections (link_info.output_bfd, &link_info);
1517 #endif /* DLL_SUPPORT */
1520 /* This next chunk of code tries to detect the case where you have
1521 two import libraries for the same DLL (specifically,
1522 symbolically linking libm.a and libc.a in cygwin to
1523 libcygwin.a). In those cases, it's possible for function
1524 thunks from the second implib to be used but without the
1525 head/tail objects, causing an improper import table. We detect
1526 those cases and rename the "other" import libraries to match
1527 the one the head/tail come from, so that the linker will sort
1528 things nicely and produce a valid import table. */
1530 LANG_FOR_EACH_INPUT_STATEMENT (is)
1532 if (is->the_bfd->my_archive)
1534 int idata2 = 0, reloc_count=0, is_imp = 0;
1537 /* See if this is an import library thunk. */
1538 for (sec = is->the_bfd->sections; sec; sec = sec->next)
1540 if (strcmp (sec->name, ".idata\$2") == 0)
1542 if (CONST_STRNEQ (sec->name, ".idata\$"))
1544 reloc_count += sec->reloc_count;
1547 if (is_imp && !idata2 && reloc_count)
1549 /* It is, look for the reference to head and see if it's
1550 from our own library. */
1551 for (sec = is->the_bfd->sections; sec; sec = sec->next)
1559 relsize = bfd_get_reloc_upper_bound (is->the_bfd, sec);
1563 if (!bfd_generic_link_read_symbols (is->the_bfd))
1565 einfo (_("%B%F: could not read symbols: %E\n"),
1569 symbols = bfd_get_outsymbols (is->the_bfd);
1571 relocs = xmalloc ((size_t) relsize);
1572 nrelocs = bfd_canonicalize_reloc (is->the_bfd, sec,
1577 einfo ("%X%P: unable to process relocs: %E\n");
1581 for (i = 0; i < nrelocs; i++)
1583 struct bfd_symbol *s;
1584 struct bfd_link_hash_entry * blhe;
1585 char *other_bfd_filename;
1588 s = (relocs[i]->sym_ptr_ptr)[0];
1590 if (s->flags & BSF_LOCAL)
1593 /* Thunk section with reloc to another bfd. */
1594 blhe = bfd_link_hash_lookup (link_info.hash,
1596 FALSE, FALSE, TRUE);
1599 || blhe->type != bfd_link_hash_defined)
1603 = blhe->u.def.section->owner->my_archive
1604 ? bfd_get_filename (blhe->u.def.section->owner->my_archive)
1605 : bfd_get_filename (blhe->u.def.section->owner);
1607 if (filename_cmp (bfd_get_filename
1608 (is->the_bfd->my_archive),
1609 other_bfd_filename) == 0)
1612 /* Rename this implib to match the other one. */
1613 n = xmalloc (strlen (other_bfd_filename) + 1);
1614 strcpy (n, other_bfd_filename);
1615 is->the_bfd->my_archive->filename = n;
1619 /* Note - we do not free the symbols,
1620 they are now cached in the BFD. */
1630 lang_input_statement_type *is2;
1631 lang_input_statement_type *is3;
1633 /* Careful - this is a shell script. Watch those dollar signs! */
1634 /* Microsoft import libraries have every member named the same,
1635 and not in the right order for us to link them correctly. We
1636 must detect these and rename the members so that they'll link
1637 correctly. There are three types of objects: the head, the
1638 thunks, and the sentinel(s). The head is easy; it's the one
1639 with idata2. We assume that the sentinels won't have relocs,
1640 and the thunks will. It's easier than checking the symbol
1641 table for external references. */
1642 LANG_FOR_EACH_INPUT_STATEMENT (is)
1644 if (is->the_bfd->my_archive)
1647 bfd *arch = is->the_bfd->my_archive;
1649 if (cur_arch != arch)
1655 is3 && is3->the_bfd->my_archive == arch;
1656 is3 = (lang_input_statement_type *) is3->next)
1658 /* A MS dynamic import library can also contain static
1659 members, so look for the first element with a .dll
1660 extension, and use that for the remainder of the
1662 pnt = strrchr (is3->the_bfd->filename, '.');
1663 if (pnt != NULL && filename_cmp (pnt, ".dll") == 0)
1671 /* OK, found one. Now look to see if the remaining
1672 (dynamic import) members use the same name. */
1674 is2 && is2->the_bfd->my_archive == arch;
1675 is2 = (lang_input_statement_type *) is2->next)
1677 /* Skip static members, ie anything with a .obj
1679 pnt = strrchr (is2->the_bfd->filename, '.');
1680 if (pnt != NULL && filename_cmp (pnt, ".obj") == 0)
1683 if (filename_cmp (is3->the_bfd->filename,
1684 is2->the_bfd->filename))
1693 /* This fragment might have come from an .obj file in a Microsoft
1694 import, and not an actual import record. If this is the case,
1695 then leave the filename alone. */
1696 pnt = strrchr (is->the_bfd->filename, '.');
1698 if (is_ms_arch && (filename_cmp (pnt, ".dll") == 0))
1700 int idata2 = 0, reloc_count=0;
1702 char *new_name, seq;
1704 for (sec = is->the_bfd->sections; sec; sec = sec->next)
1706 if (strcmp (sec->name, ".idata\$2") == 0)
1708 reloc_count += sec->reloc_count;
1711 if (idata2) /* .idata2 is the TOC */
1713 else if (reloc_count > 0) /* thunks */
1718 new_name = xmalloc (strlen (is->the_bfd->filename) + 3);
1719 sprintf (new_name, "%s.%c", is->the_bfd->filename, seq);
1720 is->the_bfd->filename = new_name;
1722 new_name = xmalloc (strlen (is->filename) + 3);
1723 sprintf (new_name, "%s.%c", is->filename, seq);
1724 is->filename = new_name;
1732 gld_${EMULATION_NAME}_before_allocation (void)
1735 before_allocation_default ();
1739 /* This is called when an input file isn't recognized as a BFD. We
1740 check here for .DEF files and pull them in automatically. */
1743 saw_option (char *option)
1749 for (i = 0; init[i].ptr; i++)
1750 if (strcmp (GET_INIT_SYMBOL_NAME (i), option) == 0)
1751 return init[i].inited;
1754 #endif /* DLL_SUPPORT */
1757 gld_${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry ATTRIBUTE_UNUSED)
1760 const char *ext = entry->filename + strlen (entry->filename) - 4;
1762 if (filename_cmp (ext, ".def") == 0 || filename_cmp (ext, ".DEF") == 0)
1764 pep_def_file = def_file_parse (entry->filename, pep_def_file);
1768 int i, buflen=0, len;
1771 for (i = 0; i < pep_def_file->num_exports; i++)
1773 len = strlen (pep_def_file->exports[i].internal_name);
1774 if (buflen < len + 2)
1778 buf = xmalloc (buflen);
1780 for (i = 0; i < pep_def_file->num_exports; i++)
1782 struct bfd_link_hash_entry *h;
1784 sprintf (buf, "%s%s", U (""),
1785 pep_def_file->exports[i].internal_name);
1787 h = bfd_link_hash_lookup (link_info.hash, buf, TRUE, TRUE, TRUE);
1788 if (h == (struct bfd_link_hash_entry *) NULL)
1789 einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
1790 if (h->type == bfd_link_hash_new)
1792 h->type = bfd_link_hash_undefined;
1793 h->u.undef.abfd = NULL;
1794 bfd_link_add_undef (link_info.hash, h);
1799 /* def_file_print (stdout, pep_def_file); */
1800 if (pep_def_file->is_dll == 1)
1801 link_info.type = type_dll;
1803 if (pep_def_file->base_address != (bfd_vma)(-1))
1806 = pe_data (link_info.output_bfd)->pe_opthdr.ImageBase
1807 = init[IMAGEBASEOFF].value
1808 = pep_def_file->base_address;
1809 init[IMAGEBASEOFF].inited = 1;
1810 if (image_base_statement)
1811 image_base_statement->exp
1812 = exp_assign ("__image_base__", exp_intop (pep.ImageBase),
1816 if (pep_def_file->stack_reserve != -1
1817 && ! saw_option ("__size_of_stack_reserve__"))
1819 pep.SizeOfStackReserve = pep_def_file->stack_reserve;
1820 if (pep_def_file->stack_commit != -1)
1821 pep.SizeOfStackCommit = pep_def_file->stack_commit;
1823 if (pep_def_file->heap_reserve != -1
1824 && ! saw_option ("__size_of_heap_reserve__"))
1826 pep.SizeOfHeapReserve = pep_def_file->heap_reserve;
1827 if (pep_def_file->heap_commit != -1)
1828 pep.SizeOfHeapCommit = pep_def_file->heap_commit;
1838 gld_${EMULATION_NAME}_recognized_file (lang_input_statement_type *entry ATTRIBUTE_UNUSED)
1842 #ifdef TARGET_IS_i386pep
1843 pep_dll_id_target ("pei-x86-64");
1845 if (pep_bfd_is_dll (entry->the_bfd))
1846 return pep_implied_import_dll (entry->filename);
1852 gld_${EMULATION_NAME}_finish (void)
1858 if (bfd_link_pic (&link_info)
1859 || (!bfd_link_relocatable (&link_info)
1860 && pep_def_file->num_exports != 0))
1862 pep_dll_fill_sections (link_info.output_bfd, &link_info);
1863 if (command_line.out_implib_filename)
1864 pep_dll_generate_implib (pep_def_file,
1865 command_line.out_implib_filename, &link_info);
1868 if (pep_out_def_filename)
1869 pep_dll_generate_def_file (pep_out_def_filename);
1870 #endif /* DLL_SUPPORT */
1872 /* I don't know where .idata gets set as code, but it shouldn't be. */
1874 asection *asec = bfd_get_section_by_name (link_info.output_bfd, ".idata");
1878 asec->flags &= ~SEC_CODE;
1879 asec->flags |= SEC_DATA;
1885 /* Place an orphan section.
1887 We use this to put sections in a reasonable place in the file, and
1888 to ensure that they are aligned as required.
1890 We handle grouped sections here as well. A section named .foo\$nn
1891 goes into the output section .foo. All grouped sections are sorted
1894 Grouped sections for the default sections are handled by the
1895 default linker script using wildcards, and are sorted by
1898 static lang_output_section_statement_type *
1899 gld_${EMULATION_NAME}_place_orphan (asection *s,
1900 const char *secname,
1903 const char *orig_secname = secname;
1904 char *dollar = NULL;
1905 lang_output_section_statement_type *os;
1906 lang_statement_list_type add_child;
1907 lang_output_section_statement_type *match_by_name = NULL;
1908 lang_statement_union_type **pl;
1910 /* Look through the script to see where to place this section. */
1911 if (!bfd_link_relocatable (&link_info)
1912 && (dollar = strchr (secname, '\$')) != NULL)
1914 size_t len = dollar - secname;
1915 char *newname = xmalloc (len + 1);
1916 memcpy (newname, secname, len);
1917 newname[len] = '\0';
1921 lang_list_init (&add_child);
1924 if (constraint == 0)
1925 for (os = lang_output_section_find (secname);
1927 os = next_matching_output_section_statement (os, 0))
1929 /* If we don't match an existing output section, tell
1930 lang_insert_orphan to create a new output section. */
1931 constraint = SPECIAL;
1933 if (os->bfd_section != NULL
1934 && (os->bfd_section->flags == 0
1935 || ((s->flags ^ os->bfd_section->flags)
1936 & (SEC_LOAD | SEC_ALLOC)) == 0))
1938 /* We already have an output section statement with this
1939 name, and its bfd section has compatible flags.
1940 If the section already exists but does not have any flags set,
1941 then it has been created by the linker, probably as a result of
1942 a --section-start command line switch. */
1943 lang_add_section (&add_child, s, NULL, os);
1947 /* Save unused output sections in case we can match them
1948 against orphans later. */
1949 if (os->bfd_section == NULL)
1953 /* If we didn't match an active output section, see if we matched an
1954 unused one and use that. */
1955 if (os == NULL && match_by_name)
1957 lang_add_section (&match_by_name->children, s, NULL, match_by_name);
1958 return match_by_name;
1963 static struct orphan_save hold[] =
1966 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1969 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1972 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1975 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1981 enum orphan_save_index
1989 static int orphan_init_done = 0;
1990 struct orphan_save *place;
1991 lang_output_section_statement_type *after;
1992 etree_type *address;
1996 if (!orphan_init_done)
1998 struct orphan_save *ho;
1999 for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
2000 if (ho->name != NULL)
2002 ho->os = lang_output_section_find (ho->name);
2003 if (ho->os != NULL && ho->os->flags == 0)
2004 ho->os->flags = ho->flags;
2006 orphan_init_done = 1;
2010 if (!bfd_link_relocatable (&link_info))
2013 while ((nexts = bfd_get_next_section_by_name (nexts->owner,
2015 if (nexts->output_section == NULL
2016 && (nexts->flags & SEC_EXCLUDE) == 0
2017 && ((nexts->flags ^ flags) & (SEC_LOAD | SEC_ALLOC)) == 0
2018 && (nexts->owner->flags & DYNAMIC) == 0
2019 && nexts->owner->usrdata != NULL
2020 && !(((lang_input_statement_type *) nexts->owner->usrdata)
2022 flags = (((flags ^ SEC_READONLY)
2023 | (nexts->flags ^ SEC_READONLY))
2027 /* Try to put the new output section in a reasonable place based
2028 on the section name and section flags. */
2031 if ((flags & SEC_ALLOC) == 0)
2033 else if ((flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
2034 place = &hold[orphan_bss];
2035 else if ((flags & SEC_READONLY) == 0)
2036 place = &hold[orphan_data];
2037 else if ((flags & SEC_CODE) == 0)
2039 place = (!strncmp (secname, ".idata\$", 7) ? &hold[orphan_idata]
2040 : &hold[orphan_rodata]);
2043 place = &hold[orphan_text];
2048 if (place->os == NULL)
2049 place->os = lang_output_section_find (place->name);
2052 after = lang_output_section_find_by_flags (s, flags, &place->os,
2055 /* *ABS* is always the first output section statement. */
2056 after = (&lang_output_section_statement.head
2057 ->output_section_statement);
2060 /* All sections in an executable must be aligned to a page boundary.
2061 In a relocatable link, just preserve the incoming alignment; the
2062 address is discarded by lang_insert_orphan in that case, anyway. */
2063 address = exp_unop (ALIGN_K, exp_nameop (NAME, "__section_alignment__"));
2064 os = lang_insert_orphan (s, secname, constraint, after, place, address,
2066 if (bfd_link_relocatable (&link_info))
2068 os->section_alignment = s->alignment_power;
2069 os->bfd_section->alignment_power = s->alignment_power;
2073 /* If the section name has a '\$', sort it with the other '\$'
2075 for (pl = &os->children.head; *pl != NULL; pl = &(*pl)->header.next)
2077 lang_input_section_type *ls;
2080 if ((*pl)->header.type != lang_input_section_enum)
2083 ls = &(*pl)->input_section;
2085 lname = bfd_get_section_name (ls->section->owner, ls->section);
2086 if (strchr (lname, '\$') != NULL
2087 && (dollar == NULL || strcmp (orig_secname, lname) < 0))
2091 if (add_child.head != NULL)
2093 *add_child.tail = *pl;
2094 *pl = add_child.head;
2101 gld_${EMULATION_NAME}_open_dynamic_archive
2102 (const char *arch ATTRIBUTE_UNUSED,
2103 search_dirs_type *search,
2104 lang_input_statement_type *entry)
2108 const char * format;
2109 bfd_boolean use_prefix;
2113 /* Preferred explicit import library for dll's. */
2114 { "lib%s.dll.a", FALSE },
2115 /* Alternate explicit import library for dll's. */
2116 { "%s.dll.a", FALSE },
2117 /* "libfoo.a" could be either an import lib or a static lib.
2118 For backwards compatibility, libfoo.a needs to precede
2119 libfoo.dll and foo.dll in the search. */
2120 { "lib%s.a", FALSE },
2121 /* The 'native' spelling of an import lib name is "foo.lib". */
2122 { "%s.lib", FALSE },
2124 /* Try "<prefix>foo.dll" (preferred dll name, if specified). */
2125 { "%s%s.dll", TRUE },
2127 /* Try "libfoo.dll" (default preferred dll name). */
2128 { "lib%s.dll", FALSE },
2129 /* Finally try 'native' dll name "foo.dll". */
2130 { "%s.dll", FALSE },
2131 /* Note: If adding more formats to this table, make sure to check to
2132 see if their length is longer than libname_fmt[0].format, and if
2133 so, update the call to xmalloc() below. */
2136 static unsigned int format_max_len = 0;
2137 const char * filename;
2143 if (! entry->flags.maybe_archive || entry->flags.full_name_provided)
2146 filename = entry->filename;
2148 if (format_max_len == 0)
2149 /* We need to allow space in the memory that we are going to allocate
2150 for the characters in the format string. Since the format array is
2151 static we only need to calculate this information once. In theory
2152 this value could also be computed statically, but this introduces
2153 the possibility for a discrepancy and hence a possible memory
2154 corruption. The lengths we compute here will be too long because
2155 they will include any formating characters (%s) in the strings, but
2156 this will not matter. */
2157 for (i = 0; libname_fmt[i].format; i++)
2158 if (format_max_len < strlen (libname_fmt[i].format))
2159 format_max_len = strlen (libname_fmt[i].format);
2161 full_string = xmalloc (strlen (search->name)
2165 + (pep_dll_search_prefix
2166 ? strlen (pep_dll_search_prefix) : 0)
2168 /* Allow for the terminating NUL and for the path
2169 separator character that is inserted between
2170 search->name and the start of the format string. */
2173 sprintf (full_string, "%s/", search->name);
2174 base_string = full_string + strlen (full_string);
2176 for (i = 0; libname_fmt[i].format; i++)
2179 if (libname_fmt[i].use_prefix)
2181 if (!pep_dll_search_prefix)
2183 sprintf (base_string, libname_fmt[i].format, pep_dll_search_prefix, filename);
2187 sprintf (base_string, libname_fmt[i].format, filename);
2189 if (ldfile_try_open_bfd (full_string, entry))
2193 if (!libname_fmt[i].format)
2199 entry->filename = full_string;
2205 gld_${EMULATION_NAME}_find_potential_libraries
2206 (char *name, lang_input_statement_type *entry)
2208 return ldfile_open_file_search (name, entry, "", ".lib");
2212 gld_${EMULATION_NAME}_get_script (int *isfile)
2214 # Scripts compiled in.
2215 # sed commands to quote an ld script as a C string.
2216 sc="-f stringify.sed"
2222 if (bfd_link_relocatable (&link_info) && config.build_constructors)
2225 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
2226 echo ' ; else if (bfd_link_relocatable (&link_info)) return' >> e${EMULATION_NAME}.c
2227 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
2228 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
2229 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
2230 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
2231 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
2232 if test -n "$GENERATE_AUTO_IMPORT_SCRIPT" ; then
2233 echo ' ; else if (link_info.pei386_auto_import == 1 && link_info.pei386_runtime_pseudo_reloc != 2) return' >> e${EMULATION_NAME}.c
2234 sed $sc ldscripts/${EMULATION_NAME}.xa >> e${EMULATION_NAME}.c
2236 echo ' ; else return' >> e${EMULATION_NAME}.c
2237 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
2238 echo '; }' >> e${EMULATION_NAME}.c
2243 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
2245 gld_${EMULATION_NAME}_before_parse,
2248 gld_${EMULATION_NAME}_after_parse,
2249 gld_${EMULATION_NAME}_after_open,
2250 after_allocation_default,
2251 set_output_arch_default,
2252 ldemul_default_target,
2253 gld_${EMULATION_NAME}_before_allocation,
2254 gld_${EMULATION_NAME}_get_script,
2255 "${EMULATION_NAME}",
2257 gld_${EMULATION_NAME}_finish,
2258 NULL, /* Create output section statements. */
2259 gld_${EMULATION_NAME}_open_dynamic_archive,
2260 gld_${EMULATION_NAME}_place_orphan,
2261 gld_${EMULATION_NAME}_set_symbols,
2262 NULL, /* parse_args */
2263 gld${EMULATION_NAME}_add_options,
2264 gld${EMULATION_NAME}_handle_option,
2265 gld_${EMULATION_NAME}_unrecognized_file,
2266 gld_${EMULATION_NAME}_list_options,
2267 gld_${EMULATION_NAME}_recognized_file,
2268 gld_${EMULATION_NAME}_find_potential_libraries,
2269 NULL, /* new_vers_pattern. */
2270 NULL /* extra_map_file_text */