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 /* Declare functions used by various EXTRA_EM_FILEs. */
57 static void gld${EMULATION_NAME}_before_parse (void);
58 static void gld${EMULATION_NAME}_after_open (void);
59 static void gld${EMULATION_NAME}_before_allocation (void);
60 static bfd_boolean gld${EMULATION_NAME}_place_orphan
61 (lang_input_statement_type *file, asection *s);
62 static void gld${EMULATION_NAME}_finish (void);
66 # Import any needed special functions and/or overrides.
68 if test -n "$EXTRA_EM_FILE" ; then
69 . ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
72 # Functions in this file can be overridden by setting the LDEMUL_* shell
73 # variables. If the name of the overriding function is the same as is
74 # defined in this file, then don't output this file's version.
75 # If a different overriding name is given then output the standard function
76 # as presumably it is called from the overriding function.
78 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
79 cat >>e${EMULATION_NAME}.c <<EOF
82 gld${EMULATION_NAME}_before_parse (void)
84 const bfd_arch_info_type *arch = bfd_scan_arch ("${OUTPUT_ARCH}");
87 ldfile_output_architecture = arch->arch;
88 ldfile_output_machine = arch->mach;
89 ldfile_output_machine_name = arch->printable_name;
92 ldfile_output_architecture = bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`;
93 config.dynamic_link = ${DYNAMIC_LINK-TRUE};
94 config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
100 cat >>e${EMULATION_NAME}.c <<EOF
102 /* These variables are required to pass information back and forth
103 between after_open and check_needed and stat_needed and vercheck. */
105 static struct bfd_link_needed_list *global_needed;
106 static struct stat global_stat;
107 static bfd_boolean global_found;
108 static struct bfd_link_needed_list *global_vercheck_needed;
109 static bfd_boolean global_vercheck_failed;
112 /* On Linux, it's possible to have different versions of the same
113 shared library linked against different versions of libc. The
114 dynamic linker somehow tags which libc version to use in
115 /etc/ld.so.cache, and, based on the libc that it sees in the
116 executable, chooses which version of the shared library to use.
118 We try to do a similar check here by checking whether this shared
119 library needs any other shared libraries which may conflict with
120 libraries we have already included in the link. If it does, we
121 skip it, and try to find another shared library farther on down the
124 This is called via lang_for_each_input_file.
125 GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
126 which we are checking. This sets GLOBAL_VERCHECK_FAILED if we find
127 a conflicting version. */
130 gld${EMULATION_NAME}_vercheck (lang_input_statement_type *s)
133 struct bfd_link_needed_list *l;
135 if (global_vercheck_failed)
137 if (s->the_bfd == NULL
138 || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
141 soname = bfd_elf_get_dt_soname (s->the_bfd);
143 soname = lbasename (bfd_get_filename (s->the_bfd));
145 for (l = global_vercheck_needed; l != NULL; l = l->next)
149 if (strcmp (soname, l->name) == 0)
151 /* Probably can't happen, but it's an easy check. */
155 if (strchr (l->name, '/') != NULL)
158 suffix = strstr (l->name, ".so.");
162 suffix += sizeof ".so." - 1;
164 if (strncmp (soname, l->name, suffix - l->name) == 0)
166 /* Here we know that S is a dynamic object FOO.SO.VER1, and
167 the object we are considering needs a dynamic object
168 FOO.SO.VER2, and VER1 and VER2 are different. This
169 appears to be a version mismatch, so we tell the caller
170 to try a different version of this library. */
171 global_vercheck_failed = TRUE;
178 /* See if an input file matches a DT_NEEDED entry by running stat on
182 gld${EMULATION_NAME}_stat_needed (lang_input_statement_type *s)
190 if (s->the_bfd == NULL)
193 if (bfd_stat (s->the_bfd, &st) != 0)
195 einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
199 if (st.st_dev == global_stat.st_dev
200 && st.st_ino == global_stat.st_ino)
206 /* We issue a warning if it looks like we are including two
207 different versions of the same shared library. For example,
208 there may be a problem if -lc picks up libc.so.6 but some other
209 shared library has a DT_NEEDED entry of libc.so.5. This is a
210 heuristic test, and it will only work if the name looks like
211 NAME.so.VERSION. FIXME: Depending on file names is error-prone.
212 If we really want to issue warnings about mixing version numbers
213 of shared libraries, we need to find a better way. */
215 if (strchr (global_needed->name, '/') != NULL)
217 suffix = strstr (global_needed->name, ".so.");
220 suffix += sizeof ".so." - 1;
222 soname = bfd_elf_get_dt_soname (s->the_bfd);
224 soname = lbasename (s->filename);
226 if (strncmp (soname, global_needed->name, suffix - global_needed->name) == 0)
227 einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
228 global_needed->name, global_needed->by, soname);
232 /* This function is called for each possible name for a dynamic object
233 named by a DT_NEEDED entry. The FORCE parameter indicates whether
234 to skip the check for a conflicting version. */
237 gld${EMULATION_NAME}_try_needed (const char *name, int force)
242 abfd = bfd_openr (name, bfd_get_target (output_bfd));
245 if (! bfd_check_format (abfd, bfd_object))
250 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
256 /* For DT_NEEDED, they have to match. */
257 if (abfd->xvec != output_bfd->xvec)
263 /* Check whether this object would include any conflicting library
264 versions. If FORCE is set, then we skip this check; we use this
265 the second time around, if we couldn't find any compatible
266 instance of the shared library. */
270 struct bfd_link_needed_list *needed;
272 if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
273 einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
277 global_vercheck_needed = needed;
278 global_vercheck_failed = FALSE;
279 lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
280 if (global_vercheck_failed)
283 /* Return FALSE to force the caller to move on to try
284 another file on the search path. */
288 /* But wait! It gets much worse. On Linux, if a shared
289 library does not use libc at all, we are supposed to skip
290 it the first time around in case we encounter a shared
291 library later on with the same name which does use the
292 version of libc that we want. This is much too horrible
293 to use on any system other than Linux. */
298 cat >>e${EMULATION_NAME}.c <<EOF
300 struct bfd_link_needed_list *l;
302 for (l = needed; l != NULL; l = l->next)
303 if (strncmp (l->name, "libc.so", 7) == 0)
315 cat >>e${EMULATION_NAME}.c <<EOF
319 /* We've found a dynamic object matching the DT_NEEDED entry. */
321 /* We have already checked that there is no other input file of the
322 same name. We must now check again that we are not including the
323 same file twice. We need to do this because on many systems
324 libc.so is a symlink to, e.g., libc.so.1. The SONAME entry will
325 reference libc.so.1. If we have already included libc.so, we
326 don't want to include libc.so.1 if they are the same file, and we
327 can only check that using stat. */
329 if (bfd_stat (abfd, &global_stat) != 0)
330 einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
332 /* First strip off everything before the last '/'. */
333 soname = lbasename (abfd->filename);
335 if (trace_file_tries)
336 info_msg (_("found %s at %s\n"), soname, name);
338 global_found = FALSE;
339 lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
342 /* Return TRUE to indicate that we found the file, even though
343 we aren't going to do anything with it. */
347 /* Tell the ELF backend that we don't want the output file to have a
348 DT_NEEDED entry for this file. */
349 bfd_elf_set_dt_needed_name (abfd, "");
351 /* Tell the ELF backend that the output file needs a DT_NEEDED
352 entry for this file if it is used to resolve the reference in
354 bfd_elf_set_dt_needed_soname (abfd, soname);
356 /* Add this file into the symbol table. */
357 if (! bfd_link_add_symbols (abfd, &link_info))
358 einfo ("%F%B: could not read symbols: %E\n", abfd);
364 /* Search for a needed file in a path. */
367 gld${EMULATION_NAME}_search_needed (const char *path, const char *name, int force)
373 return gld${EMULATION_NAME}_try_needed (name, force);
375 if (path == NULL || *path == '\0')
380 char *filename, *sset;
382 s = strchr (path, ':');
384 s = path + strlen (path);
386 filename = (char *) xmalloc (s - path + len + 2);
391 memcpy (filename, path, s - path);
392 filename[s - path] = '/';
393 sset = filename + (s - path) + 1;
397 if (gld${EMULATION_NAME}_try_needed (filename, force))
411 if [ "x${USE_LIBPATH}" = xyes ] ; then
412 cat >>e${EMULATION_NAME}.c <<EOF
414 /* Add the sysroot to every entry in a colon-separated path. */
417 gld${EMULATION_NAME}_add_sysroot (const char *path)
426 if (path[i++] == ':')
432 len = len + (colons + 1) * strlen (ld_sysroot);
433 ret = xmalloc (len + 1);
434 strcpy (ret, ld_sysroot);
435 p = ret + strlen (ret);
441 strcpy (p, ld_sysroot);
454 cat >>e${EMULATION_NAME}.c <<EOF
455 /* For a native linker, check the file /etc/ld.so.conf for directories
456 in which we may find shared libraries. /etc/ld.so.conf is really
457 only meaningful on Linux. */
460 gld${EMULATION_NAME}_check_ld_so_conf (const char *name, int force)
462 static bfd_boolean initialized;
463 static char *ld_so_conf;
470 tmppath = concat (ld_sysroot, "/etc/ld.so.conf", NULL);
471 f = fopen (tmppath, FOPEN_RT);
481 b = (char *) xmalloc (alloc);
483 while ((c = getc (f)) != EOF)
485 if (len + 1 >= alloc)
488 b = (char *) xrealloc (b, alloc);
501 if (len > 0 && b[len - 1] != ':')
509 if (len > 0 && b[len - 1] == ':')
524 char *d = gld${EMULATION_NAME}_add_sysroot (b);
535 if (ld_so_conf == NULL)
538 return gld${EMULATION_NAME}_search_needed (ld_so_conf, name, force);
546 cat >>e${EMULATION_NAME}.c <<EOF
548 /* See if an input file matches a DT_NEEDED entry by name. */
551 gld${EMULATION_NAME}_check_needed (lang_input_statement_type *s)
556 if (s->filename != NULL)
560 if (strcmp (s->filename, global_needed->name) == 0)
566 if (s->search_dirs_flag)
568 f = strrchr (s->filename, '/');
570 && strcmp (f + 1, global_needed->name) == 0)
578 if (s->the_bfd != NULL)
582 soname = bfd_elf_get_dt_soname (s->the_bfd);
584 && strcmp (soname, global_needed->name) == 0)
594 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
595 cat >>e${EMULATION_NAME}.c <<EOF
597 /* This is called after all the input files have been opened. */
600 gld${EMULATION_NAME}_after_open (void)
602 struct bfd_link_needed_list *needed, *l;
604 /* We only need to worry about this when doing a final link. */
605 if (link_info.relocatable || !link_info.executable)
608 /* Get the list of files which appear in DT_NEEDED entries in
609 dynamic objects included in the link (often there will be none).
610 For each such file, we want to track down the corresponding
611 library, and include the symbol table in the link. This is what
612 the runtime dynamic linker will do. Tracking the files down here
613 permits one dynamic object to include another without requiring
614 special action by the person doing the link. Note that the
615 needed list can actually grow while we are stepping through this
617 needed = bfd_elf_get_needed_list (output_bfd, &link_info);
618 for (l = needed; l != NULL; l = l->next)
620 struct bfd_link_needed_list *ll;
623 /* If we've already seen this file, skip it. */
624 for (ll = needed; ll != l; ll = ll->next)
625 if (strcmp (ll->name, l->name) == 0)
630 /* See if this file was included in the link explicitly. */
632 global_found = FALSE;
633 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
637 if (trace_file_tries)
638 info_msg (_("%s needed by %B\n"), l->name, l->by);
640 /* We need to find this file and include the symbol table. We
641 want to search for the file in the same way that the dynamic
642 linker will search. That means that we want to use
643 rpath_link, rpath, then the environment variable
644 LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
645 entries (native only), then the linker script LIB_SEARCH_DIRS.
646 We do not search using the -L arguments.
648 We search twice. The first time, we skip objects which may
649 introduce version mismatches. The second time, we force
650 their use. See gld${EMULATION_NAME}_vercheck comment. */
651 for (force = 0; force < 2; force++)
654 search_dirs_type *search;
656 if [ "x${USE_LIBPATH}" = xyes ] ; then
657 cat >>e${EMULATION_NAME}.c <<EOF
658 const char *lib_path;
659 struct bfd_link_needed_list *rp;
663 cat >>e${EMULATION_NAME}.c <<EOF
665 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
669 if [ "x${USE_LIBPATH}" = xyes ] ; then
670 cat >>e${EMULATION_NAME}.c <<EOF
671 if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
676 if [ "x${NATIVE}" = xyes ] ; then
677 cat >>e${EMULATION_NAME}.c <<EOF
678 if (command_line.rpath_link == NULL
679 && command_line.rpath == NULL)
681 lib_path = (const char *) getenv ("LD_RUN_PATH");
682 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name,
686 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
687 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, force))
691 if [ "x${USE_LIBPATH}" = xyes ] ; then
692 cat >>e${EMULATION_NAME}.c <<EOF
694 rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
695 for (; !found && rp != NULL; rp = rp->next)
697 char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
698 found = (rp->by == l->by
699 && gld${EMULATION_NAME}_search_needed (tmpname,
709 cat >>e${EMULATION_NAME}.c <<EOF
710 len = strlen (l->name);
711 for (search = search_head; search != NULL; search = search->next)
717 filename = (char *) xmalloc (strlen (search->name) + len + 2);
718 sprintf (filename, "%s/%s", search->name, l->name);
719 if (gld${EMULATION_NAME}_try_needed (filename, force))
726 if [ "x${USE_LIBPATH}" = xyes ] ; then
729 cat >>e${EMULATION_NAME}.c <<EOF
730 if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
737 cat >>e${EMULATION_NAME}.c <<EOF
743 einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
751 cat >>e${EMULATION_NAME}.c <<EOF
753 /* Look through an expression for an assignment statement. */
756 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
758 struct bfd_link_hash_entry *h;
760 switch (exp->type.node_class)
763 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
764 FALSE, FALSE, FALSE);
768 /* We call record_link_assignment even if the symbol is defined.
769 This is because if it is defined by a dynamic object, we
770 actually want to use the value defined by the linker script,
771 not the value from the dynamic object (because we are setting
772 symbols like etext). If the symbol is defined by a regular
773 object, then, as it happens, calling record_link_assignment
778 if (strcmp (exp->assign.dst, ".") != 0)
780 if (! (bfd_elf_record_link_assignment
781 (output_bfd, &link_info, exp->assign.dst,
782 exp->type.node_class == etree_provide ? TRUE : FALSE)))
783 einfo ("%P%F: failed to record assignment to %s: %E\n",
786 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
790 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
791 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
795 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
796 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
797 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
801 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
810 /* This is called by the before_allocation routine via
811 lang_for_each_statement. It locates any assignment statements, and
812 tells the ELF backend about them, in case they are assignments to
813 symbols which are referred to by dynamic objects. */
816 gld${EMULATION_NAME}_find_statement_assignment (lang_statement_union_type *s)
818 if (s->header.type == lang_assignment_statement_enum)
819 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
824 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
825 if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
826 ELF_INTERPRETER_SET_DEFAULT="
829 sinterp->contents = ${ELF_INTERPRETER_NAME};
830 sinterp->_raw_size = strlen (sinterp->contents) + 1;
835 ELF_INTERPRETER_SET_DEFAULT=
837 cat >>e${EMULATION_NAME}.c <<EOF
839 /* This is called after the sections have been attached to output
840 sections, but before any sizes or addresses have been set. */
843 gld${EMULATION_NAME}_before_allocation (void)
848 /* If we are going to make any variable assignments, we need to let
849 the ELF backend know about them in case the variables are
850 referred to by dynamic objects. */
851 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
853 /* Let the ELF backend work out the sizes of any sections required
854 by dynamic linking. */
855 rpath = command_line.rpath;
857 rpath = (const char *) getenv ("LD_RUN_PATH");
858 if (! (bfd_elf${ELFSIZE}_size_dynamic_sections
859 (output_bfd, command_line.soname, rpath,
860 command_line.filter_shlib,
861 (const char * const *) command_line.auxiliary_filters,
862 &link_info, &sinterp, lang_elf_version_info)))
863 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
864 ${ELF_INTERPRETER_SET_DEFAULT}
865 /* Let the user override the dynamic linker we are using. */
866 if (command_line.interpreter != NULL
869 sinterp->contents = (bfd_byte *) command_line.interpreter;
870 sinterp->_raw_size = strlen (command_line.interpreter) + 1;
873 /* Look for any sections named .gnu.warning. As a GNU extensions,
874 we treat such sections as containing warning messages. We print
875 out the warning message, and then zero out the section size so
876 that it does not get copied into the output file. */
879 LANG_FOR_EACH_INPUT_STATEMENT (is)
883 bfd_size_type prefix_len;
886 const char * gnu_warning_prefix = _("warning: ");
888 if (is->just_syms_flag)
891 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
895 sz = bfd_section_size (is->the_bfd, s);
896 prefix_len = strlen (gnu_warning_prefix);
897 msg = xmalloc ((size_t) (prefix_len + sz + 1));
898 strcpy (msg, gnu_warning_prefix);
899 if (! bfd_get_section_contents (is->the_bfd, s, msg + prefix_len,
901 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
903 msg[prefix_len + sz] = '\0';
904 ret = link_info.callbacks->warning (&link_info, msg,
906 is->the_bfd, (asection *) NULL,
911 /* Clobber the section size, so that we don't waste copying the
912 warning into the output file. */
921 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
922 cat >>e${EMULATION_NAME}.c <<EOF
924 /* Try to open a dynamic archive. This is where we know that ELF
925 dynamic libraries have an extension of .so (or .sl on oddball systems
929 gld${EMULATION_NAME}_open_dynamic_archive
930 (const char *arch, search_dirs_type *search, lang_input_statement_type *entry)
932 const char *filename;
935 if (! entry->is_archive)
938 filename = entry->filename;
940 /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
941 is defined, but it does not seem worth the headache to optimize
942 away those two bytes of space. */
943 string = (char *) xmalloc (strlen (search->name)
946 #ifdef EXTRA_SHLIB_EXTENSION
947 + strlen (EXTRA_SHLIB_EXTENSION)
951 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
953 #ifdef EXTRA_SHLIB_EXTENSION
954 /* Try the .so extension first. If that fails build a new filename
955 using EXTRA_SHLIB_EXTENSION. */
956 if (! ldfile_try_open_bfd (string, entry))
957 sprintf (string, "%s/lib%s%s%s", search->name,
958 filename, arch, EXTRA_SHLIB_EXTENSION);
961 if (! ldfile_try_open_bfd (string, entry))
967 entry->filename = string;
969 /* We have found a dynamic object to include in the link. The ELF
970 backend linker will create a DT_NEEDED entry in the .dynamic
971 section naming this file. If this file includes a DT_SONAME
972 entry, it will be used. Otherwise, the ELF linker will just use
973 the name of the file. For an archive found by searching, like
974 this one, the DT_NEEDED entry should consist of just the name of
975 the file, without the path information used to find it. Note
976 that we only need to do this if we have a dynamic object; an
977 archive will never be referenced by a DT_NEEDED entry.
979 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
980 very pretty. I haven't been able to think of anything that is
982 if (bfd_check_format (entry->the_bfd, bfd_object)
983 && (entry->the_bfd->flags & DYNAMIC) != 0)
985 ASSERT (entry->is_archive && entry->search_dirs_flag);
987 /* Rather than duplicating the logic above. Just use the
988 filename we recorded earlier. */
990 filename = lbasename (entry->filename);
991 bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
1000 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
1001 cat >>e${EMULATION_NAME}.c <<EOF
1003 /* A variant of lang_output_section_find. Used by place_orphan. */
1005 static lang_output_section_statement_type *
1006 output_rel_find (asection *sec, int isdyn)
1008 lang_statement_union_type *u;
1009 lang_output_section_statement_type *lookup;
1010 lang_output_section_statement_type *last = NULL;
1011 lang_output_section_statement_type *last_alloc = NULL;
1012 lang_output_section_statement_type *last_rel = NULL;
1013 lang_output_section_statement_type *last_rel_alloc = NULL;
1014 int rela = sec->name[4] == 'a';
1016 for (u = lang_output_section_statement.head; u; u = lookup->next)
1018 lookup = &u->output_section_statement;
1019 if (strncmp (".rel", lookup->name, 4) == 0)
1021 int lookrela = lookup->name[4] == 'a';
1023 /* .rel.dyn must come before all other reloc sections, to suit
1028 /* Don't place after .rel.plt as doing so results in wrong
1030 if (strcmp (".plt", lookup->name + 4 + lookrela) == 0)
1033 if (rela == lookrela || last_rel == NULL)
1035 if ((rela == lookrela || last_rel_alloc == NULL)
1036 && lookup->bfd_section != NULL
1037 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1038 last_rel_alloc = lookup;
1042 if (lookup->bfd_section != NULL
1043 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1044 last_alloc = lookup;
1048 return last_rel_alloc;
1059 /* Find the last output section before given output statement.
1060 Used by place_orphan. */
1063 output_prev_sec_find (lang_output_section_statement_type *os)
1065 asection *s = (asection *) NULL;
1066 lang_statement_union_type *u;
1067 lang_output_section_statement_type *lookup;
1069 for (u = lang_output_section_statement.head;
1070 u != (lang_statement_union_type *) NULL;
1073 lookup = &u->output_section_statement;
1077 if (lookup->bfd_section != NULL && lookup->bfd_section->owner != NULL)
1078 s = lookup->bfd_section;
1084 /* Place an orphan section. We use this to put random SHF_ALLOC
1085 sections in the right segment. */
1087 struct orphan_save {
1088 lang_output_section_statement_type *os;
1090 lang_statement_union_type **stmt;
1091 lang_statement_union_type **os_tail;
1095 gld${EMULATION_NAME}_place_orphan (lang_input_statement_type *file, asection *s)
1097 static struct orphan_save hold_text;
1098 static struct orphan_save hold_rodata;
1099 static struct orphan_save hold_data;
1100 static struct orphan_save hold_bss;
1101 static struct orphan_save hold_rel;
1102 static struct orphan_save hold_interp;
1103 static struct orphan_save hold_sdata;
1104 static int count = 1;
1105 struct orphan_save *place;
1106 lang_statement_list_type *old;
1107 lang_statement_list_type add;
1108 etree_type *address;
1109 const char *secname;
1110 const char *ps = NULL;
1111 lang_output_section_statement_type *os;
1112 lang_statement_union_type **os_tail;
1113 etree_type *load_base;
1116 secname = bfd_get_section_name (s->owner, s);
1117 if (! link_info.relocatable
1118 && link_info.combreloc
1119 && (s->flags & SEC_ALLOC)
1120 && strncmp (secname, ".rel", 4) == 0)
1122 if (secname[4] == 'a')
1123 secname = ".rela.dyn";
1125 secname = ".rel.dyn";
1129 if (isdyn || (!config.unique_orphan_sections && !unique_section_p (secname)))
1131 /* Look through the script to see where to place this section. */
1132 os = lang_output_section_find (secname);
1135 && (os->bfd_section == NULL
1136 || ((s->flags ^ os->bfd_section->flags)
1137 & (SEC_LOAD | SEC_ALLOC)) == 0))
1139 /* We already have an output section statement with this
1140 name, and its bfd section, if any, has compatible flags. */
1141 lang_add_section (&os->children, s, os, file);
1146 if (hold_text.os == NULL)
1147 hold_text.os = lang_output_section_find (".text");
1149 /* If this is a final link, then always put .gnu.warning.SYMBOL
1150 sections into the .text section to get them out of the way. */
1151 if (link_info.executable
1152 && ! link_info.relocatable
1153 && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
1154 && hold_text.os != NULL)
1156 lang_add_section (&hold_text.os->children, s, hold_text.os, file);
1160 /* Decide which segment the section should go in based on the
1161 section name and section flags. We put loadable .note sections
1162 right after the .interp section, so that the PT_NOTE segment is
1163 stored right after the program headers where the OS can read it
1164 in the first page. */
1165 #define HAVE_SECTION(hold, name) \
1166 (hold.os != NULL || (hold.os = lang_output_section_find (name)) != NULL)
1168 if ((s->flags & SEC_EXCLUDE) != 0 && !link_info.relocatable)
1170 if (s->output_section == NULL)
1171 s->output_section = bfd_abs_section_ptr;
1176 if ((s->flags & SEC_ALLOC) == 0)
1178 else if ((s->flags & SEC_LOAD) != 0
1179 && strncmp (secname, ".note", 5) == 0
1180 && HAVE_SECTION (hold_interp, ".interp"))
1181 place = &hold_interp;
1182 else if ((s->flags & SEC_HAS_CONTENTS) == 0
1183 && HAVE_SECTION (hold_bss, ".bss"))
1185 else if ((s->flags & SEC_SMALL_DATA) != 0
1186 && HAVE_SECTION (hold_sdata, ".sdata"))
1187 place = &hold_sdata;
1188 else if ((s->flags & SEC_READONLY) == 0
1189 && HAVE_SECTION (hold_data, ".data"))
1191 else if (strncmp (secname, ".rel", 4) == 0
1192 && (s->flags & SEC_LOAD) != 0
1193 && (hold_rel.os != NULL
1194 || (hold_rel.os = output_rel_find (s, isdyn)) != NULL))
1196 else if ((s->flags & (SEC_CODE | SEC_READONLY)) == SEC_READONLY
1197 && HAVE_SECTION (hold_rodata, ".rodata"))
1198 place = &hold_rodata;
1199 else if ((s->flags & (SEC_CODE | SEC_READONLY)) == (SEC_CODE | SEC_READONLY)
1200 && hold_text.os != NULL)
1205 /* Choose a unique name for the section. This will be needed if the
1206 same section name appears in the input file with different
1207 loadable or allocatable characteristics. */
1208 if (bfd_get_section_by_name (output_bfd, secname) != NULL)
1210 secname = bfd_get_unique_section_name (output_bfd, secname, &count);
1211 if (secname == NULL)
1212 einfo ("%F%P: place_orphan failed: %E\n");
1215 /* Start building a list of statements for this section.
1216 First save the current statement pointer. */
1219 /* If we have found an appropriate place for the output section
1220 statements for this orphan, add them to our own private list,
1221 inserting them later into the global statement list. */
1225 lang_list_init (stat_ptr);
1228 if (config.build_constructors)
1230 /* If the name of the section is representable in C, then create
1231 symbols to mark the start and the end of the section. */
1232 for (ps = secname; *ps != '\0'; ps++)
1233 if (! ISALNUM (*ps) && *ps != '_')
1238 etree_type *e_align;
1240 symname = (char *) xmalloc (ps - secname + sizeof "__start_");
1241 sprintf (symname, "__start_%s", secname);
1242 e_align = exp_unop (ALIGN_K,
1243 exp_intop ((bfd_vma) 1 << s->alignment_power));
1244 lang_add_assignment (exp_assop ('=', symname, e_align));
1249 if (link_info.relocatable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
1250 address = exp_intop ((bfd_vma) 0);
1253 if (place != NULL && place->os->load_base != NULL)
1255 etree_type *lma_from_vma;
1256 lma_from_vma = exp_binop ('-', place->os->load_base,
1257 exp_nameop (ADDR, place->os->name));
1258 load_base = exp_binop ('+', lma_from_vma,
1259 exp_nameop (ADDR, secname));
1262 os_tail = lang_output_section_statement.tail;
1263 os = lang_enter_output_section_statement (secname, address, 0,
1265 (etree_type *) NULL,
1266 (etree_type *) NULL,
1269 lang_add_section (&os->children, s, os, file);
1271 lang_leave_output_section_statement
1272 ((bfd_vma) 0, "*default*",
1273 (struct lang_output_section_phdr_list *) NULL, NULL);
1275 if (config.build_constructors && *ps == '\0')
1279 /* lang_leave_ouput_section_statement resets stat_ptr. Put
1280 stat_ptr back where we want it. */
1284 symname = (char *) xmalloc (ps - secname + sizeof "__stop_");
1285 sprintf (symname, "__stop_%s", secname);
1286 lang_add_assignment (exp_assop ('=', symname,
1287 exp_nameop (NAME, ".")));
1290 /* Restore the global list pointer. */
1293 if (place != NULL && os->bfd_section != NULL)
1295 asection *snew, **pps;
1297 snew = os->bfd_section;
1299 /* Shuffle the bfd section list to make the output file look
1300 neater. This is really only cosmetic. */
1301 if (place->section == NULL)
1303 asection *bfd_section = place->os->bfd_section;
1305 /* If the output statement hasn't been used to place
1306 any input sections (and thus doesn't have an output
1307 bfd_section), look for the closest prior output statement
1308 having an output section. */
1309 if (bfd_section == NULL)
1310 bfd_section = output_prev_sec_find (place->os);
1312 if (bfd_section != NULL && bfd_section != snew)
1313 place->section = &bfd_section->next;
1316 if (place->section != NULL)
1318 /* Unlink the section. */
1319 for (pps = &output_bfd->sections; *pps != snew; pps = &(*pps)->next)
1321 bfd_section_list_remove (output_bfd, pps);
1323 /* Now tack it on to the "place->os" section list. */
1324 bfd_section_list_insert (output_bfd, place->section, snew);
1327 /* Save the end of this list. Further ophans of this type will
1328 follow the one we've just added. */
1329 place->section = &snew->next;
1331 /* The following is non-cosmetic. We try to put the output
1332 statements in some sort of reasonable order here, because
1333 they determine the final load addresses of the orphan
1334 sections. In addition, placing output statements in the
1335 wrong order may require extra segments. For instance,
1336 given a typical situation of all read-only sections placed
1337 in one segment and following that a segment containing all
1338 the read-write sections, we wouldn't want to place an orphan
1339 read/write section before or amongst the read-only ones. */
1340 if (add.head != NULL)
1342 lang_statement_union_type *newly_added_os;
1344 if (place->stmt == NULL)
1346 /* Put the new statement list right at the head. */
1347 *add.tail = place->os->header.next;
1348 place->os->header.next = add.head;
1350 place->os_tail = &place->os->next;
1354 /* Put it after the last orphan statement we added. */
1355 *add.tail = *place->stmt;
1356 *place->stmt = add.head;
1359 /* Fix the global list pointer if we happened to tack our
1360 new list at the tail. */
1361 if (*old->tail == add.head)
1362 old->tail = add.tail;
1364 /* Save the end of this list. */
1365 place->stmt = add.tail;
1367 /* Do the same for the list of output section statements. */
1368 newly_added_os = *os_tail;
1370 newly_added_os->output_section_statement.next = *place->os_tail;
1371 *place->os_tail = newly_added_os;
1372 place->os_tail = &newly_added_os->output_section_statement.next;
1374 /* Fixing the global list pointer here is a little different.
1375 We added to the list in lang_enter_output_section_statement,
1376 trimmed off the new output_section_statment above when
1377 assigning *os_tail = NULL, but possibly added it back in
1378 the same place when assigning *place->os_tail. */
1379 if (*os_tail == NULL)
1380 lang_output_section_statement.tail = os_tail;
1389 if test x"$LDEMUL_FINISH" != xgld"$EMULATION_NAME"_finish; then
1390 cat >>e${EMULATION_NAME}.c <<EOF
1393 gld${EMULATION_NAME}_finish (void)
1395 if (bfd_elf${ELFSIZE}_discard_info (output_bfd, &link_info))
1397 lang_reset_memory_regions ();
1399 /* Resize the sections. */
1400 lang_size_sections (stat_ptr->head, abs_output_section,
1401 &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE);
1403 /* Redo special stuff. */
1404 ldemul_after_allocation ();
1406 /* Do the assignments again. */
1407 lang_do_assignments (stat_ptr->head, abs_output_section,
1408 (fill_type *) 0, (bfd_vma) 0);
1414 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1415 cat >>e${EMULATION_NAME}.c <<EOF
1418 gld${EMULATION_NAME}_get_script (int *isfile)
1421 if test -n "$COMPILE_IN"
1423 # Scripts compiled in.
1425 # sed commands to quote an ld script as a C string.
1426 sc="-f stringify.sed"
1428 cat >>e${EMULATION_NAME}.c <<EOF
1432 if (link_info.relocatable && config.build_constructors)
1435 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1436 echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c
1437 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1438 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1439 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1440 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
1441 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1442 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1444 if test -n "$GENERATE_PIE_SCRIPT" ; then
1445 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1446 echo ' ; else if (link_info.pie && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1447 sed $sc ldscripts/${EMULATION_NAME}.xdc >> e${EMULATION_NAME}.c
1449 echo ' ; else if (link_info.pie) return' >> e${EMULATION_NAME}.c
1450 sed $sc ldscripts/${EMULATION_NAME}.xd >> e${EMULATION_NAME}.c
1452 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1453 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1454 echo ' ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1455 sed $sc ldscripts/${EMULATION_NAME}.xsc >> e${EMULATION_NAME}.c
1457 echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c
1458 sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
1460 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1461 echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c
1462 sed $sc ldscripts/${EMULATION_NAME}.xc >> e${EMULATION_NAME}.c
1464 echo ' ; else return' >> e${EMULATION_NAME}.c
1465 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1466 echo '; }' >> e${EMULATION_NAME}.c
1469 # Scripts read from the filesystem.
1471 cat >>e${EMULATION_NAME}.c <<EOF
1475 if (link_info.relocatable && config.build_constructors)
1476 return "ldscripts/${EMULATION_NAME}.xu";
1477 else if (link_info.relocatable)
1478 return "ldscripts/${EMULATION_NAME}.xr";
1479 else if (!config.text_read_only)
1480 return "ldscripts/${EMULATION_NAME}.xbn";
1482 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
1484 cat >>e${EMULATION_NAME}.c <<EOF
1485 else if (!config.magic_demand_paged)
1486 return "ldscripts/${EMULATION_NAME}.xn";
1489 if test -n "$GENERATE_PIE_SCRIPT" ; then
1490 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1491 cat >>e${EMULATION_NAME}.c <<EOF
1492 else if (link_info.pie && link_info.combreloc)
1493 return "ldscripts/${EMULATION_NAME}.xdc";
1496 cat >>e${EMULATION_NAME}.c <<EOF
1497 else if (link_info.pie)
1498 return "ldscripts/${EMULATION_NAME}.xd";
1501 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1502 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1503 cat >>e${EMULATION_NAME}.c <<EOF
1504 else if (link_info.shared && link_info.combreloc)
1505 return "ldscripts/${EMULATION_NAME}.xsc";
1508 cat >>e${EMULATION_NAME}.c <<EOF
1509 else if (link_info.shared)
1510 return "ldscripts/${EMULATION_NAME}.xs";
1513 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1514 cat >>e${EMULATION_NAME}.c <<EOF
1515 else if (link_info.combreloc)
1516 return "ldscripts/${EMULATION_NAME}.xc";
1519 cat >>e${EMULATION_NAME}.c <<EOF
1521 return "ldscripts/${EMULATION_NAME}.x";
1528 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1530 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1531 cat >>e${EMULATION_NAME}.c <<EOF
1532 $PARSE_AND_LIST_PROLOGUE
1536 cat >>e${EMULATION_NAME}.c <<EOF
1538 #define OPTION_DISABLE_NEW_DTAGS (400)
1539 #define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
1540 #define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
1541 #define OPTION_EH_FRAME_HDR (OPTION_GROUP + 1)
1544 gld${EMULATION_NAME}_add_options
1545 (int ns, char **shortopts, int nl, struct option **longopts,
1546 int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
1548 static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:";
1549 static const struct option xtra_long[] = {
1552 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1553 cat >>e${EMULATION_NAME}.c <<EOF
1554 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1555 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1556 {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
1557 {"Bgroup", no_argument, NULL, OPTION_GROUP},
1561 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
1562 cat >>e${EMULATION_NAME}.c <<EOF
1563 $PARSE_AND_LIST_LONGOPTS
1567 cat >>e${EMULATION_NAME}.c <<EOF
1568 {NULL, no_argument, NULL, 0}
1571 *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
1572 memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
1573 *longopts = (struct option *)
1574 xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
1575 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
1579 gld${EMULATION_NAME}_handle_option (int optc)
1588 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1589 cat >>e${EMULATION_NAME}.c <<EOF
1590 case OPTION_DISABLE_NEW_DTAGS:
1591 link_info.new_dtags = FALSE;
1594 case OPTION_ENABLE_NEW_DTAGS:
1595 link_info.new_dtags = TRUE;
1598 case OPTION_EH_FRAME_HDR:
1599 link_info.eh_frame_hdr = TRUE;
1603 link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
1604 /* Groups must be self-contained. */
1605 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
1606 link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
1610 if (strcmp (optarg, "initfirst") == 0)
1611 link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
1612 else if (strcmp (optarg, "interpose") == 0)
1613 link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
1614 else if (strcmp (optarg, "loadfltr") == 0)
1615 link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
1616 else if (strcmp (optarg, "nodefaultlib") == 0)
1617 link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
1618 else if (strcmp (optarg, "nodelete") == 0)
1619 link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
1620 else if (strcmp (optarg, "nodlopen") == 0)
1621 link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
1622 else if (strcmp (optarg, "nodump") == 0)
1623 link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
1624 else if (strcmp (optarg, "now") == 0)
1626 link_info.flags |= (bfd_vma) DF_BIND_NOW;
1627 link_info.flags_1 |= (bfd_vma) DF_1_NOW;
1629 else if (strcmp (optarg, "origin") == 0)
1631 link_info.flags |= (bfd_vma) DF_ORIGIN;
1632 link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
1634 else if (strcmp (optarg, "defs") == 0)
1635 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
1636 else if (strcmp (optarg, "muldefs") == 0)
1637 link_info.allow_multiple_definition = TRUE;
1638 else if (strcmp (optarg, "combreloc") == 0)
1639 link_info.combreloc = TRUE;
1640 else if (strcmp (optarg, "nocombreloc") == 0)
1641 link_info.combreloc = FALSE;
1642 else if (strcmp (optarg, "nocopyreloc") == 0)
1643 link_info.nocopyreloc = TRUE;
1644 else if (strcmp (optarg, "execstack") == 0)
1646 link_info.execstack = TRUE;
1647 link_info.noexecstack = FALSE;
1649 else if (strcmp (optarg, "noexecstack") == 0)
1651 link_info.noexecstack = TRUE;
1652 link_info.execstack = FALSE;
1654 /* What about the other Solaris -z options? FIXME. */
1659 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
1660 cat >>e${EMULATION_NAME}.c <<EOF
1661 $PARSE_AND_LIST_ARGS_CASES
1665 cat >>e${EMULATION_NAME}.c <<EOF
1673 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1674 cat >>e${EMULATION_NAME}.c <<EOF
1677 gld${EMULATION_NAME}_list_options (FILE * file)
1681 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1682 cat >>e${EMULATION_NAME}.c <<EOF
1683 fprintf (file, _(" -Bgroup\t\tSelects group name lookup rules for DSO\n"));
1684 fprintf (file, _(" --disable-new-dtags\tDisable new dynamic tags\n"));
1685 fprintf (file, _(" --enable-new-dtags\tEnable new dynamic tags\n"));
1686 fprintf (file, _(" --eh-frame-hdr\tCreate .eh_frame_hdr section\n"));
1687 fprintf (file, _(" -z combreloc\t\tMerge dynamic relocs into one section and sort\n"));
1688 fprintf (file, _(" -z defs\t\tReport unresolved symbols in object files.\n"));
1689 fprintf (file, _(" -z execstack\t\tMark executable as requiring executable stack\n"));
1690 fprintf (file, _(" -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
1691 fprintf (file, _(" -z interpose\t\tMark object to interpose all DSOs but executable\n"));
1692 fprintf (file, _(" -z loadfltr\t\tMark object requiring immediate process\n"));
1693 fprintf (file, _(" -z muldefs\t\tAllow multiple definitions\n"));
1694 fprintf (file, _(" -z nocombreloc\tDon't merge dynamic relocs into one section\n"));
1695 fprintf (file, _(" -z nocopyreloc\tDon't create copy relocs\n"));
1696 fprintf (file, _(" -z nodefaultlib\tMark object not to use default search paths\n"));
1697 fprintf (file, _(" -z nodelete\t\tMark DSO non-deletable at runtime\n"));
1698 fprintf (file, _(" -z nodlopen\t\tMark DSO not available to dlopen\n"));
1699 fprintf (file, _(" -z nodump\t\tMark DSO not available to dldump\n"));
1700 fprintf (file, _(" -z noexecstack\tMark executable as not requiring executable stack\n"));
1701 fprintf (file, _(" -z now\t\tMark object non-lazy runtime binding\n"));
1702 fprintf (file, _(" -z origin\t\tMark object requiring immediate \$ORIGIN processing\n\t\t\t at runtime\n"));
1703 fprintf (file, _(" -z KEYWORD\t\tIgnored for Solaris compatibility\n"));
1707 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
1708 cat >>e${EMULATION_NAME}.c <<EOF
1709 $PARSE_AND_LIST_OPTIONS
1713 cat >>e${EMULATION_NAME}.c <<EOF
1717 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
1718 cat >>e${EMULATION_NAME}.c <<EOF
1719 $PARSE_AND_LIST_EPILOGUE
1724 cat >>e${EMULATION_NAME}.c <<EOF
1725 #define gld${EMULATION_NAME}_add_options NULL
1726 #define gld${EMULATION_NAME}_handle_option NULL
1728 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1729 cat >>e${EMULATION_NAME}.c <<EOF
1730 #define gld${EMULATION_NAME}_list_options NULL
1735 cat >>e${EMULATION_NAME}.c <<EOF
1737 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1739 ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
1740 ${LDEMUL_SYSLIB-syslib_default},
1741 ${LDEMUL_HLL-hll_default},
1742 ${LDEMUL_AFTER_PARSE-after_parse_default},
1743 ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
1744 ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
1745 ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
1746 ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
1747 ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
1748 ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
1749 "${EMULATION_NAME}",
1751 ${LDEMUL_FINISH-gld${EMULATION_NAME}_finish},
1752 ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
1753 ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
1754 ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
1755 ${LDEMUL_SET_SYMBOLS-NULL},
1756 ${LDEMUL_PARSE_ARGS-NULL},
1757 gld${EMULATION_NAME}_add_options,
1758 gld${EMULATION_NAME}_handle_option,
1759 ${LDEMUL_UNRECOGNIZED_FILE-NULL},
1760 ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
1761 ${LDEMUL_RECOGNIZED_FILE-NULL},
1762 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
1763 ${LDEMUL_NEW_VERS_PATTERN-NULL}