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, 2003 Free Software Foundation, Inc.
17 Written by Steve Chamberlain <sac@cygnus.com>
18 ELF support by Ian Lance Taylor <ian@cygnus.com>
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"
54 #include "elf/common.h"
56 static void gld${EMULATION_NAME}_before_parse
58 static void gld${EMULATION_NAME}_vercheck
59 PARAMS ((lang_input_statement_type *));
60 static void gld${EMULATION_NAME}_stat_needed
61 PARAMS ((lang_input_statement_type *));
62 static bfd_boolean gld${EMULATION_NAME}_try_needed
63 PARAMS ((const char *, int));
64 static bfd_boolean gld${EMULATION_NAME}_search_needed
65 PARAMS ((const char *, const char *, int));
66 static void gld${EMULATION_NAME}_check_needed
67 PARAMS ((lang_input_statement_type *));
68 static void gld${EMULATION_NAME}_after_open
70 static void gld${EMULATION_NAME}_find_exp_assignment
71 PARAMS ((etree_type *));
72 static void gld${EMULATION_NAME}_find_statement_assignment
73 PARAMS ((lang_statement_union_type *));
74 static void gld${EMULATION_NAME}_before_allocation
76 static bfd_boolean gld${EMULATION_NAME}_open_dynamic_archive
77 PARAMS ((const char *, search_dirs_type *, lang_input_statement_type *));
78 static lang_output_section_statement_type *output_rel_find
79 PARAMS ((asection *));
80 static asection *output_prev_sec_find
81 PARAMS ((lang_output_section_statement_type *));
82 static bfd_boolean gld${EMULATION_NAME}_place_orphan
83 PARAMS ((lang_input_statement_type *, asection *));
84 static void gld${EMULATION_NAME}_finish
86 static char *gld${EMULATION_NAME}_get_script
87 PARAMS ((int *isfile));
91 # Import any needed special functions and/or overrides.
93 if test -n "$EXTRA_EM_FILE" ; then
94 . ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
97 # Functions in this file can be overridden by setting the LDEMUL_* shell
98 # variables. If the name of the overriding function is the same as is
99 # defined in this file, then don't output this file's version.
100 # If a different overriding name is given then output the standard function
101 # as presumably it is called from the overriding function.
103 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
104 cat >>e${EMULATION_NAME}.c <<EOF
107 gld${EMULATION_NAME}_before_parse ()
109 const bfd_arch_info_type *arch = bfd_scan_arch ("${OUTPUT_ARCH}");
112 ldfile_output_architecture = arch->arch;
113 ldfile_output_machine = arch->mach;
114 ldfile_output_machine_name = arch->printable_name;
117 ldfile_output_architecture = bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`;
118 config.dynamic_link = ${DYNAMIC_LINK-TRUE};
119 config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
125 cat >>e${EMULATION_NAME}.c <<EOF
127 /* These variables are required to pass information back and forth
128 between after_open and check_needed and stat_needed and vercheck. */
130 static struct bfd_link_needed_list *global_needed;
131 static struct stat global_stat;
132 static bfd_boolean global_found;
133 static struct bfd_link_needed_list *global_vercheck_needed;
134 static bfd_boolean global_vercheck_failed;
137 /* On Linux, it's possible to have different versions of the same
138 shared library linked against different versions of libc. The
139 dynamic linker somehow tags which libc version to use in
140 /etc/ld.so.cache, and, based on the libc that it sees in the
141 executable, chooses which version of the shared library to use.
143 We try to do a similar check here by checking whether this shared
144 library needs any other shared libraries which may conflict with
145 libraries we have already included in the link. If it does, we
146 skip it, and try to find another shared library farther on down the
149 This is called via lang_for_each_input_file.
150 GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
151 which we are checking. This sets GLOBAL_VERCHECK_FAILED if we find
152 a conflicting version. */
155 gld${EMULATION_NAME}_vercheck (s)
156 lang_input_statement_type *s;
159 struct bfd_link_needed_list *l;
161 if (global_vercheck_failed)
163 if (s->the_bfd == NULL
164 || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
167 soname = bfd_elf_get_dt_soname (s->the_bfd);
169 soname = lbasename (bfd_get_filename (s->the_bfd));
171 for (l = global_vercheck_needed; l != NULL; l = l->next)
175 if (strcmp (soname, l->name) == 0)
177 /* Probably can't happen, but it's an easy check. */
181 if (strchr (l->name, '/') != NULL)
184 suffix = strstr (l->name, ".so.");
188 suffix += sizeof ".so." - 1;
190 if (strncmp (soname, l->name, suffix - l->name) == 0)
192 /* Here we know that S is a dynamic object FOO.SO.VER1, and
193 the object we are considering needs a dynamic object
194 FOO.SO.VER2, and VER1 and VER2 are different. This
195 appears to be a version mismatch, so we tell the caller
196 to try a different version of this library. */
197 global_vercheck_failed = TRUE;
204 /* See if an input file matches a DT_NEEDED entry by running stat on
208 gld${EMULATION_NAME}_stat_needed (s)
209 lang_input_statement_type *s;
217 if (s->the_bfd == NULL)
220 if (bfd_stat (s->the_bfd, &st) != 0)
222 einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
226 if (st.st_dev == global_stat.st_dev
227 && st.st_ino == global_stat.st_ino)
233 /* We issue a warning if it looks like we are including two
234 different versions of the same shared library. For example,
235 there may be a problem if -lc picks up libc.so.6 but some other
236 shared library has a DT_NEEDED entry of libc.so.5. This is a
237 heuristic test, and it will only work if the name looks like
238 NAME.so.VERSION. FIXME: Depending on file names is error-prone.
239 If we really want to issue warnings about mixing version numbers
240 of shared libraries, we need to find a better way. */
242 if (strchr (global_needed->name, '/') != NULL)
244 suffix = strstr (global_needed->name, ".so.");
247 suffix += sizeof ".so." - 1;
249 soname = bfd_elf_get_dt_soname (s->the_bfd);
251 soname = lbasename (s->filename);
253 if (strncmp (soname, global_needed->name, suffix - global_needed->name) == 0)
254 einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
255 global_needed->name, global_needed->by, soname);
259 /* This function is called for each possible name for a dynamic object
260 named by a DT_NEEDED entry. The FORCE parameter indicates whether
261 to skip the check for a conflicting version. */
264 gld${EMULATION_NAME}_try_needed (name, force)
271 abfd = bfd_openr (name, bfd_get_target (output_bfd));
274 if (! bfd_check_format (abfd, bfd_object))
279 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
285 /* For DT_NEEDED, they have to match. */
286 if (abfd->xvec != output_bfd->xvec)
292 /* Check whether this object would include any conflicting library
293 versions. If FORCE is set, then we skip this check; we use this
294 the second time around, if we couldn't find any compatible
295 instance of the shared library. */
299 struct bfd_link_needed_list *needed;
301 if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
302 einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
306 global_vercheck_needed = needed;
307 global_vercheck_failed = FALSE;
308 lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
309 if (global_vercheck_failed)
312 /* Return FALSE to force the caller to move on to try
313 another file on the search path. */
317 /* But wait! It gets much worse. On Linux, if a shared
318 library does not use libc at all, we are supposed to skip
319 it the first time around in case we encounter a shared
320 library later on with the same name which does use the
321 version of libc that we want. This is much too horrible
322 to use on any system other than Linux. */
327 cat >>e${EMULATION_NAME}.c <<EOF
329 struct bfd_link_needed_list *l;
331 for (l = needed; l != NULL; l = l->next)
332 if (strncmp (l->name, "libc.so", 7) == 0)
344 cat >>e${EMULATION_NAME}.c <<EOF
348 /* We've found a dynamic object matching the DT_NEEDED entry. */
350 /* We have already checked that there is no other input file of the
351 same name. We must now check again that we are not including the
352 same file twice. We need to do this because on many systems
353 libc.so is a symlink to, e.g., libc.so.1. The SONAME entry will
354 reference libc.so.1. If we have already included libc.so, we
355 don't want to include libc.so.1 if they are the same file, and we
356 can only check that using stat. */
358 if (bfd_stat (abfd, &global_stat) != 0)
359 einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
361 /* First strip off everything before the last '/'. */
362 soname = lbasename (abfd->filename);
364 if (trace_file_tries)
365 info_msg (_("found %s at %s\n"), soname, name);
367 global_found = FALSE;
368 lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
371 /* Return TRUE to indicate that we found the file, even though
372 we aren't going to do anything with it. */
376 /* Tell the ELF backend that we don't want the output file to have a
377 DT_NEEDED entry for this file. */
378 bfd_elf_set_dt_needed_name (abfd, "");
380 /* Tell the ELF backend that the output file needs a DT_NEEDED
381 entry for this file if it is used to resolve the reference in
383 bfd_elf_set_dt_needed_soname (abfd, soname);
385 /* Add this file into the symbol table. */
386 if (! bfd_link_add_symbols (abfd, &link_info))
387 einfo ("%F%B: could not read symbols: %E\n", abfd);
393 /* Search for a needed file in a path. */
396 gld${EMULATION_NAME}_search_needed (path, name, force)
405 return gld${EMULATION_NAME}_try_needed (name, force);
407 if (path == NULL || *path == '\0')
412 char *filename, *sset;
414 s = strchr (path, ':');
416 s = path + strlen (path);
418 filename = (char *) xmalloc (s - path + len + 2);
423 memcpy (filename, path, s - path);
424 filename[s - path] = '/';
425 sset = filename + (s - path) + 1;
429 if (gld${EMULATION_NAME}_try_needed (filename, force))
443 if [ "x${USE_LIBPATH}" = xyes ] ; then
444 cat >>e${EMULATION_NAME}.c <<EOF
446 /* Add the sysroot to every entry in a colon-separated path. */
448 static char * gld${EMULATION_NAME}_add_sysroot PARAMS ((const char *));
451 gld${EMULATION_NAME}_add_sysroot (path)
461 if (path[i++] == ':')
467 len = len + (colons + 1) * strlen (ld_sysroot);
468 ret = xmalloc (len + 1);
469 strcpy (ret, ld_sysroot);
470 p = ret + strlen (ret);
476 strcpy (p, ld_sysroot);
489 cat >>e${EMULATION_NAME}.c <<EOF
490 /* For a native linker, check the file /etc/ld.so.conf for directories
491 in which we may find shared libraries. /etc/ld.so.conf is really
492 only meaningful on Linux. */
494 static bfd_boolean gld${EMULATION_NAME}_check_ld_so_conf
495 PARAMS ((const char *, int));
498 gld${EMULATION_NAME}_check_ld_so_conf (name, force)
502 static bfd_boolean initialized;
503 static char *ld_so_conf;
510 tmppath = concat (ld_sysroot, "/etc/ld.so.conf", NULL);
511 f = fopen (tmppath, FOPEN_RT);
521 b = (char *) xmalloc (alloc);
523 while ((c = getc (f)) != EOF)
525 if (len + 1 >= alloc)
528 b = (char *) xrealloc (b, alloc);
541 if (len > 0 && b[len - 1] != ':')
549 if (len > 0 && b[len - 1] == ':')
564 char *d = gld${EMULATION_NAME}_add_sysroot (b);
575 if (ld_so_conf == NULL)
578 return gld${EMULATION_NAME}_search_needed (ld_so_conf, name, force);
586 cat >>e${EMULATION_NAME}.c <<EOF
588 /* See if an input file matches a DT_NEEDED entry by name. */
591 gld${EMULATION_NAME}_check_needed (s)
592 lang_input_statement_type *s;
597 if (s->filename != NULL)
601 if (strcmp (s->filename, global_needed->name) == 0)
607 if (s->search_dirs_flag)
609 f = strrchr (s->filename, '/');
611 && strcmp (f + 1, global_needed->name) == 0)
619 if (s->the_bfd != NULL)
623 soname = bfd_elf_get_dt_soname (s->the_bfd);
625 && strcmp (soname, global_needed->name) == 0)
635 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
636 cat >>e${EMULATION_NAME}.c <<EOF
638 /* This is called after all the input files have been opened. */
641 gld${EMULATION_NAME}_after_open ()
643 struct bfd_link_needed_list *needed, *l;
645 /* We only need to worry about this when doing a final link. */
646 if (link_info.relocateable || !link_info.executable)
649 /* Get the list of files which appear in DT_NEEDED entries in
650 dynamic objects included in the link (often there will be none).
651 For each such file, we want to track down the corresponding
652 library, and include the symbol table in the link. This is what
653 the runtime dynamic linker will do. Tracking the files down here
654 permits one dynamic object to include another without requiring
655 special action by the person doing the link. Note that the
656 needed list can actually grow while we are stepping through this
658 needed = bfd_elf_get_needed_list (output_bfd, &link_info);
659 for (l = needed; l != NULL; l = l->next)
661 struct bfd_link_needed_list *ll;
664 /* If we've already seen this file, skip it. */
665 for (ll = needed; ll != l; ll = ll->next)
666 if (strcmp (ll->name, l->name) == 0)
671 /* See if this file was included in the link explicitly. */
673 global_found = FALSE;
674 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
678 if (trace_file_tries)
679 info_msg (_("%s needed by %B\n"), l->name, l->by);
681 /* We need to find this file and include the symbol table. We
682 want to search for the file in the same way that the dynamic
683 linker will search. That means that we want to use
684 rpath_link, rpath, then the environment variable
685 LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
686 entries (native only), then the linker script LIB_SEARCH_DIRS.
687 We do not search using the -L arguments.
689 We search twice. The first time, we skip objects which may
690 introduce version mismatches. The second time, we force
691 their use. See gld${EMULATION_NAME}_vercheck comment. */
692 for (force = 0; force < 2; force++)
695 search_dirs_type *search;
697 if [ "x${USE_LIBPATH}" = xyes ] ; then
698 cat >>e${EMULATION_NAME}.c <<EOF
699 const char *lib_path;
700 struct bfd_link_needed_list *rp;
704 cat >>e${EMULATION_NAME}.c <<EOF
706 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
710 if [ "x${USE_LIBPATH}" = xyes ] ; then
711 cat >>e${EMULATION_NAME}.c <<EOF
712 if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
717 if [ "x${NATIVE}" = xyes ] ; then
718 cat >>e${EMULATION_NAME}.c <<EOF
719 if (command_line.rpath_link == NULL
720 && command_line.rpath == NULL)
722 lib_path = (const char *) getenv ("LD_RUN_PATH");
723 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name,
727 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
728 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, force))
732 if [ "x${USE_LIBPATH}" = xyes ] ; then
733 cat >>e${EMULATION_NAME}.c <<EOF
735 rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
736 for (; !found && rp != NULL; rp = rp->next)
738 char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
739 found = (rp->by == l->by
740 && gld${EMULATION_NAME}_search_needed (tmpname,
750 cat >>e${EMULATION_NAME}.c <<EOF
751 len = strlen (l->name);
752 for (search = search_head; search != NULL; search = search->next)
758 filename = (char *) xmalloc (strlen (search->name) + len + 2);
759 sprintf (filename, "%s/%s", search->name, l->name);
760 if (gld${EMULATION_NAME}_try_needed (filename, force))
767 if [ "x${USE_LIBPATH}" = xyes ] ; then
770 cat >>e${EMULATION_NAME}.c <<EOF
771 if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
778 cat >>e${EMULATION_NAME}.c <<EOF
784 einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
792 cat >>e${EMULATION_NAME}.c <<EOF
794 /* Look through an expression for an assignment statement. */
797 gld${EMULATION_NAME}_find_exp_assignment (exp)
800 struct bfd_link_hash_entry *h;
802 switch (exp->type.node_class)
805 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
806 FALSE, FALSE, FALSE);
810 /* We call record_link_assignment even if the symbol is defined.
811 This is because if it is defined by a dynamic object, we
812 actually want to use the value defined by the linker script,
813 not the value from the dynamic object (because we are setting
814 symbols like etext). If the symbol is defined by a regular
815 object, then, as it happens, calling record_link_assignment
820 if (strcmp (exp->assign.dst, ".") != 0)
822 if (! (bfd_elf_record_link_assignment
823 (output_bfd, &link_info, exp->assign.dst,
824 exp->type.node_class == etree_provide ? TRUE : FALSE)))
825 einfo ("%P%F: failed to record assignment to %s: %E\n",
828 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
832 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
833 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
837 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
838 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
839 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
843 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
852 /* This is called by the before_allocation routine via
853 lang_for_each_statement. It locates any assignment statements, and
854 tells the ELF backend about them, in case they are assignments to
855 symbols which are referred to by dynamic objects. */
858 gld${EMULATION_NAME}_find_statement_assignment (s)
859 lang_statement_union_type *s;
861 if (s->header.type == lang_assignment_statement_enum)
862 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
867 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
868 if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
869 ELF_INTERPRETER_SET_DEFAULT="
872 sinterp->contents = ${ELF_INTERPRETER_NAME};
873 sinterp->_raw_size = strlen (sinterp->contents) + 1;
878 ELF_INTERPRETER_SET_DEFAULT=
880 cat >>e${EMULATION_NAME}.c <<EOF
882 /* This is called after the sections have been attached to output
883 sections, but before any sizes or addresses have been set. */
886 gld${EMULATION_NAME}_before_allocation ()
891 /* If we are going to make any variable assignments, we need to let
892 the ELF backend know about them in case the variables are
893 referred to by dynamic objects. */
894 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
896 /* Let the ELF backend work out the sizes of any sections required
897 by dynamic linking. */
898 rpath = command_line.rpath;
900 rpath = (const char *) getenv ("LD_RUN_PATH");
901 if (! (bfd_elf${ELFSIZE}_size_dynamic_sections
902 (output_bfd, command_line.soname, rpath,
903 command_line.filter_shlib,
904 (const char * const *) command_line.auxiliary_filters,
905 &link_info, &sinterp, lang_elf_version_info)))
906 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
907 ${ELF_INTERPRETER_SET_DEFAULT}
908 /* Let the user override the dynamic linker we are using. */
909 if (command_line.interpreter != NULL
912 sinterp->contents = (bfd_byte *) command_line.interpreter;
913 sinterp->_raw_size = strlen (command_line.interpreter) + 1;
916 /* Look for any sections named .gnu.warning. As a GNU extensions,
917 we treat such sections as containing warning messages. We print
918 out the warning message, and then zero out the section size so
919 that it does not get copied into the output file. */
922 LANG_FOR_EACH_INPUT_STATEMENT (is)
929 if (is->just_syms_flag)
932 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
936 sz = bfd_section_size (is->the_bfd, s);
937 msg = xmalloc ((size_t) sz + 1);
938 if (! bfd_get_section_contents (is->the_bfd, s, msg, (file_ptr) 0, sz))
939 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
942 ret = link_info.callbacks->warning (&link_info, msg,
944 is->the_bfd, (asection *) NULL,
949 /* Clobber the section size, so that we don't waste copying the
950 warning into the output file. */
959 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
960 cat >>e${EMULATION_NAME}.c <<EOF
962 /* Try to open a dynamic archive. This is where we know that ELF
963 dynamic libraries have an extension of .so (or .sl on oddball systems
967 gld${EMULATION_NAME}_open_dynamic_archive (arch, search, entry)
969 search_dirs_type *search;
970 lang_input_statement_type *entry;
972 const char *filename;
975 if (! entry->is_archive)
978 filename = entry->filename;
980 /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
981 is defined, but it does not seem worth the headache to optimize
982 away those two bytes of space. */
983 string = (char *) xmalloc (strlen (search->name)
986 #ifdef EXTRA_SHLIB_EXTENSION
987 + strlen (EXTRA_SHLIB_EXTENSION)
991 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
993 #ifdef EXTRA_SHLIB_EXTENSION
994 /* Try the .so extension first. If that fails build a new filename
995 using EXTRA_SHLIB_EXTENSION. */
996 if (! ldfile_try_open_bfd (string, entry))
997 sprintf (string, "%s/lib%s%s%s", search->name,
998 filename, arch, EXTRA_SHLIB_EXTENSION);
1001 if (! ldfile_try_open_bfd (string, entry))
1007 entry->filename = string;
1009 /* We have found a dynamic object to include in the link. The ELF
1010 backend linker will create a DT_NEEDED entry in the .dynamic
1011 section naming this file. If this file includes a DT_SONAME
1012 entry, it will be used. Otherwise, the ELF linker will just use
1013 the name of the file. For an archive found by searching, like
1014 this one, the DT_NEEDED entry should consist of just the name of
1015 the file, without the path information used to find it. Note
1016 that we only need to do this if we have a dynamic object; an
1017 archive will never be referenced by a DT_NEEDED entry.
1019 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
1020 very pretty. I haven't been able to think of anything that is
1022 if (bfd_check_format (entry->the_bfd, bfd_object)
1023 && (entry->the_bfd->flags & DYNAMIC) != 0)
1025 ASSERT (entry->is_archive && entry->search_dirs_flag);
1027 /* Rather than duplicating the logic above. Just use the
1028 filename we recorded earlier. */
1030 filename = lbasename (entry->filename);
1031 bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
1040 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
1041 cat >>e${EMULATION_NAME}.c <<EOF
1043 /* A variant of lang_output_section_find. Used by place_orphan. */
1045 static lang_output_section_statement_type *
1046 output_rel_find (sec)
1049 lang_statement_union_type *u;
1050 lang_output_section_statement_type *lookup;
1051 lang_output_section_statement_type *last = NULL;
1052 lang_output_section_statement_type *last_rel = NULL;
1053 lang_output_section_statement_type *last_rel_alloc = NULL;
1054 int rela = sec->name[4] == 'a';
1056 for (u = lang_output_section_statement.head; u; u = lookup->next)
1058 lookup = &u->output_section_statement;
1059 if (strncmp (".rel", lookup->name, 4) == 0)
1061 /* Don't place after .rel.plt as doing so results in wrong
1062 dynamic tags. Also, place allocated reloc sections before
1064 int lookrela = lookup->name[4] == 'a';
1066 if (strcmp (".plt", lookup->name + 4 + lookrela) == 0
1067 || (lookup->bfd_section != NULL
1068 && (lookup->bfd_section->flags & SEC_ALLOC) == 0))
1071 if (rela == lookrela)
1073 if (lookup->bfd_section != NULL
1074 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1075 last_rel_alloc = lookup;
1080 return last_rel_alloc;
1088 /* Find the last output section before given output statement.
1089 Used by place_orphan. */
1092 output_prev_sec_find (os)
1093 lang_output_section_statement_type *os;
1095 asection *s = (asection *) NULL;
1096 lang_statement_union_type *u;
1097 lang_output_section_statement_type *lookup;
1099 for (u = lang_output_section_statement.head;
1100 u != (lang_statement_union_type *) NULL;
1103 lookup = &u->output_section_statement;
1107 if (lookup->bfd_section != NULL && lookup->bfd_section->owner != NULL)
1108 s = lookup->bfd_section;
1114 /* Place an orphan section. We use this to put random SHF_ALLOC
1115 sections in the right segment. */
1117 struct orphan_save {
1118 lang_output_section_statement_type *os;
1120 lang_statement_union_type **stmt;
1121 lang_statement_union_type **os_tail;
1125 gld${EMULATION_NAME}_place_orphan (file, s)
1126 lang_input_statement_type *file;
1129 static struct orphan_save hold_text;
1130 static struct orphan_save hold_rodata;
1131 static struct orphan_save hold_data;
1132 static struct orphan_save hold_bss;
1133 static struct orphan_save hold_rel;
1134 static struct orphan_save hold_interp;
1135 static struct orphan_save hold_sdata;
1136 static int count = 1;
1137 struct orphan_save *place;
1138 lang_statement_list_type *old;
1139 lang_statement_list_type add;
1140 etree_type *address;
1141 const char *secname;
1142 const char *ps = NULL;
1143 lang_output_section_statement_type *os;
1144 lang_statement_union_type **os_tail;
1145 etree_type *load_base;
1148 secname = bfd_get_section_name (s->owner, s);
1149 if (! link_info.relocateable
1150 && link_info.combreloc
1151 && (s->flags & SEC_ALLOC)
1152 && strncmp (secname, ".rel", 4) == 0)
1154 if (secname[4] == 'a')
1155 secname = ".rela.dyn";
1157 secname = ".rel.dyn";
1161 if (isdyn || (!config.unique_orphan_sections && !unique_section_p (secname)))
1163 /* Look through the script to see where to place this section. */
1164 os = lang_output_section_find (secname);
1167 && (os->bfd_section == NULL
1168 || ((s->flags ^ os->bfd_section->flags)
1169 & (SEC_LOAD | SEC_ALLOC)) == 0))
1171 /* We already have an output section statement with this
1172 name, and its bfd section, if any, has compatible flags. */
1173 lang_add_section (&os->children, s, os, file);
1178 if (hold_text.os == NULL)
1179 hold_text.os = lang_output_section_find (".text");
1181 /* If this is a final link, then always put .gnu.warning.SYMBOL
1182 sections into the .text section to get them out of the way. */
1183 if (link_info.executable
1184 && ! link_info.relocateable
1185 && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
1186 && hold_text.os != NULL)
1188 lang_add_section (&hold_text.os->children, s, hold_text.os, file);
1192 /* Decide which segment the section should go in based on the
1193 section name and section flags. We put loadable .note sections
1194 right after the .interp section, so that the PT_NOTE segment is
1195 stored right after the program headers where the OS can read it
1196 in the first page. */
1197 #define HAVE_SECTION(hold, name) \
1198 (hold.os != NULL || (hold.os = lang_output_section_find (name)) != NULL)
1200 if ((s->flags & SEC_EXCLUDE) != 0 && !link_info.relocateable)
1202 if (s->output_section == NULL)
1203 s->output_section = bfd_abs_section_ptr;
1208 if ((s->flags & SEC_ALLOC) == 0)
1210 else if ((s->flags & SEC_LOAD) != 0
1211 && strncmp (secname, ".note", 5) == 0
1212 && HAVE_SECTION (hold_interp, ".interp"))
1213 place = &hold_interp;
1214 else if ((s->flags & SEC_HAS_CONTENTS) == 0
1215 && HAVE_SECTION (hold_bss, ".bss"))
1217 else if ((s->flags & SEC_SMALL_DATA) != 0
1218 && HAVE_SECTION (hold_sdata, ".sdata"))
1219 place = &hold_sdata;
1220 else if ((s->flags & SEC_READONLY) == 0
1221 && HAVE_SECTION (hold_data, ".data"))
1223 else if (strncmp (secname, ".rel", 4) == 0
1224 && (s->flags & SEC_LOAD) != 0
1225 && (hold_rel.os != NULL
1226 || (hold_rel.os = output_rel_find (s)) != NULL))
1228 else if ((s->flags & (SEC_CODE | SEC_READONLY)) == SEC_READONLY
1229 && HAVE_SECTION (hold_rodata, ".rodata"))
1230 place = &hold_rodata;
1231 else if ((s->flags & (SEC_CODE | SEC_READONLY)) == (SEC_CODE | SEC_READONLY)
1232 && hold_text.os != NULL)
1237 /* Choose a unique name for the section. This will be needed if the
1238 same section name appears in the input file with different
1239 loadable or allocatable characteristics. */
1240 if (bfd_get_section_by_name (output_bfd, secname) != NULL)
1242 secname = bfd_get_unique_section_name (output_bfd, secname, &count);
1243 if (secname == NULL)
1244 einfo ("%F%P: place_orphan failed: %E\n");
1247 /* Start building a list of statements for this section.
1248 First save the current statement pointer. */
1251 /* If we have found an appropriate place for the output section
1252 statements for this orphan, add them to our own private list,
1253 inserting them later into the global statement list. */
1257 lang_list_init (stat_ptr);
1260 if (config.build_constructors)
1262 /* If the name of the section is representable in C, then create
1263 symbols to mark the start and the end of the section. */
1264 for (ps = secname; *ps != '\0'; ps++)
1265 if (! ISALNUM (*ps) && *ps != '_')
1270 etree_type *e_align;
1272 symname = (char *) xmalloc (ps - secname + sizeof "__start_");
1273 sprintf (symname, "__start_%s", secname);
1274 e_align = exp_unop (ALIGN_K,
1275 exp_intop ((bfd_vma) 1 << s->alignment_power));
1276 lang_add_assignment (exp_assop ('=', symname, e_align));
1281 if (link_info.relocateable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
1282 address = exp_intop ((bfd_vma) 0);
1285 if (place != NULL && place->os->load_base != NULL)
1287 etree_type *lma_from_vma;
1288 lma_from_vma = exp_binop ('-', place->os->load_base,
1289 exp_nameop (ADDR, place->os->name));
1290 load_base = exp_binop ('+', lma_from_vma,
1291 exp_nameop (ADDR, secname));
1294 os_tail = lang_output_section_statement.tail;
1295 os = lang_enter_output_section_statement (secname, address, 0,
1297 (etree_type *) NULL,
1298 (etree_type *) NULL,
1301 lang_add_section (&os->children, s, os, file);
1303 lang_leave_output_section_statement
1304 ((bfd_vma) 0, "*default*",
1305 (struct lang_output_section_phdr_list *) NULL, NULL);
1307 if (config.build_constructors && *ps == '\0')
1311 /* lang_leave_ouput_section_statement resets stat_ptr. Put
1312 stat_ptr back where we want it. */
1316 symname = (char *) xmalloc (ps - secname + sizeof "__stop_");
1317 sprintf (symname, "__stop_%s", secname);
1318 lang_add_assignment (exp_assop ('=', symname,
1319 exp_nameop (NAME, ".")));
1322 /* Restore the global list pointer. */
1325 if (place != NULL && os->bfd_section != NULL)
1327 asection *snew, **pps;
1329 snew = os->bfd_section;
1331 /* Shuffle the bfd section list to make the output file look
1332 neater. This is really only cosmetic. */
1333 if (place->section == NULL)
1335 asection *bfd_section = place->os->bfd_section;
1337 /* If the output statement hasn't been used to place
1338 any input sections (and thus doesn't have an output
1339 bfd_section), look for the closest prior output statement
1340 having an output section. */
1341 if (bfd_section == NULL)
1342 bfd_section = output_prev_sec_find (place->os);
1344 if (bfd_section != NULL && bfd_section != snew)
1345 place->section = &bfd_section->next;
1348 if (place->section != NULL)
1350 /* Unlink the section. */
1351 for (pps = &output_bfd->sections; *pps != snew; pps = &(*pps)->next)
1353 bfd_section_list_remove (output_bfd, pps);
1355 /* Now tack it on to the "place->os" section list. */
1356 bfd_section_list_insert (output_bfd, place->section, snew);
1359 /* Save the end of this list. Further ophans of this type will
1360 follow the one we've just added. */
1361 place->section = &snew->next;
1363 /* The following is non-cosmetic. We try to put the output
1364 statements in some sort of reasonable order here, because
1365 they determine the final load addresses of the orphan
1366 sections. In addition, placing output statements in the
1367 wrong order may require extra segments. For instance,
1368 given a typical situation of all read-only sections placed
1369 in one segment and following that a segment containing all
1370 the read-write sections, we wouldn't want to place an orphan
1371 read/write section before or amongst the read-only ones. */
1372 if (add.head != NULL)
1374 lang_statement_union_type *newly_added_os;
1376 if (place->stmt == NULL)
1378 /* Put the new statement list right at the head. */
1379 *add.tail = place->os->header.next;
1380 place->os->header.next = add.head;
1382 place->os_tail = &place->os->next;
1386 /* Put it after the last orphan statement we added. */
1387 *add.tail = *place->stmt;
1388 *place->stmt = add.head;
1391 /* Fix the global list pointer if we happened to tack our
1392 new list at the tail. */
1393 if (*old->tail == add.head)
1394 old->tail = add.tail;
1396 /* Save the end of this list. */
1397 place->stmt = add.tail;
1399 /* Do the same for the list of output section statements. */
1400 newly_added_os = *os_tail;
1402 newly_added_os->output_section_statement.next = *place->os_tail;
1403 *place->os_tail = newly_added_os;
1404 place->os_tail = &newly_added_os->output_section_statement.next;
1406 /* Fixing the global list pointer here is a little different.
1407 We added to the list in lang_enter_output_section_statement,
1408 trimmed off the new output_section_statment above when
1409 assigning *os_tail = NULL, but possibly added it back in
1410 the same place when assigning *place->os_tail. */
1411 if (*os_tail == NULL)
1412 lang_output_section_statement.tail = os_tail;
1421 if test x"$LDEMUL_FINISH" != xgld"$EMULATION_NAME"_finish; then
1422 cat >>e${EMULATION_NAME}.c <<EOF
1425 gld${EMULATION_NAME}_finish ()
1427 if (bfd_elf${ELFSIZE}_discard_info (output_bfd, &link_info))
1429 lang_reset_memory_regions ();
1431 /* Resize the sections. */
1432 lang_size_sections (stat_ptr->head, abs_output_section,
1433 &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE);
1435 /* Redo special stuff. */
1436 ldemul_after_allocation ();
1438 /* Do the assignments again. */
1439 lang_do_assignments (stat_ptr->head, abs_output_section,
1440 (fill_type *) 0, (bfd_vma) 0);
1446 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1447 cat >>e${EMULATION_NAME}.c <<EOF
1450 gld${EMULATION_NAME}_get_script (isfile)
1454 if test -n "$COMPILE_IN"
1456 # Scripts compiled in.
1458 # sed commands to quote an ld script as a C string.
1459 sc="-f stringify.sed"
1461 cat >>e${EMULATION_NAME}.c <<EOF
1465 if (link_info.relocateable && config.build_constructors)
1468 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1469 echo ' ; else if (link_info.relocateable) return' >> e${EMULATION_NAME}.c
1470 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1471 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1472 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1473 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
1474 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1475 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1477 if test -n "$GENERATE_PIE_SCRIPT" ; then
1478 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1479 echo ' ; else if (link_info.pie && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1480 sed $sc ldscripts/${EMULATION_NAME}.xdc >> e${EMULATION_NAME}.c
1482 echo ' ; else if (link_info.pie) return' >> e${EMULATION_NAME}.c
1483 sed $sc ldscripts/${EMULATION_NAME}.xd >> e${EMULATION_NAME}.c
1485 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1486 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1487 echo ' ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1488 sed $sc ldscripts/${EMULATION_NAME}.xsc >> e${EMULATION_NAME}.c
1490 echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c
1491 sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
1493 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1494 echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c
1495 sed $sc ldscripts/${EMULATION_NAME}.xc >> e${EMULATION_NAME}.c
1497 echo ' ; else return' >> e${EMULATION_NAME}.c
1498 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1499 echo '; }' >> e${EMULATION_NAME}.c
1502 # Scripts read from the filesystem.
1504 cat >>e${EMULATION_NAME}.c <<EOF
1508 if (link_info.relocateable && config.build_constructors)
1509 return "ldscripts/${EMULATION_NAME}.xu";
1510 else if (link_info.relocateable)
1511 return "ldscripts/${EMULATION_NAME}.xr";
1512 else if (!config.text_read_only)
1513 return "ldscripts/${EMULATION_NAME}.xbn";
1515 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
1517 cat >>e${EMULATION_NAME}.c <<EOF
1518 else if (!config.magic_demand_paged)
1519 return "ldscripts/${EMULATION_NAME}.xn";
1522 if test -n "$GENERATE_PIE_SCRIPT" ; then
1523 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1524 cat >>e${EMULATION_NAME}.c <<EOF
1525 else if (link_info.pie && link_info.combreloc)
1526 return "ldscripts/${EMULATION_NAME}.xdc";
1529 cat >>e${EMULATION_NAME}.c <<EOF
1530 else if (link_info.pie)
1531 return "ldscripts/${EMULATION_NAME}.xd";
1534 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1535 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1536 cat >>e${EMULATION_NAME}.c <<EOF
1537 else if (link_info.shared && link_info.combreloc)
1538 return "ldscripts/${EMULATION_NAME}.xsc";
1541 cat >>e${EMULATION_NAME}.c <<EOF
1542 else if (link_info.shared)
1543 return "ldscripts/${EMULATION_NAME}.xs";
1546 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1547 cat >>e${EMULATION_NAME}.c <<EOF
1548 else if (link_info.combreloc)
1549 return "ldscripts/${EMULATION_NAME}.xc";
1552 cat >>e${EMULATION_NAME}.c <<EOF
1554 return "ldscripts/${EMULATION_NAME}.x";
1561 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1563 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1564 cat >>e${EMULATION_NAME}.c <<EOF
1565 $PARSE_AND_LIST_PROLOGUE
1569 cat >>e${EMULATION_NAME}.c <<EOF
1571 #define OPTION_DISABLE_NEW_DTAGS (400)
1572 #define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
1573 #define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
1574 #define OPTION_EH_FRAME_HDR (OPTION_GROUP + 1)
1576 static void gld${EMULATION_NAME}_add_options
1577 PARAMS ((int, char **, int, struct option **, int, struct option **));
1580 gld${EMULATION_NAME}_add_options (ns, shortopts, nl, longopts, nrl, really_longopts)
1584 struct option **longopts;
1585 int nrl ATTRIBUTE_UNUSED;
1586 struct option **really_longopts ATTRIBUTE_UNUSED;
1588 static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:";
1589 static const struct option xtra_long[] = {
1592 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1593 cat >>e${EMULATION_NAME}.c <<EOF
1594 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1595 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1596 {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
1597 {"Bgroup", no_argument, NULL, OPTION_GROUP},
1601 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
1602 cat >>e${EMULATION_NAME}.c <<EOF
1603 $PARSE_AND_LIST_LONGOPTS
1607 cat >>e${EMULATION_NAME}.c <<EOF
1608 {NULL, no_argument, NULL, 0}
1611 *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
1612 memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
1613 *longopts = (struct option *)
1614 xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
1615 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
1618 static bfd_boolean gld${EMULATION_NAME}_handle_option
1622 gld${EMULATION_NAME}_handle_option (optc)
1632 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1633 cat >>e${EMULATION_NAME}.c <<EOF
1634 case OPTION_DISABLE_NEW_DTAGS:
1635 link_info.new_dtags = FALSE;
1638 case OPTION_ENABLE_NEW_DTAGS:
1639 link_info.new_dtags = TRUE;
1642 case OPTION_EH_FRAME_HDR:
1643 link_info.eh_frame_hdr = TRUE;
1647 link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
1648 /* Groups must be self-contained. */
1649 link_info.no_undefined = TRUE;
1653 if (strcmp (optarg, "initfirst") == 0)
1654 link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
1655 else if (strcmp (optarg, "interpose") == 0)
1656 link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
1657 else if (strcmp (optarg, "loadfltr") == 0)
1658 link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
1659 else if (strcmp (optarg, "nodefaultlib") == 0)
1660 link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
1661 else if (strcmp (optarg, "nodelete") == 0)
1662 link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
1663 else if (strcmp (optarg, "nodlopen") == 0)
1664 link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
1665 else if (strcmp (optarg, "nodump") == 0)
1666 link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
1667 else if (strcmp (optarg, "now") == 0)
1669 link_info.flags |= (bfd_vma) DF_BIND_NOW;
1670 link_info.flags_1 |= (bfd_vma) DF_1_NOW;
1672 else if (strcmp (optarg, "origin") == 0)
1674 link_info.flags |= (bfd_vma) DF_ORIGIN;
1675 link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
1677 else if (strcmp (optarg, "defs") == 0)
1678 link_info.no_undefined = TRUE;
1679 else if (strcmp (optarg, "muldefs") == 0)
1680 link_info.allow_multiple_definition = TRUE;
1681 else if (strcmp (optarg, "combreloc") == 0)
1682 link_info.combreloc = TRUE;
1683 else if (strcmp (optarg, "nocombreloc") == 0)
1684 link_info.combreloc = FALSE;
1685 else if (strcmp (optarg, "nocopyreloc") == 0)
1686 link_info.nocopyreloc = TRUE;
1687 else if (strcmp (optarg, "execstack") == 0)
1689 link_info.execstack = TRUE;
1690 link_info.noexecstack = FALSE;
1692 else if (strcmp (optarg, "noexecstack") == 0)
1694 link_info.noexecstack = TRUE;
1695 link_info.execstack = FALSE;
1697 /* What about the other Solaris -z options? FIXME. */
1702 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
1703 cat >>e${EMULATION_NAME}.c <<EOF
1704 $PARSE_AND_LIST_ARGS_CASES
1708 cat >>e${EMULATION_NAME}.c <<EOF
1716 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1717 cat >>e${EMULATION_NAME}.c <<EOF
1719 static void gld${EMULATION_NAME}_list_options PARAMS ((FILE * file));
1722 gld${EMULATION_NAME}_list_options (file)
1727 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1728 cat >>e${EMULATION_NAME}.c <<EOF
1729 fprintf (file, _(" -Bgroup\t\tSelects group name lookup rules for DSO\n"));
1730 fprintf (file, _(" --disable-new-dtags\tDisable new dynamic tags\n"));
1731 fprintf (file, _(" --enable-new-dtags\tEnable new dynamic tags\n"));
1732 fprintf (file, _(" --eh-frame-hdr\tCreate .eh_frame_hdr section\n"));
1733 fprintf (file, _(" -z combreloc\t\tMerge dynamic relocs into one section and sort\n"));
1734 fprintf (file, _(" -z defs\t\tDisallows undefined symbols\n"));
1735 fprintf (file, _(" -z execstack\t\tMark executable as requiring executable stack\n"));
1736 fprintf (file, _(" -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
1737 fprintf (file, _(" -z interpose\t\tMark object to interpose all DSOs but executable\n"));
1738 fprintf (file, _(" -z loadfltr\t\tMark object requiring immediate process\n"));
1739 fprintf (file, _(" -z muldefs\t\tAllow multiple definitions\n"));
1740 fprintf (file, _(" -z nocombreloc\tDon't merge dynamic relocs into one section\n"));
1741 fprintf (file, _(" -z nocopyreloc\tDon't create copy relocs\n"));
1742 fprintf (file, _(" -z nodefaultlib\tMark object not to use default search paths\n"));
1743 fprintf (file, _(" -z nodelete\t\tMark DSO non-deletable at runtime\n"));
1744 fprintf (file, _(" -z nodlopen\t\tMark DSO not available to dlopen\n"));
1745 fprintf (file, _(" -z nodump\t\tMark DSO not available to dldump\n"));
1746 fprintf (file, _(" -z noexecstack\tMark executable as not requiring executable stack\n"));
1747 fprintf (file, _(" -z now\t\tMark object non-lazy runtime binding\n"));
1748 fprintf (file, _(" -z origin\t\tMark object requiring immediate \$ORIGIN processing\n\t\t\t at runtime\n"));
1749 fprintf (file, _(" -z KEYWORD\t\tIgnored for Solaris compatibility\n"));
1753 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
1754 cat >>e${EMULATION_NAME}.c <<EOF
1755 $PARSE_AND_LIST_OPTIONS
1759 cat >>e${EMULATION_NAME}.c <<EOF
1763 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
1764 cat >>e${EMULATION_NAME}.c <<EOF
1765 $PARSE_AND_LIST_EPILOGUE
1770 cat >>e${EMULATION_NAME}.c <<EOF
1771 #define gld${EMULATION_NAME}_add_options NULL
1772 #define gld${EMULATION_NAME}_handle_option NULL
1774 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1775 cat >>e${EMULATION_NAME}.c <<EOF
1776 #define gld${EMULATION_NAME}_list_options NULL
1781 cat >>e${EMULATION_NAME}.c <<EOF
1783 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1785 ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
1786 ${LDEMUL_SYSLIB-syslib_default},
1787 ${LDEMUL_HLL-hll_default},
1788 ${LDEMUL_AFTER_PARSE-after_parse_default},
1789 ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
1790 ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
1791 ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
1792 ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
1793 ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
1794 ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
1795 "${EMULATION_NAME}",
1797 ${LDEMUL_FINISH-gld${EMULATION_NAME}_finish},
1798 ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
1799 ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
1800 ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
1801 ${LDEMUL_SET_SYMBOLS-NULL},
1802 ${LDEMUL_PARSE_ARGS-NULL},
1803 gld${EMULATION_NAME}_add_options,
1804 gld${EMULATION_NAME}_handle_option,
1805 ${LDEMUL_UNRECOGNIZED_FILE-NULL},
1806 ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
1807 ${LDEMUL_RECOGNIZED_FILE-NULL},
1808 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
1809 ${LDEMUL_NEW_VERS_PATTERN-NULL}