1 # This shell script emits a C file. -*- C -*-
2 # It does some substitutions.
3 # This file is now misnamed, because it supports both 32 bit and 64 bit
5 test -z "${ELFSIZE}" && ELFSIZE=32
6 if [ -z "$MACHINE" ]; then
9 OUTPUT_ARCH=${ARCH}:${MACHINE}
11 cat >e${EMULATION_NAME}.c <<EOF
12 /* This file is is generated by a shell script. DO NOT EDIT! */
14 /* ${ELFSIZE} bit ELF emulation code for ${EMULATION_NAME}
15 Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
16 2002, 2003, 2004, 2005 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
36 #define TARGET_IS_${EMULATION_NAME}
41 #include "libiberty.h"
42 #include "safe-ctype.h"
55 #include "elf/common.h"
57 /* Declare functions used by various EXTRA_EM_FILEs. */
58 static void gld${EMULATION_NAME}_before_parse (void);
59 static void gld${EMULATION_NAME}_after_open (void);
60 static void gld${EMULATION_NAME}_provide_init_fini_syms (void);
61 static void gld${EMULATION_NAME}_before_allocation (void);
62 static bfd_boolean gld${EMULATION_NAME}_place_orphan
63 (lang_input_statement_type *file, asection *s);
64 static void gld${EMULATION_NAME}_layout_sections_again (void);
65 static void gld${EMULATION_NAME}_finish (void) ATTRIBUTE_UNUSED;
69 if [ "x${USE_LIBPATH}" = xyes ] ; then
71 *-*-linux-* | *-*-k*bsd*-*)
72 cat >>e${EMULATION_NAME}.c <<EOF
81 # Import any needed special functions and/or overrides.
83 if test -n "$EXTRA_EM_FILE" ; then
84 . ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
87 # Functions in this file can be overridden by setting the LDEMUL_* shell
88 # variables. If the name of the overriding function is the same as is
89 # defined in this file, then don't output this file's version.
90 # If a different overriding name is given then output the standard function
91 # as presumably it is called from the overriding function.
93 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
94 cat >>e${EMULATION_NAME}.c <<EOF
97 gld${EMULATION_NAME}_before_parse (void)
99 ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
100 config.dynamic_link = ${DYNAMIC_LINK-TRUE};
101 config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
107 if test x"$LDEMUL_RECOGNIZED_FILE" != xgld"${EMULATION_NAME}"_load_symbols; then
108 cat >>e${EMULATION_NAME}.c <<EOF
109 /* Handle as_needed DT_NEEDED. */
112 gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *entry)
116 /* Tell the ELF linker that we don't want the output file to have a
117 DT_NEEDED entry for this file, unless it is used to resolve
118 references in a regular object. */
119 if (entry->as_needed)
120 class = DYN_AS_NEEDED;
122 /* Tell the ELF linker that we don't want the output file to have a
123 DT_NEEDED entry for any dynamic library in DT_NEEDED tags from
125 if (!entry->add_needed)
126 class |= DYN_NO_ADD_NEEDED;
129 || (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) == 0)
132 bfd_elf_set_dyn_lib_class (entry->the_bfd, class);
134 /* Continue on with normal load_symbols processing. */
140 cat >>e${EMULATION_NAME}.c <<EOF
142 /* These variables are required to pass information back and forth
143 between after_open and check_needed and stat_needed and vercheck. */
145 static struct bfd_link_needed_list *global_needed;
146 static struct stat global_stat;
147 static bfd_boolean global_found;
148 static struct bfd_link_needed_list *global_vercheck_needed;
149 static bfd_boolean global_vercheck_failed;
152 /* On Linux, it's possible to have different versions of the same
153 shared library linked against different versions of libc. The
154 dynamic linker somehow tags which libc version to use in
155 /etc/ld.so.cache, and, based on the libc that it sees in the
156 executable, chooses which version of the shared library to use.
158 We try to do a similar check here by checking whether this shared
159 library needs any other shared libraries which may conflict with
160 libraries we have already included in the link. If it does, we
161 skip it, and try to find another shared library farther on down the
164 This is called via lang_for_each_input_file.
165 GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
166 which we are checking. This sets GLOBAL_VERCHECK_FAILED if we find
167 a conflicting version. */
170 gld${EMULATION_NAME}_vercheck (lang_input_statement_type *s)
173 struct bfd_link_needed_list *l;
175 if (global_vercheck_failed)
177 if (s->the_bfd == NULL
178 || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
181 soname = bfd_elf_get_dt_soname (s->the_bfd);
183 soname = lbasename (bfd_get_filename (s->the_bfd));
185 for (l = global_vercheck_needed; l != NULL; l = l->next)
189 if (strcmp (soname, l->name) == 0)
191 /* Probably can't happen, but it's an easy check. */
195 if (strchr (l->name, '/') != NULL)
198 suffix = strstr (l->name, ".so.");
202 suffix += sizeof ".so." - 1;
204 if (strncmp (soname, l->name, suffix - l->name) == 0)
206 /* Here we know that S is a dynamic object FOO.SO.VER1, and
207 the object we are considering needs a dynamic object
208 FOO.SO.VER2, and VER1 and VER2 are different. This
209 appears to be a version mismatch, so we tell the caller
210 to try a different version of this library. */
211 global_vercheck_failed = TRUE;
218 /* See if an input file matches a DT_NEEDED entry by running stat on
222 gld${EMULATION_NAME}_stat_needed (lang_input_statement_type *s)
230 if (s->the_bfd == NULL)
233 && (bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0)
236 if (bfd_stat (s->the_bfd, &st) != 0)
238 einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
242 /* Some operating systems, e.g. Windows, do not provide a meaningful
243 st_ino; they always set it to zero. (Windows does provide a
244 meaningful st_dev.) Do not indicate a duplicate library in that
245 case. While there is no guarantee that a system that provides
246 meaningful inode numbers will never set st_ino to zero, this is
247 merely an optimization, so we do not need to worry about false
249 if (st.st_dev == global_stat.st_dev
250 && st.st_ino == global_stat.st_ino
257 /* We issue a warning if it looks like we are including two
258 different versions of the same shared library. For example,
259 there may be a problem if -lc picks up libc.so.6 but some other
260 shared library has a DT_NEEDED entry of libc.so.5. This is a
261 heuristic test, and it will only work if the name looks like
262 NAME.so.VERSION. FIXME: Depending on file names is error-prone.
263 If we really want to issue warnings about mixing version numbers
264 of shared libraries, we need to find a better way. */
266 if (strchr (global_needed->name, '/') != NULL)
268 suffix = strstr (global_needed->name, ".so.");
271 suffix += sizeof ".so." - 1;
273 soname = bfd_elf_get_dt_soname (s->the_bfd);
275 soname = lbasename (s->filename);
277 if (strncmp (soname, global_needed->name, suffix - global_needed->name) == 0)
278 einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
279 global_needed->name, global_needed->by, soname);
288 /* This function is called for each possible name for a dynamic object
289 named by a DT_NEEDED entry. The FORCE parameter indicates whether
290 to skip the check for a conflicting version. */
293 gld${EMULATION_NAME}_try_needed (struct dt_needed *needed,
297 const char *name = needed->name;
301 abfd = bfd_openr (name, bfd_get_target (output_bfd));
304 if (! bfd_check_format (abfd, bfd_object))
309 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
315 /* For DT_NEEDED, they have to match. */
316 if (abfd->xvec != output_bfd->xvec)
322 /* Check whether this object would include any conflicting library
323 versions. If FORCE is set, then we skip this check; we use this
324 the second time around, if we couldn't find any compatible
325 instance of the shared library. */
329 struct bfd_link_needed_list *needed;
331 if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
332 einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
336 global_vercheck_needed = needed;
337 global_vercheck_failed = FALSE;
338 lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
339 if (global_vercheck_failed)
342 /* Return FALSE to force the caller to move on to try
343 another file on the search path. */
347 /* But wait! It gets much worse. On Linux, if a shared
348 library does not use libc at all, we are supposed to skip
349 it the first time around in case we encounter a shared
350 library later on with the same name which does use the
351 version of libc that we want. This is much too horrible
352 to use on any system other than Linux. */
356 *-*-linux-* | *-*-k*bsd*-*)
357 cat >>e${EMULATION_NAME}.c <<EOF
359 struct bfd_link_needed_list *l;
361 for (l = needed; l != NULL; l = l->next)
362 if (strncmp (l->name, "libc.so", 7) == 0)
374 cat >>e${EMULATION_NAME}.c <<EOF
378 /* We've found a dynamic object matching the DT_NEEDED entry. */
380 /* We have already checked that there is no other input file of the
381 same name. We must now check again that we are not including the
382 same file twice. We need to do this because on many systems
383 libc.so is a symlink to, e.g., libc.so.1. The SONAME entry will
384 reference libc.so.1. If we have already included libc.so, we
385 don't want to include libc.so.1 if they are the same file, and we
386 can only check that using stat. */
388 if (bfd_stat (abfd, &global_stat) != 0)
389 einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
391 /* First strip off everything before the last '/'. */
392 soname = lbasename (abfd->filename);
394 if (trace_file_tries)
395 info_msg (_("found %s at %s\n"), soname, name);
397 global_found = FALSE;
398 lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
401 /* Return TRUE to indicate that we found the file, even though
402 we aren't going to do anything with it. */
406 /* Specify the soname to use. */
407 bfd_elf_set_dt_needed_name (abfd, soname);
409 /* Tell the ELF linker that we don't want the output file to have a
410 DT_NEEDED entry for this file, unless it is used to resolve
411 references in a regular object. */
412 class = DYN_DT_NEEDED;
414 /* Tell the ELF linker that we don't want the output file to have a
415 DT_NEEDED entry for this file at all if the entry is from a file
416 with DYN_NO_ADD_NEEDED. */
417 if (needed->by != NULL
418 && (bfd_elf_get_dyn_lib_class (needed->by) & DYN_NO_ADD_NEEDED) != 0)
419 class |= DYN_NO_NEEDED | DYN_NO_ADD_NEEDED;
421 bfd_elf_set_dyn_lib_class (abfd, class);
423 /* Add this file into the symbol table. */
424 if (! bfd_link_add_symbols (abfd, &link_info))
425 einfo ("%F%B: could not read symbols: %E\n", abfd);
431 /* Search for a needed file in a path. */
434 gld${EMULATION_NAME}_search_needed (const char *path,
435 struct dt_needed *n, int force)
438 const char *name = n->name;
440 struct dt_needed needed;
443 return gld${EMULATION_NAME}_try_needed (n, force);
445 if (path == NULL || *path == '\0')
449 needed.name = n->name;
454 char *filename, *sset;
456 s = strchr (path, ':');
458 s = path + strlen (path);
460 filename = (char *) xmalloc (s - path + len + 2);
465 memcpy (filename, path, s - path);
466 filename[s - path] = '/';
467 sset = filename + (s - path) + 1;
471 needed.name = filename;
472 if (gld${EMULATION_NAME}_try_needed (&needed, force))
486 if [ "x${USE_LIBPATH}" = xyes ] ; then
487 cat >>e${EMULATION_NAME}.c <<EOF
489 /* Add the sysroot to every entry in a colon-separated path. */
492 gld${EMULATION_NAME}_add_sysroot (const char *path)
501 if (path[i++] == ':')
507 len = len + (colons + 1) * strlen (ld_sysroot);
508 ret = xmalloc (len + 1);
509 strcpy (ret, ld_sysroot);
510 p = ret + strlen (ret);
516 strcpy (p, ld_sysroot);
528 *-*-linux-* | *-*-k*bsd*-*)
529 cat >>e${EMULATION_NAME}.c <<EOF
530 /* For a native linker, check the file /etc/ld.so.conf for directories
531 in which we may find shared libraries. /etc/ld.so.conf is really
532 only meaningful on Linux. */
534 struct gld${EMULATION_NAME}_ld_so_conf
541 gld${EMULATION_NAME}_parse_ld_so_conf
542 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename);
545 gld${EMULATION_NAME}_parse_ld_so_conf_include
546 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename,
554 if (pattern[0] != '/')
556 char *p = strrchr (filename, '/');
557 size_t patlen = strlen (pattern) + 1;
559 newp = xmalloc (p - filename + 1 + patlen);
560 memcpy (newp, filename, p - filename + 1);
561 memcpy (newp + (p - filename + 1), pattern, patlen);
566 if (glob (pattern, 0, NULL, &gl) == 0)
570 for (i = 0; i < gl.gl_pathc; ++i)
571 gld${EMULATION_NAME}_parse_ld_so_conf (info, gl.gl_pathv[i]);
575 /* If we do not have glob, treat the pattern as a literal filename. */
576 gld${EMULATION_NAME}_parse_ld_so_conf (info, pattern);
584 gld${EMULATION_NAME}_parse_ld_so_conf
585 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename)
587 FILE *f = fopen (filename, FOPEN_RT);
595 line = xmalloc (linelen);
600 /* Normally this would use getline(3), but we need to be portable. */
601 while ((q = fgets (p, linelen - (p - line), f)) != NULL
602 && strlen (q) == linelen - (p - line) - 1
603 && line[linelen - 2] != '\n')
605 line = xrealloc (line, 2 * linelen);
606 p = line + linelen - 1;
610 if (q == NULL && p == line)
613 p = strchr (line, '\n');
617 /* Because the file format does not know any form of quoting we
618 can search forward for the next '#' character and if found
619 make it terminating the line. */
620 p = strchr (line, '#');
624 /* Remove leading whitespace. NUL is no whitespace character. */
626 while (*p == ' ' || *p == '\f' || *p == '\r' || *p == '\t' || *p == '\v')
629 /* If the line is blank it is ignored. */
633 if (!strncmp (p, "include", 7) && (p[7] == ' ' || p[7] == '\t'))
639 while (*p == ' ' || *p == '\t')
647 while (*p != ' ' && *p != '\t' && *p)
653 gld${EMULATION_NAME}_parse_ld_so_conf_include (info, filename,
661 while (*p && *p != '=' && *p != ' ' && *p != '\t' && *p != '\f'
662 && *p != '\r' && *p != '\v')
665 while (p != dir && p[-1] == '/')
667 if (info->path == NULL)
669 info->alloc = p - dir + 1 + 256;
670 info->path = xmalloc (info->alloc);
675 if (info->len + 1 + (p - dir) >= info->alloc)
677 info->alloc += p - dir + 256;
678 info->path = xrealloc (info->path, info->alloc);
680 info->path[info->len++] = ':';
682 memcpy (info->path + info->len, dir, p - dir);
683 info->len += p - dir;
684 info->path[info->len] = '\0';
693 gld${EMULATION_NAME}_check_ld_so_conf (const char *name, int force)
695 static bfd_boolean initialized;
696 static char *ld_so_conf;
697 struct dt_needed needed;
702 struct gld${EMULATION_NAME}_ld_so_conf info;
704 tmppath = concat (ld_sysroot, "/etc/ld.so.conf", NULL);
706 info.len = info.alloc = 0;
707 gld${EMULATION_NAME}_parse_ld_so_conf (&info, tmppath);
711 char *d = gld${EMULATION_NAME}_add_sysroot (info.path);
718 if (ld_so_conf == NULL)
724 return gld${EMULATION_NAME}_search_needed (ld_so_conf, &needed, force);
732 cat >>e${EMULATION_NAME}.c <<EOF
734 /* See if an input file matches a DT_NEEDED entry by name. */
737 gld${EMULATION_NAME}_check_needed (lang_input_statement_type *s)
742 /* If this input file was an as-needed entry, and wasn't found to be
743 needed at the stage it was linked, then don't say we have loaded it. */
745 && (s->the_bfd == NULL
746 || (bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0))
749 if (s->filename != NULL)
753 if (strcmp (s->filename, global_needed->name) == 0)
759 if (s->search_dirs_flag)
761 f = strrchr (s->filename, '/');
763 && strcmp (f + 1, global_needed->name) == 0)
771 if (s->the_bfd != NULL)
775 soname = bfd_elf_get_dt_soname (s->the_bfd);
777 && strcmp (soname, global_needed->name) == 0)
787 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
788 cat >>e${EMULATION_NAME}.c <<EOF
790 /* This is called after all the input files have been opened. */
793 gld${EMULATION_NAME}_after_open (void)
795 struct bfd_link_needed_list *needed, *l;
797 /* We only need to worry about this when doing a final link. */
798 if (link_info.relocatable || !link_info.executable)
801 /* Get the list of files which appear in DT_NEEDED entries in
802 dynamic objects included in the link (often there will be none).
803 For each such file, we want to track down the corresponding
804 library, and include the symbol table in the link. This is what
805 the runtime dynamic linker will do. Tracking the files down here
806 permits one dynamic object to include another without requiring
807 special action by the person doing the link. Note that the
808 needed list can actually grow while we are stepping through this
810 needed = bfd_elf_get_needed_list (output_bfd, &link_info);
811 for (l = needed; l != NULL; l = l->next)
813 struct bfd_link_needed_list *ll;
814 struct dt_needed n, nn;
817 /* If the lib that needs this one was --as-needed and wasn't
818 found to be needed, then this lib isn't needed either. */
820 && (bfd_elf_get_dyn_lib_class (l->by) & DYN_AS_NEEDED) != 0)
823 /* If we've already seen this file, skip it. */
824 for (ll = needed; ll != l; ll = ll->next)
826 || (bfd_elf_get_dyn_lib_class (ll->by) & DYN_AS_NEEDED) == 0)
827 && strcmp (ll->name, l->name) == 0)
832 /* See if this file was included in the link explicitly. */
834 global_found = FALSE;
835 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
842 if (trace_file_tries)
843 info_msg (_("%s needed by %B\n"), l->name, l->by);
845 /* We need to find this file and include the symbol table. We
846 want to search for the file in the same way that the dynamic
847 linker will search. That means that we want to use
848 rpath_link, rpath, then the environment variable
849 LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
850 entries (native only), then the linker script LIB_SEARCH_DIRS.
851 We do not search using the -L arguments.
853 We search twice. The first time, we skip objects which may
854 introduce version mismatches. The second time, we force
855 their use. See gld${EMULATION_NAME}_vercheck comment. */
856 for (force = 0; force < 2; force++)
859 search_dirs_type *search;
861 if [ "x${NATIVE}" = xyes ] ; then
862 cat >>e${EMULATION_NAME}.c <<EOF
863 const char *lib_path;
866 if [ "x${USE_LIBPATH}" = xyes ] ; then
867 cat >>e${EMULATION_NAME}.c <<EOF
868 struct bfd_link_needed_list *rp;
872 cat >>e${EMULATION_NAME}.c <<EOF
874 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
878 if [ "x${USE_LIBPATH}" = xyes ] ; then
879 cat >>e${EMULATION_NAME}.c <<EOF
880 if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
885 if [ "x${NATIVE}" = xyes ] ; then
886 cat >>e${EMULATION_NAME}.c <<EOF
887 if (command_line.rpath_link == NULL
888 && command_line.rpath == NULL)
890 lib_path = (const char *) getenv ("LD_RUN_PATH");
891 if (gld${EMULATION_NAME}_search_needed (lib_path, &n,
895 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
896 if (gld${EMULATION_NAME}_search_needed (lib_path, &n, force))
900 if [ "x${USE_LIBPATH}" = xyes ] ; then
901 cat >>e${EMULATION_NAME}.c <<EOF
903 rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
904 for (; !found && rp != NULL; rp = rp->next)
906 char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
907 found = (rp->by == l->by
908 && gld${EMULATION_NAME}_search_needed (tmpname,
918 cat >>e${EMULATION_NAME}.c <<EOF
919 len = strlen (l->name);
920 for (search = search_head; search != NULL; search = search->next)
926 filename = (char *) xmalloc (strlen (search->name) + len + 2);
927 sprintf (filename, "%s/%s", search->name, l->name);
929 if (gld${EMULATION_NAME}_try_needed (&nn, force))
936 if [ "x${USE_LIBPATH}" = xyes ] ; then
938 *-*-linux-* | *-*-k*bsd*-*)
939 cat >>e${EMULATION_NAME}.c <<EOF
940 if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
947 cat >>e${EMULATION_NAME}.c <<EOF
953 einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
961 cat >>e${EMULATION_NAME}.c <<EOF
963 /* Look through an expression for an assignment statement. */
966 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
968 bfd_boolean provide = FALSE;
970 switch (exp->type.node_class)
976 /* We call record_link_assignment even if the symbol is defined.
977 This is because if it is defined by a dynamic object, we
978 actually want to use the value defined by the linker script,
979 not the value from the dynamic object (because we are setting
980 symbols like etext). If the symbol is defined by a regular
981 object, then, as it happens, calling record_link_assignment
983 if (strcmp (exp->assign.dst, ".") != 0)
985 if (!bfd_elf_record_link_assignment (&link_info, exp->assign.dst,
987 einfo ("%P%F: failed to record assignment to %s: %E\n",
990 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
994 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
995 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
999 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1000 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1001 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1005 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1014 /* This is called by the before_allocation routine via
1015 lang_for_each_statement. It locates any assignment statements, and
1016 tells the ELF backend about them, in case they are assignments to
1017 symbols which are referred to by dynamic objects. */
1020 gld${EMULATION_NAME}_find_statement_assignment (lang_statement_union_type *s)
1022 if (s->header.type == lang_assignment_statement_enum)
1023 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1028 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
1029 if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
1030 ELF_INTERPRETER_SET_DEFAULT="
1031 if (sinterp != NULL)
1033 sinterp->contents = (unsigned char *) ${ELF_INTERPRETER_NAME};
1034 sinterp->size = strlen ((char *) sinterp->contents) + 1;
1039 ELF_INTERPRETER_SET_DEFAULT=
1041 cat >>e${EMULATION_NAME}.c <<EOF
1044 gld${EMULATION_NAME}_provide_bound_symbols (const char *sec,
1048 asection *s = bfd_get_section_by_name (output_bfd, sec);
1049 _bfd_elf_provide_section_bound_symbols (&link_info, s, start, end);
1052 /* If not building a shared library, provide
1054 __preinit_array_start
1061 They are set here rather than via PROVIDE in the linker
1062 script, because using PROVIDE inside an output section
1063 statement results in unnecessary output sections. Using
1064 PROVIDE outside an output section statement runs the risk of
1065 section alignment affecting where the section starts. */
1068 gld${EMULATION_NAME}_provide_init_fini_syms (void)
1070 if (!link_info.relocatable && link_info.executable)
1072 gld${EMULATION_NAME}_provide_bound_symbols (".preinit_array",
1073 "__preinit_array_start",
1074 "__preinit_array_end");
1075 gld${EMULATION_NAME}_provide_bound_symbols (".init_array",
1076 "__init_array_start",
1077 "__init_array_end");
1078 gld${EMULATION_NAME}_provide_bound_symbols (".fini_array",
1079 "__fini_array_start",
1080 "__fini_array_end");
1084 /* This is called after the sections have been attached to output
1085 sections, but before any sizes or addresses have been set. */
1088 gld${EMULATION_NAME}_before_allocation (void)
1093 if (link_info.hash->type == bfd_link_elf_hash_table)
1094 _bfd_elf_tls_setup (output_bfd, &link_info);
1096 /* If we are going to make any variable assignments, we need to let
1097 the ELF backend know about them in case the variables are
1098 referred to by dynamic objects. */
1099 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
1101 ldemul_do_assignments ();
1103 /* Let the ELF backend work out the sizes of any sections required
1104 by dynamic linking. */
1105 rpath = command_line.rpath;
1107 rpath = (const char *) getenv ("LD_RUN_PATH");
1108 if (! (bfd_elf_size_dynamic_sections
1109 (output_bfd, command_line.soname, rpath,
1110 command_line.filter_shlib,
1111 (const char * const *) command_line.auxiliary_filters,
1112 &link_info, &sinterp, lang_elf_version_info)))
1113 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1115 ${ELF_INTERPRETER_SET_DEFAULT}
1116 /* Let the user override the dynamic linker we are using. */
1117 if (command_line.interpreter != NULL
1120 sinterp->contents = (bfd_byte *) command_line.interpreter;
1121 sinterp->size = strlen (command_line.interpreter) + 1;
1124 /* Look for any sections named .gnu.warning. As a GNU extensions,
1125 we treat such sections as containing warning messages. We print
1126 out the warning message, and then zero out the section size so
1127 that it does not get copied into the output file. */
1130 LANG_FOR_EACH_INPUT_STATEMENT (is)
1134 bfd_size_type prefix_len;
1137 const char * gnu_warning_prefix = _("warning: ");
1139 if (is->just_syms_flag)
1142 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
1147 prefix_len = strlen (gnu_warning_prefix);
1148 msg = xmalloc ((size_t) (prefix_len + sz + 1));
1149 strcpy (msg, gnu_warning_prefix);
1150 if (! bfd_get_section_contents (is->the_bfd, s, msg + prefix_len,
1152 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
1154 msg[prefix_len + sz] = '\0';
1155 ret = link_info.callbacks->warning (&link_info, msg,
1156 (const char *) NULL,
1157 is->the_bfd, (asection *) NULL,
1162 /* Clobber the section size, so that we don't waste copying the
1163 warning into the output file. */
1166 /* Also set SEC_EXCLUDE, so that symbols defined in the warning
1167 section don't get copied to the output. */
1168 s->flags |= SEC_EXCLUDE;
1172 if (!link_info.relocatable)
1173 strip_excluded_output_sections ();
1175 if (!bfd_elf_size_dynsym_hash_dynstr (output_bfd, &link_info))
1176 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1182 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
1183 cat >>e${EMULATION_NAME}.c <<EOF
1185 /* Try to open a dynamic archive. This is where we know that ELF
1186 dynamic libraries have an extension of .so (or .sl on oddball systems
1190 gld${EMULATION_NAME}_open_dynamic_archive
1191 (const char *arch, search_dirs_type *search, lang_input_statement_type *entry)
1193 const char *filename;
1196 if (! entry->is_archive)
1199 filename = entry->filename;
1201 /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
1202 is defined, but it does not seem worth the headache to optimize
1203 away those two bytes of space. */
1204 string = (char *) xmalloc (strlen (search->name)
1207 #ifdef EXTRA_SHLIB_EXTENSION
1208 + strlen (EXTRA_SHLIB_EXTENSION)
1210 + sizeof "/lib.so");
1212 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
1214 #ifdef EXTRA_SHLIB_EXTENSION
1215 /* Try the .so extension first. If that fails build a new filename
1216 using EXTRA_SHLIB_EXTENSION. */
1217 if (! ldfile_try_open_bfd (string, entry))
1218 sprintf (string, "%s/lib%s%s%s", search->name,
1219 filename, arch, EXTRA_SHLIB_EXTENSION);
1222 if (! ldfile_try_open_bfd (string, entry))
1228 entry->filename = string;
1230 /* We have found a dynamic object to include in the link. The ELF
1231 backend linker will create a DT_NEEDED entry in the .dynamic
1232 section naming this file. If this file includes a DT_SONAME
1233 entry, it will be used. Otherwise, the ELF linker will just use
1234 the name of the file. For an archive found by searching, like
1235 this one, the DT_NEEDED entry should consist of just the name of
1236 the file, without the path information used to find it. Note
1237 that we only need to do this if we have a dynamic object; an
1238 archive will never be referenced by a DT_NEEDED entry.
1240 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
1241 very pretty. I haven't been able to think of anything that is
1243 if (bfd_check_format (entry->the_bfd, bfd_object)
1244 && (entry->the_bfd->flags & DYNAMIC) != 0)
1246 ASSERT (entry->is_archive && entry->search_dirs_flag);
1248 /* Rather than duplicating the logic above. Just use the
1249 filename we recorded earlier. */
1251 filename = lbasename (entry->filename);
1252 bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
1261 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
1262 cat >>e${EMULATION_NAME}.c <<EOF
1264 /* A variant of lang_output_section_find used by place_orphan. */
1266 static lang_output_section_statement_type *
1267 output_rel_find (asection *sec, int isdyn)
1269 lang_output_section_statement_type *lookup;
1270 lang_output_section_statement_type *last = NULL;
1271 lang_output_section_statement_type *last_alloc = NULL;
1272 lang_output_section_statement_type *last_rel = NULL;
1273 lang_output_section_statement_type *last_rel_alloc = NULL;
1274 int rela = sec->name[4] == 'a';
1276 for (lookup = &lang_output_section_statement.head->output_section_statement;
1278 lookup = lookup->next)
1280 if (lookup->constraint != -1
1281 && strncmp (".rel", lookup->name, 4) == 0)
1283 int lookrela = lookup->name[4] == 'a';
1285 /* .rel.dyn must come before all other reloc sections, to suit
1290 /* Don't place after .rel.plt as doing so results in wrong
1292 if (strcmp (".plt", lookup->name + 4 + lookrela) == 0)
1295 if (rela == lookrela || last_rel == NULL)
1297 if ((rela == lookrela || last_rel_alloc == NULL)
1298 && lookup->bfd_section != NULL
1299 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1300 last_rel_alloc = lookup;
1304 if (lookup->bfd_section != NULL
1305 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1306 last_alloc = lookup;
1310 return last_rel_alloc;
1321 /* Place an orphan section. We use this to put random SHF_ALLOC
1322 sections in the right segment. */
1325 gld${EMULATION_NAME}_place_orphan (lang_input_statement_type *file, asection *s)
1327 static struct orphan_save hold[] =
1330 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1333 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1336 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1342 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1345 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1348 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_SMALL_DATA,
1351 enum orphan_save_index
1361 static int orphan_init_done = 0;
1362 struct orphan_save *place;
1363 const char *secname;
1364 lang_output_section_statement_type *after;
1365 lang_output_section_statement_type *os;
1368 secname = bfd_get_section_name (s->owner, s);
1370 if (! link_info.relocatable
1371 && link_info.combreloc
1372 && (s->flags & SEC_ALLOC)
1373 && strncmp (secname, ".rel", 4) == 0)
1375 if (secname[4] == 'a')
1376 secname = ".rela.dyn";
1378 secname = ".rel.dyn";
1382 if (isdyn || (!config.unique_orphan_sections && !unique_section_p (s)))
1384 /* Look through the script to see where to place this section. */
1385 os = lang_output_section_find (secname);
1388 && (os->bfd_section == NULL
1389 || os->bfd_section->flags == 0
1390 || ((s->flags ^ os->bfd_section->flags)
1391 & (SEC_LOAD | SEC_ALLOC)) == 0))
1393 /* We already have an output section statement with this
1394 name, and its bfd section, if any, has compatible flags.
1395 If the section already exists but does not have any flags
1396 set, then it has been created by the linker, probably as a
1397 result of a --section-start command line switch. */
1398 lang_add_section (&os->children, s, os, file);
1403 if (!orphan_init_done)
1405 struct orphan_save *ho;
1406 for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
1407 if (ho->name != NULL)
1409 ho->os = lang_output_section_find (ho->name);
1410 if (ho->os != NULL && ho->os->flags == 0)
1411 ho->os->flags = ho->flags;
1413 orphan_init_done = 1;
1416 /* If this is a final link, then always put .gnu.warning.SYMBOL
1417 sections into the .text section to get them out of the way. */
1418 if (link_info.executable
1419 && ! link_info.relocatable
1420 && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
1421 && hold[orphan_text].os != NULL)
1423 lang_add_section (&hold[orphan_text].os->children, s,
1424 hold[orphan_text].os, file);
1428 /* Decide which segment the section should go in based on the
1429 section name and section flags. We put loadable .note sections
1430 right after the .interp section, so that the PT_NOTE segment is
1431 stored right after the program headers where the OS can read it
1432 in the first page. */
1435 if ((s->flags & SEC_ALLOC) == 0)
1437 else if ((s->flags & SEC_LOAD) != 0
1438 && strncmp (secname, ".note", 5) == 0)
1439 place = &hold[orphan_interp];
1440 else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
1441 place = &hold[orphan_bss];
1442 else if ((s->flags & SEC_SMALL_DATA) != 0)
1443 place = &hold[orphan_sdata];
1444 else if ((s->flags & SEC_READONLY) == 0)
1445 place = &hold[orphan_data];
1446 else if (strncmp (secname, ".rel", 4) == 0
1447 && (s->flags & SEC_LOAD) != 0)
1448 place = &hold[orphan_rel];
1449 else if ((s->flags & SEC_CODE) == 0)
1450 place = &hold[orphan_rodata];
1452 place = &hold[orphan_text];
1457 if (place->os == NULL)
1459 if (place->name != NULL)
1460 place->os = lang_output_section_find (place->name);
1462 place->os = output_rel_find (s, isdyn);
1466 after = lang_output_section_find_by_flags (s, &place->os);
1468 /* *ABS* is always the first output section statement. */
1469 after = &lang_output_section_statement.head->output_section_statement;
1472 /* Choose a unique name for the section. This will be needed if the
1473 same section name appears in the input file with different
1474 loadable or allocatable characteristics. */
1475 if (bfd_get_section_by_name (output_bfd, secname) != NULL)
1477 static int count = 1;
1478 secname = bfd_get_unique_section_name (output_bfd, secname, &count);
1479 if (secname == NULL)
1480 einfo ("%F%P: place_orphan failed: %E\n");
1483 lang_insert_orphan (file, s, secname, after, place, NULL, NULL);
1490 if test x"$LDEMUL_FINISH" != xgld"$EMULATION_NAME"_finish; then
1491 cat >>e${EMULATION_NAME}.c <<EOF
1494 gld${EMULATION_NAME}_layout_sections_again (void)
1496 lang_reset_memory_regions ();
1498 /* Resize the sections. */
1499 lang_size_sections (NULL, TRUE);
1501 /* Redo special stuff. */
1502 ldemul_after_allocation ();
1504 /* Do the assignments again. */
1505 lang_do_assignments ();
1509 gld${EMULATION_NAME}_finish (void)
1511 if (bfd_elf_discard_info (output_bfd, &link_info))
1512 gld${EMULATION_NAME}_layout_sections_again ();
1514 _bfd_elf_fix_excluded_sec_syms (output_bfd, &link_info);
1519 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1520 cat >>e${EMULATION_NAME}.c <<EOF
1523 gld${EMULATION_NAME}_get_script (int *isfile)
1526 if test -n "$COMPILE_IN"
1528 # Scripts compiled in.
1530 # sed commands to quote an ld script as a C string.
1531 sc="-f stringify.sed"
1533 cat >>e${EMULATION_NAME}.c <<EOF
1537 if (link_info.relocatable && config.build_constructors)
1540 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1541 echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c
1542 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1543 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1544 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1545 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
1546 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1547 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1549 if test -n "$GENERATE_PIE_SCRIPT" ; then
1550 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1551 echo ' ; else if (link_info.pie && link_info.combreloc' >> e${EMULATION_NAME}.c
1552 echo ' && link_info.relro' >> e${EMULATION_NAME}.c
1553 echo ' && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1554 sed $sc ldscripts/${EMULATION_NAME}.xdw >> e${EMULATION_NAME}.c
1555 echo ' ; else if (link_info.pie && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1556 sed $sc ldscripts/${EMULATION_NAME}.xdc >> e${EMULATION_NAME}.c
1558 echo ' ; else if (link_info.pie) return' >> e${EMULATION_NAME}.c
1559 sed $sc ldscripts/${EMULATION_NAME}.xd >> e${EMULATION_NAME}.c
1561 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1562 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1563 echo ' ; else if (link_info.shared && link_info.combreloc' >> e${EMULATION_NAME}.c
1564 echo ' && link_info.relro' >> e${EMULATION_NAME}.c
1565 echo ' && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1566 sed $sc ldscripts/${EMULATION_NAME}.xsw >> e${EMULATION_NAME}.c
1567 echo ' ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1568 sed $sc ldscripts/${EMULATION_NAME}.xsc >> e${EMULATION_NAME}.c
1570 echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c
1571 sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
1573 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1574 echo ' ; else if (link_info.combreloc && link_info.relro' >> e${EMULATION_NAME}.c
1575 echo ' && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1576 sed $sc ldscripts/${EMULATION_NAME}.xw >> e${EMULATION_NAME}.c
1577 echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c
1578 sed $sc ldscripts/${EMULATION_NAME}.xc >> e${EMULATION_NAME}.c
1580 echo ' ; else return' >> e${EMULATION_NAME}.c
1581 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1582 echo '; }' >> e${EMULATION_NAME}.c
1585 # Scripts read from the filesystem.
1587 cat >>e${EMULATION_NAME}.c <<EOF
1591 if (link_info.relocatable && config.build_constructors)
1592 return "ldscripts/${EMULATION_NAME}.xu";
1593 else if (link_info.relocatable)
1594 return "ldscripts/${EMULATION_NAME}.xr";
1595 else if (!config.text_read_only)
1596 return "ldscripts/${EMULATION_NAME}.xbn";
1598 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
1600 cat >>e${EMULATION_NAME}.c <<EOF
1601 else if (!config.magic_demand_paged)
1602 return "ldscripts/${EMULATION_NAME}.xn";
1605 if test -n "$GENERATE_PIE_SCRIPT" ; then
1606 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1607 cat >>e${EMULATION_NAME}.c <<EOF
1608 else if (link_info.pie && link_info.combreloc
1609 && link_info.relro && (link_info.flags & DT_BIND_NOW))
1610 return "ldscripts/${EMULATION_NAME}.xdw";
1611 else if (link_info.pie && link_info.combreloc)
1612 return "ldscripts/${EMULATION_NAME}.xdc";
1615 cat >>e${EMULATION_NAME}.c <<EOF
1616 else if (link_info.pie)
1617 return "ldscripts/${EMULATION_NAME}.xd";
1620 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1621 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1622 cat >>e${EMULATION_NAME}.c <<EOF
1623 else if (link_info.shared && link_info.combreloc
1624 && link_info.relro && (link_info.flags & DT_BIND_NOW))
1625 return "ldscripts/${EMULATION_NAME}.xsw";
1626 else if (link_info.shared && link_info.combreloc)
1627 return "ldscripts/${EMULATION_NAME}.xsc";
1630 cat >>e${EMULATION_NAME}.c <<EOF
1631 else if (link_info.shared)
1632 return "ldscripts/${EMULATION_NAME}.xs";
1635 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1636 cat >>e${EMULATION_NAME}.c <<EOF
1637 else if (link_info.combreloc && link_info.relro
1638 && (link_info.flags & DT_BIND_NOW))
1639 return "ldscripts/${EMULATION_NAME}.xw";
1640 else if (link_info.combreloc)
1641 return "ldscripts/${EMULATION_NAME}.xc";
1644 cat >>e${EMULATION_NAME}.c <<EOF
1646 return "ldscripts/${EMULATION_NAME}.x";
1653 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1655 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1656 cat >>e${EMULATION_NAME}.c <<EOF
1657 $PARSE_AND_LIST_PROLOGUE
1661 cat >>e${EMULATION_NAME}.c <<EOF
1663 #define OPTION_DISABLE_NEW_DTAGS (400)
1664 #define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
1665 #define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
1666 #define OPTION_EH_FRAME_HDR (OPTION_GROUP + 1)
1667 #define OPTION_EXCLUDE_LIBS (OPTION_EH_FRAME_HDR + 1)
1670 gld${EMULATION_NAME}_add_options
1671 (int ns, char **shortopts, int nl, struct option **longopts,
1672 int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
1674 static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:";
1675 static const struct option xtra_long[] = {
1678 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1679 cat >>e${EMULATION_NAME}.c <<EOF
1680 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1681 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1682 {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
1683 {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
1684 {"Bgroup", no_argument, NULL, OPTION_GROUP},
1688 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
1689 cat >>e${EMULATION_NAME}.c <<EOF
1690 $PARSE_AND_LIST_LONGOPTS
1694 cat >>e${EMULATION_NAME}.c <<EOF
1695 {NULL, no_argument, NULL, 0}
1698 *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
1699 memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
1700 *longopts = (struct option *)
1701 xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
1702 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
1706 gld${EMULATION_NAME}_handle_option (int optc)
1715 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1716 cat >>e${EMULATION_NAME}.c <<EOF
1717 case OPTION_DISABLE_NEW_DTAGS:
1718 link_info.new_dtags = FALSE;
1721 case OPTION_ENABLE_NEW_DTAGS:
1722 link_info.new_dtags = TRUE;
1725 case OPTION_EH_FRAME_HDR:
1726 link_info.eh_frame_hdr = TRUE;
1730 link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
1731 /* Groups must be self-contained. */
1732 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
1733 link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
1736 case OPTION_EXCLUDE_LIBS:
1737 add_excluded_libs (optarg);
1741 if (strcmp (optarg, "initfirst") == 0)
1742 link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
1743 else if (strcmp (optarg, "interpose") == 0)
1744 link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
1745 else if (strcmp (optarg, "loadfltr") == 0)
1746 link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
1747 else if (strcmp (optarg, "nodefaultlib") == 0)
1748 link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
1749 else if (strcmp (optarg, "nodelete") == 0)
1750 link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
1751 else if (strcmp (optarg, "nodlopen") == 0)
1752 link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
1753 else if (strcmp (optarg, "nodump") == 0)
1754 link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
1755 else if (strcmp (optarg, "now") == 0)
1757 link_info.flags |= (bfd_vma) DF_BIND_NOW;
1758 link_info.flags_1 |= (bfd_vma) DF_1_NOW;
1760 else if (strcmp (optarg, "origin") == 0)
1762 link_info.flags |= (bfd_vma) DF_ORIGIN;
1763 link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
1765 else if (strcmp (optarg, "defs") == 0)
1766 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
1767 else if (strcmp (optarg, "muldefs") == 0)
1768 link_info.allow_multiple_definition = TRUE;
1769 else if (strcmp (optarg, "combreloc") == 0)
1770 link_info.combreloc = TRUE;
1771 else if (strcmp (optarg, "nocombreloc") == 0)
1772 link_info.combreloc = FALSE;
1773 else if (strcmp (optarg, "nocopyreloc") == 0)
1774 link_info.nocopyreloc = TRUE;
1775 else if (strcmp (optarg, "execstack") == 0)
1777 link_info.execstack = TRUE;
1778 link_info.noexecstack = FALSE;
1780 else if (strcmp (optarg, "noexecstack") == 0)
1782 link_info.noexecstack = TRUE;
1783 link_info.execstack = FALSE;
1785 else if (strcmp (optarg, "relro") == 0)
1786 link_info.relro = TRUE;
1787 else if (strcmp (optarg, "norelro") == 0)
1788 link_info.relro = FALSE;
1789 /* What about the other Solaris -z options? FIXME. */
1794 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
1795 cat >>e${EMULATION_NAME}.c <<EOF
1796 $PARSE_AND_LIST_ARGS_CASES
1800 cat >>e${EMULATION_NAME}.c <<EOF
1808 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1809 cat >>e${EMULATION_NAME}.c <<EOF
1812 gld${EMULATION_NAME}_list_options (FILE * file)
1816 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1817 cat >>e${EMULATION_NAME}.c <<EOF
1818 fprintf (file, _(" -Bgroup\t\tSelects group name lookup rules for DSO\n"));
1819 fprintf (file, _(" --disable-new-dtags\tDisable new dynamic tags\n"));
1820 fprintf (file, _(" --enable-new-dtags\tEnable new dynamic tags\n"));
1821 fprintf (file, _(" --eh-frame-hdr\tCreate .eh_frame_hdr section\n"));
1822 fprintf (file, _(" -z combreloc\t\tMerge dynamic relocs into one section and sort\n"));
1823 fprintf (file, _(" -z defs\t\tReport unresolved symbols in object files.\n"));
1824 fprintf (file, _(" -z execstack\t\tMark executable as requiring executable stack\n"));
1825 fprintf (file, _(" -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
1826 fprintf (file, _(" -z interpose\t\tMark object to interpose all DSOs but executable\n"));
1827 fprintf (file, _(" -z loadfltr\t\tMark object requiring immediate process\n"));
1828 fprintf (file, _(" -z muldefs\t\tAllow multiple definitions\n"));
1829 fprintf (file, _(" -z nocombreloc\tDon't merge dynamic relocs into one section\n"));
1830 fprintf (file, _(" -z nocopyreloc\tDon't create copy relocs\n"));
1831 fprintf (file, _(" -z nodefaultlib\tMark object not to use default search paths\n"));
1832 fprintf (file, _(" -z nodelete\t\tMark DSO non-deletable at runtime\n"));
1833 fprintf (file, _(" -z nodlopen\t\tMark DSO not available to dlopen\n"));
1834 fprintf (file, _(" -z nodump\t\tMark DSO not available to dldump\n"));
1835 fprintf (file, _(" -z noexecstack\tMark executable as not requiring executable stack\n"));
1836 fprintf (file, _(" -z norelro\t\tDon't create RELRO program header\n"));
1837 fprintf (file, _(" -z now\t\tMark object non-lazy runtime binding\n"));
1838 fprintf (file, _(" -z origin\t\tMark object requiring immediate \$ORIGIN processing\n\t\t\t at runtime\n"));
1839 fprintf (file, _(" -z relro\t\tCreate RELRO program header\n"));
1840 fprintf (file, _(" -z KEYWORD\t\tIgnored for Solaris compatibility\n"));
1844 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
1845 cat >>e${EMULATION_NAME}.c <<EOF
1846 $PARSE_AND_LIST_OPTIONS
1850 cat >>e${EMULATION_NAME}.c <<EOF
1854 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
1855 cat >>e${EMULATION_NAME}.c <<EOF
1856 $PARSE_AND_LIST_EPILOGUE
1861 cat >>e${EMULATION_NAME}.c <<EOF
1862 #define gld${EMULATION_NAME}_add_options NULL
1863 #define gld${EMULATION_NAME}_handle_option NULL
1865 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1866 cat >>e${EMULATION_NAME}.c <<EOF
1867 #define gld${EMULATION_NAME}_list_options NULL
1872 cat >>e${EMULATION_NAME}.c <<EOF
1874 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1876 ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
1877 ${LDEMUL_SYSLIB-syslib_default},
1878 ${LDEMUL_HLL-hll_default},
1879 ${LDEMUL_AFTER_PARSE-after_parse_default},
1880 ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
1881 ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
1882 ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
1883 ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
1884 ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
1885 ${LDEMUL_DO_ASSIGNMENTS-gld${EMULATION_NAME}_provide_init_fini_syms},
1886 ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
1887 "${EMULATION_NAME}",
1889 ${LDEMUL_FINISH-gld${EMULATION_NAME}_finish},
1890 ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
1891 ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
1892 ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
1893 ${LDEMUL_SET_SYMBOLS-NULL},
1894 ${LDEMUL_PARSE_ARGS-NULL},
1895 gld${EMULATION_NAME}_add_options,
1896 gld${EMULATION_NAME}_handle_option,
1897 ${LDEMUL_UNRECOGNIZED_FILE-NULL},
1898 ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
1899 ${LDEMUL_RECOGNIZED_FILE-gld${EMULATION_NAME}_load_symbols},
1900 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
1901 ${LDEMUL_NEW_VERS_PATTERN-NULL}