1 # This shell script emits a C file. -*- C -*-
2 # It does some substitutions.
3 cat >e${EMULATION_NAME}.c <<EOF
4 /* This file is is generated by a shell script. DO NOT EDIT! */
6 /* SunOS emulation code for ${EMULATION_NAME}
7 Copyright (C) 1991, 93, 94, 95, 96, 97, 98, 1999
8 Free Software Foundation, Inc.
9 Written by Steve Chamberlain <sac@cygnus.com>
10 SunOS shared library support by Ian Lance Taylor <ian@cygnus.com>
12 This file is part of GLD, the Gnu Linker.
14 This program is free software; you can redistribute it and/or modify
15 it under the terms of the GNU General Public License as published by
16 the Free Software Foundation; either version 2 of the License, or
17 (at your option) any later version.
19 This program is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 GNU General Public License for more details.
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, write to the Free Software
26 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
28 #define TARGET_IS_${EMULATION_NAME}
35 #include "libiberty.h"
48 # define dirent direct
49 # ifdef HAVE_SYS_NDIR_H
50 # include <sys/ndir.h>
52 # ifdef HAVE_SYS_DIR_H
60 static void gld${EMULATION_NAME}_before_parse PARAMS ((void));
61 static void gld${EMULATION_NAME}_set_symbols PARAMS ((void));
62 static void gld${EMULATION_NAME}_create_output_section_statements
64 static void gld${EMULATION_NAME}_find_so
65 PARAMS ((lang_input_statement_type *));
66 static char *gld${EMULATION_NAME}_search_dir
67 PARAMS ((const char *, const char *, boolean *));
68 static void gld${EMULATION_NAME}_after_open PARAMS ((void));
69 static void gld${EMULATION_NAME}_check_needed
70 PARAMS ((lang_input_statement_type *));
71 static boolean gld${EMULATION_NAME}_search_needed
72 PARAMS ((const char *, const char *));
73 static boolean gld${EMULATION_NAME}_try_needed
74 PARAMS ((const char *, const char *));
75 static void gld${EMULATION_NAME}_before_allocation PARAMS ((void));
76 static void gld${EMULATION_NAME}_find_assignment
77 PARAMS ((lang_statement_union_type *));
78 static void gld${EMULATION_NAME}_find_exp_assignment PARAMS ((etree_type *));
79 static void gld${EMULATION_NAME}_count_need
80 PARAMS ((lang_input_statement_type *));
81 static void gld${EMULATION_NAME}_set_need
82 PARAMS ((lang_input_statement_type *));
83 static char *gld${EMULATION_NAME}_get_script PARAMS ((int *isfile));
86 gld${EMULATION_NAME}_before_parse()
88 ldfile_output_architecture = bfd_arch_${ARCH};
89 config.dynamic_link = true;
90 config.has_shared = true;
93 /* This is called after the command line arguments have been parsed,
94 but before the linker script has been read. If this is a native
95 linker, we add the directories in LD_LIBRARY_PATH to the search
99 gld${EMULATION_NAME}_set_symbols ()
102 if [ "x${host}" = "x${target}" ] ; then
103 if [ "x${DEFAULT_EMULATION}" = "x${EMULATION_NAME}" ] ; then
104 cat >>e${EMULATION_NAME}.c <<EOF
107 env = (const char *) getenv ("LD_LIBRARY_PATH");
121 ldfile_add_library_path (l, false);
130 cat >>e${EMULATION_NAME}.c <<EOF
133 /* Despite the name, we use this routine to search for dynamic
134 libraries. On SunOS this requires a directory search. We need to
135 find the .so file with the highest version number. The user may
136 restrict the major version by saying, e.g., -lc.1. Also, if we
137 find a .so file, we need to look for a the same file after
138 replacing .so with .sa; if it exists, it will be an archive which
139 provide some initializations for data symbols, and we need to
140 search it after including the .so file. */
143 gld${EMULATION_NAME}_create_output_section_statements ()
145 lang_for_each_input_file (gld${EMULATION_NAME}_find_so);
148 /* Search the directory for a .so file for each library search. */
151 gld${EMULATION_NAME}_find_so (inp)
152 lang_input_statement_type *inp;
154 search_dirs_type *search;
159 if (! inp->search_dirs_flag
164 ASSERT (strncmp (inp->local_sym_name, "-l", 2) == 0);
166 for (search = search_head; search != NULL; search = search->next)
168 boolean found_static;
170 found = gld${EMULATION_NAME}_search_dir (search->name, inp->filename,
172 if (found != NULL || found_static)
178 /* We did not find a matching .so file. This isn't an error,
179 since there might still be a matching .a file, which will be
180 found by the usual search. */
184 /* Replace the filename with the one we have found. */
185 alc = (char *) xmalloc (strlen (search->name) + strlen (found) + 2);
186 sprintf (alc, "%s/%s", search->name, found);
189 /* Turn off the search_dirs_flag to prevent ldfile_open_file from
190 searching for this file again. */
191 inp->search_dirs_flag = false;
195 /* Now look for the same file name, but with .sa instead of .so. If
196 found, add it to the list of input files. */
197 alc = (char *) xmalloc (strlen (inp->filename) + 1);
198 strcpy (alc, inp->filename);
199 strstr (alc + strlen (search->name), ".so")[2] = 'a';
200 if (stat (alc, &st) != 0)
204 lang_input_statement_type *sa;
206 /* Add the .sa file to the statement list just before the .so
207 file. This is really a hack. */
208 sa = ((lang_input_statement_type *)
209 xmalloc (sizeof (lang_input_statement_type)));
213 inp->local_sym_name = alc;
215 inp->header.next = (lang_statement_union_type *) sa;
216 inp->next_real_file = (lang_statement_union_type *) sa;
220 /* Search a directory for a .so file. */
223 gld${EMULATION_NAME}_search_dir (dirname, filename, found_static)
225 const char *filename;
226 boolean *found_static;
228 int force_maj, force_min;
233 int max_maj, max_min;
235 struct dirent *entry;
236 unsigned int dirnamelen;
241 *found_static = false;
245 dot = strchr (filename, '.');
248 len = strlen (filename);
253 force_maj = atoi (dot + 1);
255 len = dot - filename;
256 alc = (char *) xmalloc (len + 1);
257 strncpy (alc, filename, len);
261 dot = strchr (dot + 1, '.');
263 force_min = atoi (dot + 1);
267 max_maj = max_min = 0;
269 dir = opendir (dirname);
272 dirnamelen = strlen (dirname);
274 while ((entry = readdir (dir)) != NULL)
277 int found_maj, found_min;
279 if (strncmp (entry->d_name, "lib", 3) != 0
280 || strncmp (entry->d_name + 3, filename, len) != 0)
284 && strcmp (entry->d_name + 3 + len, ".a") == 0)
286 *found_static = true;
290 /* We accept libfoo.so without a version number, even though the
291 native linker does not. This is more convenient for packages
292 which just generate .so files for shared libraries, as on ELF
294 if (strncmp (entry->d_name + 3 + len, ".so", 3) != 0)
296 if (entry->d_name[6 + len] == '\0')
298 else if (entry->d_name[6 + len] == '.'
299 && isdigit ((unsigned char) entry->d_name[7 + len]))
304 for (s = entry->d_name + 6 + len; *s != '\0'; s++)
305 if (*s != '.' && ! isdigit ((unsigned char) *s))
310 /* We've found a .so file. Work out the major and minor
314 sscanf (entry->d_name + 3 + len, ".so.%d.%d",
315 &found_maj, &found_min);
317 if ((force_maj != -1 && force_maj != found_maj)
318 || (force_min != -1 && force_min != found_min))
321 /* Make sure the file really exists (ignore broken symlinks). */
322 full_path = xmalloc (dirnamelen + 1 + strlen (entry->d_name) + 1);
323 sprintf (full_path, "%s/%s", dirname, entry->d_name);
324 statval = stat (full_path, &st);
329 /* We've found a match for the name we are searching for. See
330 if this is the version we should use. If the major and minor
331 versions match, we use the last entry in alphabetical order;
332 I don't know if this is how SunOS distinguishes libc.so.1.8
333 from libc.so.1.8.1, but it ought to suffice. */
335 || (found_maj > max_maj)
336 || (found_maj == max_maj
337 && (found_min > max_min
338 || (found_min == max_min
339 && strcmp (entry->d_name, found) > 0))))
343 found = (char *) xmalloc (strlen (entry->d_name) + 1);
344 strcpy (found, entry->d_name);
358 /* These variables are required to pass information back and forth
359 between after_open and check_needed. */
361 static struct bfd_link_needed_list *global_needed;
362 static boolean global_found;
364 /* This is called after all the input files have been opened. */
367 gld${EMULATION_NAME}_after_open ()
369 struct bfd_link_needed_list *needed, *l;
371 /* We only need to worry about this when doing a final link. */
372 if (link_info.relocateable || link_info.shared)
375 /* Get the list of files which appear in ld_need entries in dynamic
376 objects included in the link. For each such file, we want to
377 track down the corresponding library, and include the symbol
378 table in the link. This is what the runtime dynamic linker will
379 do. Tracking the files down here permits one dynamic object to
380 include another without requiring special action by the person
381 doing the link. Note that the needed list can actually grow
382 while we are stepping through this loop. */
383 needed = bfd_sunos_get_needed_list (output_bfd, &link_info);
384 for (l = needed; l != NULL; l = l->next)
386 struct bfd_link_needed_list *ll;
388 search_dirs_type *search;
392 /* If we've already seen this file, skip it. */
393 for (ll = needed; ll != l; ll = ll->next)
394 if (strcmp (ll->name, lname) == 0)
399 /* See if this file was included in the link explicitly. */
401 global_found = false;
402 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
406 if (strncmp (lname, "-l", 2) != 0)
410 abfd = bfd_openr (lname, bfd_get_target (output_bfd));
413 if (! bfd_check_format (abfd, bfd_object))
415 (void) bfd_close (abfd);
421 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
423 (void) bfd_close (abfd);
429 /* We've found the needed dynamic object. */
430 if (! bfd_link_add_symbols (abfd, &link_info))
431 einfo ("%F%B: could not read symbols: %E\n", abfd);
435 einfo ("%P: warning: %s, needed by %B, not found\n",
444 /* We want to search for the file in the same way that the
445 dynamic linker will search. That means that we want to use
446 rpath_link, rpath or -L, then the environment variable
447 LD_LIBRARY_PATH (native only), then (if rpath was used) the
448 linker script LIB_SEARCH_DIRS. */
449 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
452 if (command_line.rpath != NULL)
454 if (gld${EMULATION_NAME}_search_needed (command_line.rpath, lname))
459 for (search = search_head; search != NULL; search = search->next)
460 if (gld${EMULATION_NAME}_try_needed (search->name, lname))
466 if [ "x${host}" = "x${target}" ] ; then
467 if [ "x${DEFAULT_EMULATION}" = "x${EMULATION_NAME}" ] ; then
468 cat >>e${EMULATION_NAME}.c <<EOF
470 const char *lib_path;
472 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
473 if (gld${EMULATION_NAME}_search_needed (lib_path, lname))
479 cat >>e${EMULATION_NAME}.c <<EOF
480 if (command_line.rpath != NULL)
482 for (search = search_head; search != NULL; search = search->next)
486 if (gld${EMULATION_NAME}_try_needed (search->name, lname))
493 einfo ("%P: warning: %s, needed by %B, not found\n",
498 /* Search for a needed file in a path. */
501 gld${EMULATION_NAME}_search_needed (path, name)
507 if (path == NULL || *path == '\0')
514 s = strchr (path, ':');
522 dircopy = (char *) xmalloc (s - path + 1);
523 memcpy (dircopy, path, s - path);
524 dircopy[s - path] = '\0';
528 if (gld${EMULATION_NAME}_try_needed (dir, name))
542 /* This function is called for each possible directory for a needed
546 gld${EMULATION_NAME}_try_needed (dir, name)
555 file = gld${EMULATION_NAME}_search_dir (dir, name, &ignore);
559 alc = (char *) xmalloc (strlen (dir) + strlen (file) + 2);
560 sprintf (alc, "%s/%s", dir, file);
562 abfd = bfd_openr (alc, bfd_get_target (output_bfd));
565 if (! bfd_check_format (abfd, bfd_object))
567 (void) bfd_close (abfd);
570 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
572 (void) bfd_close (abfd);
576 /* We've found the needed dynamic object. */
578 /* Add this file into the symbol table. */
579 if (! bfd_link_add_symbols (abfd, &link_info))
580 einfo ("%F%B: could not read symbols: %E\n", abfd);
585 /* See if we have already included a needed object in the link. This
586 does not have to be precise, as it does no harm to include a
587 dynamic object more than once. */
590 gld${EMULATION_NAME}_check_needed (s)
591 lang_input_statement_type *s;
593 if (s->filename == NULL)
595 if (strncmp (global_needed->name, "-l", 2) != 0)
597 if (strcmp (s->filename, global_needed->name) == 0)
602 const char *sname, *lname;
603 const char *sdot, *ldot;
604 int lmaj, lmin, smaj, smin;
606 lname = global_needed->name + 2;
608 sname = strrchr (s->filename, '/');
614 if (strncmp (sname, "lib", 3) != 0)
618 ldot = strchr (lname, '.');
620 ldot = lname + strlen (lname);
622 sdot = strstr (sname, ".so.");
626 if (sdot - sname != ldot - lname
627 || strncmp (lname, sname, sdot - sname) != 0)
631 sscanf (ldot, ".%d.%d", &lmaj, &lmin);
633 sscanf (sdot, ".so.%d.%d", &smaj, &smin);
634 if ((smaj != lmaj && smaj != -1 && lmaj != -1)
635 || (smin != lmin && smin != -1 && lmin != -1))
642 /* We need to use static variables to pass information around the call
643 to lang_for_each_statement. Ick. */
645 static const char *find_assign;
646 static boolean found_assign;
648 /* We need to use static variables to pass information around the call
649 to lang_for_each_input_file. Ick. */
651 static bfd_size_type need_size;
652 static bfd_size_type need_entries;
653 static bfd_byte *need_contents;
654 static bfd_byte *need_pinfo;
655 static bfd_byte *need_pnames;
657 /* The size of one entry in the .need section, not including the file
660 #define NEED_ENTRY_SIZE (16)
662 /* This is called after the sections have been attached to output
663 sections, but before any sizes or addresses have been set. */
666 gld${EMULATION_NAME}_before_allocation ()
668 struct bfd_link_hash_entry *hdyn = NULL;
673 /* The SunOS native linker creates a shared library whenever there
674 are any undefined symbols in a link, unless -e is used. This is
675 pretty weird, but we are compatible. */
676 if (! link_info.shared && ! link_info.relocateable && ! entry_from_cmdline)
678 struct bfd_link_hash_entry *h;
680 for (h = link_info.hash->undefs; h != NULL; h = h->next)
682 if (h->type == bfd_link_hash_undefined
683 && h->u.undef.abfd != NULL
684 && (h->u.undef.abfd->flags & DYNAMIC) == 0
685 && strcmp (h->root.string, "__DYNAMIC") != 0
686 && strcmp (h->root.string, "__GLOBAL_OFFSET_TABLE_") != 0)
688 find_assign = h->root.string;
689 found_assign = false;
690 lang_for_each_statement (gld${EMULATION_NAME}_find_assignment);
693 link_info.shared = true;
700 if (link_info.shared)
702 lang_output_section_statement_type *os;
704 /* Set the .text section to start at 0x20, not 0x2020. FIXME:
705 This is too magical. */
706 os = lang_output_section_statement_lookup (".text");
707 if (os->addr_tree == NULL)
708 os->addr_tree = exp_intop (0x20);
711 /* We need to create a __DYNAMIC symbol. We don't do this in the
712 linker script because we want to set the value to the start of
713 the dynamic section if there is one, or to zero if there isn't
714 one. We need to create the symbol before calling
715 size_dynamic_sections, although we can't set the value until
717 if (! link_info.relocateable)
719 hdyn = bfd_link_hash_lookup (link_info.hash, "__DYNAMIC", true, false,
722 einfo ("%P%F: bfd_link_hash_lookup: %E\n");
723 if (! bfd_sunos_record_link_assignment (output_bfd, &link_info,
725 einfo ("%P%F: failed to record assignment to __DYNAMIC: %E\n");
728 /* If we are going to make any variable assignments, we need to let
729 the backend linker know about them in case the variables are
730 referred to by dynamic objects. */
731 lang_for_each_statement (gld${EMULATION_NAME}_find_assignment);
733 /* Let the backend linker work out the sizes of any sections
734 required by dynamic linking. */
735 if (! bfd_sunos_size_dynamic_sections (output_bfd, &link_info, &sdyn,
737 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
741 /* Set up the .need section. See the description of the ld_need
742 field in include/aout/sun4.h. */
747 lang_for_each_input_file (gld${EMULATION_NAME}_count_need);
749 /* We should only have a .need section if we have at least one
751 ASSERT (need_entries != 0);
753 sneed->_raw_size = need_size;
754 sneed->contents = (bfd_byte *) xmalloc (need_size);
756 need_contents = sneed->contents;
757 need_pinfo = sneed->contents;
758 need_pnames = sneed->contents + need_entries * 16;
760 lang_for_each_input_file (gld${EMULATION_NAME}_set_need);
762 ASSERT ((bfd_size_type) (need_pnames - sneed->contents) == need_size);
767 /* Set up the .rules section. This is just a PATH like string
768 of the -L arguments given on the command line. We permit the
769 user to specify the directories using the -rpath command line
771 if (command_line.rpath)
773 srules->_raw_size = strlen (command_line.rpath);
774 srules->contents = (bfd_byte *) command_line.rpath;
779 search_dirs_type *search;
782 for (search = search_head; search != NULL; search = search->next)
784 size += strlen (search->name) + 1;
785 srules->_raw_size = size;
790 srules->contents = (bfd_byte *) xmalloc (size);
791 p = (char *) srules->contents;
793 for (search = search_head; search != NULL; search = search->next)
797 if (p != (char *) srules->contents)
799 strcpy (p, search->name);
807 /* We must assign a value to __DYNAMIC. It should be zero if we are
808 not doing a dynamic link, or the start of the .dynamic section if
810 if (! link_info.relocateable)
812 hdyn->type = bfd_link_hash_defined;
813 hdyn->u.def.value = 0;
815 hdyn->u.def.section = sdyn;
817 hdyn->u.def.section = bfd_abs_section_ptr;
821 /* This is called by the before_allocation routine via
822 lang_for_each_statement. It does one of two things: if the
823 variable find_assign is set, it sets found_assign if it finds an
824 assignment to that variable; otherwise it tells the backend linker
825 about all assignment statements, in case they are assignments to
826 symbols which are referred to by dynamic objects. */
829 gld${EMULATION_NAME}_find_assignment (s)
830 lang_statement_union_type *s;
832 if (s->header.type == lang_assignment_statement_enum
833 && (find_assign == NULL || ! found_assign))
834 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
837 /* Look through an expression for an assignment statement. */
840 gld${EMULATION_NAME}_find_exp_assignment (exp)
843 switch (exp->type.node_class)
846 if (find_assign != NULL)
848 if (strcmp (find_assign, exp->assign.dst) == 0)
853 if (strcmp (exp->assign.dst, ".") != 0)
855 if (! bfd_sunos_record_link_assignment (output_bfd, &link_info,
857 einfo ("%P%F: failed to record assignment to %s: %E\n",
860 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
864 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
865 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
869 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
870 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
871 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
875 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
883 /* Work out the size of the .need section, and the number of entries.
884 The backend will set the ld_need field of the dynamic linking
885 information to point to the .need section. See include/aout/sun4.h
886 for more information. */
889 gld${EMULATION_NAME}_count_need (inp)
890 lang_input_statement_type *inp;
892 if (inp->the_bfd != NULL
893 && (inp->the_bfd->flags & DYNAMIC) != 0)
896 need_size += NEED_ENTRY_SIZE;
897 if (! inp->is_archive)
898 need_size += strlen (inp->filename) + 1;
901 ASSERT (inp->local_sym_name[0] == '-'
902 && inp->local_sym_name[1] == 'l');
903 need_size += strlen (inp->local_sym_name + 2) + 1;
908 /* Fill in the contents of the .need section. */
911 gld${EMULATION_NAME}_set_need (inp)
912 lang_input_statement_type *inp;
914 if (inp->the_bfd != NULL
915 && (inp->the_bfd->flags & DYNAMIC) != 0)
919 /* To really fill in the .need section contents, we need to know
920 the final file position of the section, but we don't.
921 Instead, we use offsets, and rely on the BFD backend to
922 finish the section up correctly. FIXME: Talk about lack of
923 referential locality. */
924 bfd_put_32 (output_bfd, need_pnames - need_contents, need_pinfo);
925 if (! inp->is_archive)
927 bfd_put_32 (output_bfd, (bfd_vma) 0, need_pinfo + 4);
928 bfd_put_16 (output_bfd, (bfd_vma) 0, need_pinfo + 8);
929 bfd_put_16 (output_bfd, (bfd_vma) 0, need_pinfo + 10);
930 strcpy (need_pnames, inp->filename);
937 bfd_put_32 (output_bfd, (bfd_vma) 0x80000000, need_pinfo + 4);
940 verstr = strstr (inp->filename, ".so.");
942 sscanf (verstr, ".so.%d.%d", &maj, &min);
943 bfd_put_16 (output_bfd, (bfd_vma) maj, need_pinfo + 8);
944 bfd_put_16 (output_bfd, (bfd_vma) min, need_pinfo + 10);
945 strcpy (need_pnames, inp->local_sym_name + 2);
948 c = (need_pinfo - need_contents) / NEED_ENTRY_SIZE;
949 if (c + 1 >= need_entries)
950 bfd_put_32 (output_bfd, (bfd_vma) 0, need_pinfo + 12);
952 bfd_put_32 (output_bfd, (bfd_vma) (c + 1) * NEED_ENTRY_SIZE,
955 need_pinfo += NEED_ENTRY_SIZE;
956 need_pnames += strlen (need_pnames) + 1;
961 gld${EMULATION_NAME}_get_script(isfile)
965 if test -n "$COMPILE_IN"
967 # Scripts compiled in.
969 # sed commands to quote an ld script as a C string.
976 cat >>e${EMULATION_NAME}.c <<EOF
980 if (link_info.relocateable == true && config.build_constructors == true)
981 return `sed "$sc" ldscripts/${EMULATION_NAME}.xu`;
982 else if (link_info.relocateable == true)
983 return `sed "$sc" ldscripts/${EMULATION_NAME}.xr`;
984 else if (!config.text_read_only)
985 return `sed "$sc" ldscripts/${EMULATION_NAME}.xbn`;
986 else if (!config.magic_demand_paged)
987 return `sed "$sc" ldscripts/${EMULATION_NAME}.xn`;
989 return `sed "$sc" ldscripts/${EMULATION_NAME}.x`;
994 # Scripts read from the filesystem.
996 cat >>e${EMULATION_NAME}.c <<EOF
1000 if (link_info.relocateable == true && config.build_constructors == true)
1001 return "ldscripts/${EMULATION_NAME}.xu";
1002 else if (link_info.relocateable == true)
1003 return "ldscripts/${EMULATION_NAME}.xr";
1004 else if (!config.text_read_only)
1005 return "ldscripts/${EMULATION_NAME}.xbn";
1006 else if (!config.magic_demand_paged)
1007 return "ldscripts/${EMULATION_NAME}.xn";
1009 return "ldscripts/${EMULATION_NAME}.x";
1015 cat >>e${EMULATION_NAME}.c <<EOF
1017 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1019 gld${EMULATION_NAME}_before_parse,
1022 after_parse_default,
1023 gld${EMULATION_NAME}_after_open,
1024 after_allocation_default,
1025 set_output_arch_default,
1026 ldemul_default_target,
1027 gld${EMULATION_NAME}_before_allocation,
1028 gld${EMULATION_NAME}_get_script,
1029 "${EMULATION_NAME}",
1032 gld${EMULATION_NAME}_create_output_section_statements,
1033 NULL, /* open_dynamic_library */
1034 NULL, /* place_orphan */
1035 gld${EMULATION_NAME}_set_symbols