1 # This shell script emits a C file. -*- C -*-
2 # It does some substitutions.
3 # This file is now misnamed, because it supports both 32 bit and 64 bit
5 test -z "${ELFSIZE}" && ELFSIZE=32
6 if [ -z "$MACHINE" ]; then
9 OUTPUT_ARCH=${ARCH}:${MACHINE}
11 cat >e${EMULATION_NAME}.c <<EOF
12 /* This file is is generated by a shell script. DO NOT EDIT! */
14 /* ${ELFSIZE} bit ELF emulation code for ${EMULATION_NAME}
15 Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
16 2002 Free Software Foundation, Inc.
20 This file is part of GLD, the Gnu Linker.
22 This program is free software; you can redistribute it and/or modify
23 it under the terms of the GNU General Public License as published by
24 the Free Software Foundation; either version 2 of the License, or
25 (at your option) any later version.
27 This program is distributed in the hope that it will be useful,
28 but WITHOUT ANY WARRANTY; without even the implied warranty of
29 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 GNU General Public License for more details.
32 You should have received a copy of the GNU General Public License
33 along with this program; if not, write to the Free Software
34 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
36 #define TARGET_IS_${EMULATION_NAME}
40 #include "libiberty.h"
41 #include "safe-ctype.h"
53 #include "elf/common.h"
55 static void gld${EMULATION_NAME}_before_parse
57 static void gld${EMULATION_NAME}_vercheck
58 PARAMS ((lang_input_statement_type *));
59 static void gld${EMULATION_NAME}_stat_needed
60 PARAMS ((lang_input_statement_type *));
61 static boolean gld${EMULATION_NAME}_try_needed
62 PARAMS ((const char *, int));
63 static boolean gld${EMULATION_NAME}_search_needed
64 PARAMS ((const char *, const char *, int));
65 static void gld${EMULATION_NAME}_check_needed
66 PARAMS ((lang_input_statement_type *));
67 static void gld${EMULATION_NAME}_after_open
69 static void gld${EMULATION_NAME}_find_exp_assignment
70 PARAMS ((etree_type *));
71 static void gld${EMULATION_NAME}_find_statement_assignment
72 PARAMS ((lang_statement_union_type *));
73 static void gld${EMULATION_NAME}_before_allocation
75 static boolean gld${EMULATION_NAME}_open_dynamic_archive
76 PARAMS ((const char *, search_dirs_type *, lang_input_statement_type *));
77 static lang_output_section_statement_type *output_rel_find
78 PARAMS ((asection *));
79 static asection *output_prev_sec_find
80 PARAMS ((lang_output_section_statement_type *));
81 static boolean gld${EMULATION_NAME}_place_orphan
82 PARAMS ((lang_input_statement_type *, asection *));
83 static void gld${EMULATION_NAME}_finish
85 static char *gld${EMULATION_NAME}_get_script
86 PARAMS ((int *isfile));
90 # Import any needed special functions and/or overrides.
92 if test -n "$EXTRA_EM_FILE" ; then
93 . ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
96 # Functions in this file can be overridden by setting the LDEMUL_* shell
97 # variables. If the name of the overriding function is the same as is
98 # defined in this file, then don't output this file's version.
99 # If a different overriding name is given then output the standard function
100 # as presumably it is called from the overriding function.
102 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
103 cat >>e${EMULATION_NAME}.c <<EOF
106 gld${EMULATION_NAME}_before_parse ()
108 const bfd_arch_info_type *arch = bfd_scan_arch ("${OUTPUT_ARCH}");
111 ldfile_output_architecture = arch->arch;
112 ldfile_output_machine = arch->mach;
113 ldfile_output_machine_name = arch->printable_name;
116 ldfile_output_architecture = bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`;
117 config.dynamic_link = ${DYNAMIC_LINK-true};
118 config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo true ; else echo false ; fi`;
124 cat >>e${EMULATION_NAME}.c <<EOF
126 /* These variables are required to pass information back and forth
127 between after_open and check_needed and stat_needed and vercheck. */
129 static struct bfd_link_needed_list *global_needed;
130 static struct stat global_stat;
131 static boolean global_found;
132 static struct bfd_link_needed_list *global_vercheck_needed;
133 static boolean global_vercheck_failed;
136 /* On Linux, it's possible to have different versions of the same
137 shared library linked against different versions of libc. The
138 dynamic linker somehow tags which libc version to use in
139 /etc/ld.so.cache, and, based on the libc that it sees in the
140 executable, chooses which version of the shared library to use.
142 We try to do a similar check here by checking whether this shared
143 library needs any other shared libraries which may conflict with
144 libraries we have already included in the link. If it does, we
145 skip it, and try to find another shared library farther on down the
148 This is called via lang_for_each_input_file.
149 GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
150 which we are checking. This sets GLOBAL_VERCHECK_FAILED if we find
151 a conflicting version. */
154 gld${EMULATION_NAME}_vercheck (s)
155 lang_input_statement_type *s;
158 struct bfd_link_needed_list *l;
160 if (global_vercheck_failed)
162 if (s->the_bfd == NULL
163 || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
166 soname = bfd_elf_get_dt_soname (s->the_bfd);
168 soname = lbasename (bfd_get_filename (s->the_bfd));
170 for (l = global_vercheck_needed; l != NULL; l = l->next)
174 if (strcmp (soname, l->name) == 0)
176 /* Probably can't happen, but it's an easy check. */
180 if (strchr (l->name, '/') != NULL)
183 suffix = strstr (l->name, ".so.");
187 suffix += sizeof ".so." - 1;
189 if (strncmp (soname, l->name, suffix - l->name) == 0)
191 /* Here we know that S is a dynamic object FOO.SO.VER1, and
192 the object we are considering needs a dynamic object
193 FOO.SO.VER2, and VER1 and VER2 are different. This
194 appears to be a version mismatch, so we tell the caller
195 to try a different version of this library. */
196 global_vercheck_failed = true;
203 /* See if an input file matches a DT_NEEDED entry by running stat on
207 gld${EMULATION_NAME}_stat_needed (s)
208 lang_input_statement_type *s;
216 if (s->the_bfd == NULL)
219 if (bfd_stat (s->the_bfd, &st) != 0)
221 einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
225 if (st.st_dev == global_stat.st_dev
226 && st.st_ino == global_stat.st_ino)
232 /* We issue a warning if it looks like we are including two
233 different versions of the same shared library. For example,
234 there may be a problem if -lc picks up libc.so.6 but some other
235 shared library has a DT_NEEDED entry of libc.so.5. This is a
236 heuristic test, and it will only work if the name looks like
237 NAME.so.VERSION. FIXME: Depending on file names is error-prone.
238 If we really want to issue warnings about mixing version numbers
239 of shared libraries, we need to find a better way. */
241 if (strchr (global_needed->name, '/') != NULL)
243 suffix = strstr (global_needed->name, ".so.");
246 suffix += sizeof ".so." - 1;
248 soname = bfd_elf_get_dt_soname (s->the_bfd);
250 soname = lbasename (s->filename);
252 if (strncmp (soname, global_needed->name, suffix - global_needed->name) == 0)
253 einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
254 global_needed->name, global_needed->by, soname);
258 /* This function is called for each possible name for a dynamic object
259 named by a DT_NEEDED entry. The FORCE parameter indicates whether
260 to skip the check for a conflicting version. */
263 gld${EMULATION_NAME}_try_needed (name, force)
270 abfd = bfd_openr (name, bfd_get_target (output_bfd));
273 if (! bfd_check_format (abfd, bfd_object))
278 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
284 /* For DT_NEEDED, they have to match. */
285 if (abfd->xvec != output_bfd->xvec)
291 /* Check whether this object would include any conflicting library
292 versions. If FORCE is set, then we skip this check; we use this
293 the second time around, if we couldn't find any compatible
294 instance of the shared library. */
298 struct bfd_link_needed_list *needed;
300 if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
301 einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
305 global_vercheck_needed = needed;
306 global_vercheck_failed = false;
307 lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
308 if (global_vercheck_failed)
311 /* Return false to force the caller to move on to try
312 another file on the search path. */
316 /* But wait! It gets much worse. On Linux, if a shared
317 library does not use libc at all, we are supposed to skip
318 it the first time around in case we encounter a shared
319 library later on with the same name which does use the
320 version of libc that we want. This is much too horrible
321 to use on any system other than Linux. */
326 cat >>e${EMULATION_NAME}.c <<EOF
328 struct bfd_link_needed_list *l;
330 for (l = needed; l != NULL; l = l->next)
331 if (strncmp (l->name, "libc.so", 7) == 0)
343 cat >>e${EMULATION_NAME}.c <<EOF
347 /* We've found a dynamic object matching the DT_NEEDED entry. */
349 /* We have already checked that there is no other input file of the
350 same name. We must now check again that we are not including the
351 same file twice. We need to do this because on many systems
352 libc.so is a symlink to, e.g., libc.so.1. The SONAME entry will
353 reference libc.so.1. If we have already included libc.so, we
354 don't want to include libc.so.1 if they are the same file, and we
355 can only check that using stat. */
357 if (bfd_stat (abfd, &global_stat) != 0)
358 einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
360 /* First strip off everything before the last '/'. */
361 soname = lbasename (abfd->filename);
363 if (trace_file_tries)
364 info_msg (_("found %s at %s\n"), soname, name);
366 global_found = false;
367 lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
370 /* Return true to indicate that we found the file, even though
371 we aren't going to do anything with it. */
375 /* Tell the ELF backend that we don't want the output file to have a
376 DT_NEEDED entry for this file. */
377 bfd_elf_set_dt_needed_name (abfd, "");
379 /* Tell the ELF backend that the output file needs a DT_NEEDED
380 entry for this file if it is used to resolve the reference in
382 bfd_elf_set_dt_needed_soname (abfd, soname);
384 /* Add this file into the symbol table. */
385 if (! bfd_link_add_symbols (abfd, &link_info))
386 einfo ("%F%B: could not read symbols: %E\n", abfd);
392 /* Search for a needed file in a path. */
395 gld${EMULATION_NAME}_search_needed (path, name, force)
404 return gld${EMULATION_NAME}_try_needed (name, force);
406 if (path == NULL || *path == '\0')
411 char *filename, *sset;
413 s = strchr (path, ':');
415 s = path + strlen (path);
417 filename = (char *) xmalloc (s - path + len + 2);
422 memcpy (filename, path, s - path);
423 filename[s - path] = '/';
424 sset = filename + (s - path) + 1;
428 if (gld${EMULATION_NAME}_try_needed (filename, force))
442 if [ "x${host}" = "x${target}" ] ; then
443 case " ${EMULATION_LIBPATH} " in
444 *" ${EMULATION_NAME} "*)
447 cat >>e${EMULATION_NAME}.c <<EOF
449 /* For a native linker, check the file /etc/ld.so.conf for directories
450 in which we may find shared libraries. /etc/ld.so.conf is really
451 only meaningful on Linux. */
453 static boolean gld${EMULATION_NAME}_check_ld_so_conf
454 PARAMS ((const char *, int));
457 gld${EMULATION_NAME}_check_ld_so_conf (name, force)
461 static boolean initialized;
462 static char *ld_so_conf;
468 f = fopen ("/etc/ld.so.conf", FOPEN_RT);
477 b = (char *) xmalloc (alloc);
479 while ((c = getc (f)) != EOF)
481 if (len + 1 >= alloc)
484 b = (char *) xrealloc (b, alloc);
497 if (len > 0 && b[len - 1] != ':')
505 if (len > 0 && b[len - 1] == ':')
524 if (ld_so_conf == NULL)
527 return gld${EMULATION_NAME}_search_needed (ld_so_conf, name, force);
536 cat >>e${EMULATION_NAME}.c <<EOF
538 /* See if an input file matches a DT_NEEDED entry by name. */
541 gld${EMULATION_NAME}_check_needed (s)
542 lang_input_statement_type *s;
547 if (s->filename != NULL)
551 if (strcmp (s->filename, global_needed->name) == 0)
557 if (s->search_dirs_flag)
559 f = strrchr (s->filename, '/');
561 && strcmp (f + 1, global_needed->name) == 0)
569 if (s->the_bfd != NULL)
573 soname = bfd_elf_get_dt_soname (s->the_bfd);
575 && strcmp (soname, global_needed->name) == 0)
585 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
586 cat >>e${EMULATION_NAME}.c <<EOF
588 /* This is called after all the input files have been opened. */
591 gld${EMULATION_NAME}_after_open ()
593 struct bfd_link_needed_list *needed, *l;
595 /* We only need to worry about this when doing a final link. */
596 if (link_info.relocateable || link_info.shared)
599 /* Get the list of files which appear in DT_NEEDED entries in
600 dynamic objects included in the link (often there will be none).
601 For each such file, we want to track down the corresponding
602 library, and include the symbol table in the link. This is what
603 the runtime dynamic linker will do. Tracking the files down here
604 permits one dynamic object to include another without requiring
605 special action by the person doing the link. Note that the
606 needed list can actually grow while we are stepping through this
608 needed = bfd_elf_get_needed_list (output_bfd, &link_info);
609 for (l = needed; l != NULL; l = l->next)
611 struct bfd_link_needed_list *ll;
614 /* If we've already seen this file, skip it. */
615 for (ll = needed; ll != l; ll = ll->next)
616 if (strcmp (ll->name, l->name) == 0)
621 /* See if this file was included in the link explicitly. */
623 global_found = false;
624 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
628 if (trace_file_tries)
629 info_msg (_("%s needed by %B\n"), l->name, l->by);
631 /* We need to find this file and include the symbol table. We
632 want to search for the file in the same way that the dynamic
633 linker will search. That means that we want to use
634 rpath_link, rpath, then the environment variable
635 LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
636 entries (native only), then the linker script LIB_SEARCH_DIRS.
637 We do not search using the -L arguments.
639 We search twice. The first time, we skip objects which may
640 introduce version mismatches. The second time, we force
641 their use. See gld${EMULATION_NAME}_vercheck comment. */
642 for (force = 0; force < 2; force++)
645 search_dirs_type *search;
647 if [ "x${host}" = "x${target}" ] ; then
648 case " ${EMULATION_LIBPATH} " in
649 *" ${EMULATION_NAME} "*)
650 cat >>e${EMULATION_NAME}.c <<EOF
651 const char *lib_path;
652 struct bfd_link_needed_list *rp;
658 cat >>e${EMULATION_NAME}.c <<EOF
660 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
664 if [ "x${host}" = "x${target}" ] ; then
665 case " ${EMULATION_LIBPATH} " in
666 *" ${EMULATION_NAME} "*)
667 cat >>e${EMULATION_NAME}.c <<EOF
668 if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
671 if (command_line.rpath_link == NULL
672 && command_line.rpath == NULL)
674 lib_path = (const char *) getenv ("LD_RUN_PATH");
675 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name,
679 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
680 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, force))
684 rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
685 for (; !found && rp != NULL; rp = rp->next)
687 found = (rp->by == l->by
688 && gld${EMULATION_NAME}_search_needed (rp->name,
699 cat >>e${EMULATION_NAME}.c <<EOF
700 len = strlen (l->name);
701 for (search = search_head; search != NULL; search = search->next)
707 filename = (char *) xmalloc (strlen (search->name) + len + 2);
708 sprintf (filename, "%s/%s", search->name, l->name);
709 if (gld${EMULATION_NAME}_try_needed (filename, force))
716 if [ "x${host}" = "x${target}" ] ; then
717 case " ${EMULATION_LIBPATH} " in
718 *" ${EMULATION_NAME} "*)
721 cat >>e${EMULATION_NAME}.c <<EOF
722 if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
731 cat >>e${EMULATION_NAME}.c <<EOF
737 einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
745 cat >>e${EMULATION_NAME}.c <<EOF
747 /* Look through an expression for an assignment statement. */
750 gld${EMULATION_NAME}_find_exp_assignment (exp)
753 struct bfd_link_hash_entry *h;
755 switch (exp->type.node_class)
758 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
759 false, false, false);
763 /* We call record_link_assignment even if the symbol is defined.
764 This is because if it is defined by a dynamic object, we
765 actually want to use the value defined by the linker script,
766 not the value from the dynamic object (because we are setting
767 symbols like etext). If the symbol is defined by a regular
768 object, then, as it happens, calling record_link_assignment
773 if (strcmp (exp->assign.dst, ".") != 0)
775 if (! (bfd_elf${ELFSIZE}_record_link_assignment
776 (output_bfd, &link_info, exp->assign.dst,
777 exp->type.node_class == etree_provide ? true : false)))
778 einfo ("%P%F: failed to record assignment to %s: %E\n",
781 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
785 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
786 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
790 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
791 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
792 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
796 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
805 /* This is called by the before_allocation routine via
806 lang_for_each_statement. It locates any assignment statements, and
807 tells the ELF backend about them, in case they are assignments to
808 symbols which are referred to by dynamic objects. */
811 gld${EMULATION_NAME}_find_statement_assignment (s)
812 lang_statement_union_type *s;
814 if (s->header.type == lang_assignment_statement_enum)
815 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
820 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
821 if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
822 ELF_INTERPRETER_SET_DEFAULT="
825 sinterp->contents = ${ELF_INTERPRETER_NAME};
826 sinterp->_raw_size = strlen (sinterp->contents) + 1;
831 ELF_INTERPRETER_SET_DEFAULT=
833 cat >>e${EMULATION_NAME}.c <<EOF
835 /* This is called after the sections have been attached to output
836 sections, but before any sizes or addresses have been set. */
839 gld${EMULATION_NAME}_before_allocation ()
844 /* If we are going to make any variable assignments, we need to let
845 the ELF backend know about them in case the variables are
846 referred to by dynamic objects. */
847 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
849 /* Let the ELF backend work out the sizes of any sections required
850 by dynamic linking. */
851 rpath = command_line.rpath;
853 rpath = (const char *) getenv ("LD_RUN_PATH");
854 if (! (bfd_elf${ELFSIZE}_size_dynamic_sections
855 (output_bfd, command_line.soname, rpath,
856 command_line.filter_shlib,
857 (const char * const *) command_line.auxiliary_filters,
858 &link_info, &sinterp, lang_elf_version_info)))
859 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
860 ${ELF_INTERPRETER_SET_DEFAULT}
861 /* Let the user override the dynamic linker we are using. */
862 if (command_line.interpreter != NULL
865 sinterp->contents = (bfd_byte *) command_line.interpreter;
866 sinterp->_raw_size = strlen (command_line.interpreter) + 1;
869 /* Look for any sections named .gnu.warning. As a GNU extensions,
870 we treat such sections as containing warning messages. We print
871 out the warning message, and then zero out the section size so
872 that it does not get copied into the output file. */
875 LANG_FOR_EACH_INPUT_STATEMENT (is)
882 if (is->just_syms_flag)
885 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
889 sz = bfd_section_size (is->the_bfd, s);
890 msg = xmalloc ((size_t) sz + 1);
891 if (! bfd_get_section_contents (is->the_bfd, s, msg, (file_ptr) 0, sz))
892 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
895 ret = link_info.callbacks->warning (&link_info, msg,
897 is->the_bfd, (asection *) NULL,
902 /* Clobber the section size, so that we don't waste copying the
903 warning into the output file. */
912 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
913 cat >>e${EMULATION_NAME}.c <<EOF
915 /* Try to open a dynamic archive. This is where we know that ELF
916 dynamic libraries have an extension of .so (or .sl on oddball systems
920 gld${EMULATION_NAME}_open_dynamic_archive (arch, search, entry)
922 search_dirs_type *search;
923 lang_input_statement_type *entry;
925 const char *filename;
928 if (! entry->is_archive)
931 filename = entry->filename;
933 /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
934 is defined, but it does not seem worth the headache to optimize
935 away those two bytes of space. */
936 string = (char *) xmalloc (strlen (search->name)
939 #ifdef EXTRA_SHLIB_EXTENSION
940 + strlen (EXTRA_SHLIB_EXTENSION)
944 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
946 #ifdef EXTRA_SHLIB_EXTENSION
947 /* Try the .so extension first. If that fails build a new filename
948 using EXTRA_SHLIB_EXTENSION. */
949 if (! ldfile_try_open_bfd (string, entry))
950 sprintf (string, "%s/lib%s%s%s", search->name,
951 filename, arch, EXTRA_SHLIB_EXTENSION);
954 if (! ldfile_try_open_bfd (string, entry))
960 entry->filename = string;
962 /* We have found a dynamic object to include in the link. The ELF
963 backend linker will create a DT_NEEDED entry in the .dynamic
964 section naming this file. If this file includes a DT_SONAME
965 entry, it will be used. Otherwise, the ELF linker will just use
966 the name of the file. For an archive found by searching, like
967 this one, the DT_NEEDED entry should consist of just the name of
968 the file, without the path information used to find it. Note
969 that we only need to do this if we have a dynamic object; an
970 archive will never be referenced by a DT_NEEDED entry.
972 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
973 very pretty. I haven't been able to think of anything that is
975 if (bfd_check_format (entry->the_bfd, bfd_object)
976 && (entry->the_bfd->flags & DYNAMIC) != 0)
978 ASSERT (entry->is_archive && entry->search_dirs_flag);
980 /* Rather than duplicating the logic above. Just use the
981 filename we recorded earlier. */
983 filename = lbasename (entry->filename);
984 bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
993 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
994 cat >>e${EMULATION_NAME}.c <<EOF
996 /* A variant of lang_output_section_find. Used by place_orphan. */
998 static lang_output_section_statement_type *
999 output_rel_find (sec)
1002 lang_statement_union_type *u;
1003 lang_output_section_statement_type *lookup;
1004 lang_output_section_statement_type *last = NULL;
1005 lang_output_section_statement_type *last_rel = NULL;
1006 lang_output_section_statement_type *last_rel_alloc = NULL;
1007 int rela = sec->name[4] == 'a';
1009 for (u = lang_output_section_statement.head; u; u = lookup->next)
1011 lookup = &u->output_section_statement;
1012 if (strncmp (".rel", lookup->name, 4) == 0)
1014 /* Don't place after .rel.plt as doing so results in wrong
1015 dynamic tags. Also, place allocated reloc sections before
1017 int lookrela = lookup->name[4] == 'a';
1019 if (strcmp (".plt", lookup->name + 4 + lookrela) == 0
1020 || (lookup->bfd_section != NULL
1021 && (lookup->bfd_section->flags & SEC_ALLOC) == 0))
1024 if (rela == lookrela)
1026 if (lookup->bfd_section != NULL
1027 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1028 last_rel_alloc = lookup;
1033 return last_rel_alloc;
1041 /* Find the last output section before given output statement.
1042 Used by place_orphan. */
1045 output_prev_sec_find (os)
1046 lang_output_section_statement_type *os;
1048 asection *s = (asection *) NULL;
1049 lang_statement_union_type *u;
1050 lang_output_section_statement_type *lookup;
1052 for (u = lang_output_section_statement.head;
1053 u != (lang_statement_union_type *) NULL;
1056 lookup = &u->output_section_statement;
1060 if (lookup->bfd_section != NULL && lookup->bfd_section->owner != NULL)
1061 s = lookup->bfd_section;
1067 /* Place an orphan section. We use this to put random SHF_ALLOC
1068 sections in the right segment. */
1070 struct orphan_save {
1071 lang_output_section_statement_type *os;
1073 lang_statement_union_type **stmt;
1077 gld${EMULATION_NAME}_place_orphan (file, s)
1078 lang_input_statement_type *file;
1081 static struct orphan_save hold_text;
1082 static struct orphan_save hold_rodata;
1083 static struct orphan_save hold_data;
1084 static struct orphan_save hold_bss;
1085 static struct orphan_save hold_rel;
1086 static struct orphan_save hold_interp;
1087 static struct orphan_save hold_sdata;
1088 static int count = 1;
1089 struct orphan_save *place;
1090 lang_statement_list_type *old;
1091 lang_statement_list_type add;
1092 etree_type *address;
1093 const char *secname;
1094 const char *ps = NULL;
1095 lang_output_section_statement_type *os;
1098 secname = bfd_get_section_name (s->owner, s);
1099 if (! link_info.relocateable
1100 && link_info.combreloc
1101 && strncmp (secname, ".rel", 4) == 0)
1103 if (secname[4] == 'a')
1104 secname = ".rela.dyn";
1106 secname = ".rel.dyn";
1110 if (isdyn || (!config.unique_orphan_sections && !unique_section_p (secname)))
1112 /* Look through the script to see where to place this section. */
1113 os = lang_output_section_find (secname);
1116 && (os->bfd_section == NULL
1117 || ((s->flags ^ os->bfd_section->flags)
1118 & (SEC_LOAD | SEC_ALLOC)) == 0))
1120 /* We already have an output section statement with this
1121 name, and its bfd section, if any, has compatible flags. */
1122 lang_add_section (&os->children, s, os, file);
1127 if (hold_text.os == NULL)
1128 hold_text.os = lang_output_section_find (".text");
1130 /* If this is a final link, then always put .gnu.warning.SYMBOL
1131 sections into the .text section to get them out of the way. */
1132 if (! link_info.shared
1133 && ! link_info.relocateable
1134 && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
1135 && hold_text.os != NULL)
1137 lang_add_section (&hold_text.os->children, s, hold_text.os, file);
1141 /* Decide which segment the section should go in based on the
1142 section name and section flags. We put loadable .note sections
1143 right after the .interp section, so that the PT_NOTE segment is
1144 stored right after the program headers where the OS can read it
1145 in the first page. */
1146 #define HAVE_SECTION(hold, name) \
1147 (hold.os != NULL || (hold.os = lang_output_section_find (name)) != NULL)
1149 if ((s->flags & SEC_EXCLUDE) != 0 && !link_info.relocateable)
1151 if (s->output_section == NULL)
1152 s->output_section = bfd_abs_section_ptr;
1157 if ((s->flags & SEC_ALLOC) == 0)
1159 else if ((s->flags & SEC_LOAD) != 0
1160 && strncmp (secname, ".note", 5) == 0
1161 && HAVE_SECTION (hold_interp, ".interp"))
1162 place = &hold_interp;
1163 else if ((s->flags & SEC_HAS_CONTENTS) == 0
1164 && HAVE_SECTION (hold_bss, ".bss"))
1166 else if ((s->flags & SEC_SMALL_DATA) != 0
1167 && HAVE_SECTION (hold_sdata, ".sdata"))
1168 place = &hold_sdata;
1169 else if ((s->flags & SEC_READONLY) == 0
1170 && HAVE_SECTION (hold_data, ".data"))
1172 else if (strncmp (secname, ".rel", 4) == 0
1173 && (s->flags & SEC_LOAD) != 0
1174 && (hold_rel.os != NULL
1175 || (hold_rel.os = output_rel_find (s)) != NULL))
1177 else if ((s->flags & (SEC_CODE | SEC_READONLY)) == SEC_READONLY
1178 && HAVE_SECTION (hold_rodata, ".rodata"))
1179 place = &hold_rodata;
1180 else if ((s->flags & (SEC_CODE | SEC_READONLY)) == (SEC_CODE | SEC_READONLY)
1181 && hold_text.os != NULL)
1186 /* Choose a unique name for the section. This will be needed if the
1187 same section name appears in the input file with different
1188 loadable or allocatable characteristics. */
1189 if (bfd_get_section_by_name (output_bfd, secname) != NULL)
1191 secname = bfd_get_unique_section_name (output_bfd, secname, &count);
1192 if (secname == NULL)
1193 einfo ("%F%P: place_orphan failed: %E\n");
1196 /* Start building a list of statements for this section.
1197 First save the current statement pointer. */
1200 /* If we have found an appropriate place for the output section
1201 statements for this orphan, add them to our own private list,
1202 inserting them later into the global statement list. */
1206 lang_list_init (stat_ptr);
1209 if (config.build_constructors)
1211 /* If the name of the section is representable in C, then create
1212 symbols to mark the start and the end of the section. */
1213 for (ps = secname; *ps != '\0'; ps++)
1214 if (! ISALNUM (*ps) && *ps != '_')
1219 etree_type *e_align;
1221 symname = (char *) xmalloc (ps - secname + sizeof "__start_");
1222 sprintf (symname, "__start_%s", secname);
1223 e_align = exp_unop (ALIGN_K,
1224 exp_intop ((bfd_vma) 1 << s->alignment_power));
1225 lang_add_assignment (exp_assop ('=', symname, e_align));
1229 if (link_info.relocateable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
1230 address = exp_intop ((bfd_vma) 0);
1234 os = lang_enter_output_section_statement (secname, address, 0,
1236 (etree_type *) NULL,
1237 (etree_type *) NULL,
1238 (etree_type *) NULL);
1240 lang_add_section (&os->children, s, os, file);
1242 lang_leave_output_section_statement
1243 ((bfd_vma) 0, "*default*",
1244 (struct lang_output_section_phdr_list *) NULL, NULL);
1246 if (config.build_constructors && *ps == '\0')
1250 /* lang_leave_ouput_section_statement resets stat_ptr. Put
1251 stat_ptr back where we want it. */
1255 symname = (char *) xmalloc (ps - secname + sizeof "__stop_");
1256 sprintf (symname, "__stop_%s", secname);
1257 lang_add_assignment (exp_assop ('=', symname,
1258 exp_nameop (NAME, ".")));
1261 /* Restore the global list pointer. */
1264 if (place != NULL && os->bfd_section != NULL)
1266 asection *snew, **pps;
1268 snew = os->bfd_section;
1270 /* Shuffle the bfd section list to make the output file look
1271 neater. This is really only cosmetic. */
1272 if (place->section == NULL)
1274 asection *bfd_section = place->os->bfd_section;
1276 /* If the output statement hasn't been used to place
1277 any input sections (and thus doesn't have an output
1278 bfd_section), look for the closest prior output statement
1279 having an output section. */
1280 if (bfd_section == NULL)
1281 bfd_section = output_prev_sec_find (place->os);
1283 if (bfd_section != NULL && bfd_section != snew)
1284 place->section = &bfd_section->next;
1287 if (place->section != NULL)
1289 /* Unlink the section. */
1290 for (pps = &output_bfd->sections; *pps != snew; pps = &(*pps)->next)
1292 bfd_section_list_remove (output_bfd, pps);
1294 /* Now tack it on to the "place->os" section list. */
1295 bfd_section_list_insert (output_bfd, place->section, snew);
1298 /* Save the end of this list. Further ophans of this type will
1299 follow the one we've just added. */
1300 place->section = &snew->next;
1302 /* The following is non-cosmetic. We try to put the output
1303 statements in some sort of reasonable order here, because
1304 they determine the final load addresses of the orphan
1305 sections. In addition, placing output statements in the
1306 wrong order may require extra segments. For instance,
1307 given a typical situation of all read-only sections placed
1308 in one segment and following that a segment containing all
1309 the read-write sections, we wouldn't want to place an orphan
1310 read/write section before or amongst the read-only ones. */
1311 if (add.head != NULL)
1313 if (place->stmt == NULL)
1315 /* Put the new statement list right at the head. */
1316 *add.tail = place->os->header.next;
1317 place->os->header.next = add.head;
1321 /* Put it after the last orphan statement we added. */
1322 *add.tail = *place->stmt;
1323 *place->stmt = add.head;
1326 /* Fix the global list pointer if we happened to tack our
1327 new list at the tail. */
1328 if (*old->tail == add.head)
1329 old->tail = add.tail;
1331 /* Save the end of this list. */
1332 place->stmt = add.tail;
1341 if test x"$LDEMUL_FINISH" != xgld"$EMULATION_NAME"_finish; then
1342 cat >>e${EMULATION_NAME}.c <<EOF
1345 gld${EMULATION_NAME}_finish ()
1347 if (bfd_elf${ELFSIZE}_discard_info (output_bfd, &link_info))
1349 lang_reset_memory_regions ();
1351 /* Resize the sections. */
1352 lang_size_sections (stat_ptr->head, abs_output_section,
1353 &stat_ptr->head, 0, (bfd_vma) 0, NULL);
1355 /* Redo special stuff. */
1356 ldemul_after_allocation ();
1358 /* Do the assignments again. */
1359 lang_do_assignments (stat_ptr->head, abs_output_section,
1360 (fill_type *) 0, (bfd_vma) 0);
1366 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1367 cat >>e${EMULATION_NAME}.c <<EOF
1370 gld${EMULATION_NAME}_get_script (isfile)
1374 if test -n "$COMPILE_IN"
1376 # Scripts compiled in.
1378 # sed commands to quote an ld script as a C string.
1379 sc="-f stringify.sed"
1381 cat >>e${EMULATION_NAME}.c <<EOF
1385 if (link_info.relocateable == true && config.build_constructors == true)
1388 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1389 echo ' ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c
1390 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1391 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1392 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1393 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
1394 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1395 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1397 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1398 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1399 echo ' ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1400 sed $sc ldscripts/${EMULATION_NAME}.xsc >> e${EMULATION_NAME}.c
1402 echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c
1403 sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
1405 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1406 echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c
1407 sed $sc ldscripts/${EMULATION_NAME}.xc >> e${EMULATION_NAME}.c
1409 echo ' ; else return' >> e${EMULATION_NAME}.c
1410 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1411 echo '; }' >> e${EMULATION_NAME}.c
1414 # Scripts read from the filesystem.
1416 cat >>e${EMULATION_NAME}.c <<EOF
1420 if (link_info.relocateable == true && config.build_constructors == true)
1421 return "ldscripts/${EMULATION_NAME}.xu";
1422 else if (link_info.relocateable == true)
1423 return "ldscripts/${EMULATION_NAME}.xr";
1424 else if (!config.text_read_only)
1425 return "ldscripts/${EMULATION_NAME}.xbn";
1426 else if (!config.magic_demand_paged)
1427 return "ldscripts/${EMULATION_NAME}.xn";
1428 else if (link_info.shared)
1429 return "ldscripts/${EMULATION_NAME}.xs";
1431 return "ldscripts/${EMULATION_NAME}.x";
1438 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1440 if test x"$LDEMUL_PARSE_ARGS" != xgld"$EMULATION_NAME"_parse_args; then
1442 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1443 cat >>e${EMULATION_NAME}.c <<EOF
1444 $PARSE_AND_LIST_PROLOGUE
1448 cat >>e${EMULATION_NAME}.c <<EOF
1452 #define OPTION_DISABLE_NEW_DTAGS (400)
1453 #define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
1454 #define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
1455 #define OPTION_EH_FRAME_HDR (OPTION_GROUP + 1)
1457 static struct option longopts[] =
1461 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1462 cat >>e${EMULATION_NAME}.c <<EOF
1463 /* getopt allows abbreviations, so we do this to stop it from
1464 treating -d/-e as abbreviations for these options. */
1465 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1466 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1467 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1468 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1469 {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
1470 {"Bgroup", no_argument, NULL, OPTION_GROUP},
1471 {"Bgroup", no_argument, NULL, OPTION_GROUP},
1475 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
1476 cat >>e${EMULATION_NAME}.c <<EOF
1477 $PARSE_AND_LIST_LONGOPTS
1481 cat >>e${EMULATION_NAME}.c <<EOF
1482 {NULL, no_argument, NULL, 0}
1486 static int gld${EMULATION_NAME}_parse_args PARAMS ((int, char **));
1489 gld${EMULATION_NAME}_parse_args (argc, argv)
1495 static int prevoptind = -1;
1496 int prevopterr = opterr;
1499 if (prevoptind != optind)
1503 prevoptind = optind;
1505 optc = getopt_long_only (argc, argv,
1506 "-${PARSE_AND_LIST_SHORTOPTS}z:", longopts,
1508 opterr = prevopterr;
1515 optind = prevoptind;
1520 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1521 cat >>e${EMULATION_NAME}.c <<EOF
1522 case OPTION_DISABLE_NEW_DTAGS:
1523 link_info.new_dtags = false;
1526 case OPTION_ENABLE_NEW_DTAGS:
1527 link_info.new_dtags = true;
1530 case OPTION_EH_FRAME_HDR:
1531 link_info.eh_frame_hdr = true;
1535 link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
1536 /* Groups must be self-contained. */
1537 link_info.no_undefined = true;
1541 if (strcmp (optarg, "initfirst") == 0)
1542 link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
1543 else if (strcmp (optarg, "interpose") == 0)
1544 link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
1545 else if (strcmp (optarg, "loadfltr") == 0)
1546 link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
1547 else if (strcmp (optarg, "nodefaultlib") == 0)
1548 link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
1549 else if (strcmp (optarg, "nodelete") == 0)
1550 link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
1551 else if (strcmp (optarg, "nodlopen") == 0)
1552 link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
1553 else if (strcmp (optarg, "nodump") == 0)
1554 link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
1555 else if (strcmp (optarg, "now") == 0)
1557 link_info.flags |= (bfd_vma) DF_BIND_NOW;
1558 link_info.flags_1 |= (bfd_vma) DF_1_NOW;
1560 else if (strcmp (optarg, "origin") == 0)
1562 link_info.flags |= (bfd_vma) DF_ORIGIN;
1563 link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
1565 else if (strcmp (optarg, "defs") == 0)
1566 link_info.no_undefined = true;
1567 else if (strcmp (optarg, "muldefs") == 0)
1568 link_info.allow_multiple_definition = true;
1569 else if (strcmp (optarg, "combreloc") == 0)
1570 link_info.combreloc = true;
1571 else if (strcmp (optarg, "nocombreloc") == 0)
1572 link_info.combreloc = false;
1573 else if (strcmp (optarg, "nocopyreloc") == 0)
1574 link_info.nocopyreloc = true;
1575 /* What about the other Solaris -z options? FIXME. */
1580 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
1581 cat >>e${EMULATION_NAME}.c <<EOF
1582 $PARSE_AND_LIST_ARGS_CASES
1586 cat >>e${EMULATION_NAME}.c <<EOF
1595 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1596 cat >>e${EMULATION_NAME}.c <<EOF
1598 static void gld${EMULATION_NAME}_list_options PARAMS ((FILE * file));
1601 gld${EMULATION_NAME}_list_options (file)
1606 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1607 cat >>e${EMULATION_NAME}.c <<EOF
1608 fprintf (file, _(" -Bgroup\t\tSelects group name lookup rules for DSO\n"));
1609 fprintf (file, _(" --disable-new-dtags\tDisable new dynamic tags\n"));
1610 fprintf (file, _(" --enable-new-dtags\tEnable new dynamic tags\n"));
1611 fprintf (file, _(" --eh-frame-hdr\tCreate .eh_frame_hdr section\n"));
1612 fprintf (file, _(" -z combreloc\t\tMerge dynamic relocs into one section and sort\n"));
1613 fprintf (file, _(" -z defs\t\tDisallows undefined symbols\n"));
1614 fprintf (file, _(" -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
1615 fprintf (file, _(" -z interpose\t\tMark object to interpose all DSOs but executable\n"));
1616 fprintf (file, _(" -z loadfltr\t\tMark object requiring immediate process\n"));
1617 fprintf (file, _(" -z muldefs\t\tAllow multiple definitions\n"));
1618 fprintf (file, _(" -z nocombreloc\tDon't merge dynamic relocs into one section\n"));
1619 fprintf (file, _(" -z nocopyreloc\tDon't create copy relocs\n"));
1620 fprintf (file, _(" -z nodefaultlib\tMark object not to use default search paths\n"));
1621 fprintf (file, _(" -z nodelete\t\tMark DSO non-deletable at runtime\n"));
1622 fprintf (file, _(" -z nodlopen\t\tMark DSO not available to dlopen\n"));
1623 fprintf (file, _(" -z nodump\t\tMark DSO not available to dldump\n"));
1624 fprintf (file, _(" -z now\t\tMark object non-lazy runtime binding\n"));
1625 fprintf (file, _(" -z origin\t\tMark object requiring immediate \$ORIGIN processing\n\t\t\t at runtime\n"));
1626 fprintf (file, _(" -z KEYWORD\t\tIgnored for Solaris compatibility\n"));
1630 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
1631 cat >>e${EMULATION_NAME}.c <<EOF
1632 $PARSE_AND_LIST_OPTIONS
1636 cat >>e${EMULATION_NAME}.c <<EOF
1640 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
1641 cat >>e${EMULATION_NAME}.c <<EOF
1642 $PARSE_AND_LIST_EPILOGUE
1647 if test x"$LDEMUL_PARSE_ARGS" != xgld"$EMULATION_NAME"_parse_args; then
1648 cat >>e${EMULATION_NAME}.c <<EOF
1649 #define gld${EMULATION_NAME}_parse_args NULL
1652 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1653 cat >>e${EMULATION_NAME}.c <<EOF
1654 #define gld${EMULATION_NAME}_list_options NULL
1659 cat >>e${EMULATION_NAME}.c <<EOF
1661 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1663 ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
1664 ${LDEMUL_SYSLIB-syslib_default},
1665 ${LDEMUL_HLL-hll_default},
1666 ${LDEMUL_AFTER_PARSE-after_parse_default},
1667 ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
1668 ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
1669 ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
1670 ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
1671 ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
1672 ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
1673 "${EMULATION_NAME}",
1675 ${LDEMUL_FINISH-gld${EMULATION_NAME}_finish},
1676 ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
1677 ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
1678 ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
1679 ${LDEMUL_SET_SYMBOLS-NULL},
1680 ${LDEMUL_PARSE_ARGS-gld${EMULATION_NAME}_parse_args},
1681 ${LDEMUL_UNRECOGNIZED_FILE-NULL},
1682 ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
1683 ${LDEMUL_RECOGNIZED_FILE-NULL},
1684 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
1685 ${LDEMUL_NEW_VERS_PATTERN-NULL}