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
58 static void gld${EMULATION_NAME}_vercheck
59 PARAMS ((lang_input_statement_type *));
60 static void gld${EMULATION_NAME}_stat_needed
61 PARAMS ((lang_input_statement_type *));
62 static boolean gld${EMULATION_NAME}_try_needed
63 PARAMS ((const char *, int));
64 static boolean gld${EMULATION_NAME}_search_needed
65 PARAMS ((const char *, const char *, int));
66 static void gld${EMULATION_NAME}_check_needed
67 PARAMS ((lang_input_statement_type *));
68 static void gld${EMULATION_NAME}_after_open
70 static void gld${EMULATION_NAME}_find_exp_assignment
71 PARAMS ((etree_type *));
72 static void gld${EMULATION_NAME}_find_statement_assignment
73 PARAMS ((lang_statement_union_type *));
74 static void gld${EMULATION_NAME}_before_allocation
76 static boolean gld${EMULATION_NAME}_open_dynamic_archive
77 PARAMS ((const char *, search_dirs_type *, lang_input_statement_type *));
78 static lang_output_section_statement_type *output_rel_find
80 static asection *output_prev_sec_find
81 PARAMS ((lang_output_section_statement_type *));
82 static boolean gld${EMULATION_NAME}_place_orphan
83 PARAMS ((lang_input_statement_type *, asection *));
84 static char *gld${EMULATION_NAME}_get_script
85 PARAMS ((int *isfile));
89 # Import any needed special functions and/or overrides.
91 if test -n "$EXTRA_EM_FILE" ; then
92 . ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
95 # Functions in this file can be overridden by setting the LDEMUL_* shell
96 # variables. If the name of the overriding function is the same as is
97 # defined in this file, then don't output this file's version.
98 # If a different overriding name is given then output the standard function
99 # as presumably it is called from the overriding function.
101 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
102 cat >>e${EMULATION_NAME}.c <<EOF
105 gld${EMULATION_NAME}_before_parse ()
107 const bfd_arch_info_type *arch = bfd_scan_arch ("${OUTPUT_ARCH}");
110 ldfile_output_architecture = arch->arch;
111 ldfile_output_machine = arch->mach;
112 ldfile_output_machine_name = arch->printable_name;
115 ldfile_output_architecture = bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`;
116 config.dynamic_link = ${DYNAMIC_LINK-true};
117 config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo true ; else echo false ; fi`;
123 cat >>e${EMULATION_NAME}.c <<EOF
125 /* These variables are required to pass information back and forth
126 between after_open and check_needed and stat_needed and vercheck. */
128 static struct bfd_link_needed_list *global_needed;
129 static struct stat global_stat;
130 static boolean global_found;
131 static struct bfd_link_needed_list *global_vercheck_needed;
132 static boolean global_vercheck_failed;
135 /* On Linux, it's possible to have different versions of the same
136 shared library linked against different versions of libc. The
137 dynamic linker somehow tags which libc version to use in
138 /etc/ld.so.cache, and, based on the libc that it sees in the
139 executable, chooses which version of the shared library to use.
141 We try to do a similar check here by checking whether this shared
142 library needs any other shared libraries which may conflict with
143 libraries we have already included in the link. If it does, we
144 skip it, and try to find another shared library farther on down the
147 This is called via lang_for_each_input_file.
148 GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
149 which we are checking. This sets GLOBAL_VERCHECK_FAILED if we find
150 a conflicting version. */
153 gld${EMULATION_NAME}_vercheck (s)
154 lang_input_statement_type *s;
157 struct bfd_link_needed_list *l;
159 if (global_vercheck_failed)
161 if (s->the_bfd == NULL
162 || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
165 soname = bfd_elf_get_dt_soname (s->the_bfd);
167 soname = basename (bfd_get_filename (s->the_bfd));
169 for (l = global_vercheck_needed; l != NULL; l = l->next)
173 if (strcmp (soname, l->name) == 0)
175 /* Probably can't happen, but it's an easy check. */
179 if (strchr (l->name, '/') != NULL)
182 suffix = strstr (l->name, ".so.");
186 suffix += sizeof ".so." - 1;
188 if (strncmp (soname, l->name, suffix - l->name) == 0)
190 /* Here we know that S is a dynamic object FOO.SO.VER1, and
191 the object we are considering needs a dynamic object
192 FOO.SO.VER2, and VER1 and VER2 are different. This
193 appears to be a version mismatch, so we tell the caller
194 to try a different version of this library. */
195 global_vercheck_failed = true;
202 /* See if an input file matches a DT_NEEDED entry by running stat on
206 gld${EMULATION_NAME}_stat_needed (s)
207 lang_input_statement_type *s;
215 if (s->the_bfd == NULL)
218 if (bfd_stat (s->the_bfd, &st) != 0)
220 einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
224 if (st.st_dev == global_stat.st_dev
225 && st.st_ino == global_stat.st_ino)
231 /* We issue a warning if it looks like we are including two
232 different versions of the same shared library. For example,
233 there may be a problem if -lc picks up libc.so.6 but some other
234 shared library has a DT_NEEDED entry of libc.so.5. This is a
235 heuristic test, and it will only work if the name looks like
236 NAME.so.VERSION. FIXME: Depending on file names is error-prone.
237 If we really want to issue warnings about mixing version numbers
238 of shared libraries, we need to find a better way. */
240 if (strchr (global_needed->name, '/') != NULL)
242 suffix = strstr (global_needed->name, ".so.");
245 suffix += sizeof ".so." - 1;
247 soname = bfd_elf_get_dt_soname (s->the_bfd);
249 soname = basename (s->filename);
251 if (strncmp (soname, global_needed->name, suffix - global_needed->name) == 0)
252 einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
253 global_needed->name, global_needed->by, soname);
257 /* This function is called for each possible name for a dynamic object
258 named by a DT_NEEDED entry. The FORCE parameter indicates whether
259 to skip the check for a conflicting version. */
262 gld${EMULATION_NAME}_try_needed (name, force)
269 abfd = bfd_openr (name, bfd_get_target (output_bfd));
272 if (! bfd_check_format (abfd, bfd_object))
277 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
283 /* Check whether this object would include any conflicting library
284 versions. If FORCE is set, then we skip this check; we use this
285 the second time around, if we couldn't find any compatible
286 instance of the shared library. */
290 struct bfd_link_needed_list *needed;
292 if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
293 einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
297 global_vercheck_needed = needed;
298 global_vercheck_failed = false;
299 lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
300 if (global_vercheck_failed)
303 /* Return false to force the caller to move on to try
304 another file on the search path. */
308 /* But wait! It gets much worse. On Linux, if a shared
309 library does not use libc at all, we are supposed to skip
310 it the first time around in case we encounter a shared
311 library later on with the same name which does use the
312 version of libc that we want. This is much too horrible
313 to use on any system other than Linux. */
318 cat >>e${EMULATION_NAME}.c <<EOF
320 struct bfd_link_needed_list *l;
322 for (l = needed; l != NULL; l = l->next)
323 if (strncmp (l->name, "libc.so", 7) == 0)
335 cat >>e${EMULATION_NAME}.c <<EOF
339 /* We've found a dynamic object matching the DT_NEEDED entry. */
341 /* We have already checked that there is no other input file of the
342 same name. We must now check again that we are not including the
343 same file twice. We need to do this because on many systems
344 libc.so is a symlink to, e.g., libc.so.1. The SONAME entry will
345 reference libc.so.1. If we have already included libc.so, we
346 don't want to include libc.so.1 if they are the same file, and we
347 can only check that using stat. */
349 if (bfd_stat (abfd, &global_stat) != 0)
350 einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
352 /* First strip off everything before the last '/'. */
353 soname = basename (abfd->filename);
355 if (trace_file_tries)
356 info_msg (_("found %s at %s\n"), soname, name);
358 global_found = false;
359 lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
362 /* Return true to indicate that we found the file, even though
363 we aren't going to do anything with it. */
367 /* Tell the ELF backend that we don't want the output file to have a
368 DT_NEEDED entry for this file. */
369 bfd_elf_set_dt_needed_name (abfd, "");
371 /* Previos basename call was clobbered in lang_for_each_input_file. */
372 soname = basename (abfd->filename);
374 /* Tell the ELF backend that the output file needs a DT_NEEDED
375 entry for this file if it is used to resolve the reference in
377 bfd_elf_set_dt_needed_soname (abfd, soname);
379 /* Add this file into the symbol table. */
380 if (! bfd_link_add_symbols (abfd, &link_info))
381 einfo ("%F%B: could not read symbols: %E\n", abfd);
387 /* Search for a needed file in a path. */
390 gld${EMULATION_NAME}_search_needed (path, name, force)
399 return gld${EMULATION_NAME}_try_needed (name, force);
401 if (path == NULL || *path == '\0')
406 char *filename, *sset;
408 s = strchr (path, ':');
410 s = path + strlen (path);
412 filename = (char *) xmalloc (s - path + len + 2);
417 memcpy (filename, path, s - path);
418 filename[s - path] = '/';
419 sset = filename + (s - path) + 1;
423 if (gld${EMULATION_NAME}_try_needed (filename, force))
437 if [ "x${host}" = "x${target}" ] ; then
438 case " ${EMULATION_LIBPATH} " in
439 *" ${EMULATION_NAME} "*)
442 cat >>e${EMULATION_NAME}.c <<EOF
444 /* For a native linker, check the file /etc/ld.so.conf for directories
445 in which we may find shared libraries. /etc/ld.so.conf is really
446 only meaningful on Linux. */
448 static boolean gld${EMULATION_NAME}_check_ld_so_conf
449 PARAMS ((const char *, int));
452 gld${EMULATION_NAME}_check_ld_so_conf (name, force)
456 static boolean initialized;
457 static char *ld_so_conf;
463 f = fopen ("/etc/ld.so.conf", FOPEN_RT);
472 b = (char *) xmalloc (alloc);
474 while ((c = getc (f)) != EOF)
476 if (len + 1 >= alloc)
479 b = (char *) xrealloc (b, alloc);
492 if (len > 0 && b[len - 1] != ':')
500 if (len > 0 && b[len - 1] == ':')
519 if (ld_so_conf == NULL)
522 return gld${EMULATION_NAME}_search_needed (ld_so_conf, name, force);
531 cat >>e${EMULATION_NAME}.c <<EOF
533 /* See if an input file matches a DT_NEEDED entry by name. */
536 gld${EMULATION_NAME}_check_needed (s)
537 lang_input_statement_type *s;
542 if (s->filename != NULL)
546 if (strcmp (s->filename, global_needed->name) == 0)
552 if (s->search_dirs_flag)
554 f = strrchr (s->filename, '/');
556 && strcmp (f + 1, global_needed->name) == 0)
564 if (s->the_bfd != NULL)
568 soname = bfd_elf_get_dt_soname (s->the_bfd);
570 && strcmp (soname, global_needed->name) == 0)
580 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
581 cat >>e${EMULATION_NAME}.c <<EOF
583 /* This is called after all the input files have been opened. */
586 gld${EMULATION_NAME}_after_open ()
588 struct bfd_link_needed_list *needed, *l;
590 /* We only need to worry about this when doing a final link. */
591 if (link_info.relocateable || link_info.shared)
594 /* Get the list of files which appear in DT_NEEDED entries in
595 dynamic objects included in the link (often there will be none).
596 For each such file, we want to track down the corresponding
597 library, and include the symbol table in the link. This is what
598 the runtime dynamic linker will do. Tracking the files down here
599 permits one dynamic object to include another without requiring
600 special action by the person doing the link. Note that the
601 needed list can actually grow while we are stepping through this
603 needed = bfd_elf_get_needed_list (output_bfd, &link_info);
604 for (l = needed; l != NULL; l = l->next)
606 struct bfd_link_needed_list *ll;
609 /* If we've already seen this file, skip it. */
610 for (ll = needed; ll != l; ll = ll->next)
611 if (strcmp (ll->name, l->name) == 0)
616 /* See if this file was included in the link explicitly. */
618 global_found = false;
619 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
623 if (trace_file_tries)
624 info_msg (_("%s needed by %B\n"), l->name, l->by);
626 /* We need to find this file and include the symbol table. We
627 want to search for the file in the same way that the dynamic
628 linker will search. That means that we want to use
629 rpath_link, rpath, then the environment variable
630 LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
631 entries (native only), then the linker script LIB_SEARCH_DIRS.
632 We do not search using the -L arguments.
634 We search twice. The first time, we skip objects which may
635 introduce version mismatches. The second time, we force
636 their use. See gld${EMULATION_NAME}_vercheck comment. */
637 for (force = 0; force < 2; force++)
640 search_dirs_type *search;
642 if [ "x${host}" = "x${target}" ] ; then
643 case " ${EMULATION_LIBPATH} " in
644 *" ${EMULATION_NAME} "*)
645 cat >>e${EMULATION_NAME}.c <<EOF
646 const char *lib_path;
647 struct bfd_link_needed_list *rp;
653 cat >>e${EMULATION_NAME}.c <<EOF
655 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
659 if [ "x${host}" = "x${target}" ] ; then
660 case " ${EMULATION_LIBPATH} " in
661 *" ${EMULATION_NAME} "*)
662 cat >>e${EMULATION_NAME}.c <<EOF
663 if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
666 if (command_line.rpath_link == NULL
667 && command_line.rpath == NULL)
669 lib_path = (const char *) getenv ("LD_RUN_PATH");
670 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name,
674 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
675 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, force))
679 rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
680 for (; !found && rp != NULL; rp = rp->next)
682 found = (rp->by == l->by
683 && gld${EMULATION_NAME}_search_needed (rp->name,
694 cat >>e${EMULATION_NAME}.c <<EOF
695 len = strlen (l->name);
696 for (search = search_head; search != NULL; search = search->next)
702 filename = (char *) xmalloc (strlen (search->name) + len + 2);
703 sprintf (filename, "%s/%s", search->name, l->name);
704 if (gld${EMULATION_NAME}_try_needed (filename, force))
711 if [ "x${host}" = "x${target}" ] ; then
712 case " ${EMULATION_LIBPATH} " in
713 *" ${EMULATION_NAME} "*)
716 cat >>e${EMULATION_NAME}.c <<EOF
717 if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
726 cat >>e${EMULATION_NAME}.c <<EOF
732 einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
740 cat >>e${EMULATION_NAME}.c <<EOF
742 /* Look through an expression for an assignment statement. */
745 gld${EMULATION_NAME}_find_exp_assignment (exp)
748 struct bfd_link_hash_entry *h;
750 switch (exp->type.node_class)
753 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
754 false, false, false);
758 /* We call record_link_assignment even if the symbol is defined.
759 This is because if it is defined by a dynamic object, we
760 actually want to use the value defined by the linker script,
761 not the value from the dynamic object (because we are setting
762 symbols like etext). If the symbol is defined by a regular
763 object, then, as it happens, calling record_link_assignment
768 if (strcmp (exp->assign.dst, ".") != 0)
770 if (! (bfd_elf${ELFSIZE}_record_link_assignment
771 (output_bfd, &link_info, exp->assign.dst,
772 exp->type.node_class == etree_provide ? true : false)))
773 einfo ("%P%F: failed to record assignment to %s: %E\n",
776 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
780 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
781 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
785 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
786 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
787 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
791 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
800 /* This is called by the before_allocation routine via
801 lang_for_each_statement. It locates any assignment statements, and
802 tells the ELF backend about them, in case they are assignments to
803 symbols which are referred to by dynamic objects. */
806 gld${EMULATION_NAME}_find_statement_assignment (s)
807 lang_statement_union_type *s;
809 if (s->header.type == lang_assignment_statement_enum)
810 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
815 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
816 if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
817 ELF_INTERPRETER_SET_DEFAULT="
820 sinterp->contents = ${ELF_INTERPRETER_NAME};
821 sinterp->_raw_size = strlen (sinterp->contents) + 1;
826 ELF_INTERPRETER_SET_DEFAULT=
828 cat >>e${EMULATION_NAME}.c <<EOF
830 /* This is called after the sections have been attached to output
831 sections, but before any sizes or addresses have been set. */
834 gld${EMULATION_NAME}_before_allocation ()
839 /* If we are going to make any variable assignments, we need to let
840 the ELF backend know about them in case the variables are
841 referred to by dynamic objects. */
842 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
844 /* Let the ELF backend work out the sizes of any sections required
845 by dynamic linking. */
846 rpath = command_line.rpath;
848 rpath = (const char *) getenv ("LD_RUN_PATH");
849 if (! (bfd_elf${ELFSIZE}_size_dynamic_sections
850 (output_bfd, command_line.soname, rpath,
851 command_line.filter_shlib,
852 (const char * const *) command_line.auxiliary_filters,
853 &link_info, &sinterp, lang_elf_version_info)))
854 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
855 ${ELF_INTERPRETER_SET_DEFAULT}
856 /* Let the user override the dynamic linker we are using. */
857 if (command_line.interpreter != NULL
860 sinterp->contents = (bfd_byte *) command_line.interpreter;
861 sinterp->_raw_size = strlen (command_line.interpreter) + 1;
864 /* Look for any sections named .gnu.warning. As a GNU extensions,
865 we treat such sections as containing warning messages. We print
866 out the warning message, and then zero out the section size so
867 that it does not get copied into the output file. */
870 LANG_FOR_EACH_INPUT_STATEMENT (is)
877 if (is->just_syms_flag)
880 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
884 sz = bfd_section_size (is->the_bfd, s);
885 msg = xmalloc ((size_t) sz + 1);
886 if (! bfd_get_section_contents (is->the_bfd, s, msg, (file_ptr) 0, sz))
887 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
890 ret = link_info.callbacks->warning (&link_info, msg,
892 is->the_bfd, (asection *) NULL,
897 /* Clobber the section size, so that we don't waste copying the
898 warning into the output file. */
907 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
908 cat >>e${EMULATION_NAME}.c <<EOF
910 /* Try to open a dynamic archive. This is where we know that ELF
911 dynamic libraries have an extension of .so (or .sl on oddball systems
915 gld${EMULATION_NAME}_open_dynamic_archive (arch, search, entry)
917 search_dirs_type *search;
918 lang_input_statement_type *entry;
920 const char *filename;
923 if (! entry->is_archive)
926 filename = entry->filename;
928 /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
929 is defined, but it does not seem worth the headache to optimize
930 away those two bytes of space. */
931 string = (char *) xmalloc (strlen (search->name)
934 #ifdef EXTRA_SHLIB_EXTENSION
935 + strlen (EXTRA_SHLIB_EXTENSION)
939 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
941 #ifdef EXTRA_SHLIB_EXTENSION
942 /* Try the .so extension first. If that fails build a new filename
943 using EXTRA_SHLIB_EXTENSION. */
944 if (! ldfile_try_open_bfd (string, entry))
945 sprintf (string, "%s/lib%s%s%s", search->name,
946 filename, arch, EXTRA_SHLIB_EXTENSION);
949 if (! ldfile_try_open_bfd (string, entry))
955 entry->filename = string;
957 /* We have found a dynamic object to include in the link. The ELF
958 backend linker will create a DT_NEEDED entry in the .dynamic
959 section naming this file. If this file includes a DT_SONAME
960 entry, it will be used. Otherwise, the ELF linker will just use
961 the name of the file. For an archive found by searching, like
962 this one, the DT_NEEDED entry should consist of just the name of
963 the file, without the path information used to find it. Note
964 that we only need to do this if we have a dynamic object; an
965 archive will never be referenced by a DT_NEEDED entry.
967 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
968 very pretty. I haven't been able to think of anything that is
970 if (bfd_check_format (entry->the_bfd, bfd_object)
971 && (entry->the_bfd->flags & DYNAMIC) != 0)
973 ASSERT (entry->is_archive && entry->search_dirs_flag);
975 /* Rather than duplicating the logic above. Just use the
976 filename we recorded earlier. */
978 filename = xstrdup (basename (entry->filename));
979 bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
988 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
989 cat >>e${EMULATION_NAME}.c <<EOF
991 /* A variant of lang_output_section_find. Used by place_orphan. */
993 static lang_output_section_statement_type *
996 lang_statement_union_type *u;
997 lang_output_section_statement_type *lookup;
999 for (u = lang_output_section_statement.head;
1000 u != (lang_statement_union_type *) NULL;
1003 lookup = &u->output_section_statement;
1004 if (strncmp (".rel", lookup->name, 4) == 0
1005 && lookup->bfd_section != NULL
1006 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1011 return (lang_output_section_statement_type *) NULL;
1014 /* Find the last output section before given output statement.
1015 Used by place_orphan. */
1018 output_prev_sec_find (os)
1019 lang_output_section_statement_type *os;
1021 asection *s = (asection *) NULL;
1022 lang_statement_union_type *u;
1023 lang_output_section_statement_type *lookup;
1025 for (u = lang_output_section_statement.head;
1026 u != (lang_statement_union_type *) NULL;
1029 lookup = &u->output_section_statement;
1033 if (lookup->bfd_section != NULL && lookup->bfd_section->owner != NULL)
1034 s = lookup->bfd_section;
1040 /* Place an orphan section. We use this to put random SHF_ALLOC
1041 sections in the right segment. */
1043 struct orphan_save {
1044 lang_output_section_statement_type *os;
1046 lang_statement_union_type **stmt;
1050 gld${EMULATION_NAME}_place_orphan (file, s)
1051 lang_input_statement_type *file;
1054 static struct orphan_save hold_text;
1055 static struct orphan_save hold_rodata;
1056 static struct orphan_save hold_data;
1057 static struct orphan_save hold_bss;
1058 static struct orphan_save hold_rel;
1059 static struct orphan_save hold_interp;
1060 static struct orphan_save hold_sdata;
1061 static int count = 1;
1062 struct orphan_save *place;
1063 lang_statement_list_type *old;
1064 lang_statement_list_type add;
1065 etree_type *address;
1066 const char *secname;
1067 const char *outsecname;
1068 const char *ps = NULL;
1069 lang_output_section_statement_type *os;
1071 secname = bfd_get_section_name (s->owner, s);
1073 if (! config.unique_orphan_sections && ! unique_section_p (secname))
1075 /* Look through the script to see where to place this section. */
1076 os = lang_output_section_find (secname);
1079 && (os->bfd_section == NULL
1080 || ((s->flags ^ os->bfd_section->flags)
1081 & (SEC_LOAD | SEC_ALLOC)) == 0))
1083 /* We already have an output section statement with this
1084 name, and its bfd section, if any, has compatible flags. */
1085 lang_add_section (&os->children, s, os, file);
1090 if (hold_text.os == NULL)
1091 hold_text.os = lang_output_section_find (".text");
1093 /* If this is a final link, then always put .gnu.warning.SYMBOL
1094 sections into the .text section to get them out of the way. */
1095 if (! link_info.shared
1096 && ! link_info.relocateable
1097 && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
1098 && hold_text.os != NULL)
1100 lang_add_section (&hold_text.os->children, s, hold_text.os, file);
1104 /* Decide which segment the section should go in based on the
1105 section name and section flags. We put loadable .note sections
1106 right after the .interp section, so that the PT_NOTE segment is
1107 stored right after the program headers where the OS can read it
1108 in the first page. */
1109 #define HAVE_SECTION(hold, name) \
1110 (hold.os != NULL || (hold.os = lang_output_section_find (name)) != NULL)
1112 if (s->flags & SEC_EXCLUDE)
1114 if (s->output_section == NULL)
1115 s->output_section = bfd_abs_section_ptr;
1120 if ((s->flags & SEC_ALLOC) == 0)
1122 else if ((s->flags & SEC_LOAD) != 0
1123 && strncmp (secname, ".note", 5) == 0
1124 && HAVE_SECTION (hold_interp, ".interp"))
1125 place = &hold_interp;
1126 else if ((s->flags & SEC_HAS_CONTENTS) == 0
1127 && HAVE_SECTION (hold_bss, ".bss"))
1129 else if ((s->flags & SEC_SMALL_DATA) != 0
1130 && HAVE_SECTION (hold_sdata, ".sdata"))
1131 place = &hold_sdata;
1132 else if ((s->flags & SEC_READONLY) == 0
1133 && HAVE_SECTION (hold_data, ".data"))
1135 else if (strncmp (secname, ".rel", 4) == 0
1136 && (hold_rel.os != NULL
1137 || (hold_rel.os = output_rel_find ()) != NULL))
1139 if (! link_info.relocateable && link_info.combreloc)
1141 if (strncmp (secname, ".rela", 5) == 0)
1142 os = lang_output_section_find (".rela.dyn");
1144 os = lang_output_section_find (".rel.dyn");
1147 && os->bfd_section != NULL
1148 && ((s->flags ^ os->bfd_section->flags)
1149 & (SEC_LOAD | SEC_ALLOC)) == 0)
1151 lang_add_section (&os->children, s, os, file);
1157 else if ((s->flags & (SEC_CODE | SEC_READONLY)) == SEC_READONLY
1158 && HAVE_SECTION (hold_rodata, ".rodata"))
1159 place = &hold_rodata;
1160 else if ((s->flags & (SEC_CODE | SEC_READONLY)) == (SEC_CODE | SEC_READONLY)
1161 && hold_text.os != NULL)
1166 /* Choose a unique name for the section. This will be needed if the
1167 same section name appears in the input file with different
1168 loadable or allocatable characteristics. */
1169 outsecname = secname;
1170 if (bfd_get_section_by_name (output_bfd, outsecname) != NULL)
1172 outsecname = bfd_get_unique_section_name (output_bfd,
1175 if (outsecname == NULL)
1176 einfo ("%F%P: place_orphan failed: %E\n");
1179 /* Start building a list of statements for this section.
1180 First save the current statement pointer. */
1183 /* If we have found an appropriate place for the output section
1184 statements for this orphan, add them to our own private list,
1185 inserting them later into the global statement list. */
1189 lang_list_init (stat_ptr);
1192 if (config.build_constructors)
1194 /* If the name of the section is representable in C, then create
1195 symbols to mark the start and the end of the section. */
1196 for (ps = outsecname; *ps != '\0'; ps++)
1197 if (! isalnum ((unsigned char) *ps) && *ps != '_')
1202 etree_type *e_align;
1204 symname = (char *) xmalloc (ps - outsecname + sizeof "__start_");
1205 sprintf (symname, "__start_%s", outsecname);
1206 e_align = exp_unop (ALIGN_K,
1207 exp_intop ((bfd_vma) 1 << s->alignment_power));
1208 lang_add_assignment (exp_assop ('=', symname, e_align));
1212 if (link_info.relocateable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
1213 address = exp_intop ((bfd_vma) 0);
1217 os = lang_enter_output_section_statement (outsecname, address, 0,
1219 (etree_type *) NULL,
1220 (etree_type *) NULL,
1221 (etree_type *) NULL);
1223 lang_add_section (&os->children, s, os, file);
1225 lang_leave_output_section_statement
1226 ((bfd_vma) 0, "*default*",
1227 (struct lang_output_section_phdr_list *) NULL, "*default*");
1229 if (config.build_constructors && *ps == '\0')
1233 /* lang_leave_ouput_section_statement resets stat_ptr. Put
1234 stat_ptr back where we want it. */
1238 symname = (char *) xmalloc (ps - outsecname + sizeof "__stop_");
1239 sprintf (symname, "__stop_%s", outsecname);
1240 lang_add_assignment (exp_assop ('=', symname,
1241 exp_nameop (NAME, ".")));
1244 /* Restore the global list pointer. */
1249 asection *snew, **pps;
1251 snew = os->bfd_section;
1253 /* Shuffle the bfd section list to make the output file look
1254 neater. This is really only cosmetic. */
1255 if (place->section == NULL)
1257 asection *bfd_section = place->os->bfd_section;
1259 /* If the output statement hasn't been used to place
1260 any input sections (and thus doesn't have an output
1261 bfd_section), look for the closest prior output statement
1262 having an output section. */
1263 if (bfd_section == NULL)
1264 bfd_section = output_prev_sec_find (place->os);
1266 if (bfd_section != NULL && bfd_section != snew)
1267 place->section = &bfd_section->next;
1270 if (place->section != NULL)
1272 /* Unlink the section. */
1273 for (pps = &output_bfd->sections; *pps != snew; pps = &(*pps)->next)
1277 /* Now tack it on to the "place->os" section list. */
1278 snew->next = *place->section;
1279 *place->section = snew;
1282 /* Save the end of this list. Further ophans of this type will
1283 follow the one we've just added. */
1284 place->section = &snew->next;
1286 /* The following is non-cosmetic. We try to put the output
1287 statements in some sort of reasonable order here, because
1288 they determine the final load addresses of the orphan
1289 sections. In addition, placing output statements in the
1290 wrong order may require extra segments. For instance,
1291 given a typical situation of all read-only sections placed
1292 in one segment and following that a segment containing all
1293 the read-write sections, we wouldn't want to place an orphan
1294 read/write section before or amongst the read-only ones. */
1295 if (add.head != NULL)
1297 if (place->stmt == NULL)
1299 /* Put the new statement list right at the head. */
1300 *add.tail = place->os->header.next;
1301 place->os->header.next = add.head;
1305 /* Put it after the last orphan statement we added. */
1306 *add.tail = *place->stmt;
1307 *place->stmt = add.head;
1310 /* Fix the global list pointer if we happened to tack our
1311 new list at the tail. */
1312 if (*old->tail == add.head)
1313 old->tail = add.tail;
1315 /* Save the end of this list. */
1316 place->stmt = add.tail;
1326 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1327 cat >>e${EMULATION_NAME}.c <<EOF
1330 gld${EMULATION_NAME}_get_script (isfile)
1334 if test -n "$COMPILE_IN"
1336 # Scripts compiled in.
1338 # sed commands to quote an ld script as a C string.
1339 sc="-f stringify.sed"
1341 cat >>e${EMULATION_NAME}.c <<EOF
1345 if (link_info.relocateable == true && config.build_constructors == true)
1348 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1349 echo ' ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c
1350 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1351 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1352 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1353 if ! cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then
1354 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1355 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1357 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1358 echo ' ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1359 sed $sc ldscripts/${EMULATION_NAME}.xsc >> e${EMULATION_NAME}.c
1360 echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c
1361 sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
1363 echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c
1364 sed $sc ldscripts/${EMULATION_NAME}.xc >> e${EMULATION_NAME}.c
1365 echo ' ; else return' >> e${EMULATION_NAME}.c
1366 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1367 echo '; }' >> e${EMULATION_NAME}.c
1370 # Scripts read from the filesystem.
1372 cat >>e${EMULATION_NAME}.c <<EOF
1376 if (link_info.relocateable == true && config.build_constructors == true)
1377 return "ldscripts/${EMULATION_NAME}.xu";
1378 else if (link_info.relocateable == true)
1379 return "ldscripts/${EMULATION_NAME}.xr";
1380 else if (!config.text_read_only)
1381 return "ldscripts/${EMULATION_NAME}.xbn";
1382 else if (!config.magic_demand_paged)
1383 return "ldscripts/${EMULATION_NAME}.xn";
1384 else if (link_info.shared)
1385 return "ldscripts/${EMULATION_NAME}.xs";
1387 return "ldscripts/${EMULATION_NAME}.x";
1394 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1396 if test x"$LDEMUL_PARSE_ARGS" != xgld"$EMULATION_NAME"_parse_args; then
1398 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1399 cat >>e${EMULATION_NAME}.c <<EOF
1400 $PARSE_AND_LIST_PROLOGUE
1404 cat >>e${EMULATION_NAME}.c <<EOF
1408 #define OPTION_DISABLE_NEW_DTAGS (400)
1409 #define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
1410 #define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
1412 static struct option longopts[] =
1416 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1417 cat >>e${EMULATION_NAME}.c <<EOF
1418 /* getopt allows abbreviations, so we do this to stop it from
1419 treating -d/-e as abbreviations for these options. */
1420 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1421 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1422 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1423 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1424 {"Bgroup", no_argument, NULL, OPTION_GROUP},
1425 {"Bgroup", no_argument, NULL, OPTION_GROUP},
1429 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
1430 cat >>e${EMULATION_NAME}.c <<EOF
1431 $PARSE_AND_LIST_LONGOPTS
1435 cat >>e${EMULATION_NAME}.c <<EOF
1436 {NULL, no_argument, NULL, 0}
1440 static int gld${EMULATION_NAME}_parse_args PARAMS ((int, char **));
1443 gld${EMULATION_NAME}_parse_args (argc, argv)
1449 static int prevoptind = -1;
1450 int prevopterr = opterr;
1453 if (prevoptind != optind)
1457 prevoptind = optind;
1459 optc = getopt_long_only (argc, argv,
1460 "-${PARSE_AND_LIST_SHORTOPTS}z:", longopts,
1462 opterr = prevopterr;
1469 optind = prevoptind;
1474 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1475 cat >>e${EMULATION_NAME}.c <<EOF
1476 case OPTION_DISABLE_NEW_DTAGS:
1477 link_info.new_dtags = false;
1480 case OPTION_ENABLE_NEW_DTAGS:
1481 link_info.new_dtags = true;
1485 link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
1486 /* Groups must be self-contained. */
1487 link_info.no_undefined = true;
1491 if (strcmp (optarg, "initfirst") == 0)
1492 link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
1493 else if (strcmp (optarg, "interpose") == 0)
1494 link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
1495 else if (strcmp (optarg, "loadfltr") == 0)
1496 link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
1497 else if (strcmp (optarg, "nodefaultlib") == 0)
1498 link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
1499 else if (strcmp (optarg, "nodelete") == 0)
1500 link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
1501 else if (strcmp (optarg, "nodlopen") == 0)
1502 link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
1503 else if (strcmp (optarg, "nodump") == 0)
1504 link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
1505 else if (strcmp (optarg, "now") == 0)
1507 link_info.flags |= (bfd_vma) DF_BIND_NOW;
1508 link_info.flags_1 |= (bfd_vma) DF_1_NOW;
1510 else if (strcmp (optarg, "origin") == 0)
1512 link_info.flags |= (bfd_vma) DF_ORIGIN;
1513 link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
1515 else if (strcmp (optarg, "defs") == 0)
1516 link_info.no_undefined = true;
1517 else if (strcmp (optarg, "combreloc") == 0)
1518 link_info.combreloc = true;
1519 else if (strcmp (optarg, "nocombreloc") == 0)
1520 link_info.combreloc = false;
1521 /* What about the other Solaris -z options? FIXME. */
1526 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
1527 cat >>e${EMULATION_NAME}.c <<EOF
1528 $PARSE_AND_LIST_ARGS_CASES
1532 cat >>e${EMULATION_NAME}.c <<EOF
1541 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1542 cat >>e${EMULATION_NAME}.c <<EOF
1544 static void gld${EMULATION_NAME}_list_options PARAMS ((FILE * file));
1547 gld${EMULATION_NAME}_list_options (file)
1552 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1553 cat >>e${EMULATION_NAME}.c <<EOF
1554 fprintf (file, _(" -Bgroup\t\tSelects group name lookup rules for DSO\n"));
1555 fprintf (file, _(" --disable-new-dtags\tDisable new dynamic tags\n"));
1556 fprintf (file, _(" --enable-new-dtags\tEnable new dynamic tags\n"));
1557 fprintf (file, _(" -z defs\t\tDisallows undefined symbols\n"));
1558 fprintf (file, _(" -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
1559 fprintf (file, _(" -z interpose\t\tMark object to interpose all DSOs but executable\n"));
1560 fprintf (file, _(" -z loadfltr\t\tMark object requiring immediate process\n"));
1561 fprintf (file, _(" -z nodefaultlib\tMark object not to use default search paths\n"));
1562 fprintf (file, _(" -z nodelete\t\tMark DSO non-deletable at runtime\n"));
1563 fprintf (file, _(" -z nodlopen\t\tMark DSO not available to dlopen\n"));
1564 fprintf (file, _(" -z nodump\t\tMark DSO not available to dldump\n"));
1565 fprintf (file, _(" -z now\t\tMark object non-lazy runtime binding\n"));
1566 fprintf (file, _(" -z origin\t\tMark object requiring immediate \$ORIGIN processing\n"));
1567 fprintf (file, _("\t\t\t at runtime\n"));
1568 fprintf (file, _(" -z KEYWORD\t\tIgnored for Solaris compatibility\n"));
1572 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
1573 cat >>e${EMULATION_NAME}.c <<EOF
1574 $PARSE_AND_LIST_OPTIONS
1578 cat >>e${EMULATION_NAME}.c <<EOF
1582 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
1583 cat >>e${EMULATION_NAME}.c <<EOF
1584 $PARSE_AND_LIST_EPILOGUE
1589 if test x"$LDEMUL_PARSE_ARGS" != xgld"$EMULATION_NAME"_parse_args; then
1590 cat >>e${EMULATION_NAME}.c <<EOF
1591 #define gld${EMULATION_NAME}_parse_args NULL
1594 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1595 cat >>e${EMULATION_NAME}.c <<EOF
1596 #define gld${EMULATION_NAME}_list_options NULL
1601 cat >>e${EMULATION_NAME}.c <<EOF
1603 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1605 ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
1606 ${LDEMUL_SYSLIB-syslib_default},
1607 ${LDEMUL_HLL-hll_default},
1608 ${LDEMUL_AFTER_PARSE-after_parse_default},
1609 ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
1610 ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
1611 ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
1612 ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
1613 ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
1614 ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
1615 "${EMULATION_NAME}",
1617 ${LDEMUL_FINISH-NULL},
1618 ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
1619 ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
1620 ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
1621 ${LDEMUL_SET_SYMBOLS-NULL},
1622 ${LDEMUL_PARSE_ARGS-gld${EMULATION_NAME}_parse_args},
1623 ${LDEMUL_UNRECOGNIZED_FILE-NULL},
1624 ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
1625 ${LDEMUL_RECOGNIZED_FILE-NULL},
1626 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},