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, 2004 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 ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
85 config.dynamic_link = ${DYNAMIC_LINK-TRUE};
86 config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
92 cat >>e${EMULATION_NAME}.c <<EOF
94 /* These variables are required to pass information back and forth
95 between after_open and check_needed and stat_needed and vercheck. */
97 static struct bfd_link_needed_list *global_needed;
98 static struct stat global_stat;
99 static bfd_boolean global_found;
100 static struct bfd_link_needed_list *global_vercheck_needed;
101 static bfd_boolean global_vercheck_failed;
104 /* On Linux, it's possible to have different versions of the same
105 shared library linked against different versions of libc. The
106 dynamic linker somehow tags which libc version to use in
107 /etc/ld.so.cache, and, based on the libc that it sees in the
108 executable, chooses which version of the shared library to use.
110 We try to do a similar check here by checking whether this shared
111 library needs any other shared libraries which may conflict with
112 libraries we have already included in the link. If it does, we
113 skip it, and try to find another shared library farther on down the
116 This is called via lang_for_each_input_file.
117 GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
118 which we are checking. This sets GLOBAL_VERCHECK_FAILED if we find
119 a conflicting version. */
122 gld${EMULATION_NAME}_vercheck (lang_input_statement_type *s)
125 struct bfd_link_needed_list *l;
127 if (global_vercheck_failed)
129 if (s->the_bfd == NULL
130 || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
133 soname = bfd_elf_get_dt_soname (s->the_bfd);
135 soname = lbasename (bfd_get_filename (s->the_bfd));
137 for (l = global_vercheck_needed; l != NULL; l = l->next)
141 if (strcmp (soname, l->name) == 0)
143 /* Probably can't happen, but it's an easy check. */
147 if (strchr (l->name, '/') != NULL)
150 suffix = strstr (l->name, ".so.");
154 suffix += sizeof ".so." - 1;
156 if (strncmp (soname, l->name, suffix - l->name) == 0)
158 /* Here we know that S is a dynamic object FOO.SO.VER1, and
159 the object we are considering needs a dynamic object
160 FOO.SO.VER2, and VER1 and VER2 are different. This
161 appears to be a version mismatch, so we tell the caller
162 to try a different version of this library. */
163 global_vercheck_failed = TRUE;
170 /* See if an input file matches a DT_NEEDED entry by running stat on
174 gld${EMULATION_NAME}_stat_needed (lang_input_statement_type *s)
182 if (s->the_bfd == NULL)
185 if (bfd_stat (s->the_bfd, &st) != 0)
187 einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
191 if (st.st_dev == global_stat.st_dev
192 && st.st_ino == global_stat.st_ino)
198 /* We issue a warning if it looks like we are including two
199 different versions of the same shared library. For example,
200 there may be a problem if -lc picks up libc.so.6 but some other
201 shared library has a DT_NEEDED entry of libc.so.5. This is a
202 heuristic test, and it will only work if the name looks like
203 NAME.so.VERSION. FIXME: Depending on file names is error-prone.
204 If we really want to issue warnings about mixing version numbers
205 of shared libraries, we need to find a better way. */
207 if (strchr (global_needed->name, '/') != NULL)
209 suffix = strstr (global_needed->name, ".so.");
212 suffix += sizeof ".so." - 1;
214 soname = bfd_elf_get_dt_soname (s->the_bfd);
216 soname = lbasename (s->filename);
218 if (strncmp (soname, global_needed->name, suffix - global_needed->name) == 0)
219 einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
220 global_needed->name, global_needed->by, soname);
224 /* This function is called for each possible name for a dynamic object
225 named by a DT_NEEDED entry. The FORCE parameter indicates whether
226 to skip the check for a conflicting version. */
229 gld${EMULATION_NAME}_try_needed (const char *name, int force)
234 abfd = bfd_openr (name, bfd_get_target (output_bfd));
237 if (! bfd_check_format (abfd, bfd_object))
242 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
248 /* For DT_NEEDED, they have to match. */
249 if (abfd->xvec != output_bfd->xvec)
255 /* Check whether this object would include any conflicting library
256 versions. If FORCE is set, then we skip this check; we use this
257 the second time around, if we couldn't find any compatible
258 instance of the shared library. */
262 struct bfd_link_needed_list *needed;
264 if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
265 einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
269 global_vercheck_needed = needed;
270 global_vercheck_failed = FALSE;
271 lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
272 if (global_vercheck_failed)
275 /* Return FALSE to force the caller to move on to try
276 another file on the search path. */
280 /* But wait! It gets much worse. On Linux, if a shared
281 library does not use libc at all, we are supposed to skip
282 it the first time around in case we encounter a shared
283 library later on with the same name which does use the
284 version of libc that we want. This is much too horrible
285 to use on any system other than Linux. */
290 cat >>e${EMULATION_NAME}.c <<EOF
292 struct bfd_link_needed_list *l;
294 for (l = needed; l != NULL; l = l->next)
295 if (strncmp (l->name, "libc.so", 7) == 0)
307 cat >>e${EMULATION_NAME}.c <<EOF
311 /* We've found a dynamic object matching the DT_NEEDED entry. */
313 /* We have already checked that there is no other input file of the
314 same name. We must now check again that we are not including the
315 same file twice. We need to do this because on many systems
316 libc.so is a symlink to, e.g., libc.so.1. The SONAME entry will
317 reference libc.so.1. If we have already included libc.so, we
318 don't want to include libc.so.1 if they are the same file, and we
319 can only check that using stat. */
321 if (bfd_stat (abfd, &global_stat) != 0)
322 einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
324 /* First strip off everything before the last '/'. */
325 soname = lbasename (abfd->filename);
327 if (trace_file_tries)
328 info_msg (_("found %s at %s\n"), soname, name);
330 global_found = FALSE;
331 lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
334 /* Return TRUE to indicate that we found the file, even though
335 we aren't going to do anything with it. */
339 /* Tell the ELF backend that we don't want the output file to have a
340 DT_NEEDED entry for this file. */
341 bfd_elf_set_dt_needed_name (abfd, "");
343 /* Tell the ELF backend that the output file needs a DT_NEEDED
344 entry for this file if it is used to resolve the reference in
346 bfd_elf_set_dt_needed_soname (abfd, soname);
348 /* Add this file into the symbol table. */
349 if (! bfd_link_add_symbols (abfd, &link_info))
350 einfo ("%F%B: could not read symbols: %E\n", abfd);
356 /* Search for a needed file in a path. */
359 gld${EMULATION_NAME}_search_needed (const char *path, const char *name, int force)
365 return gld${EMULATION_NAME}_try_needed (name, force);
367 if (path == NULL || *path == '\0')
372 char *filename, *sset;
374 s = strchr (path, ':');
376 s = path + strlen (path);
378 filename = (char *) xmalloc (s - path + len + 2);
383 memcpy (filename, path, s - path);
384 filename[s - path] = '/';
385 sset = filename + (s - path) + 1;
389 if (gld${EMULATION_NAME}_try_needed (filename, force))
403 if [ "x${USE_LIBPATH}" = xyes ] ; then
404 cat >>e${EMULATION_NAME}.c <<EOF
406 /* Add the sysroot to every entry in a colon-separated path. */
409 gld${EMULATION_NAME}_add_sysroot (const char *path)
418 if (path[i++] == ':')
424 len = len + (colons + 1) * strlen (ld_sysroot);
425 ret = xmalloc (len + 1);
426 strcpy (ret, ld_sysroot);
427 p = ret + strlen (ret);
433 strcpy (p, ld_sysroot);
446 cat >>e${EMULATION_NAME}.c <<EOF
447 /* For a native linker, check the file /etc/ld.so.conf for directories
448 in which we may find shared libraries. /etc/ld.so.conf is really
449 only meaningful on Linux. */
452 gld${EMULATION_NAME}_check_ld_so_conf (const char *name, int force)
454 static bfd_boolean initialized;
455 static char *ld_so_conf;
462 tmppath = concat (ld_sysroot, "/etc/ld.so.conf", NULL);
463 f = fopen (tmppath, FOPEN_RT);
473 b = (char *) xmalloc (alloc);
475 while ((c = getc (f)) != EOF)
477 if (len + 1 >= alloc)
480 b = (char *) xrealloc (b, alloc);
493 if (len > 0 && b[len - 1] != ':')
501 if (len > 0 && b[len - 1] == ':')
516 char *d = gld${EMULATION_NAME}_add_sysroot (b);
527 if (ld_so_conf == NULL)
530 return gld${EMULATION_NAME}_search_needed (ld_so_conf, name, force);
538 cat >>e${EMULATION_NAME}.c <<EOF
540 /* See if an input file matches a DT_NEEDED entry by name. */
543 gld${EMULATION_NAME}_check_needed (lang_input_statement_type *s)
548 if (s->filename != NULL)
552 if (strcmp (s->filename, global_needed->name) == 0)
558 if (s->search_dirs_flag)
560 f = strrchr (s->filename, '/');
562 && strcmp (f + 1, global_needed->name) == 0)
570 if (s->the_bfd != NULL)
574 soname = bfd_elf_get_dt_soname (s->the_bfd);
576 && strcmp (soname, global_needed->name) == 0)
586 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
587 cat >>e${EMULATION_NAME}.c <<EOF
589 /* This is called after all the input files have been opened. */
592 gld${EMULATION_NAME}_after_open (void)
594 struct bfd_link_needed_list *needed, *l;
596 /* We only need to worry about this when doing a final link. */
597 if (link_info.relocatable || !link_info.executable)
600 /* Get the list of files which appear in DT_NEEDED entries in
601 dynamic objects included in the link (often there will be none).
602 For each such file, we want to track down the corresponding
603 library, and include the symbol table in the link. This is what
604 the runtime dynamic linker will do. Tracking the files down here
605 permits one dynamic object to include another without requiring
606 special action by the person doing the link. Note that the
607 needed list can actually grow while we are stepping through this
609 needed = bfd_elf_get_needed_list (output_bfd, &link_info);
610 for (l = needed; l != NULL; l = l->next)
612 struct bfd_link_needed_list *ll;
615 /* If we've already seen this file, skip it. */
616 for (ll = needed; ll != l; ll = ll->next)
617 if (strcmp (ll->name, l->name) == 0)
622 /* See if this file was included in the link explicitly. */
624 global_found = FALSE;
625 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
629 if (trace_file_tries)
630 info_msg (_("%s needed by %B\n"), l->name, l->by);
632 /* We need to find this file and include the symbol table. We
633 want to search for the file in the same way that the dynamic
634 linker will search. That means that we want to use
635 rpath_link, rpath, then the environment variable
636 LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
637 entries (native only), then the linker script LIB_SEARCH_DIRS.
638 We do not search using the -L arguments.
640 We search twice. The first time, we skip objects which may
641 introduce version mismatches. The second time, we force
642 their use. See gld${EMULATION_NAME}_vercheck comment. */
643 for (force = 0; force < 2; force++)
646 search_dirs_type *search;
648 if [ "x${USE_LIBPATH}" = xyes ] ; then
649 cat >>e${EMULATION_NAME}.c <<EOF
650 const char *lib_path;
651 struct bfd_link_needed_list *rp;
655 cat >>e${EMULATION_NAME}.c <<EOF
657 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
661 if [ "x${USE_LIBPATH}" = xyes ] ; then
662 cat >>e${EMULATION_NAME}.c <<EOF
663 if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
668 if [ "x${NATIVE}" = xyes ] ; then
669 cat >>e${EMULATION_NAME}.c <<EOF
670 if (command_line.rpath_link == NULL
671 && command_line.rpath == NULL)
673 lib_path = (const char *) getenv ("LD_RUN_PATH");
674 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name,
678 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
679 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, force))
683 if [ "x${USE_LIBPATH}" = xyes ] ; then
684 cat >>e${EMULATION_NAME}.c <<EOF
686 rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
687 for (; !found && rp != NULL; rp = rp->next)
689 char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
690 found = (rp->by == l->by
691 && gld${EMULATION_NAME}_search_needed (tmpname,
701 cat >>e${EMULATION_NAME}.c <<EOF
702 len = strlen (l->name);
703 for (search = search_head; search != NULL; search = search->next)
709 filename = (char *) xmalloc (strlen (search->name) + len + 2);
710 sprintf (filename, "%s/%s", search->name, l->name);
711 if (gld${EMULATION_NAME}_try_needed (filename, force))
718 if [ "x${USE_LIBPATH}" = xyes ] ; then
721 cat >>e${EMULATION_NAME}.c <<EOF
722 if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
729 cat >>e${EMULATION_NAME}.c <<EOF
735 einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
743 cat >>e${EMULATION_NAME}.c <<EOF
745 /* Look through an expression for an assignment statement. */
748 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
750 struct bfd_link_hash_entry *h;
752 switch (exp->type.node_class)
755 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
756 FALSE, FALSE, FALSE);
760 /* We call record_link_assignment even if the symbol is defined.
761 This is because if it is defined by a dynamic object, we
762 actually want to use the value defined by the linker script,
763 not the value from the dynamic object (because we are setting
764 symbols like etext). If the symbol is defined by a regular
765 object, then, as it happens, calling record_link_assignment
770 if (strcmp (exp->assign.dst, ".") != 0)
772 if (! (bfd_elf_record_link_assignment
773 (output_bfd, &link_info, exp->assign.dst,
774 exp->type.node_class == etree_provide ? TRUE : FALSE)))
775 einfo ("%P%F: failed to record assignment to %s: %E\n",
778 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
782 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
783 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
787 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
788 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
789 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
793 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
802 /* This is called by the before_allocation routine via
803 lang_for_each_statement. It locates any assignment statements, and
804 tells the ELF backend about them, in case they are assignments to
805 symbols which are referred to by dynamic objects. */
808 gld${EMULATION_NAME}_find_statement_assignment (lang_statement_union_type *s)
810 if (s->header.type == lang_assignment_statement_enum)
811 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
816 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
817 if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
818 ELF_INTERPRETER_SET_DEFAULT="
821 sinterp->contents = ${ELF_INTERPRETER_NAME};
822 sinterp->_raw_size = strlen (sinterp->contents) + 1;
827 ELF_INTERPRETER_SET_DEFAULT=
829 cat >>e${EMULATION_NAME}.c <<EOF
831 /* This is called after the sections have been attached to output
832 sections, but before any sizes or addresses have been set. */
835 gld${EMULATION_NAME}_before_allocation (void)
840 if (link_info.hash->type == bfd_link_elf_hash_table)
841 _bfd_elf_tls_setup (output_bfd, &link_info);
843 /* If we are going to make any variable assignments, we need to let
844 the ELF backend know about them in case the variables are
845 referred to by dynamic objects. */
846 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
848 /* Let the ELF backend work out the sizes of any sections required
849 by dynamic linking. */
850 rpath = command_line.rpath;
852 rpath = (const char *) getenv ("LD_RUN_PATH");
853 if (! (bfd_elf${ELFSIZE}_size_dynamic_sections
854 (output_bfd, command_line.soname, rpath,
855 command_line.filter_shlib,
856 (const char * const *) command_line.auxiliary_filters,
857 &link_info, &sinterp, lang_elf_version_info)))
858 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
859 ${ELF_INTERPRETER_SET_DEFAULT}
860 /* Let the user override the dynamic linker we are using. */
861 if (command_line.interpreter != NULL
864 sinterp->contents = (bfd_byte *) command_line.interpreter;
865 sinterp->_raw_size = strlen (command_line.interpreter) + 1;
868 /* Look for any sections named .gnu.warning. As a GNU extensions,
869 we treat such sections as containing warning messages. We print
870 out the warning message, and then zero out the section size so
871 that it does not get copied into the output file. */
874 LANG_FOR_EACH_INPUT_STATEMENT (is)
878 bfd_size_type prefix_len;
881 const char * gnu_warning_prefix = _("warning: ");
883 if (is->just_syms_flag)
886 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
890 sz = bfd_section_size (is->the_bfd, s);
891 prefix_len = strlen (gnu_warning_prefix);
892 msg = xmalloc ((size_t) (prefix_len + sz + 1));
893 strcpy (msg, gnu_warning_prefix);
894 if (! bfd_get_section_contents (is->the_bfd, s, msg + prefix_len,
896 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
898 msg[prefix_len + sz] = '\0';
899 ret = link_info.callbacks->warning (&link_info, msg,
901 is->the_bfd, (asection *) NULL,
906 /* Clobber the section size, so that we don't waste copying the
907 warning into the output file. */
916 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
917 cat >>e${EMULATION_NAME}.c <<EOF
919 /* Try to open a dynamic archive. This is where we know that ELF
920 dynamic libraries have an extension of .so (or .sl on oddball systems
924 gld${EMULATION_NAME}_open_dynamic_archive
925 (const char *arch, search_dirs_type *search, lang_input_statement_type *entry)
927 const char *filename;
930 if (! entry->is_archive)
933 filename = entry->filename;
935 /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
936 is defined, but it does not seem worth the headache to optimize
937 away those two bytes of space. */
938 string = (char *) xmalloc (strlen (search->name)
941 #ifdef EXTRA_SHLIB_EXTENSION
942 + strlen (EXTRA_SHLIB_EXTENSION)
946 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
948 #ifdef EXTRA_SHLIB_EXTENSION
949 /* Try the .so extension first. If that fails build a new filename
950 using EXTRA_SHLIB_EXTENSION. */
951 if (! ldfile_try_open_bfd (string, entry))
952 sprintf (string, "%s/lib%s%s%s", search->name,
953 filename, arch, EXTRA_SHLIB_EXTENSION);
956 if (! ldfile_try_open_bfd (string, entry))
962 entry->filename = string;
964 /* We have found a dynamic object to include in the link. The ELF
965 backend linker will create a DT_NEEDED entry in the .dynamic
966 section naming this file. If this file includes a DT_SONAME
967 entry, it will be used. Otherwise, the ELF linker will just use
968 the name of the file. For an archive found by searching, like
969 this one, the DT_NEEDED entry should consist of just the name of
970 the file, without the path information used to find it. Note
971 that we only need to do this if we have a dynamic object; an
972 archive will never be referenced by a DT_NEEDED entry.
974 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
975 very pretty. I haven't been able to think of anything that is
977 if (bfd_check_format (entry->the_bfd, bfd_object)
978 && (entry->the_bfd->flags & DYNAMIC) != 0)
980 ASSERT (entry->is_archive && entry->search_dirs_flag);
982 /* Rather than duplicating the logic above. Just use the
983 filename we recorded earlier. */
985 filename = lbasename (entry->filename);
986 bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
995 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
996 cat >>e${EMULATION_NAME}.c <<EOF
998 /* A variant of lang_output_section_find. Used by place_orphan. */
1000 static lang_output_section_statement_type *
1001 output_rel_find (asection *sec, int isdyn)
1003 lang_statement_union_type *u;
1004 lang_output_section_statement_type *lookup;
1005 lang_output_section_statement_type *last = NULL;
1006 lang_output_section_statement_type *last_alloc = NULL;
1007 lang_output_section_statement_type *last_rel = NULL;
1008 lang_output_section_statement_type *last_rel_alloc = NULL;
1009 int rela = sec->name[4] == 'a';
1011 for (u = lang_output_section_statement.head; u; u = lookup->next)
1013 lookup = &u->output_section_statement;
1014 if (strncmp (".rel", lookup->name, 4) == 0)
1016 int lookrela = lookup->name[4] == 'a';
1018 /* .rel.dyn must come before all other reloc sections, to suit
1023 /* Don't place after .rel.plt as doing so results in wrong
1025 if (strcmp (".plt", lookup->name + 4 + lookrela) == 0)
1028 if (rela == lookrela || last_rel == NULL)
1030 if ((rela == lookrela || last_rel_alloc == NULL)
1031 && lookup->bfd_section != NULL
1032 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1033 last_rel_alloc = lookup;
1037 if (lookup->bfd_section != NULL
1038 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1039 last_alloc = lookup;
1043 return last_rel_alloc;
1054 /* Find the last output section before given output statement.
1055 Used by place_orphan. */
1058 output_prev_sec_find (lang_output_section_statement_type *os)
1060 asection *s = (asection *) NULL;
1061 lang_statement_union_type *u;
1062 lang_output_section_statement_type *lookup;
1064 for (u = lang_output_section_statement.head;
1065 u != (lang_statement_union_type *) NULL;
1068 lookup = &u->output_section_statement;
1072 if (lookup->bfd_section != NULL && lookup->bfd_section->owner != NULL)
1073 s = lookup->bfd_section;
1079 /* Place an orphan section. We use this to put random SHF_ALLOC
1080 sections in the right segment. */
1082 struct orphan_save {
1083 lang_output_section_statement_type *os;
1085 lang_statement_union_type **stmt;
1086 lang_statement_union_type **os_tail;
1090 gld${EMULATION_NAME}_place_orphan (lang_input_statement_type *file, asection *s)
1092 static struct orphan_save hold_text;
1093 static struct orphan_save hold_rodata;
1094 static struct orphan_save hold_data;
1095 static struct orphan_save hold_bss;
1096 static struct orphan_save hold_rel;
1097 static struct orphan_save hold_interp;
1098 static struct orphan_save hold_sdata;
1099 static int count = 1;
1100 struct orphan_save *place;
1101 lang_statement_list_type *old;
1102 lang_statement_list_type add;
1103 etree_type *address;
1104 const char *secname;
1105 const char *ps = NULL;
1106 lang_output_section_statement_type *os;
1107 lang_statement_union_type **os_tail;
1108 etree_type *load_base;
1111 secname = bfd_get_section_name (s->owner, s);
1112 if (! link_info.relocatable
1113 && link_info.combreloc
1114 && (s->flags & SEC_ALLOC)
1115 && strncmp (secname, ".rel", 4) == 0)
1117 if (secname[4] == 'a')
1118 secname = ".rela.dyn";
1120 secname = ".rel.dyn";
1124 if (isdyn || (!config.unique_orphan_sections && !unique_section_p (secname)))
1126 /* Look through the script to see where to place this section. */
1127 os = lang_output_section_find (secname);
1130 && (os->bfd_section == NULL
1131 || ((s->flags ^ os->bfd_section->flags)
1132 & (SEC_LOAD | SEC_ALLOC)) == 0))
1134 /* We already have an output section statement with this
1135 name, and its bfd section, if any, has compatible flags. */
1136 lang_add_section (&os->children, s, os, file);
1141 if (hold_text.os == NULL)
1142 hold_text.os = lang_output_section_find (".text");
1144 /* If this is a final link, then always put .gnu.warning.SYMBOL
1145 sections into the .text section to get them out of the way. */
1146 if (link_info.executable
1147 && ! link_info.relocatable
1148 && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
1149 && hold_text.os != NULL)
1151 lang_add_section (&hold_text.os->children, s, hold_text.os, file);
1155 /* Decide which segment the section should go in based on the
1156 section name and section flags. We put loadable .note sections
1157 right after the .interp section, so that the PT_NOTE segment is
1158 stored right after the program headers where the OS can read it
1159 in the first page. */
1160 #define HAVE_SECTION(hold, name) \
1161 (hold.os != NULL || (hold.os = lang_output_section_find (name)) != NULL)
1163 if ((s->flags & SEC_EXCLUDE) != 0 && !link_info.relocatable)
1165 if (s->output_section == NULL)
1166 s->output_section = bfd_abs_section_ptr;
1171 if ((s->flags & SEC_ALLOC) == 0)
1173 else if ((s->flags & SEC_LOAD) != 0
1174 && strncmp (secname, ".note", 5) == 0
1175 && HAVE_SECTION (hold_interp, ".interp"))
1176 place = &hold_interp;
1177 else if ((s->flags & SEC_HAS_CONTENTS) == 0
1178 && HAVE_SECTION (hold_bss, ".bss"))
1180 else if ((s->flags & SEC_SMALL_DATA) != 0
1181 && HAVE_SECTION (hold_sdata, ".sdata"))
1182 place = &hold_sdata;
1183 else if ((s->flags & SEC_READONLY) == 0
1184 && HAVE_SECTION (hold_data, ".data"))
1186 else if (strncmp (secname, ".rel", 4) == 0
1187 && (s->flags & SEC_LOAD) != 0
1188 && (hold_rel.os != NULL
1189 || (hold_rel.os = output_rel_find (s, isdyn)) != NULL))
1191 else if ((s->flags & (SEC_CODE | SEC_READONLY)) == SEC_READONLY
1192 && HAVE_SECTION (hold_rodata, ".rodata"))
1193 place = &hold_rodata;
1194 else if ((s->flags & (SEC_CODE | SEC_READONLY)) == (SEC_CODE | SEC_READONLY)
1195 && hold_text.os != NULL)
1200 /* Choose a unique name for the section. This will be needed if the
1201 same section name appears in the input file with different
1202 loadable or allocatable characteristics. */
1203 if (bfd_get_section_by_name (output_bfd, secname) != NULL)
1205 secname = bfd_get_unique_section_name (output_bfd, secname, &count);
1206 if (secname == NULL)
1207 einfo ("%F%P: place_orphan failed: %E\n");
1210 /* Start building a list of statements for this section.
1211 First save the current statement pointer. */
1214 /* If we have found an appropriate place for the output section
1215 statements for this orphan, add them to our own private list,
1216 inserting them later into the global statement list. */
1220 lang_list_init (stat_ptr);
1223 if (config.build_constructors)
1225 /* If the name of the section is representable in C, then create
1226 symbols to mark the start and the end of the section. */
1227 for (ps = secname; *ps != '\0'; ps++)
1228 if (! ISALNUM (*ps) && *ps != '_')
1233 etree_type *e_align;
1235 symname = (char *) xmalloc (ps - secname + sizeof "__start_");
1236 sprintf (symname, "__start_%s", secname);
1237 e_align = exp_unop (ALIGN_K,
1238 exp_intop ((bfd_vma) 1 << s->alignment_power));
1239 lang_add_assignment (exp_assop ('=', symname, e_align));
1244 if (link_info.relocatable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
1245 address = exp_intop ((bfd_vma) 0);
1248 if (place != NULL && place->os->load_base != NULL)
1250 etree_type *lma_from_vma;
1251 lma_from_vma = exp_binop ('-', place->os->load_base,
1252 exp_nameop (ADDR, place->os->name));
1253 load_base = exp_binop ('+', lma_from_vma,
1254 exp_nameop (ADDR, secname));
1257 os_tail = lang_output_section_statement.tail;
1258 os = lang_enter_output_section_statement (secname, address, 0,
1260 (etree_type *) NULL,
1261 (etree_type *) NULL,
1264 lang_add_section (&os->children, s, os, file);
1266 lang_leave_output_section_statement
1267 ((bfd_vma) 0, "*default*",
1268 (struct lang_output_section_phdr_list *) NULL, NULL);
1270 if (config.build_constructors && *ps == '\0')
1274 /* lang_leave_ouput_section_statement resets stat_ptr. Put
1275 stat_ptr back where we want it. */
1279 symname = (char *) xmalloc (ps - secname + sizeof "__stop_");
1280 sprintf (symname, "__stop_%s", secname);
1281 lang_add_assignment (exp_assop ('=', symname,
1282 exp_nameop (NAME, ".")));
1285 /* Restore the global list pointer. */
1288 if (place != NULL && os->bfd_section != NULL)
1290 asection *snew, **pps;
1292 snew = os->bfd_section;
1294 /* Shuffle the bfd section list to make the output file look
1295 neater. This is really only cosmetic. */
1296 if (place->section == NULL)
1298 asection *bfd_section = place->os->bfd_section;
1300 /* If the output statement hasn't been used to place
1301 any input sections (and thus doesn't have an output
1302 bfd_section), look for the closest prior output statement
1303 having an output section. */
1304 if (bfd_section == NULL)
1305 bfd_section = output_prev_sec_find (place->os);
1307 if (bfd_section != NULL && bfd_section != snew)
1308 place->section = &bfd_section->next;
1311 if (place->section != NULL)
1313 /* Unlink the section. */
1314 for (pps = &output_bfd->sections; *pps != snew; pps = &(*pps)->next)
1316 bfd_section_list_remove (output_bfd, pps);
1318 /* Now tack it on to the "place->os" section list. */
1319 bfd_section_list_insert (output_bfd, place->section, snew);
1322 /* Save the end of this list. Further ophans of this type will
1323 follow the one we've just added. */
1324 place->section = &snew->next;
1326 /* The following is non-cosmetic. We try to put the output
1327 statements in some sort of reasonable order here, because
1328 they determine the final load addresses of the orphan
1329 sections. In addition, placing output statements in the
1330 wrong order may require extra segments. For instance,
1331 given a typical situation of all read-only sections placed
1332 in one segment and following that a segment containing all
1333 the read-write sections, we wouldn't want to place an orphan
1334 read/write section before or amongst the read-only ones. */
1335 if (add.head != NULL)
1337 lang_statement_union_type *newly_added_os;
1339 if (place->stmt == NULL)
1341 /* Put the new statement list right at the head. */
1342 *add.tail = place->os->header.next;
1343 place->os->header.next = add.head;
1345 place->os_tail = &place->os->next;
1349 /* Put it after the last orphan statement we added. */
1350 *add.tail = *place->stmt;
1351 *place->stmt = add.head;
1354 /* Fix the global list pointer if we happened to tack our
1355 new list at the tail. */
1356 if (*old->tail == add.head)
1357 old->tail = add.tail;
1359 /* Save the end of this list. */
1360 place->stmt = add.tail;
1362 /* Do the same for the list of output section statements. */
1363 newly_added_os = *os_tail;
1365 newly_added_os->output_section_statement.next = *place->os_tail;
1366 *place->os_tail = newly_added_os;
1367 place->os_tail = &newly_added_os->output_section_statement.next;
1369 /* Fixing the global list pointer here is a little different.
1370 We added to the list in lang_enter_output_section_statement,
1371 trimmed off the new output_section_statment above when
1372 assigning *os_tail = NULL, but possibly added it back in
1373 the same place when assigning *place->os_tail. */
1374 if (*os_tail == NULL)
1375 lang_output_section_statement.tail = os_tail;
1384 if test x"$LDEMUL_FINISH" != xgld"$EMULATION_NAME"_finish; then
1385 cat >>e${EMULATION_NAME}.c <<EOF
1388 gld${EMULATION_NAME}_finish (void)
1390 if (bfd_elf${ELFSIZE}_discard_info (output_bfd, &link_info))
1392 lang_reset_memory_regions ();
1394 /* Resize the sections. */
1395 lang_size_sections (stat_ptr->head, abs_output_section,
1396 &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE);
1398 /* Redo special stuff. */
1399 ldemul_after_allocation ();
1401 /* Do the assignments again. */
1402 lang_do_assignments (stat_ptr->head, abs_output_section,
1403 (fill_type *) 0, (bfd_vma) 0);
1409 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1410 cat >>e${EMULATION_NAME}.c <<EOF
1413 gld${EMULATION_NAME}_get_script (int *isfile)
1416 if test -n "$COMPILE_IN"
1418 # Scripts compiled in.
1420 # sed commands to quote an ld script as a C string.
1421 sc="-f stringify.sed"
1423 cat >>e${EMULATION_NAME}.c <<EOF
1427 if (link_info.relocatable && config.build_constructors)
1430 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1431 echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c
1432 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1433 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1434 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1435 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
1436 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1437 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1439 if test -n "$GENERATE_PIE_SCRIPT" ; then
1440 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1441 echo ' ; else if (link_info.pie && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1442 sed $sc ldscripts/${EMULATION_NAME}.xdc >> e${EMULATION_NAME}.c
1444 echo ' ; else if (link_info.pie) return' >> e${EMULATION_NAME}.c
1445 sed $sc ldscripts/${EMULATION_NAME}.xd >> e${EMULATION_NAME}.c
1447 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1448 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1449 echo ' ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1450 sed $sc ldscripts/${EMULATION_NAME}.xsc >> e${EMULATION_NAME}.c
1452 echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c
1453 sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
1455 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1456 echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c
1457 sed $sc ldscripts/${EMULATION_NAME}.xc >> e${EMULATION_NAME}.c
1459 echo ' ; else return' >> e${EMULATION_NAME}.c
1460 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1461 echo '; }' >> e${EMULATION_NAME}.c
1464 # Scripts read from the filesystem.
1466 cat >>e${EMULATION_NAME}.c <<EOF
1470 if (link_info.relocatable && config.build_constructors)
1471 return "ldscripts/${EMULATION_NAME}.xu";
1472 else if (link_info.relocatable)
1473 return "ldscripts/${EMULATION_NAME}.xr";
1474 else if (!config.text_read_only)
1475 return "ldscripts/${EMULATION_NAME}.xbn";
1477 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
1479 cat >>e${EMULATION_NAME}.c <<EOF
1480 else if (!config.magic_demand_paged)
1481 return "ldscripts/${EMULATION_NAME}.xn";
1484 if test -n "$GENERATE_PIE_SCRIPT" ; then
1485 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1486 cat >>e${EMULATION_NAME}.c <<EOF
1487 else if (link_info.pie && link_info.combreloc)
1488 return "ldscripts/${EMULATION_NAME}.xdc";
1491 cat >>e${EMULATION_NAME}.c <<EOF
1492 else if (link_info.pie)
1493 return "ldscripts/${EMULATION_NAME}.xd";
1496 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1497 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1498 cat >>e${EMULATION_NAME}.c <<EOF
1499 else if (link_info.shared && link_info.combreloc)
1500 return "ldscripts/${EMULATION_NAME}.xsc";
1503 cat >>e${EMULATION_NAME}.c <<EOF
1504 else if (link_info.shared)
1505 return "ldscripts/${EMULATION_NAME}.xs";
1508 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1509 cat >>e${EMULATION_NAME}.c <<EOF
1510 else if (link_info.combreloc)
1511 return "ldscripts/${EMULATION_NAME}.xc";
1514 cat >>e${EMULATION_NAME}.c <<EOF
1516 return "ldscripts/${EMULATION_NAME}.x";
1523 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1525 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1526 cat >>e${EMULATION_NAME}.c <<EOF
1527 $PARSE_AND_LIST_PROLOGUE
1531 cat >>e${EMULATION_NAME}.c <<EOF
1533 #define OPTION_DISABLE_NEW_DTAGS (400)
1534 #define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
1535 #define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
1536 #define OPTION_EH_FRAME_HDR (OPTION_GROUP + 1)
1539 gld${EMULATION_NAME}_add_options
1540 (int ns, char **shortopts, int nl, struct option **longopts,
1541 int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
1543 static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:";
1544 static const struct option xtra_long[] = {
1547 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1548 cat >>e${EMULATION_NAME}.c <<EOF
1549 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1550 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1551 {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
1552 {"Bgroup", no_argument, NULL, OPTION_GROUP},
1556 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
1557 cat >>e${EMULATION_NAME}.c <<EOF
1558 $PARSE_AND_LIST_LONGOPTS
1562 cat >>e${EMULATION_NAME}.c <<EOF
1563 {NULL, no_argument, NULL, 0}
1566 *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
1567 memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
1568 *longopts = (struct option *)
1569 xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
1570 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
1574 gld${EMULATION_NAME}_handle_option (int optc)
1583 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1584 cat >>e${EMULATION_NAME}.c <<EOF
1585 case OPTION_DISABLE_NEW_DTAGS:
1586 link_info.new_dtags = FALSE;
1589 case OPTION_ENABLE_NEW_DTAGS:
1590 link_info.new_dtags = TRUE;
1593 case OPTION_EH_FRAME_HDR:
1594 link_info.eh_frame_hdr = TRUE;
1598 link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
1599 /* Groups must be self-contained. */
1600 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
1601 link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
1605 if (strcmp (optarg, "initfirst") == 0)
1606 link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
1607 else if (strcmp (optarg, "interpose") == 0)
1608 link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
1609 else if (strcmp (optarg, "loadfltr") == 0)
1610 link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
1611 else if (strcmp (optarg, "nodefaultlib") == 0)
1612 link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
1613 else if (strcmp (optarg, "nodelete") == 0)
1614 link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
1615 else if (strcmp (optarg, "nodlopen") == 0)
1616 link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
1617 else if (strcmp (optarg, "nodump") == 0)
1618 link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
1619 else if (strcmp (optarg, "now") == 0)
1621 link_info.flags |= (bfd_vma) DF_BIND_NOW;
1622 link_info.flags_1 |= (bfd_vma) DF_1_NOW;
1624 else if (strcmp (optarg, "origin") == 0)
1626 link_info.flags |= (bfd_vma) DF_ORIGIN;
1627 link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
1629 else if (strcmp (optarg, "defs") == 0)
1630 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
1631 else if (strcmp (optarg, "muldefs") == 0)
1632 link_info.allow_multiple_definition = TRUE;
1633 else if (strcmp (optarg, "combreloc") == 0)
1634 link_info.combreloc = TRUE;
1635 else if (strcmp (optarg, "nocombreloc") == 0)
1636 link_info.combreloc = FALSE;
1637 else if (strcmp (optarg, "nocopyreloc") == 0)
1638 link_info.nocopyreloc = TRUE;
1639 else if (strcmp (optarg, "execstack") == 0)
1641 link_info.execstack = TRUE;
1642 link_info.noexecstack = FALSE;
1644 else if (strcmp (optarg, "noexecstack") == 0)
1646 link_info.noexecstack = TRUE;
1647 link_info.execstack = FALSE;
1649 /* What about the other Solaris -z options? FIXME. */
1654 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
1655 cat >>e${EMULATION_NAME}.c <<EOF
1656 $PARSE_AND_LIST_ARGS_CASES
1660 cat >>e${EMULATION_NAME}.c <<EOF
1668 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1669 cat >>e${EMULATION_NAME}.c <<EOF
1672 gld${EMULATION_NAME}_list_options (FILE * file)
1676 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1677 cat >>e${EMULATION_NAME}.c <<EOF
1678 fprintf (file, _(" -Bgroup\t\tSelects group name lookup rules for DSO\n"));
1679 fprintf (file, _(" --disable-new-dtags\tDisable new dynamic tags\n"));
1680 fprintf (file, _(" --enable-new-dtags\tEnable new dynamic tags\n"));
1681 fprintf (file, _(" --eh-frame-hdr\tCreate .eh_frame_hdr section\n"));
1682 fprintf (file, _(" -z combreloc\t\tMerge dynamic relocs into one section and sort\n"));
1683 fprintf (file, _(" -z defs\t\tReport unresolved symbols in object files.\n"));
1684 fprintf (file, _(" -z execstack\t\tMark executable as requiring executable stack\n"));
1685 fprintf (file, _(" -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
1686 fprintf (file, _(" -z interpose\t\tMark object to interpose all DSOs but executable\n"));
1687 fprintf (file, _(" -z loadfltr\t\tMark object requiring immediate process\n"));
1688 fprintf (file, _(" -z muldefs\t\tAllow multiple definitions\n"));
1689 fprintf (file, _(" -z nocombreloc\tDon't merge dynamic relocs into one section\n"));
1690 fprintf (file, _(" -z nocopyreloc\tDon't create copy relocs\n"));
1691 fprintf (file, _(" -z nodefaultlib\tMark object not to use default search paths\n"));
1692 fprintf (file, _(" -z nodelete\t\tMark DSO non-deletable at runtime\n"));
1693 fprintf (file, _(" -z nodlopen\t\tMark DSO not available to dlopen\n"));
1694 fprintf (file, _(" -z nodump\t\tMark DSO not available to dldump\n"));
1695 fprintf (file, _(" -z noexecstack\tMark executable as not requiring executable stack\n"));
1696 fprintf (file, _(" -z now\t\tMark object non-lazy runtime binding\n"));
1697 fprintf (file, _(" -z origin\t\tMark object requiring immediate \$ORIGIN processing\n\t\t\t at runtime\n"));
1698 fprintf (file, _(" -z KEYWORD\t\tIgnored for Solaris compatibility\n"));
1702 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
1703 cat >>e${EMULATION_NAME}.c <<EOF
1704 $PARSE_AND_LIST_OPTIONS
1708 cat >>e${EMULATION_NAME}.c <<EOF
1712 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
1713 cat >>e${EMULATION_NAME}.c <<EOF
1714 $PARSE_AND_LIST_EPILOGUE
1719 cat >>e${EMULATION_NAME}.c <<EOF
1720 #define gld${EMULATION_NAME}_add_options NULL
1721 #define gld${EMULATION_NAME}_handle_option NULL
1723 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1724 cat >>e${EMULATION_NAME}.c <<EOF
1725 #define gld${EMULATION_NAME}_list_options NULL
1730 cat >>e${EMULATION_NAME}.c <<EOF
1732 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1734 ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
1735 ${LDEMUL_SYSLIB-syslib_default},
1736 ${LDEMUL_HLL-hll_default},
1737 ${LDEMUL_AFTER_PARSE-after_parse_default},
1738 ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
1739 ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
1740 ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
1741 ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
1742 ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
1743 ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
1744 "${EMULATION_NAME}",
1746 ${LDEMUL_FINISH-gld${EMULATION_NAME}_finish},
1747 ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
1748 ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
1749 ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
1750 ${LDEMUL_SET_SYMBOLS-NULL},
1751 ${LDEMUL_PARSE_ARGS-NULL},
1752 gld${EMULATION_NAME}_add_options,
1753 gld${EMULATION_NAME}_handle_option,
1754 ${LDEMUL_UNRECOGNIZED_FILE-NULL},
1755 ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
1756 ${LDEMUL_RECOGNIZED_FILE-NULL},
1757 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
1758 ${LDEMUL_NEW_VERS_PATTERN-NULL}