1 # This shell script emits a C file. -*- C -*-
2 # It does some substitutions.
3 if [ -z "$MACHINE" ]; then
6 OUTPUT_ARCH=${ARCH}:${MACHINE}
8 cat >e${EMULATION_NAME}.c <<EOF
9 /* This file is part of GLD, the Gnu Linker.
10 Copyright 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003
11 Free Software Foundation, Inc.
13 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation; either version 2 of the License, or
16 (at your option) any later version.
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
28 /* The original file generated returned different default scripts depending
29 on whether certain switches were set, but these switches pertain to the
30 Linux system and that particular version of coff. In the NT case, we
31 only determine if the subsystem is console or windows in order to select
32 the correct entry point by default. */
38 #include "libiberty.h"
49 #include "coff/internal.h"
50 #include "../bfd/libcoff.h"
52 #define TARGET_IS_${EMULATION_NAME}
54 static struct internal_extra_pe_aouthdr pe;
57 extern const char *output_filename;
60 gld_${EMULATION_NAME}_before_parse (void)
62 const bfd_arch_info_type *arch = bfd_scan_arch ("${OUTPUT_ARCH}");
65 ldfile_output_architecture = arch->arch;
66 ldfile_output_machine = arch->mach;
67 ldfile_output_machine_name = arch->printable_name;
70 ldfile_output_architecture = bfd_arch_${ARCH};
71 output_filename = "a.exe";
74 /* PE format extra command line options. */
76 /* Used for setting flags in the PE header. */
77 #define OPTION_BASE_FILE (300 + 1)
78 #define OPTION_DLL (OPTION_BASE_FILE + 1)
79 #define OPTION_FILE_ALIGNMENT (OPTION_DLL + 1)
80 #define OPTION_IMAGE_BASE (OPTION_FILE_ALIGNMENT + 1)
81 #define OPTION_MAJOR_IMAGE_VERSION (OPTION_IMAGE_BASE + 1)
82 #define OPTION_MAJOR_OS_VERSION (OPTION_MAJOR_IMAGE_VERSION + 1)
83 #define OPTION_MAJOR_SUBSYSTEM_VERSION (OPTION_MAJOR_OS_VERSION + 1)
84 #define OPTION_MINOR_IMAGE_VERSION (OPTION_MAJOR_SUBSYSTEM_VERSION + 1)
85 #define OPTION_MINOR_OS_VERSION (OPTION_MINOR_IMAGE_VERSION + 1)
86 #define OPTION_MINOR_SUBSYSTEM_VERSION (OPTION_MINOR_OS_VERSION + 1)
87 #define OPTION_SECTION_ALIGNMENT (OPTION_MINOR_SUBSYSTEM_VERSION + 1)
88 #define OPTION_STACK (OPTION_SECTION_ALIGNMENT + 1)
89 #define OPTION_SUBSYSTEM (OPTION_STACK + 1)
90 #define OPTION_HEAP (OPTION_SUBSYSTEM + 1)
93 gld${EMULATION_NAME}_add_options
94 (int ns ATTRIBUTE_UNUSED, char **shortopts ATTRIBUTE_UNUSED, int nl,
95 struct option **longopts, int nrl ATTRIBUTE_UNUSED,
96 struct option **really_longopts ATTRIBUTE_UNUSED)
98 static const struct option xtra_long[] = {
100 {"base-file", required_argument, NULL, OPTION_BASE_FILE},
101 {"dll", no_argument, NULL, OPTION_DLL},
102 {"file-alignment", required_argument, NULL, OPTION_FILE_ALIGNMENT},
103 {"heap", required_argument, NULL, OPTION_HEAP},
104 {"image-base", required_argument, NULL, OPTION_IMAGE_BASE},
105 {"major-image-version", required_argument, NULL, OPTION_MAJOR_IMAGE_VERSION},
106 {"major-os-version", required_argument, NULL, OPTION_MAJOR_OS_VERSION},
107 {"major-subsystem-version", required_argument, NULL, OPTION_MAJOR_SUBSYSTEM_VERSION},
108 {"minor-image-version", required_argument, NULL, OPTION_MINOR_IMAGE_VERSION},
109 {"minor-os-version", required_argument, NULL, OPTION_MINOR_OS_VERSION},
110 {"minor-subsystem-version", required_argument, NULL, OPTION_MINOR_SUBSYSTEM_VERSION},
111 {"section-alignment", required_argument, NULL, OPTION_SECTION_ALIGNMENT},
112 {"stack", required_argument, NULL, OPTION_STACK},
113 {"subsystem", required_argument, NULL, OPTION_SUBSYSTEM},
114 {NULL, no_argument, NULL, 0}
117 *longopts = (struct option *)
118 xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
119 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
123 /* PE/WIN32; added routines to get the subsystem type, heap and/or stack
124 parameters which may be input from the command line */
134 #define D(field,symbol,def) {&pe.field,sizeof(pe.field), def, symbol,0}
136 static definfo init[] =
138 /* imagebase must be first */
139 #define IMAGEBASEOFF 0
140 D(ImageBase,"__image_base__", BEOS_EXE_IMAGE_BASE),
142 {&dll, sizeof(dll), 0, "__dll__", 0},
143 D(SectionAlignment,"__section_alignment__", PE_DEF_SECTION_ALIGNMENT),
144 D(FileAlignment,"__file_alignment__", PE_DEF_FILE_ALIGNMENT),
145 D(MajorOperatingSystemVersion,"__major_os_version__", 4),
146 D(MinorOperatingSystemVersion,"__minor_os_version__", 0),
147 D(MajorImageVersion,"__major_image_version__", 1),
148 D(MinorImageVersion,"__minor_image_version__", 0),
149 D(MajorSubsystemVersion,"__major_subsystem_version__", 4),
150 D(MinorSubsystemVersion,"__minor_subsystem_version__", 0),
151 D(Subsystem,"__subsystem__", 3),
152 D(SizeOfStackReserve,"__size_of_stack_reserve__", 0x2000000),
153 D(SizeOfStackCommit,"__size_of_stack_commit__", 0x1000),
154 D(SizeOfHeapReserve,"__size_of_heap_reserve__", 0x100000),
155 D(SizeOfHeapCommit,"__size_of_heap_commit__", 0x1000),
156 D(LoaderFlags,"__loader_flags__", 0x0),
157 { NULL, 0, 0, NULL, 0 }
162 set_pe_name (char *name, long val)
165 /* Find the name and set it. */
166 for (i = 0; init[i].ptr; i++)
168 if (strcmp (name, init[i].symbol) == 0)
180 set_pe_subsystem (void)
193 { "native", 1, "_NtProcessStartup" },
194 { "windows", 2, "_WinMainCRTStartup" },
195 { "wwindows", 2, "_wWinMainCRTStartup" },
196 { "console", 3, "_mainCRTStartup" },
197 { "wconsole", 3, "_wmainCRTStartup" },
199 /* The Microsoft linker does not recognize this. */
202 { "posix", 7, "___PosixProcessStartup"},
206 sver = strchr (optarg, ':');
208 len = strlen (optarg);
214 set_pe_name ("__major_subsystem_version__",
215 strtoul (sver + 1, &end, 0));
217 set_pe_name ("__minor_subsystem_version__",
218 strtoul (end + 1, &end, 0));
220 einfo ("%P: warning: bad version number in -subsystem option\n");
223 for (i = 0; v[i].name; i++)
225 if (strncmp (optarg, v[i].name, len) == 0
226 && v[i].name[len] == '\0')
228 set_pe_name ("__subsystem__", v[i].value);
230 /* If the subsystem is windows, we use a different entry
231 point. We also register the entry point as an undefined
232 symbol. from lang_add_entry() The reason we do
233 this is so that the user
234 doesn't have to because they would have to use the -u
235 switch if they were specifying an entry point other than
236 _mainCRTStartup. Specifically, if creating a windows
237 application, entry point _WinMainCRTStartup must be
238 specified. What I have found for non console
239 applications (entry not _mainCRTStartup) is that the .obj
240 that contains mainCRTStartup is brought in since it is
241 the first encountered in libc.lib and it has other
242 symbols in it which will be pulled in by the link
243 process. To avoid this, adding -u with the entry point
244 name specified forces the correct .obj to be used. We
245 can avoid making the user do this by always adding the
246 entry point name as an undefined symbol. */
247 lang_add_entry (v[i].entry, 1);
252 einfo ("%P%F: invalid subsystem type %s\n", optarg);
257 set_pe_value (char *name)
260 set_pe_name (name, strtoul (optarg, &end, 0));
263 einfo ("%P%F: invalid hex number for PE parameter '%s'\n", optarg);
270 set_pe_stack_heap (char *resname, char *comname)
272 set_pe_value (resname);
276 set_pe_value (comname);
280 einfo ("%P%F: strange hex info for PE parameter '%s'\n", optarg);
286 gld${EMULATION_NAME}_handle_option (int optc)
293 case OPTION_BASE_FILE:
294 link_info.base_file = fopen (optarg, FOPEN_WB);
295 if (link_info.base_file == NULL)
297 fprintf (stderr, "%s: Can't open base file %s\n",
298 program_name, optarg);
305 set_pe_stack_heap ("__size_of_heap_reserve__", "__size_of_heap_commit__");
308 set_pe_stack_heap ("__size_of_stack_reserve__", "__size_of_stack_commit__");
310 case OPTION_SUBSYSTEM:
313 case OPTION_MAJOR_OS_VERSION:
314 set_pe_value ("__major_os_version__");
316 case OPTION_MINOR_OS_VERSION:
317 set_pe_value ("__minor_os_version__");
319 case OPTION_MAJOR_SUBSYSTEM_VERSION:
320 set_pe_value ("__major_subsystem_version__");
322 case OPTION_MINOR_SUBSYSTEM_VERSION:
323 set_pe_value ("__minor_subsystem_version__");
325 case OPTION_MAJOR_IMAGE_VERSION:
326 set_pe_value ("__major_image_version__");
328 case OPTION_MINOR_IMAGE_VERSION:
329 set_pe_value ("__minor_image_version__");
331 case OPTION_FILE_ALIGNMENT:
332 set_pe_value ("__file_alignment__");
334 case OPTION_SECTION_ALIGNMENT:
335 set_pe_value ("__section_alignment__");
338 set_pe_name ("__dll__", 1);
340 case OPTION_IMAGE_BASE:
341 set_pe_value ("__image_base__");
347 /* Assign values to the special symbols before the linker script is
351 gld_${EMULATION_NAME}_set_symbols (void)
353 /* Run through and invent symbols for all the
354 names and insert the defaults. */
356 lang_statement_list_type *save;
358 if (!init[IMAGEBASEOFF].inited)
360 if (link_info.relocatable)
361 init[IMAGEBASEOFF].value = 0;
362 else if (init[DLLOFF].value)
363 init[IMAGEBASEOFF].value = BEOS_DLL_IMAGE_BASE;
365 init[IMAGEBASEOFF].value = BEOS_EXE_IMAGE_BASE;
368 /* Don't do any symbol assignments if this is a relocatable link. */
369 if (link_info.relocatable)
372 /* Glue the assignments into the abs section */
375 stat_ptr = &(abs_output_section->children);
377 for (j = 0; init[j].ptr; j++)
379 long val = init[j].value;
380 lang_add_assignment (exp_assop ('=', init[j].symbol, exp_intop (val)));
381 if (init[j].size == sizeof(short))
382 *(short *)init[j].ptr = val;
383 else if (init[j].size == sizeof(int))
384 *(int *)init[j].ptr = val;
385 else if (init[j].size == sizeof(long))
386 *(long *)init[j].ptr = val;
387 /* This might be a long long or other special type. */
388 else if (init[j].size == sizeof(bfd_vma))
389 *(bfd_vma *)init[j].ptr = val;
392 /* Restore the pointer. */
395 if (pe.FileAlignment >
398 einfo ("%P: warning, file alignment > section alignment.\n");
403 gld_${EMULATION_NAME}_after_open (void)
405 /* Pass the wacky PE command line options into the output bfd.
406 FIXME: This should be done via a function, rather than by
407 including an internal BFD header. */
408 if (!coff_data(output_bfd)->pe)
410 einfo ("%F%P: PE operations on non PE file.\n");
413 pe_data(output_bfd)->pe_opthdr = pe;
414 pe_data(output_bfd)->dll = init[DLLOFF].value;
418 /* Callback functions for qsort in sort_sections. */
421 sort_by_file_name (const void *a, const void *b)
423 const lang_statement_union_type *const *ra = a;
424 const lang_statement_union_type *const *rb = b;
427 i = strcmp ((*ra)->input_section.ifile->the_bfd->my_archive->filename,
428 (*rb)->input_section.ifile->the_bfd->my_archive->filename);
432 i = strcmp ((*ra)->input_section.ifile->filename,
433 (*rb)->input_section.ifile->filename);
436 /* the tail idata4/5 are the only ones without relocs to an
437 idata$6 section unless we are importing by ordinal,
438 so sort them to last to terminate the IAT
439 and HNT properly. if no reloc this one is import by ordinal
440 so we have to sort by section contents */
442 if ( ((*ra)->input_section.section->reloc_count + (*rb)->input_section.section->reloc_count) )
444 i = (((*ra)->input_section.section->reloc_count >
445 (*rb)->input_section.section->reloc_count) ? -1 : 0);
449 return (((*ra)->input_section.section->reloc_count >
450 (*rb)->input_section.section->reloc_count) ? 0 : 1);
454 if ( (strcmp( (*ra)->input_section.section->name, ".idata$6") == 0) )
455 return 0; /* don't sort .idata$6 or .idata$7 FIXME dlltool eliminate .idata$7 */
457 if (! bfd_get_section_contents ((*ra)->input_section.ifile->the_bfd,
458 (*ra)->input_section.section, &a_sec, (file_ptr) 0, (bfd_size_type)sizeof(a_sec)))
459 einfo ("%F%B: Can't read contents of section .idata: %E\n",
460 (*ra)->input_section.ifile->the_bfd);
462 if (! bfd_get_section_contents ((*rb)->input_section.ifile->the_bfd,
463 (*rb)->input_section.section, &b_sec, (file_ptr) 0, (bfd_size_type)sizeof(b_sec) ))
464 einfo ("%F%B: Can't read contents of section .idata: %E\n",
465 (*rb)->input_section.ifile->the_bfd);
467 i = ((a_sec < b_sec) ? -1 : 0);
470 return ((a_sec < b_sec) ? 0 : 1);
476 sort_by_section_name (const void *a, const void *b)
478 const lang_statement_union_type *const *ra = a;
479 const lang_statement_union_type *const *rb = b;
481 i = strcmp ((*ra)->input_section.section->name,
482 (*rb)->input_section.section->name);
483 /* this is a hack to make .stab and .stabstr last, so we don't have
484 to fix strip/objcopy for .reloc sections.
485 FIXME stripping images with a .rsrc section still needs to be fixed */
488 if ((strncmp ((*ra)->input_section.section->name, ".stab", 5) == 0)
489 && (strncmp ((*rb)->input_section.section->name, ".stab", 5) != 0))
496 /* Subroutine of sort_sections to a contiguous subset of a list of sections.
497 NEXT_AFTER is the element after the last one to sort.
498 The result is a pointer to the last element's "next" pointer. */
500 static lang_statement_union_type **
501 sort_sections_1 (lang_statement_union_type **startptr,
502 lang_statement_union_type *next_after,
504 int (*sort_func) (const void *, const void *))
506 lang_statement_union_type **vec;
507 lang_statement_union_type *p;
509 lang_statement_union_type **ret;
514 vec = ((lang_statement_union_type **)
515 xmalloc (count * sizeof (lang_statement_union_type *)));
517 for (p = *startptr, i = 0; i < count; i++, p = p->header.next)
520 qsort (vec, count, sizeof (vec[0]), sort_func);
522 /* Fill in the next pointers again. */
524 for (i = 0; i < count - 1; i++)
525 vec[i]->header.next = vec[i + 1];
526 vec[i]->header.next = next_after;
527 ret = &vec[i]->header.next;
532 /* Sort the .idata\$foo input sections of archives into filename order.
533 The reason is so dlltool can arrange to have the pe dll import information
534 generated correctly - the head of the list goes into dh.o, the tail into
535 dt.o, and the guts into ds[nnnn].o. Note that this is only needed for the
537 FIXME: This may no longer be necessary with grouped sections. Instead of
538 sorting on dh.o, ds[nnnn].o, dt.o, one could, for example, have dh.o use
539 .idata\$4h, have ds[nnnn].o use .idata\$4s[nnnn], and have dt.o use .idata\$4t.
540 This would have to be elaborated upon to handle multiple dll's
541 [assuming such an eloboration is possible of course].
543 We also sort sections in '\$' wild statements. These are created by the
544 place_orphans routine to implement grouped sections. */
547 sort_sections (lang_statement_union_type *s)
549 for (; s ; s = s->header.next)
550 switch (s->header.type)
552 case lang_output_section_statement_enum:
553 sort_sections (s->output_section_statement.children.head);
555 case lang_wild_statement_enum:
557 lang_statement_union_type **p = &s->wild_statement.children.head;
558 struct wildcard_list *sec;
560 for (sec = s->wild_statement.section_list; sec; sec = sec->next)
562 /* Is this the .idata section? */
563 if (sec->spec.name != NULL
564 && strncmp (sec->spec.name, ".idata", 6) == 0)
566 /* Sort the children. We want to sort any objects in
567 the same archive. In order to handle the case of
568 including a single archive multiple times, we sort
569 all the children by archive name and then by object
570 name. After sorting them, we re-thread the pointer
575 lang_statement_union_type *start = *p;
576 if (start->header.type != lang_input_section_enum
577 || !start->input_section.ifile->the_bfd->my_archive)
578 p = &(start->header.next);
581 lang_statement_union_type *end;
584 for (end = start, count = 0;
585 end && (end->header.type
586 == lang_input_section_enum);
587 end = end->header.next)
590 p = sort_sections_1 (p, end, count,
597 /* If this is a collection of grouped sections, sort them.
598 The linker script must explicitly mention "*(.foo\$)" or
599 "*(.foo\$*)". Don't sort them if \$ is not the last
600 character (not sure if this is really useful, but it
601 allows explicitly mentioning some \$ sections and letting
602 the linker handle the rest). */
603 if (sec->spec.name != NULL)
605 char *q = strchr (sec->spec.name, '\$');
609 || (q[1] == '*' && q[2] == '\0')))
611 lang_statement_union_type *end;
614 for (end = *p, count = 0; end; end = end->header.next)
616 if (end->header.type != lang_input_section_enum)
620 (void) sort_sections_1 (p, end, count,
621 sort_by_section_name);
634 gld_${EMULATION_NAME}_before_allocation (void)
636 extern lang_statement_list_type *stat_ptr;
638 #ifdef TARGET_IS_ppcpe
639 /* Here we rummage through the found bfds to collect toc information */
641 LANG_FOR_EACH_INPUT_STATEMENT (is)
643 if (!ppc_process_before_allocation(is->the_bfd, &link_info))
645 einfo("Errors encountered processing file %s\n", is->filename);
650 /* We have seen it all. Allocate it, and carry on */
651 ppc_allocate_toc_section (&link_info);
653 #ifdef TARGET_IS_armpe
654 /* FIXME: we should be able to set the size of the interworking stub
657 Here we rummage through the found bfds to collect glue
658 information. FIXME: should this be based on a command line
659 option? krk@cygnus.com */
661 LANG_FOR_EACH_INPUT_STATEMENT (is)
663 if (!arm_process_before_allocation (is->the_bfd, & link_info))
665 einfo ("Errors encountered processing file %s", is->filename);
670 /* We have seen it all. Allocate it, and carry on */
671 arm_allocate_interworking_sections (& link_info);
672 #endif /* TARGET_IS_armpe */
673 #endif /* TARGET_IS_ppcpe */
675 sort_sections (stat_ptr->head);
678 /* Place an orphan section. We use this to put sections with a '\$' in them
679 into the right place. Any section with a '\$' in them (e.g. .text\$foo)
680 gets mapped to the output section with everything from the '\$' on stripped
682 See the Microsoft Portable Executable and Common Object File Format
683 Specification 4.1, section 4.2, Grouped Sections.
685 FIXME: This is now handled by the linker script using wildcards,
686 but I'm leaving this here in case we want to enable it for sections
687 which are not mentioned in the linker script. */
691 gld${EMULATION_NAME}_place_orphan (lang_input_statement_type *file, asection *s)
694 char *output_secname, *ps;
695 lang_output_section_statement_type *os;
696 lang_statement_union_type *l;
698 if ((s->flags & SEC_ALLOC) == 0)
701 /* Don't process grouped sections unless doing a final link.
702 If they're marked as COMDAT sections, we don't want .text\$foo to
703 end up in .text and then have .text disappear because it's marked
704 link-once-discard. */
705 if (link_info.relocatable)
708 secname = bfd_get_section_name (s->owner, s);
710 /* Everything from the '\$' on gets deleted so don't allow '\$' as the
712 if (*secname == '\$')
713 einfo ("%P%F: section %s has '\$' as first character\n", secname);
714 if (strchr (secname + 1, '\$') == NULL)
717 /* Look up the output section. The Microsoft specs say sections names in
718 image files never contain a '\$'. Fortunately, lang_..._lookup creates
719 the section if it doesn't exist. */
720 output_secname = xstrdup (secname);
721 ps = strchr (output_secname + 1, '\$');
723 os = lang_output_section_statement_lookup (output_secname);
725 /* Find the '\$' wild statement for this section. We currently require the
726 linker script to explicitly mention "*(.foo\$)".
727 FIXME: ppcpe.sc has .CRT\$foo in the .rdata section. According to the
728 Microsoft docs this isn't correct so it's not (currently) handled. */
732 for (l = os->children.head; l; l = l->header.next)
733 if (l->header.type == lang_wild_statement_enum)
735 struct wildcard_list *sec;
737 for (sec = l->wild_statement.section_list; sec; sec = sec->next)
738 if (sec->spec.name && strcmp (sec->spec.name, output_secname) == 0)
746 einfo ("%P%F: *(%s\$) missing from linker script\n", output_secname);
747 #else /* FIXME: This block is untried. It exists to convey the intent,
748 should one decide to not require *(.foo\$) to appear in the linker
751 lang_wild_statement_type *new;
752 struct wildcard_list *tmp;
754 tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
756 tmp->spec.name = xmalloc (strlen (output_secname) + 2);
757 sprintf (tmp->spec.name, "%s\$", output_secname);
758 tmp->spec.exclude_name_list = NULL;
760 new = new_stat (lang_wild_statement, &os->children);
761 new->filename = NULL;
762 new->filenames_sorted = FALSE;
763 new->section_list = tmp;
764 new->keep_sections = FALSE;
765 lang_list_init (&new->children);
770 /* Link the input section in and we're done for now.
771 The sections still have to be sorted, but that has to wait until
772 all such sections have been processed by us. The sorting is done by
774 lang_add_section (&l->wild_statement.children, s, os, file);
780 gld_${EMULATION_NAME}_get_script (int *isfile)
782 # Scripts compiled in.
783 # sed commands to quote an ld script as a C string.
784 sc="-f stringify.sed"
786 cat >>e${EMULATION_NAME}.c <<EOF
790 if (link_info.relocatable && config.build_constructors)
793 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
794 echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c
795 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
796 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
797 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
798 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
799 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
800 echo ' ; else return' >> e${EMULATION_NAME}.c
801 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
802 echo '; }' >> e${EMULATION_NAME}.c
804 cat >>e${EMULATION_NAME}.c <<EOF
807 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
809 gld_${EMULATION_NAME}_before_parse,
813 gld_${EMULATION_NAME}_after_open,
814 after_allocation_default,
815 set_output_arch_default,
816 ldemul_default_target,
817 gld_${EMULATION_NAME}_before_allocation,
818 gld_${EMULATION_NAME}_get_script,
822 NULL, /* create output section statements */
823 NULL, /* open dynamic archive */
824 gld${EMULATION_NAME}_place_orphan,
825 gld_${EMULATION_NAME}_set_symbols,
826 NULL, /* parse_args */
827 gld${EMULATION_NAME}_add_options,
828 gld${EMULATION_NAME}_handle_option,
829 NULL, /* unrecognized file */
830 NULL, /* list options */
831 NULL, /* recognized file */
832 NULL, /* find_potential_libraries */
833 NULL /* new_vers_pattern */