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"
53 #include "elf/common.h"
55 static void gld${EMULATION_NAME}_before_parse
57 static void gld${EMULATION_NAME}_vercheck
58 PARAMS ((lang_input_statement_type *));
59 static void gld${EMULATION_NAME}_stat_needed
60 PARAMS ((lang_input_statement_type *));
61 static bfd_boolean gld${EMULATION_NAME}_try_needed
62 PARAMS ((const char *, int));
63 static bfd_boolean gld${EMULATION_NAME}_search_needed
64 PARAMS ((const char *, const char *, int));
65 static void gld${EMULATION_NAME}_check_needed
66 PARAMS ((lang_input_statement_type *));
67 static void gld${EMULATION_NAME}_after_open
69 static void gld${EMULATION_NAME}_find_exp_assignment
70 PARAMS ((etree_type *));
71 static void gld${EMULATION_NAME}_find_statement_assignment
72 PARAMS ((lang_statement_union_type *));
73 static void gld${EMULATION_NAME}_before_allocation
75 static bfd_boolean gld${EMULATION_NAME}_open_dynamic_archive
76 PARAMS ((const char *, search_dirs_type *, lang_input_statement_type *));
77 static lang_output_section_statement_type *output_rel_find
78 PARAMS ((asection *));
79 static asection *output_prev_sec_find
80 PARAMS ((lang_output_section_statement_type *));
81 static bfd_boolean gld${EMULATION_NAME}_place_orphan
82 PARAMS ((lang_input_statement_type *, asection *));
83 static void gld${EMULATION_NAME}_finish
85 static char *gld${EMULATION_NAME}_get_script
86 PARAMS ((int *isfile));
90 # Import any needed special functions and/or overrides.
92 if test -n "$EXTRA_EM_FILE" ; then
93 . ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
96 # Functions in this file can be overridden by setting the LDEMUL_* shell
97 # variables. If the name of the overriding function is the same as is
98 # defined in this file, then don't output this file's version.
99 # If a different overriding name is given then output the standard function
100 # as presumably it is called from the overriding function.
102 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
103 cat >>e${EMULATION_NAME}.c <<EOF
106 gld${EMULATION_NAME}_before_parse ()
108 const bfd_arch_info_type *arch = bfd_scan_arch ("${OUTPUT_ARCH}");
111 ldfile_output_architecture = arch->arch;
112 ldfile_output_machine = arch->mach;
113 ldfile_output_machine_name = arch->printable_name;
116 ldfile_output_architecture = bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`;
117 config.dynamic_link = ${DYNAMIC_LINK-TRUE};
118 config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
124 cat >>e${EMULATION_NAME}.c <<EOF
126 /* These variables are required to pass information back and forth
127 between after_open and check_needed and stat_needed and vercheck. */
129 static struct bfd_link_needed_list *global_needed;
130 static struct stat global_stat;
131 static bfd_boolean global_found;
132 static struct bfd_link_needed_list *global_vercheck_needed;
133 static bfd_boolean global_vercheck_failed;
136 /* On Linux, it's possible to have different versions of the same
137 shared library linked against different versions of libc. The
138 dynamic linker somehow tags which libc version to use in
139 /etc/ld.so.cache, and, based on the libc that it sees in the
140 executable, chooses which version of the shared library to use.
142 We try to do a similar check here by checking whether this shared
143 library needs any other shared libraries which may conflict with
144 libraries we have already included in the link. If it does, we
145 skip it, and try to find another shared library farther on down the
148 This is called via lang_for_each_input_file.
149 GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
150 which we are checking. This sets GLOBAL_VERCHECK_FAILED if we find
151 a conflicting version. */
154 gld${EMULATION_NAME}_vercheck (s)
155 lang_input_statement_type *s;
158 struct bfd_link_needed_list *l;
160 if (global_vercheck_failed)
162 if (s->the_bfd == NULL
163 || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
166 soname = bfd_elf_get_dt_soname (s->the_bfd);
168 soname = lbasename (bfd_get_filename (s->the_bfd));
170 for (l = global_vercheck_needed; l != NULL; l = l->next)
174 if (strcmp (soname, l->name) == 0)
176 /* Probably can't happen, but it's an easy check. */
180 if (strchr (l->name, '/') != NULL)
183 suffix = strstr (l->name, ".so.");
187 suffix += sizeof ".so." - 1;
189 if (strncmp (soname, l->name, suffix - l->name) == 0)
191 /* Here we know that S is a dynamic object FOO.SO.VER1, and
192 the object we are considering needs a dynamic object
193 FOO.SO.VER2, and VER1 and VER2 are different. This
194 appears to be a version mismatch, so we tell the caller
195 to try a different version of this library. */
196 global_vercheck_failed = TRUE;
203 /* See if an input file matches a DT_NEEDED entry by running stat on
207 gld${EMULATION_NAME}_stat_needed (s)
208 lang_input_statement_type *s;
216 if (s->the_bfd == NULL)
219 if (bfd_stat (s->the_bfd, &st) != 0)
221 einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
225 if (st.st_dev == global_stat.st_dev
226 && st.st_ino == global_stat.st_ino)
232 /* We issue a warning if it looks like we are including two
233 different versions of the same shared library. For example,
234 there may be a problem if -lc picks up libc.so.6 but some other
235 shared library has a DT_NEEDED entry of libc.so.5. This is a
236 heuristic test, and it will only work if the name looks like
237 NAME.so.VERSION. FIXME: Depending on file names is error-prone.
238 If we really want to issue warnings about mixing version numbers
239 of shared libraries, we need to find a better way. */
241 if (strchr (global_needed->name, '/') != NULL)
243 suffix = strstr (global_needed->name, ".so.");
246 suffix += sizeof ".so." - 1;
248 soname = bfd_elf_get_dt_soname (s->the_bfd);
250 soname = lbasename (s->filename);
252 if (strncmp (soname, global_needed->name, suffix - global_needed->name) == 0)
253 einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
254 global_needed->name, global_needed->by, soname);
258 /* This function is called for each possible name for a dynamic object
259 named by a DT_NEEDED entry. The FORCE parameter indicates whether
260 to skip the check for a conflicting version. */
263 gld${EMULATION_NAME}_try_needed (name, force)
270 abfd = bfd_openr (name, bfd_get_target (output_bfd));
273 if (! bfd_check_format (abfd, bfd_object))
278 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
284 /* For DT_NEEDED, they have to match. */
285 if (abfd->xvec != output_bfd->xvec)
291 /* Check whether this object would include any conflicting library
292 versions. If FORCE is set, then we skip this check; we use this
293 the second time around, if we couldn't find any compatible
294 instance of the shared library. */
298 struct bfd_link_needed_list *needed;
300 if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
301 einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
305 global_vercheck_needed = needed;
306 global_vercheck_failed = FALSE;
307 lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
308 if (global_vercheck_failed)
311 /* Return FALSE to force the caller to move on to try
312 another file on the search path. */
316 /* But wait! It gets much worse. On Linux, if a shared
317 library does not use libc at all, we are supposed to skip
318 it the first time around in case we encounter a shared
319 library later on with the same name which does use the
320 version of libc that we want. This is much too horrible
321 to use on any system other than Linux. */
326 cat >>e${EMULATION_NAME}.c <<EOF
328 struct bfd_link_needed_list *l;
330 for (l = needed; l != NULL; l = l->next)
331 if (strncmp (l->name, "libc.so", 7) == 0)
343 cat >>e${EMULATION_NAME}.c <<EOF
347 /* We've found a dynamic object matching the DT_NEEDED entry. */
349 /* We have already checked that there is no other input file of the
350 same name. We must now check again that we are not including the
351 same file twice. We need to do this because on many systems
352 libc.so is a symlink to, e.g., libc.so.1. The SONAME entry will
353 reference libc.so.1. If we have already included libc.so, we
354 don't want to include libc.so.1 if they are the same file, and we
355 can only check that using stat. */
357 if (bfd_stat (abfd, &global_stat) != 0)
358 einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
360 /* First strip off everything before the last '/'. */
361 soname = lbasename (abfd->filename);
363 if (trace_file_tries)
364 info_msg (_("found %s at %s\n"), soname, name);
366 global_found = FALSE;
367 lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
370 /* Return TRUE to indicate that we found the file, even though
371 we aren't going to do anything with it. */
375 /* Tell the ELF backend that we don't want the output file to have a
376 DT_NEEDED entry for this file. */
377 bfd_elf_set_dt_needed_name (abfd, "");
379 /* Tell the ELF backend that the output file needs a DT_NEEDED
380 entry for this file if it is used to resolve the reference in
382 bfd_elf_set_dt_needed_soname (abfd, soname);
384 /* Add this file into the symbol table. */
385 if (! bfd_link_add_symbols (abfd, &link_info))
386 einfo ("%F%B: could not read symbols: %E\n", abfd);
392 /* Search for a needed file in a path. */
395 gld${EMULATION_NAME}_search_needed (path, name, force)
404 return gld${EMULATION_NAME}_try_needed (name, force);
406 if (path == NULL || *path == '\0')
411 char *filename, *sset;
413 s = strchr (path, ':');
415 s = path + strlen (path);
417 filename = (char *) xmalloc (s - path + len + 2);
422 memcpy (filename, path, s - path);
423 filename[s - path] = '/';
424 sset = filename + (s - path) + 1;
428 if (gld${EMULATION_NAME}_try_needed (filename, force))
442 if [ "x${USE_LIBPATH}" = xyes ] ; then
443 cat >>e${EMULATION_NAME}.c <<EOF
445 /* Add the sysroot to every entry in a colon-separated path. */
448 gld${EMULATION_NAME}_add_sysroot (path)
458 if (path[i++] == ':')
464 len = len + colons * strlen (ld_sysroot);
465 ret = xmalloc (len + 1);
466 strcpy (ret, ld_sysroot);
467 p = ret + strlen (ret);
473 strcpy (p, ld_sysroot);
486 cat >>e${EMULATION_NAME}.c <<EOF
487 /* For a native linker, check the file /etc/ld.so.conf for directories
488 in which we may find shared libraries. /etc/ld.so.conf is really
489 only meaningful on Linux. */
491 static bfd_boolean gld${EMULATION_NAME}_check_ld_so_conf
492 PARAMS ((const char *, int));
495 gld${EMULATION_NAME}_check_ld_so_conf (name, force)
499 static bfd_boolean initialized;
500 static char *ld_so_conf;
507 tmppath = concat (ld_sysroot, "/etc/ld.so.conf", NULL);
508 f = fopen (tmppath, FOPEN_RT);
518 b = (char *) xmalloc (alloc);
520 while ((c = getc (f)) != EOF)
522 if (len + 1 >= alloc)
525 b = (char *) xrealloc (b, alloc);
538 if (len > 0 && b[len - 1] != ':')
546 if (len > 0 && b[len - 1] == ':')
561 char *d = gld${EMULATION_NAME}_add_sysroot (b);
572 if (ld_so_conf == NULL)
575 return gld${EMULATION_NAME}_search_needed (ld_so_conf, name, force);
583 cat >>e${EMULATION_NAME}.c <<EOF
585 /* See if an input file matches a DT_NEEDED entry by name. */
588 gld${EMULATION_NAME}_check_needed (s)
589 lang_input_statement_type *s;
594 if (s->filename != NULL)
598 if (strcmp (s->filename, global_needed->name) == 0)
604 if (s->search_dirs_flag)
606 f = strrchr (s->filename, '/');
608 && strcmp (f + 1, global_needed->name) == 0)
616 if (s->the_bfd != NULL)
620 soname = bfd_elf_get_dt_soname (s->the_bfd);
622 && strcmp (soname, global_needed->name) == 0)
632 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
633 cat >>e${EMULATION_NAME}.c <<EOF
635 /* This is called after all the input files have been opened. */
638 gld${EMULATION_NAME}_after_open ()
640 struct bfd_link_needed_list *needed, *l;
642 /* We only need to worry about this when doing a final link. */
643 if (link_info.relocateable || link_info.shared)
646 /* Get the list of files which appear in DT_NEEDED entries in
647 dynamic objects included in the link (often there will be none).
648 For each such file, we want to track down the corresponding
649 library, and include the symbol table in the link. This is what
650 the runtime dynamic linker will do. Tracking the files down here
651 permits one dynamic object to include another without requiring
652 special action by the person doing the link. Note that the
653 needed list can actually grow while we are stepping through this
655 needed = bfd_elf_get_needed_list (output_bfd, &link_info);
656 for (l = needed; l != NULL; l = l->next)
658 struct bfd_link_needed_list *ll;
661 /* If we've already seen this file, skip it. */
662 for (ll = needed; ll != l; ll = ll->next)
663 if (strcmp (ll->name, l->name) == 0)
668 /* See if this file was included in the link explicitly. */
670 global_found = FALSE;
671 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
675 if (trace_file_tries)
676 info_msg (_("%s needed by %B\n"), l->name, l->by);
678 /* We need to find this file and include the symbol table. We
679 want to search for the file in the same way that the dynamic
680 linker will search. That means that we want to use
681 rpath_link, rpath, then the environment variable
682 LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
683 entries (native only), then the linker script LIB_SEARCH_DIRS.
684 We do not search using the -L arguments.
686 We search twice. The first time, we skip objects which may
687 introduce version mismatches. The second time, we force
688 their use. See gld${EMULATION_NAME}_vercheck comment. */
689 for (force = 0; force < 2; force++)
692 search_dirs_type *search;
694 if [ "x${USE_LIBPATH}" = xyes ] ; then
695 cat >>e${EMULATION_NAME}.c <<EOF
696 const char *lib_path;
697 struct bfd_link_needed_list *rp;
701 cat >>e${EMULATION_NAME}.c <<EOF
703 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
707 if [ "x${USE_LIBPATH}" = xyes ] ; then
708 cat >>e${EMULATION_NAME}.c <<EOF
709 if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
714 if [ "x${NATIVE}" = xyes ] ; then
715 cat >>e${EMULATION_NAME}.c <<EOF
716 if (command_line.rpath_link == NULL
717 && command_line.rpath == NULL)
719 lib_path = (const char *) getenv ("LD_RUN_PATH");
720 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name,
724 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
725 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, force))
729 if [ "x${USE_LIBPATH}" = xyes ] ; then
730 cat >>e${EMULATION_NAME}.c <<EOF
732 rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
733 for (; !found && rp != NULL; rp = rp->next)
735 char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
736 found = (rp->by == l->by
737 && gld${EMULATION_NAME}_search_needed (tmpname,
747 cat >>e${EMULATION_NAME}.c <<EOF
748 len = strlen (l->name);
749 for (search = search_head; search != NULL; search = search->next)
755 filename = (char *) xmalloc (strlen (search->name) + len + 2);
756 sprintf (filename, "%s/%s", search->name, l->name);
757 if (gld${EMULATION_NAME}_try_needed (filename, force))
764 if [ "x${USE_LIBPATH}" = xyes ] ; then
767 cat >>e${EMULATION_NAME}.c <<EOF
768 if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
775 cat >>e${EMULATION_NAME}.c <<EOF
781 einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
789 cat >>e${EMULATION_NAME}.c <<EOF
791 /* Look through an expression for an assignment statement. */
794 gld${EMULATION_NAME}_find_exp_assignment (exp)
797 struct bfd_link_hash_entry *h;
799 switch (exp->type.node_class)
802 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
803 FALSE, FALSE, FALSE);
807 /* We call record_link_assignment even if the symbol is defined.
808 This is because if it is defined by a dynamic object, we
809 actually want to use the value defined by the linker script,
810 not the value from the dynamic object (because we are setting
811 symbols like etext). If the symbol is defined by a regular
812 object, then, as it happens, calling record_link_assignment
817 if (strcmp (exp->assign.dst, ".") != 0)
819 if (! (bfd_elf${ELFSIZE}_record_link_assignment
820 (output_bfd, &link_info, exp->assign.dst,
821 exp->type.node_class == etree_provide ? TRUE : FALSE)))
822 einfo ("%P%F: failed to record assignment to %s: %E\n",
825 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
829 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
830 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
834 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
835 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
836 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
840 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
849 /* This is called by the before_allocation routine via
850 lang_for_each_statement. It locates any assignment statements, and
851 tells the ELF backend about them, in case they are assignments to
852 symbols which are referred to by dynamic objects. */
855 gld${EMULATION_NAME}_find_statement_assignment (s)
856 lang_statement_union_type *s;
858 if (s->header.type == lang_assignment_statement_enum)
859 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
864 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
865 if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
866 ELF_INTERPRETER_SET_DEFAULT="
869 sinterp->contents = ${ELF_INTERPRETER_NAME};
870 sinterp->_raw_size = strlen (sinterp->contents) + 1;
875 ELF_INTERPRETER_SET_DEFAULT=
877 cat >>e${EMULATION_NAME}.c <<EOF
879 /* This is called after the sections have been attached to output
880 sections, but before any sizes or addresses have been set. */
883 gld${EMULATION_NAME}_before_allocation ()
888 /* If we are going to make any variable assignments, we need to let
889 the ELF backend know about them in case the variables are
890 referred to by dynamic objects. */
891 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
893 /* Let the ELF backend work out the sizes of any sections required
894 by dynamic linking. */
895 rpath = command_line.rpath;
897 rpath = (const char *) getenv ("LD_RUN_PATH");
898 if (! (bfd_elf${ELFSIZE}_size_dynamic_sections
899 (output_bfd, command_line.soname, rpath,
900 command_line.filter_shlib,
901 (const char * const *) command_line.auxiliary_filters,
902 &link_info, &sinterp, lang_elf_version_info)))
903 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
904 ${ELF_INTERPRETER_SET_DEFAULT}
905 /* Let the user override the dynamic linker we are using. */
906 if (command_line.interpreter != NULL
909 sinterp->contents = (bfd_byte *) command_line.interpreter;
910 sinterp->_raw_size = strlen (command_line.interpreter) + 1;
913 /* Look for any sections named .gnu.warning. As a GNU extensions,
914 we treat such sections as containing warning messages. We print
915 out the warning message, and then zero out the section size so
916 that it does not get copied into the output file. */
919 LANG_FOR_EACH_INPUT_STATEMENT (is)
926 if (is->just_syms_flag)
929 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
933 sz = bfd_section_size (is->the_bfd, s);
934 msg = xmalloc ((size_t) sz + 1);
935 if (! bfd_get_section_contents (is->the_bfd, s, msg, (file_ptr) 0, sz))
936 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
939 ret = link_info.callbacks->warning (&link_info, msg,
941 is->the_bfd, (asection *) NULL,
946 /* Clobber the section size, so that we don't waste copying the
947 warning into the output file. */
956 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
957 cat >>e${EMULATION_NAME}.c <<EOF
959 /* Try to open a dynamic archive. This is where we know that ELF
960 dynamic libraries have an extension of .so (or .sl on oddball systems
964 gld${EMULATION_NAME}_open_dynamic_archive (arch, search, entry)
966 search_dirs_type *search;
967 lang_input_statement_type *entry;
969 const char *filename;
972 if (! entry->is_archive)
975 filename = entry->filename;
977 /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
978 is defined, but it does not seem worth the headache to optimize
979 away those two bytes of space. */
980 string = (char *) xmalloc (strlen (search->name)
983 #ifdef EXTRA_SHLIB_EXTENSION
984 + strlen (EXTRA_SHLIB_EXTENSION)
988 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
990 #ifdef EXTRA_SHLIB_EXTENSION
991 /* Try the .so extension first. If that fails build a new filename
992 using EXTRA_SHLIB_EXTENSION. */
993 if (! ldfile_try_open_bfd (string, entry))
994 sprintf (string, "%s/lib%s%s%s", search->name,
995 filename, arch, EXTRA_SHLIB_EXTENSION);
998 if (! ldfile_try_open_bfd (string, entry))
1004 entry->filename = string;
1006 /* We have found a dynamic object to include in the link. The ELF
1007 backend linker will create a DT_NEEDED entry in the .dynamic
1008 section naming this file. If this file includes a DT_SONAME
1009 entry, it will be used. Otherwise, the ELF linker will just use
1010 the name of the file. For an archive found by searching, like
1011 this one, the DT_NEEDED entry should consist of just the name of
1012 the file, without the path information used to find it. Note
1013 that we only need to do this if we have a dynamic object; an
1014 archive will never be referenced by a DT_NEEDED entry.
1016 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
1017 very pretty. I haven't been able to think of anything that is
1019 if (bfd_check_format (entry->the_bfd, bfd_object)
1020 && (entry->the_bfd->flags & DYNAMIC) != 0)
1022 ASSERT (entry->is_archive && entry->search_dirs_flag);
1024 /* Rather than duplicating the logic above. Just use the
1025 filename we recorded earlier. */
1027 filename = lbasename (entry->filename);
1028 bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
1037 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
1038 cat >>e${EMULATION_NAME}.c <<EOF
1040 /* A variant of lang_output_section_find. Used by place_orphan. */
1042 static lang_output_section_statement_type *
1043 output_rel_find (sec)
1046 lang_statement_union_type *u;
1047 lang_output_section_statement_type *lookup;
1048 lang_output_section_statement_type *last = NULL;
1049 lang_output_section_statement_type *last_rel = NULL;
1050 lang_output_section_statement_type *last_rel_alloc = NULL;
1051 int rela = sec->name[4] == 'a';
1053 for (u = lang_output_section_statement.head; u; u = lookup->next)
1055 lookup = &u->output_section_statement;
1056 if (strncmp (".rel", lookup->name, 4) == 0)
1058 /* Don't place after .rel.plt as doing so results in wrong
1059 dynamic tags. Also, place allocated reloc sections before
1061 int lookrela = lookup->name[4] == 'a';
1063 if (strcmp (".plt", lookup->name + 4 + lookrela) == 0
1064 || (lookup->bfd_section != NULL
1065 && (lookup->bfd_section->flags & SEC_ALLOC) == 0))
1068 if (rela == lookrela)
1070 if (lookup->bfd_section != NULL
1071 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1072 last_rel_alloc = lookup;
1077 return last_rel_alloc;
1085 /* Find the last output section before given output statement.
1086 Used by place_orphan. */
1089 output_prev_sec_find (os)
1090 lang_output_section_statement_type *os;
1092 asection *s = (asection *) NULL;
1093 lang_statement_union_type *u;
1094 lang_output_section_statement_type *lookup;
1096 for (u = lang_output_section_statement.head;
1097 u != (lang_statement_union_type *) NULL;
1100 lookup = &u->output_section_statement;
1104 if (lookup->bfd_section != NULL && lookup->bfd_section->owner != NULL)
1105 s = lookup->bfd_section;
1111 /* Place an orphan section. We use this to put random SHF_ALLOC
1112 sections in the right segment. */
1114 struct orphan_save {
1115 lang_output_section_statement_type *os;
1117 lang_statement_union_type **stmt;
1118 lang_statement_union_type **os_tail;
1122 gld${EMULATION_NAME}_place_orphan (file, s)
1123 lang_input_statement_type *file;
1126 static struct orphan_save hold_text;
1127 static struct orphan_save hold_rodata;
1128 static struct orphan_save hold_data;
1129 static struct orphan_save hold_bss;
1130 static struct orphan_save hold_rel;
1131 static struct orphan_save hold_interp;
1132 static struct orphan_save hold_sdata;
1133 static int count = 1;
1134 struct orphan_save *place;
1135 lang_statement_list_type *old;
1136 lang_statement_list_type add;
1137 etree_type *address;
1138 const char *secname;
1139 const char *ps = NULL;
1140 lang_output_section_statement_type *os;
1141 lang_statement_union_type **os_tail;
1142 etree_type *load_base;
1145 secname = bfd_get_section_name (s->owner, s);
1146 if (! link_info.relocateable
1147 && link_info.combreloc
1148 && (s->flags & SEC_ALLOC)
1149 && strncmp (secname, ".rel", 4) == 0)
1151 if (secname[4] == 'a')
1152 secname = ".rela.dyn";
1154 secname = ".rel.dyn";
1158 if (isdyn || (!config.unique_orphan_sections && !unique_section_p (secname)))
1160 /* Look through the script to see where to place this section. */
1161 os = lang_output_section_find (secname);
1164 && (os->bfd_section == NULL
1165 || ((s->flags ^ os->bfd_section->flags)
1166 & (SEC_LOAD | SEC_ALLOC)) == 0))
1168 /* We already have an output section statement with this
1169 name, and its bfd section, if any, has compatible flags. */
1170 lang_add_section (&os->children, s, os, file);
1175 if (hold_text.os == NULL)
1176 hold_text.os = lang_output_section_find (".text");
1178 /* If this is a final link, then always put .gnu.warning.SYMBOL
1179 sections into the .text section to get them out of the way. */
1180 if (! link_info.shared
1181 && ! link_info.relocateable
1182 && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
1183 && hold_text.os != NULL)
1185 lang_add_section (&hold_text.os->children, s, hold_text.os, file);
1189 /* Decide which segment the section should go in based on the
1190 section name and section flags. We put loadable .note sections
1191 right after the .interp section, so that the PT_NOTE segment is
1192 stored right after the program headers where the OS can read it
1193 in the first page. */
1194 #define HAVE_SECTION(hold, name) \
1195 (hold.os != NULL || (hold.os = lang_output_section_find (name)) != NULL)
1197 if ((s->flags & SEC_EXCLUDE) != 0 && !link_info.relocateable)
1199 if (s->output_section == NULL)
1200 s->output_section = bfd_abs_section_ptr;
1205 if ((s->flags & SEC_ALLOC) == 0)
1207 else if ((s->flags & SEC_LOAD) != 0
1208 && strncmp (secname, ".note", 5) == 0
1209 && HAVE_SECTION (hold_interp, ".interp"))
1210 place = &hold_interp;
1211 else if ((s->flags & SEC_HAS_CONTENTS) == 0
1212 && HAVE_SECTION (hold_bss, ".bss"))
1214 else if ((s->flags & SEC_SMALL_DATA) != 0
1215 && HAVE_SECTION (hold_sdata, ".sdata"))
1216 place = &hold_sdata;
1217 else if ((s->flags & SEC_READONLY) == 0
1218 && HAVE_SECTION (hold_data, ".data"))
1220 else if (strncmp (secname, ".rel", 4) == 0
1221 && (s->flags & SEC_LOAD) != 0
1222 && (hold_rel.os != NULL
1223 || (hold_rel.os = output_rel_find (s)) != NULL))
1225 else if ((s->flags & (SEC_CODE | SEC_READONLY)) == SEC_READONLY
1226 && HAVE_SECTION (hold_rodata, ".rodata"))
1227 place = &hold_rodata;
1228 else if ((s->flags & (SEC_CODE | SEC_READONLY)) == (SEC_CODE | SEC_READONLY)
1229 && hold_text.os != NULL)
1234 /* Choose a unique name for the section. This will be needed if the
1235 same section name appears in the input file with different
1236 loadable or allocatable characteristics. */
1237 if (bfd_get_section_by_name (output_bfd, secname) != NULL)
1239 secname = bfd_get_unique_section_name (output_bfd, secname, &count);
1240 if (secname == NULL)
1241 einfo ("%F%P: place_orphan failed: %E\n");
1244 /* Start building a list of statements for this section.
1245 First save the current statement pointer. */
1248 /* If we have found an appropriate place for the output section
1249 statements for this orphan, add them to our own private list,
1250 inserting them later into the global statement list. */
1254 lang_list_init (stat_ptr);
1257 if (config.build_constructors)
1259 /* If the name of the section is representable in C, then create
1260 symbols to mark the start and the end of the section. */
1261 for (ps = secname; *ps != '\0'; ps++)
1262 if (! ISALNUM (*ps) && *ps != '_')
1267 etree_type *e_align;
1269 symname = (char *) xmalloc (ps - secname + sizeof "__start_");
1270 sprintf (symname, "__start_%s", secname);
1271 e_align = exp_unop (ALIGN_K,
1272 exp_intop ((bfd_vma) 1 << s->alignment_power));
1273 lang_add_assignment (exp_assop ('=', symname, e_align));
1278 if (link_info.relocateable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
1279 address = exp_intop ((bfd_vma) 0);
1282 if (place != NULL && place->os->load_base != NULL)
1284 etree_type *lma_from_vma;
1285 lma_from_vma = exp_binop ('-', place->os->load_base,
1286 exp_nameop (ADDR, place->os->name));
1287 load_base = exp_binop ('+', lma_from_vma,
1288 exp_nameop (ADDR, secname));
1291 os_tail = lang_output_section_statement.tail;
1292 os = lang_enter_output_section_statement (secname, address, 0,
1294 (etree_type *) NULL,
1295 (etree_type *) NULL,
1298 lang_add_section (&os->children, s, os, file);
1300 lang_leave_output_section_statement
1301 ((bfd_vma) 0, "*default*",
1302 (struct lang_output_section_phdr_list *) NULL, NULL);
1304 if (config.build_constructors && *ps == '\0')
1308 /* lang_leave_ouput_section_statement resets stat_ptr. Put
1309 stat_ptr back where we want it. */
1313 symname = (char *) xmalloc (ps - secname + sizeof "__stop_");
1314 sprintf (symname, "__stop_%s", secname);
1315 lang_add_assignment (exp_assop ('=', symname,
1316 exp_nameop (NAME, ".")));
1319 /* Restore the global list pointer. */
1322 if (place != NULL && os->bfd_section != NULL)
1324 asection *snew, **pps;
1326 snew = os->bfd_section;
1328 /* Shuffle the bfd section list to make the output file look
1329 neater. This is really only cosmetic. */
1330 if (place->section == NULL)
1332 asection *bfd_section = place->os->bfd_section;
1334 /* If the output statement hasn't been used to place
1335 any input sections (and thus doesn't have an output
1336 bfd_section), look for the closest prior output statement
1337 having an output section. */
1338 if (bfd_section == NULL)
1339 bfd_section = output_prev_sec_find (place->os);
1341 if (bfd_section != NULL && bfd_section != snew)
1342 place->section = &bfd_section->next;
1345 if (place->section != NULL)
1347 /* Unlink the section. */
1348 for (pps = &output_bfd->sections; *pps != snew; pps = &(*pps)->next)
1350 bfd_section_list_remove (output_bfd, pps);
1352 /* Now tack it on to the "place->os" section list. */
1353 bfd_section_list_insert (output_bfd, place->section, snew);
1356 /* Save the end of this list. Further ophans of this type will
1357 follow the one we've just added. */
1358 place->section = &snew->next;
1360 /* The following is non-cosmetic. We try to put the output
1361 statements in some sort of reasonable order here, because
1362 they determine the final load addresses of the orphan
1363 sections. In addition, placing output statements in the
1364 wrong order may require extra segments. For instance,
1365 given a typical situation of all read-only sections placed
1366 in one segment and following that a segment containing all
1367 the read-write sections, we wouldn't want to place an orphan
1368 read/write section before or amongst the read-only ones. */
1369 if (add.head != NULL)
1371 lang_statement_union_type *newly_added_os;
1373 if (place->stmt == NULL)
1375 /* Put the new statement list right at the head. */
1376 *add.tail = place->os->header.next;
1377 place->os->header.next = add.head;
1379 place->os_tail = &place->os->next;
1383 /* Put it after the last orphan statement we added. */
1384 *add.tail = *place->stmt;
1385 *place->stmt = add.head;
1388 /* Fix the global list pointer if we happened to tack our
1389 new list at the tail. */
1390 if (*old->tail == add.head)
1391 old->tail = add.tail;
1393 /* Save the end of this list. */
1394 place->stmt = add.tail;
1396 /* Do the same for the list of output section statements. */
1397 newly_added_os = *os_tail;
1399 newly_added_os->output_section_statement.next = *place->os_tail;
1400 *place->os_tail = newly_added_os;
1401 place->os_tail = &newly_added_os->output_section_statement.next;
1403 /* Fixing the global list pointer here is a little different.
1404 We added to the list in lang_enter_output_section_statement,
1405 trimmed off the new output_section_statment above when
1406 assigning *os_tail = NULL, but possibly added it back in
1407 the same place when assigning *place->os_tail. */
1408 if (*os_tail == NULL)
1409 lang_output_section_statement.tail = os_tail;
1418 if test x"$LDEMUL_FINISH" != xgld"$EMULATION_NAME"_finish; then
1419 cat >>e${EMULATION_NAME}.c <<EOF
1422 gld${EMULATION_NAME}_finish ()
1424 if (bfd_elf${ELFSIZE}_discard_info (output_bfd, &link_info))
1426 lang_reset_memory_regions ();
1428 /* Resize the sections. */
1429 lang_size_sections (stat_ptr->head, abs_output_section,
1430 &stat_ptr->head, 0, (bfd_vma) 0, NULL);
1432 /* Redo special stuff. */
1433 ldemul_after_allocation ();
1435 /* Do the assignments again. */
1436 lang_do_assignments (stat_ptr->head, abs_output_section,
1437 (fill_type *) 0, (bfd_vma) 0);
1443 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1444 cat >>e${EMULATION_NAME}.c <<EOF
1447 gld${EMULATION_NAME}_get_script (isfile)
1451 if test -n "$COMPILE_IN"
1453 # Scripts compiled in.
1455 # sed commands to quote an ld script as a C string.
1456 sc="-f stringify.sed"
1458 cat >>e${EMULATION_NAME}.c <<EOF
1462 if (link_info.relocateable && config.build_constructors)
1465 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1466 echo ' ; else if (link_info.relocateable) return' >> e${EMULATION_NAME}.c
1467 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1468 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1469 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1470 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
1471 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1472 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1474 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1475 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1476 echo ' ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1477 sed $sc ldscripts/${EMULATION_NAME}.xsc >> e${EMULATION_NAME}.c
1479 echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c
1480 sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
1482 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1483 echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c
1484 sed $sc ldscripts/${EMULATION_NAME}.xc >> e${EMULATION_NAME}.c
1486 echo ' ; else return' >> e${EMULATION_NAME}.c
1487 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1488 echo '; }' >> e${EMULATION_NAME}.c
1491 # Scripts read from the filesystem.
1493 cat >>e${EMULATION_NAME}.c <<EOF
1497 if (link_info.relocateable && config.build_constructors)
1498 return "ldscripts/${EMULATION_NAME}.xu";
1499 else if (link_info.relocateable)
1500 return "ldscripts/${EMULATION_NAME}.xr";
1501 else if (!config.text_read_only)
1502 return "ldscripts/${EMULATION_NAME}.xbn";
1503 else if (!config.magic_demand_paged)
1504 return "ldscripts/${EMULATION_NAME}.xn";
1505 else if (link_info.shared)
1506 return "ldscripts/${EMULATION_NAME}.xs";
1508 return "ldscripts/${EMULATION_NAME}.x";
1515 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1517 if test x"$LDEMUL_PARSE_ARGS" != xgld"$EMULATION_NAME"_parse_args; then
1519 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1520 cat >>e${EMULATION_NAME}.c <<EOF
1521 $PARSE_AND_LIST_PROLOGUE
1525 cat >>e${EMULATION_NAME}.c <<EOF
1529 #define OPTION_DISABLE_NEW_DTAGS (400)
1530 #define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
1531 #define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
1532 #define OPTION_EH_FRAME_HDR (OPTION_GROUP + 1)
1534 static struct option longopts[] =
1538 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1539 cat >>e${EMULATION_NAME}.c <<EOF
1540 /* getopt allows abbreviations, so we do this to stop it from
1541 treating -d/-e as abbreviations for these options. */
1542 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1543 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1544 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1545 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1546 {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
1547 {"Bgroup", no_argument, NULL, OPTION_GROUP},
1548 {"Bgroup", no_argument, NULL, OPTION_GROUP},
1552 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
1553 cat >>e${EMULATION_NAME}.c <<EOF
1554 $PARSE_AND_LIST_LONGOPTS
1558 cat >>e${EMULATION_NAME}.c <<EOF
1559 {NULL, no_argument, NULL, 0}
1563 static int gld${EMULATION_NAME}_parse_args PARAMS ((int, char **));
1566 gld${EMULATION_NAME}_parse_args (argc, argv)
1572 static int prevoptind = -1;
1573 int prevopterr = opterr;
1576 if (prevoptind != optind)
1580 prevoptind = optind;
1582 optc = getopt_long_only (argc, argv,
1583 "-${PARSE_AND_LIST_SHORTOPTS}z:", longopts,
1585 opterr = prevopterr;
1592 optind = prevoptind;
1597 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1598 cat >>e${EMULATION_NAME}.c <<EOF
1599 case OPTION_DISABLE_NEW_DTAGS:
1600 link_info.new_dtags = FALSE;
1603 case OPTION_ENABLE_NEW_DTAGS:
1604 link_info.new_dtags = TRUE;
1607 case OPTION_EH_FRAME_HDR:
1608 link_info.eh_frame_hdr = TRUE;
1612 link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
1613 /* Groups must be self-contained. */
1614 link_info.no_undefined = TRUE;
1618 if (strcmp (optarg, "initfirst") == 0)
1619 link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
1620 else if (strcmp (optarg, "interpose") == 0)
1621 link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
1622 else if (strcmp (optarg, "loadfltr") == 0)
1623 link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
1624 else if (strcmp (optarg, "nodefaultlib") == 0)
1625 link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
1626 else if (strcmp (optarg, "nodelete") == 0)
1627 link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
1628 else if (strcmp (optarg, "nodlopen") == 0)
1629 link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
1630 else if (strcmp (optarg, "nodump") == 0)
1631 link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
1632 else if (strcmp (optarg, "now") == 0)
1634 link_info.flags |= (bfd_vma) DF_BIND_NOW;
1635 link_info.flags_1 |= (bfd_vma) DF_1_NOW;
1637 else if (strcmp (optarg, "origin") == 0)
1639 link_info.flags |= (bfd_vma) DF_ORIGIN;
1640 link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
1642 else if (strcmp (optarg, "defs") == 0)
1643 link_info.no_undefined = TRUE;
1644 else if (strcmp (optarg, "muldefs") == 0)
1645 link_info.allow_multiple_definition = TRUE;
1646 else if (strcmp (optarg, "combreloc") == 0)
1647 link_info.combreloc = TRUE;
1648 else if (strcmp (optarg, "nocombreloc") == 0)
1649 link_info.combreloc = FALSE;
1650 else if (strcmp (optarg, "nocopyreloc") == 0)
1651 link_info.nocopyreloc = TRUE;
1652 /* What about the other Solaris -z options? FIXME. */
1657 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
1658 cat >>e${EMULATION_NAME}.c <<EOF
1659 $PARSE_AND_LIST_ARGS_CASES
1663 cat >>e${EMULATION_NAME}.c <<EOF
1672 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1673 cat >>e${EMULATION_NAME}.c <<EOF
1675 static void gld${EMULATION_NAME}_list_options PARAMS ((FILE * file));
1678 gld${EMULATION_NAME}_list_options (file)
1683 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1684 cat >>e${EMULATION_NAME}.c <<EOF
1685 fprintf (file, _(" -Bgroup\t\tSelects group name lookup rules for DSO\n"));
1686 fprintf (file, _(" --disable-new-dtags\tDisable new dynamic tags\n"));
1687 fprintf (file, _(" --enable-new-dtags\tEnable new dynamic tags\n"));
1688 fprintf (file, _(" --eh-frame-hdr\tCreate .eh_frame_hdr section\n"));
1689 fprintf (file, _(" -z combreloc\t\tMerge dynamic relocs into one section and sort\n"));
1690 fprintf (file, _(" -z defs\t\tDisallows undefined symbols\n"));
1691 fprintf (file, _(" -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
1692 fprintf (file, _(" -z interpose\t\tMark object to interpose all DSOs but executable\n"));
1693 fprintf (file, _(" -z loadfltr\t\tMark object requiring immediate process\n"));
1694 fprintf (file, _(" -z muldefs\t\tAllow multiple definitions\n"));
1695 fprintf (file, _(" -z nocombreloc\tDon't merge dynamic relocs into one section\n"));
1696 fprintf (file, _(" -z nocopyreloc\tDon't create copy relocs\n"));
1697 fprintf (file, _(" -z nodefaultlib\tMark object not to use default search paths\n"));
1698 fprintf (file, _(" -z nodelete\t\tMark DSO non-deletable at runtime\n"));
1699 fprintf (file, _(" -z nodlopen\t\tMark DSO not available to dlopen\n"));
1700 fprintf (file, _(" -z nodump\t\tMark DSO not available to dldump\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 if test x"$LDEMUL_PARSE_ARGS" != xgld"$EMULATION_NAME"_parse_args; then
1725 cat >>e${EMULATION_NAME}.c <<EOF
1726 #define gld${EMULATION_NAME}_parse_args NULL
1729 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1730 cat >>e${EMULATION_NAME}.c <<EOF
1731 #define gld${EMULATION_NAME}_list_options NULL
1736 cat >>e${EMULATION_NAME}.c <<EOF
1738 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1740 ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
1741 ${LDEMUL_SYSLIB-syslib_default},
1742 ${LDEMUL_HLL-hll_default},
1743 ${LDEMUL_AFTER_PARSE-after_parse_default},
1744 ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
1745 ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
1746 ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
1747 ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
1748 ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
1749 ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
1750 "${EMULATION_NAME}",
1752 ${LDEMUL_FINISH-gld${EMULATION_NAME}_finish},
1753 ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
1754 ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
1755 ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
1756 ${LDEMUL_SET_SYMBOLS-NULL},
1757 ${LDEMUL_PARSE_ARGS-gld${EMULATION_NAME}_parse_args},
1758 ${LDEMUL_UNRECOGNIZED_FILE-NULL},
1759 ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
1760 ${LDEMUL_RECOGNIZED_FILE-NULL},
1761 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
1762 ${LDEMUL_NEW_VERS_PATTERN-NULL}