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 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"
54 #include "elf/common.h"
56 static void gld${EMULATION_NAME}_before_parse PARAMS ((void));
57 static void gld${EMULATION_NAME}_vercheck
58 PARAMS ((lang_input_statement_type *));
59 static void gld${EMULATION_NAME}_stat_needed
60 PARAMS ((lang_input_statement_type *));
61 static boolean gld${EMULATION_NAME}_try_needed PARAMS ((const char *, int));
62 static boolean gld${EMULATION_NAME}_search_needed
63 PARAMS ((const char *, const char *, int));
64 static void gld${EMULATION_NAME}_check_needed
65 PARAMS ((lang_input_statement_type *));
66 static void gld${EMULATION_NAME}_after_open PARAMS ((void));
67 static void gld${EMULATION_NAME}_find_exp_assignment PARAMS ((etree_type *));
68 static void gld${EMULATION_NAME}_find_statement_assignment
69 PARAMS ((lang_statement_union_type *));
70 static void gld${EMULATION_NAME}_before_allocation PARAMS ((void));
71 static boolean gld${EMULATION_NAME}_open_dynamic_archive
72 PARAMS ((const char *, search_dirs_type *, lang_input_statement_type *));
73 static lang_output_section_statement_type *output_rel_find PARAMS ((void));
74 static boolean gld${EMULATION_NAME}_place_orphan
75 PARAMS ((lang_input_statement_type *, asection *));
76 static char *gld${EMULATION_NAME}_get_script PARAMS ((int *isfile));
80 # Import any needed special functions and/or overrides.
82 if test -n "$EXTRA_EM_FILE" ; then
83 . ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
86 # Functions in this file can be overridden by setting the LDEMUL_* shell
87 # variables. If the name of the overriding function is the same as is
88 # defined in this file, then don't output this file's version.
89 # If a different overriding name is given then output the standard function
90 # as presumably it is called from the overriding function.
92 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
93 cat >>e${EMULATION_NAME}.c <<EOF
96 gld${EMULATION_NAME}_before_parse ()
98 const bfd_arch_info_type *arch = bfd_scan_arch ("${OUTPUT_ARCH}");
101 ldfile_output_architecture = arch->arch;
102 ldfile_output_machine = arch->mach;
103 ldfile_output_machine_name = arch->printable_name;
106 ldfile_output_architecture = bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`;
107 config.dynamic_link = ${DYNAMIC_LINK-true};
108 config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo true ; else echo false ; fi`;
114 cat >>e${EMULATION_NAME}.c <<EOF
116 /* These variables are required to pass information back and forth
117 between after_open and check_needed and stat_needed and vercheck. */
119 static struct bfd_link_needed_list *global_needed;
120 static struct stat global_stat;
121 static boolean global_found;
122 static struct bfd_link_needed_list *global_vercheck_needed;
123 static boolean global_vercheck_failed;
126 /* On Linux, it's possible to have different versions of the same
127 shared library linked against different versions of libc. The
128 dynamic linker somehow tags which libc version to use in
129 /etc/ld.so.cache, and, based on the libc that it sees in the
130 executable, chooses which version of the shared library to use.
132 We try to do a similar check here by checking whether this shared
133 library needs any other shared libraries which may conflict with
134 libraries we have already included in the link. If it does, we
135 skip it, and try to find another shared library farther on down the
138 This is called via lang_for_each_input_file.
139 GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
140 which we are checking. This sets GLOBAL_VERCHECK_FAILED if we find
141 a conflicting version. */
144 gld${EMULATION_NAME}_vercheck (s)
145 lang_input_statement_type *s;
148 struct bfd_link_needed_list *l;
150 if (global_vercheck_failed)
152 if (s->the_bfd == NULL
153 || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
156 soname = bfd_elf_get_dt_soname (s->the_bfd);
158 soname = basename (bfd_get_filename (s->the_bfd));
160 for (l = global_vercheck_needed; l != NULL; l = l->next)
164 if (strcmp (soname, l->name) == 0)
166 /* Probably can't happen, but it's an easy check. */
170 if (strchr (l->name, '/') != NULL)
173 suffix = strstr (l->name, ".so.");
177 suffix += sizeof ".so." - 1;
179 if (strncmp (soname, l->name, suffix - l->name) == 0)
181 /* Here we know that S is a dynamic object FOO.SO.VER1, and
182 the object we are considering needs a dynamic object
183 FOO.SO.VER2, and VER1 and VER2 are different. This
184 appears to be a version mismatch, so we tell the caller
185 to try a different version of this library. */
186 global_vercheck_failed = true;
193 /* See if an input file matches a DT_NEEDED entry by running stat on
197 gld${EMULATION_NAME}_stat_needed (s)
198 lang_input_statement_type *s;
206 if (s->the_bfd == NULL)
209 if (bfd_stat (s->the_bfd, &st) != 0)
211 einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
215 if (st.st_dev == global_stat.st_dev
216 && st.st_ino == global_stat.st_ino)
222 /* We issue a warning if it looks like we are including two
223 different versions of the same shared library. For example,
224 there may be a problem if -lc picks up libc.so.6 but some other
225 shared library has a DT_NEEDED entry of libc.so.5. This is a
226 heuristic test, and it will only work if the name looks like
227 NAME.so.VERSION. FIXME: Depending on file names is error-prone.
228 If we really want to issue warnings about mixing version numbers
229 of shared libraries, we need to find a better way. */
231 if (strchr (global_needed->name, '/') != NULL)
233 suffix = strstr (global_needed->name, ".so.");
236 suffix += sizeof ".so." - 1;
238 soname = bfd_elf_get_dt_soname (s->the_bfd);
240 soname = basename (s->filename);
242 if (strncmp (soname, global_needed->name,
243 suffix - global_needed->name) == 0)
244 einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
245 global_needed->name, global_needed->by, soname);
249 /* This function is called for each possible name for a dynamic object
250 named by a DT_NEEDED entry. The FORCE parameter indicates whether
251 to skip the check for a conflicting version. */
254 gld${EMULATION_NAME}_try_needed (name, force)
261 abfd = bfd_openr (name, bfd_get_target (output_bfd));
264 if (! bfd_check_format (abfd, bfd_object))
266 (void) bfd_close (abfd);
269 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
271 (void) bfd_close (abfd);
275 /* Check whether this object would include any conflicting library
276 versions. If FORCE is set, then we skip this check; we use this
277 the second time around, if we couldn't find any compatible
278 instance of the shared library. */
282 struct bfd_link_needed_list *needed;
284 if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
285 einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
289 global_vercheck_needed = needed;
290 global_vercheck_failed = false;
291 lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
292 if (global_vercheck_failed)
294 (void) bfd_close (abfd);
295 /* Return false to force the caller to move on to try
296 another file on the search path. */
300 /* But wait! It gets much worse. On Linux, if a shared
301 library does not use libc at all, we are supposed to skip
302 it the first time around in case we encounter a shared
303 library later on with the same name which does use the
304 version of libc that we want. This is much too horrible
305 to use on any system other than Linux. */
310 cat >>e${EMULATION_NAME}.c <<EOF
312 struct bfd_link_needed_list *l;
314 for (l = needed; l != NULL; l = l->next)
315 if (strncmp (l->name, "libc.so", 7) == 0)
319 (void) bfd_close (abfd);
327 cat >>e${EMULATION_NAME}.c <<EOF
331 /* We've found a dynamic object matching the DT_NEEDED entry. */
333 /* We have already checked that there is no other input file of the
334 same name. We must now check again that we are not including the
335 same file twice. We need to do this because on many systems
336 libc.so is a symlink to, e.g., libc.so.1. The SONAME entry will
337 reference libc.so.1. If we have already included libc.so, we
338 don't want to include libc.so.1 if they are the same file, and we
339 can only check that using stat. */
341 if (bfd_stat (abfd, &global_stat) != 0)
342 einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
344 /* First strip off everything before the last '/'. */
345 soname = basename (abfd->filename);
347 if (trace_file_tries)
348 info_msg (_("found %s at %s\n"), soname, name);
350 global_found = false;
351 lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
354 /* Return true to indicate that we found the file, even though
355 we aren't going to do anything with it. */
359 /* Tell the ELF backend that we don't want the output file to have a
360 DT_NEEDED entry for this file. */
361 bfd_elf_set_dt_needed_name (abfd, "");
363 /* Tell the ELF backend that the output file needs a DT_NEEDED
364 entry for this file if it is used to resolve the reference in
366 bfd_elf_set_dt_needed_soname (abfd, soname);
368 /* Add this file into the symbol table. */
369 if (! bfd_link_add_symbols (abfd, &link_info))
370 einfo ("%F%B: could not read symbols: %E\n", abfd);
376 /* Search for a needed file in a path. */
379 gld${EMULATION_NAME}_search_needed (path, name, force)
388 return gld${EMULATION_NAME}_try_needed (name, force);
390 if (path == NULL || *path == '\0')
395 char *filename, *sset;
397 s = strchr (path, ':');
399 s = path + strlen (path);
401 filename = (char *) xmalloc (s - path + len + 2);
406 memcpy (filename, path, s - path);
407 filename[s - path] = '/';
408 sset = filename + (s - path) + 1;
412 if (gld${EMULATION_NAME}_try_needed (filename, force))
426 if [ "x${host}" = "x${target}" ] ; then
427 case " ${EMULATION_LIBPATH} " in
428 *" ${EMULATION_NAME} "*)
431 cat >>e${EMULATION_NAME}.c <<EOF
433 /* For a native linker, check the file /etc/ld.so.conf for directories
434 in which we may find shared libraries. /etc/ld.so.conf is really
435 only meaningful on Linux. */
437 static boolean gld${EMULATION_NAME}_check_ld_so_conf
438 PARAMS ((const char *, int));
441 gld${EMULATION_NAME}_check_ld_so_conf (name, force)
445 static boolean initialized;
446 static char *ld_so_conf;
452 f = fopen ("/etc/ld.so.conf", FOPEN_RT);
461 b = (char *) xmalloc (alloc);
463 while ((c = getc (f)) != EOF)
465 if (len + 1 >= alloc)
468 b = (char *) xrealloc (b, alloc);
481 if (len > 0 && b[len - 1] != ':')
489 if (len > 0 && b[len - 1] == ':')
508 if (ld_so_conf == NULL)
511 return gld${EMULATION_NAME}_search_needed (ld_so_conf, name, force);
520 cat >>e${EMULATION_NAME}.c <<EOF
522 /* See if an input file matches a DT_NEEDED entry by name. */
525 gld${EMULATION_NAME}_check_needed (s)
526 lang_input_statement_type *s;
531 if (s->filename != NULL)
535 if (strcmp (s->filename, global_needed->name) == 0)
541 if (s->search_dirs_flag)
543 f = strrchr (s->filename, '/');
545 && strcmp (f + 1, global_needed->name) == 0)
553 if (s->the_bfd != NULL)
557 soname = bfd_elf_get_dt_soname (s->the_bfd);
559 && strcmp (soname, global_needed->name) == 0)
569 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
570 cat >>e${EMULATION_NAME}.c <<EOF
572 /* This is called after all the input files have been opened. */
575 gld${EMULATION_NAME}_after_open ()
577 struct bfd_link_needed_list *needed, *l;
579 /* We only need to worry about this when doing a final link. */
580 if (link_info.relocateable || link_info.shared)
583 /* Get the list of files which appear in DT_NEEDED entries in
584 dynamic objects included in the link (often there will be none).
585 For each such file, we want to track down the corresponding
586 library, and include the symbol table in the link. This is what
587 the runtime dynamic linker will do. Tracking the files down here
588 permits one dynamic object to include another without requiring
589 special action by the person doing the link. Note that the
590 needed list can actually grow while we are stepping through this
592 needed = bfd_elf_get_needed_list (output_bfd, &link_info);
593 for (l = needed; l != NULL; l = l->next)
595 struct bfd_link_needed_list *ll;
598 /* If we've already seen this file, skip it. */
599 for (ll = needed; ll != l; ll = ll->next)
600 if (strcmp (ll->name, l->name) == 0)
605 /* See if this file was included in the link explicitly. */
607 global_found = false;
608 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
612 if (trace_file_tries)
613 info_msg (_("%s needed by %B\n"), l->name, l->by);
615 /* We need to find this file and include the symbol table. We
616 want to search for the file in the same way that the dynamic
617 linker will search. That means that we want to use
618 rpath_link, rpath, then the environment variable
619 LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
620 entries (native only), then the linker script LIB_SEARCH_DIRS.
621 We do not search using the -L arguments.
623 We search twice. The first time, we skip objects which may
624 introduce version mismatches. The second time, we force
625 their use. See gld${EMULATION_NAME}_vercheck comment. */
626 for (force = 0; force < 2; force++)
629 search_dirs_type *search;
631 if [ "x${host}" = "x${target}" ] ; then
632 case " ${EMULATION_LIBPATH} " in
633 *" ${EMULATION_NAME} "*)
634 cat >>e${EMULATION_NAME}.c <<EOF
635 const char *lib_path;
636 struct bfd_link_needed_list *rp;
642 cat >>e${EMULATION_NAME}.c <<EOF
644 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
648 if [ "x${host}" = "x${target}" ] ; then
649 case " ${EMULATION_LIBPATH} " in
650 *" ${EMULATION_NAME} "*)
651 cat >>e${EMULATION_NAME}.c <<EOF
652 if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
655 if (command_line.rpath_link == NULL
656 && command_line.rpath == NULL)
658 lib_path = (const char *) getenv ("LD_RUN_PATH");
659 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name,
663 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
664 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, force))
668 rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
669 for (; !found && rp != NULL; rp = rp->next)
671 found = (rp->by == l->by
672 && gld${EMULATION_NAME}_search_needed (rp->name,
683 cat >>e${EMULATION_NAME}.c <<EOF
684 len = strlen (l->name);
685 for (search = search_head; search != NULL; search = search->next)
691 filename = (char *) xmalloc (strlen (search->name) + len + 2);
692 sprintf (filename, "%s/%s", search->name, l->name);
693 if (gld${EMULATION_NAME}_try_needed (filename, force))
700 if [ "x${host}" = "x${target}" ] ; then
701 case " ${EMULATION_LIBPATH} " in
702 *" ${EMULATION_NAME} "*)
705 cat >>e${EMULATION_NAME}.c <<EOF
706 if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
715 cat >>e${EMULATION_NAME}.c <<EOF
721 einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
729 cat >>e${EMULATION_NAME}.c <<EOF
731 /* Look through an expression for an assignment statement. */
734 gld${EMULATION_NAME}_find_exp_assignment (exp)
737 struct bfd_link_hash_entry *h;
739 switch (exp->type.node_class)
742 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
743 false, false, false);
747 /* We call record_link_assignment even if the symbol is defined.
748 This is because if it is defined by a dynamic object, we
749 actually want to use the value defined by the linker script,
750 not the value from the dynamic object (because we are setting
751 symbols like etext). If the symbol is defined by a regular
752 object, then, as it happens, calling record_link_assignment
757 if (strcmp (exp->assign.dst, ".") != 0)
759 if (! (bfd_elf${ELFSIZE}_record_link_assignment
760 (output_bfd, &link_info, exp->assign.dst,
761 exp->type.node_class == etree_provide ? true : false)))
762 einfo ("%P%F: failed to record assignment to %s: %E\n",
765 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
769 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
770 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
774 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
775 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
776 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
780 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
789 /* This is called by the before_allocation routine via
790 lang_for_each_statement. It locates any assignment statements, and
791 tells the ELF backend about them, in case they are assignments to
792 symbols which are referred to by dynamic objects. */
795 gld${EMULATION_NAME}_find_statement_assignment (s)
796 lang_statement_union_type *s;
798 if (s->header.type == lang_assignment_statement_enum)
799 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
804 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
805 if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
806 ELF_INTERPRETER_SET_DEFAULT="
809 sinterp->contents = ${ELF_INTERPRETER_NAME};
810 sinterp->_raw_size = strlen (sinterp->contents) + 1;
815 ELF_INTERPRETER_SET_DEFAULT=
817 cat >>e${EMULATION_NAME}.c <<EOF
819 /* This is called after the sections have been attached to output
820 sections, but before any sizes or addresses have been set. */
823 gld${EMULATION_NAME}_before_allocation ()
828 /* If we are going to make any variable assignments, we need to let
829 the ELF backend know about them in case the variables are
830 referred to by dynamic objects. */
831 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
833 /* Let the ELF backend work out the sizes of any sections required
834 by dynamic linking. */
835 rpath = command_line.rpath;
837 rpath = (const char *) getenv ("LD_RUN_PATH");
838 if (! (bfd_elf${ELFSIZE}_size_dynamic_sections
839 (output_bfd, command_line.soname, rpath,
840 command_line.filter_shlib,
841 (const char * const *) command_line.auxiliary_filters,
842 &link_info, &sinterp, lang_elf_version_info)))
843 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
844 ${ELF_INTERPRETER_SET_DEFAULT}
845 /* Let the user override the dynamic linker we are using. */
846 if (command_line.interpreter != NULL
849 sinterp->contents = (bfd_byte *) command_line.interpreter;
850 sinterp->_raw_size = strlen (command_line.interpreter) + 1;
853 /* Look for any sections named .gnu.warning. As a GNU extensions,
854 we treat such sections as containing warning messages. We print
855 out the warning message, and then zero out the section size so
856 that it does not get copied into the output file. */
859 LANG_FOR_EACH_INPUT_STATEMENT (is)
866 if (is->just_syms_flag)
869 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
873 sz = bfd_section_size (is->the_bfd, s);
874 msg = xmalloc ((size_t) sz + 1);
875 if (! bfd_get_section_contents (is->the_bfd, s, msg, (file_ptr) 0, sz))
876 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
879 ret = link_info.callbacks->warning (&link_info, msg,
881 is->the_bfd, (asection *) NULL,
886 /* Clobber the section size, so that we don't waste copying the
887 warning into the output file. */
896 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
897 cat >>e${EMULATION_NAME}.c <<EOF
899 /* Try to open a dynamic archive. This is where we know that ELF
900 dynamic libraries have an extension of .so (or .sl on oddball systems
904 gld${EMULATION_NAME}_open_dynamic_archive (arch, search, entry)
906 search_dirs_type *search;
907 lang_input_statement_type *entry;
909 const char *filename;
912 if (! entry->is_archive)
915 filename = entry->filename;
917 /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
918 is defined, but it does not seem worth the headache to optimize
919 away those two bytes of space. */
920 string = (char *) xmalloc (strlen (search->name)
923 #ifdef EXTRA_SHLIB_EXTENSION
924 + strlen (EXTRA_SHLIB_EXTENSION)
928 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
930 #ifdef EXTRA_SHLIB_EXTENSION
931 /* Try the .so extension first. If that fails build a new filename
932 using EXTRA_SHLIB_EXTENSION. */
933 if (! ldfile_try_open_bfd (string, entry))
934 sprintf (string, "%s/lib%s%s%s", search->name,
935 filename, arch, EXTRA_SHLIB_EXTENSION);
938 if (! ldfile_try_open_bfd (string, entry))
944 entry->filename = string;
946 /* We have found a dynamic object to include in the link. The ELF
947 backend linker will create a DT_NEEDED entry in the .dynamic
948 section naming this file. If this file includes a DT_SONAME
949 entry, it will be used. Otherwise, the ELF linker will just use
950 the name of the file. For an archive found by searching, like
951 this one, the DT_NEEDED entry should consist of just the name of
952 the file, without the path information used to find it. Note
953 that we only need to do this if we have a dynamic object; an
954 archive will never be referenced by a DT_NEEDED entry.
956 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
957 very pretty. I haven't been able to think of anything that is
959 if (bfd_check_format (entry->the_bfd, bfd_object)
960 && (entry->the_bfd->flags & DYNAMIC) != 0)
962 ASSERT (entry->is_archive && entry->search_dirs_flag);
964 /* Rather than duplicating the logic above. Just use the
965 filename we recorded earlier. */
967 filename = xstrdup (basename (entry->filename));
968 bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
976 cat >>e${EMULATION_NAME}.c <<EOF
978 /* A variant of lang_output_section_find. Used by place_orphan. */
980 static lang_output_section_statement_type *
983 lang_statement_union_type *u;
984 lang_output_section_statement_type *lookup;
986 for (u = lang_output_section_statement.head;
987 u != (lang_statement_union_type *) NULL;
990 lookup = &u->output_section_statement;
991 if (strncmp (".rel", lookup->name, 4) == 0
992 && lookup->bfd_section != NULL
993 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
998 return (lang_output_section_statement_type *) NULL;
1003 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
1004 cat >>e${EMULATION_NAME}.c <<EOF
1006 /* Place an orphan section. We use this to put random SHF_ALLOC
1007 sections in the right segment. */
1009 struct orphan_save {
1010 lang_output_section_statement_type *os;
1012 lang_statement_union_type **stmt;
1016 gld${EMULATION_NAME}_place_orphan (file, s)
1017 lang_input_statement_type *file;
1020 static struct orphan_save hold_text;
1021 static struct orphan_save hold_rodata;
1022 static struct orphan_save hold_data;
1023 static struct orphan_save hold_bss;
1024 static struct orphan_save hold_rel;
1025 static struct orphan_save hold_interp;
1026 static struct orphan_save hold_sdata;
1027 static int count = 1;
1028 struct orphan_save *place;
1029 lang_statement_list_type *old;
1030 lang_statement_list_type add;
1031 etree_type *address;
1032 const char *secname;
1033 const char *outsecname;
1034 const char *ps = NULL;
1035 lang_output_section_statement_type *os;
1037 secname = bfd_get_section_name (s->owner, s);
1039 if (! config.unique_orphan_sections && ! unique_section_p (secname))
1041 /* Look through the script to see where to place this section. */
1042 os = lang_output_section_find (secname);
1045 && os->bfd_section != NULL
1046 && ((s->flags ^ os->bfd_section->flags)
1047 & (SEC_LOAD | SEC_ALLOC)) == 0)
1049 /* We have already placed a section with this name. */
1050 wild_doit (&os->children, s, os, file);
1055 if (hold_text.os == NULL)
1056 hold_text.os = lang_output_section_find (".text");
1058 /* If this is a final link, then always put .gnu.warning.SYMBOL
1059 sections into the .text section to get them out of the way. */
1060 if (! link_info.shared
1061 && ! link_info.relocateable
1062 && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
1063 && hold_text.os != NULL)
1065 wild_doit (&hold_text.os->children, s, hold_text.os, file);
1069 /* Decide which segment the section should go in based on the
1070 section name and section flags. We put loadable .note sections
1071 right after the .interp section, so that the PT_NOTE segment is
1072 stored right after the program headers where the OS can read it
1073 in the first page. */
1074 #define HAVE_SECTION(hold, name) \
1075 (hold.os != NULL || (hold.os = lang_output_section_find (name)) != NULL)
1077 if (s->flags & SEC_EXCLUDE)
1081 if ((s->flags & SEC_ALLOC) == 0)
1083 else if ((s->flags & SEC_LOAD) != 0
1084 && strncmp (secname, ".note", 5) == 0
1085 && HAVE_SECTION (hold_interp, ".interp"))
1086 place = &hold_interp;
1087 else if ((s->flags & SEC_HAS_CONTENTS) == 0
1088 && HAVE_SECTION (hold_bss, ".bss"))
1090 else if ((s->flags & SEC_SMALL_DATA) != 0
1091 && HAVE_SECTION (hold_sdata, ".sdata"))
1092 place = &hold_sdata;
1093 else if ((s->flags & SEC_READONLY) == 0
1094 && HAVE_SECTION (hold_data, ".data"))
1096 else if (strncmp (secname, ".rel", 4) == 0
1097 && (hold_rel.os != NULL
1098 || (hold_rel.os = output_rel_find ()) != NULL))
1100 else if ((s->flags & (SEC_CODE | SEC_READONLY)) == SEC_READONLY
1101 && HAVE_SECTION (hold_rodata, ".rodata"))
1102 place = &hold_rodata;
1103 else if ((s->flags & (SEC_CODE | SEC_READONLY)) == (SEC_CODE | SEC_READONLY)
1104 && hold_text.os != NULL)
1109 /* Choose a unique name for the section. This will be needed if the
1110 same section name appears in the input file with different
1111 loadable or allocatable characteristics. */
1112 outsecname = secname;
1113 if (bfd_get_section_by_name (output_bfd, outsecname) != NULL)
1115 outsecname = bfd_get_unique_section_name (output_bfd,
1118 if (outsecname == NULL)
1119 einfo ("%F%P: place_orphan failed: %E\n");
1122 /* Start building a list of statements for this section.
1123 First save the current statement pointer. */
1126 /* If we have found an appropriate place for the output section
1127 statements for this orphan, add them to our own private list,
1128 inserting them later into the global statement list. */
1132 lang_list_init (stat_ptr);
1135 if (config.build_constructors)
1137 /* If the name of the section is representable in C, then create
1138 symbols to mark the start and the end of the section. */
1139 for (ps = outsecname; *ps != '\0'; ps++)
1140 if (! isalnum ((unsigned char) *ps) && *ps != '_')
1145 etree_type *e_align;
1147 symname = (char *) xmalloc (ps - outsecname + sizeof "__start_");
1148 sprintf (symname, "__start_%s", outsecname);
1149 e_align = exp_unop (ALIGN_K,
1150 exp_intop ((bfd_vma) 1 << s->alignment_power));
1151 lang_add_assignment (exp_assop ('=', symname, e_align));
1155 if (link_info.relocateable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
1156 address = exp_intop ((bfd_vma) 0);
1160 os = lang_enter_output_section_statement (outsecname, address, 0,
1162 (etree_type *) NULL,
1163 (etree_type *) NULL,
1164 (etree_type *) NULL);
1166 wild_doit (&os->children, s, os, file);
1168 lang_leave_output_section_statement
1169 ((bfd_vma) 0, "*default*",
1170 (struct lang_output_section_phdr_list *) NULL, "*default*");
1172 if (config.build_constructors && *ps == '\0')
1176 /* lang_leave_ouput_section_statement resets stat_ptr. Put
1177 stat_ptr back where we want it. */
1181 symname = (char *) xmalloc (ps - outsecname + sizeof "__stop_");
1182 sprintf (symname, "__stop_%s", outsecname);
1183 lang_add_assignment (exp_assop ('=', symname,
1184 exp_nameop (NAME, ".")));
1187 /* Restore the global list pointer. */
1192 asection *snew, **pps;
1194 snew = os->bfd_section;
1195 if (place->section != NULL
1196 || (place->os->bfd_section != NULL
1197 && place->os->bfd_section != snew))
1199 /* Shuffle the section to make the output file look neater.
1200 This is really only cosmetic. */
1201 if (place->section == NULL)
1204 /* Finding the end of the list is a little tricky. We
1205 make a wild stab at it by comparing section flags. */
1206 flagword first_flags = place->os->bfd_section->flags;
1207 for (pps = &place->os->bfd_section->next;
1208 *pps != NULL && (*pps)->flags == first_flags;
1209 pps = &(*pps)->next)
1211 place->section = pps;
1213 /* Put orphans after the first section on the list. */
1214 place->section = &place->os->bfd_section->next;
1218 /* Unlink the section. */
1219 for (pps = &output_bfd->sections; *pps != snew; pps = &(*pps)->next)
1223 /* Now tack it on to the "place->os" section list. */
1224 snew->next = *place->section;
1225 *place->section = snew;
1227 place->section = &snew->next; /* Save the end of this list. */
1229 if (add.head != NULL)
1231 /* We try to put the output statements in some sort of
1232 reasonable order here, because they determine the final
1233 load addresses of the orphan sections. */
1234 if (place->stmt == NULL)
1236 /* Put the new statement list right at the head. */
1237 *add.tail = place->os->header.next;
1238 place->os->header.next = add.head;
1242 /* Put it after the last orphan statement we added. */
1243 *add.tail = *place->stmt;
1244 *place->stmt = add.head;
1247 /* Fix the global list pointer if we happened to tack our
1248 new list at the tail. */
1249 if (*old->tail == add.head)
1250 old->tail = add.tail;
1252 /* Save the end of this list. */
1253 place->stmt = add.tail;
1263 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1264 cat >>e${EMULATION_NAME}.c <<EOF
1267 gld${EMULATION_NAME}_get_script (isfile)
1271 if test -n "$COMPILE_IN"
1273 # Scripts compiled in.
1275 # sed commands to quote an ld script as a C string.
1276 sc="-f stringify.sed"
1278 cat >>e${EMULATION_NAME}.c <<EOF
1282 if (link_info.relocateable == true && config.build_constructors == true)
1285 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1286 echo ' ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c
1287 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1288 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1289 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1290 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1291 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1293 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1294 echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c
1295 sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
1298 echo ' ; else return' >> e${EMULATION_NAME}.c
1299 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1300 echo '; }' >> e${EMULATION_NAME}.c
1303 # Scripts read from the filesystem.
1305 cat >>e${EMULATION_NAME}.c <<EOF
1309 if (link_info.relocateable == true && config.build_constructors == true)
1310 return "ldscripts/${EMULATION_NAME}.xu";
1311 else if (link_info.relocateable == true)
1312 return "ldscripts/${EMULATION_NAME}.xr";
1313 else if (!config.text_read_only)
1314 return "ldscripts/${EMULATION_NAME}.xbn";
1315 else if (!config.magic_demand_paged)
1316 return "ldscripts/${EMULATION_NAME}.xn";
1317 else if (link_info.shared)
1318 return "ldscripts/${EMULATION_NAME}.xs";
1320 return "ldscripts/${EMULATION_NAME}.x";
1327 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1329 if test x"$LDEMUL_PARSE_ARGS" != xgld"$EMULATION_NAME"_parse_args; then
1331 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1332 cat >>e${EMULATION_NAME}.c <<EOF
1333 $PARSE_AND_LIST_PROLOGUE
1337 cat >>e${EMULATION_NAME}.c <<EOF
1341 #define OPTION_DISABLE_NEW_DTAGS (400)
1342 #define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
1343 #define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
1345 static struct option longopts[] =
1349 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1350 cat >>e${EMULATION_NAME}.c <<EOF
1351 /* getopt allows abbreviations, so we do this to stop it from
1352 treating -d/-e as abbreviations for these options. */
1353 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1354 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1355 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1356 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1357 {"Bgroup", no_argument, NULL, OPTION_GROUP},
1358 {"Bgroup", no_argument, NULL, OPTION_GROUP},
1362 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
1363 cat >>e${EMULATION_NAME}.c <<EOF
1364 $PARSE_AND_LIST_LONGOPTS
1368 cat >>e${EMULATION_NAME}.c <<EOF
1369 {NULL, no_argument, NULL, 0}
1373 static int gld${EMULATION_NAME}_parse_args PARAMS ((int, char **));
1376 gld${EMULATION_NAME}_parse_args (argc, argv)
1382 static int prevoptind = -1;
1383 int prevopterr = opterr;
1386 if (prevoptind != optind)
1390 prevoptind = optind;
1392 optc = getopt_long_only (argc, argv,
1393 "-${PARSE_AND_LIST_SHORTOPTS}z:", longopts,
1395 opterr = prevopterr;
1402 optind = prevoptind;
1407 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1408 cat >>e${EMULATION_NAME}.c <<EOF
1409 case OPTION_DISABLE_NEW_DTAGS:
1410 link_info.new_dtags = false;
1413 case OPTION_ENABLE_NEW_DTAGS:
1414 link_info.new_dtags = true;
1418 link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
1419 /* Groups must be self-contained. */
1420 link_info.no_undefined = true;
1424 if (strcmp (optarg, "initfirst") == 0)
1425 link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
1426 else if (strcmp (optarg, "interpose") == 0)
1427 link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
1428 else if (strcmp (optarg, "loadfltr") == 0)
1429 link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
1430 else if (strcmp (optarg, "nodefaultlib") == 0)
1431 link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
1432 else if (strcmp (optarg, "nodelete") == 0)
1433 link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
1434 else if (strcmp (optarg, "nodlopen") == 0)
1435 link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
1436 else if (strcmp (optarg, "nodump") == 0)
1437 link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
1438 else if (strcmp (optarg, "now") == 0)
1440 link_info.flags |= (bfd_vma) DF_BIND_NOW;
1441 link_info.flags_1 |= (bfd_vma) DF_1_NOW;
1443 else if (strcmp (optarg, "origin") == 0)
1445 link_info.flags |= (bfd_vma) DF_ORIGIN;
1446 link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
1448 else if (strcmp (optarg, "defs") == 0)
1449 link_info.no_undefined = true;
1450 /* What about the other Solaris -z options? FIXME. */
1455 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
1456 cat >>e${EMULATION_NAME}.c <<EOF
1457 $PARSE_AND_LIST_ARGS_CASES
1461 cat >>e${EMULATION_NAME}.c <<EOF
1470 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1471 cat >>e${EMULATION_NAME}.c <<EOF
1473 static void gld${EMULATION_NAME}_list_options PARAMS ((FILE * file));
1476 gld${EMULATION_NAME}_list_options (file)
1481 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1482 cat >>e${EMULATION_NAME}.c <<EOF
1483 fprintf (file, _(" -Bgroup\t\tSelects group name lookup rules for DSO\n"));
1484 fprintf (file, _(" --disable-new-dtags\tDisable new dynamic tags\n"));
1485 fprintf (file, _(" --enable-new-dtags\tEnable new dynamic tags\n"));
1486 fprintf (file, _(" -z defs\t\tDisallows undefined symbols\n"));
1487 fprintf (file, _(" -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
1488 fprintf (file, _(" -z interpose\t\tMark object to interpose all DSOs but executable\n"));
1489 fprintf (file, _(" -z loadfltr\t\tMark object requiring immediate process\n"));
1490 fprintf (file, _(" -z nodefaultlib\tMark object not to use default search paths\n"));
1491 fprintf (file, _(" -z nodelete\t\tMark DSO non-deletable at runtime\n"));
1492 fprintf (file, _(" -z nodlopen\t\tMark DSO not available to dlopen\n"));
1493 fprintf (file, _(" -z nodump\t\tMark DSO not available to dldump\n"));
1494 fprintf (file, _(" -z now\t\tMark object non-lazy runtime binding\n"));
1495 fprintf (file, _(" -z origin\t\tMark object requiring immediate \$ORIGIN processing\n"));
1496 fprintf (file, _("\t\t\t at runtime\n"));
1497 fprintf (file, _(" -z KEYWORD\t\tIgnored for Solaris compatibility\n"));
1501 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
1502 cat >>e${EMULATION_NAME}.c <<EOF
1503 $PARSE_AND_LIST_OPTIONS
1507 cat >>e${EMULATION_NAME}.c <<EOF
1511 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
1512 cat >>e${EMULATION_NAME}.c <<EOF
1513 $PARSE_AND_LIST_EPILOGUE
1518 if test x"$LDEMUL_PARSE_ARGS" != xgld"$EMULATION_NAME"_parse_args; then
1519 cat >>e${EMULATION_NAME}.c <<EOF
1520 #define gld${EMULATION_NAME}_parse_args NULL
1523 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1524 cat >>e${EMULATION_NAME}.c <<EOF
1525 #define gld${EMULATION_NAME}_list_options NULL
1530 cat >>e${EMULATION_NAME}.c <<EOF
1532 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1534 ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
1535 ${LDEMUL_SYSLIB-syslib_default},
1536 ${LDEMUL_HLL-hll_default},
1537 ${LDEMUL_AFTER_PARSE-after_parse_default},
1538 ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
1539 ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
1540 ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
1541 ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
1542 ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
1543 ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
1544 "${EMULATION_NAME}",
1546 ${LDEMUL_FINISH-NULL},
1547 ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
1548 ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
1549 ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
1550 ${LDEMUL_SET_SYMBOLS-NULL},
1551 ${LDEMUL_PARSE_ARGS-gld${EMULATION_NAME}_parse_args},
1552 ${LDEMUL_UNRECOGNIZED_FILE-NULL},
1553 ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
1554 ${LDEMUL_RECOGNIZED_FILE-NULL},
1555 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},