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 before_allocation_default ();
1174 if (!bfd_elf_size_dynsym_hash_dynstr (output_bfd, &link_info))
1175 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1181 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
1182 cat >>e${EMULATION_NAME}.c <<EOF
1184 /* Try to open a dynamic archive. This is where we know that ELF
1185 dynamic libraries have an extension of .so (or .sl on oddball systems
1189 gld${EMULATION_NAME}_open_dynamic_archive
1190 (const char *arch, search_dirs_type *search, lang_input_statement_type *entry)
1192 const char *filename;
1195 if (! entry->is_archive)
1198 filename = entry->filename;
1200 /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
1201 is defined, but it does not seem worth the headache to optimize
1202 away those two bytes of space. */
1203 string = (char *) xmalloc (strlen (search->name)
1206 #ifdef EXTRA_SHLIB_EXTENSION
1207 + strlen (EXTRA_SHLIB_EXTENSION)
1209 + sizeof "/lib.so");
1211 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
1213 #ifdef EXTRA_SHLIB_EXTENSION
1214 /* Try the .so extension first. If that fails build a new filename
1215 using EXTRA_SHLIB_EXTENSION. */
1216 if (! ldfile_try_open_bfd (string, entry))
1217 sprintf (string, "%s/lib%s%s%s", search->name,
1218 filename, arch, EXTRA_SHLIB_EXTENSION);
1221 if (! ldfile_try_open_bfd (string, entry))
1227 entry->filename = string;
1229 /* We have found a dynamic object to include in the link. The ELF
1230 backend linker will create a DT_NEEDED entry in the .dynamic
1231 section naming this file. If this file includes a DT_SONAME
1232 entry, it will be used. Otherwise, the ELF linker will just use
1233 the name of the file. For an archive found by searching, like
1234 this one, the DT_NEEDED entry should consist of just the name of
1235 the file, without the path information used to find it. Note
1236 that we only need to do this if we have a dynamic object; an
1237 archive will never be referenced by a DT_NEEDED entry.
1239 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
1240 very pretty. I haven't been able to think of anything that is
1242 if (bfd_check_format (entry->the_bfd, bfd_object)
1243 && (entry->the_bfd->flags & DYNAMIC) != 0)
1245 ASSERT (entry->is_archive && entry->search_dirs_flag);
1247 /* Rather than duplicating the logic above. Just use the
1248 filename we recorded earlier. */
1250 filename = lbasename (entry->filename);
1251 bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
1260 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
1261 cat >>e${EMULATION_NAME}.c <<EOF
1263 /* A variant of lang_output_section_find used by place_orphan. */
1265 static lang_output_section_statement_type *
1266 output_rel_find (asection *sec, int isdyn)
1268 lang_output_section_statement_type *lookup;
1269 lang_output_section_statement_type *last = NULL;
1270 lang_output_section_statement_type *last_alloc = NULL;
1271 lang_output_section_statement_type *last_rel = NULL;
1272 lang_output_section_statement_type *last_rel_alloc = NULL;
1273 int rela = sec->name[4] == 'a';
1275 for (lookup = &lang_output_section_statement.head->output_section_statement;
1277 lookup = lookup->next)
1279 if (lookup->constraint != -1
1280 && strncmp (".rel", lookup->name, 4) == 0)
1282 int lookrela = lookup->name[4] == 'a';
1284 /* .rel.dyn must come before all other reloc sections, to suit
1289 /* Don't place after .rel.plt as doing so results in wrong
1291 if (strcmp (".plt", lookup->name + 4 + lookrela) == 0)
1294 if (rela == lookrela || last_rel == NULL)
1296 if ((rela == lookrela || last_rel_alloc == NULL)
1297 && lookup->bfd_section != NULL
1298 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1299 last_rel_alloc = lookup;
1303 if (lookup->bfd_section != NULL
1304 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1305 last_alloc = lookup;
1309 return last_rel_alloc;
1320 /* Place an orphan section. We use this to put random SHF_ALLOC
1321 sections in the right segment. */
1324 gld${EMULATION_NAME}_place_orphan (lang_input_statement_type *file, asection *s)
1326 static struct orphan_save hold[] =
1329 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1332 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1335 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1341 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1344 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1347 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_SMALL_DATA,
1350 enum orphan_save_index
1360 static int orphan_init_done = 0;
1361 struct orphan_save *place;
1362 const char *secname;
1363 lang_output_section_statement_type *after;
1364 lang_output_section_statement_type *os;
1367 secname = bfd_get_section_name (s->owner, s);
1369 if (! link_info.relocatable
1370 && link_info.combreloc
1371 && (s->flags & SEC_ALLOC)
1372 && strncmp (secname, ".rel", 4) == 0)
1374 if (secname[4] == 'a')
1375 secname = ".rela.dyn";
1377 secname = ".rel.dyn";
1381 if (isdyn || (!config.unique_orphan_sections && !unique_section_p (s)))
1383 /* Look through the script to see where to place this section. */
1384 os = lang_output_section_find (secname);
1387 && (os->bfd_section == NULL
1388 || os->bfd_section->flags == 0
1389 || ((s->flags ^ os->bfd_section->flags)
1390 & (SEC_LOAD | SEC_ALLOC)) == 0))
1392 /* We already have an output section statement with this
1393 name, and its bfd section, if any, has compatible flags.
1394 If the section already exists but does not have any flags
1395 set, then it has been created by the linker, probably as a
1396 result of a --section-start command line switch. */
1397 lang_add_section (&os->children, s, os, file);
1402 if (!orphan_init_done)
1404 struct orphan_save *ho;
1405 for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
1406 if (ho->name != NULL)
1408 ho->os = lang_output_section_find (ho->name);
1409 if (ho->os != NULL && ho->os->flags == 0)
1410 ho->os->flags = ho->flags;
1412 orphan_init_done = 1;
1415 /* If this is a final link, then always put .gnu.warning.SYMBOL
1416 sections into the .text section to get them out of the way. */
1417 if (link_info.executable
1418 && ! link_info.relocatable
1419 && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
1420 && hold[orphan_text].os != NULL)
1422 lang_add_section (&hold[orphan_text].os->children, s,
1423 hold[orphan_text].os, file);
1427 /* Decide which segment the section should go in based on the
1428 section name and section flags. We put loadable .note sections
1429 right after the .interp section, so that the PT_NOTE segment is
1430 stored right after the program headers where the OS can read it
1431 in the first page. */
1434 if ((s->flags & SEC_ALLOC) == 0)
1436 else if ((s->flags & SEC_LOAD) != 0
1437 && strncmp (secname, ".note", 5) == 0)
1438 place = &hold[orphan_interp];
1439 else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
1440 place = &hold[orphan_bss];
1441 else if ((s->flags & SEC_SMALL_DATA) != 0)
1442 place = &hold[orphan_sdata];
1443 else if ((s->flags & SEC_READONLY) == 0)
1444 place = &hold[orphan_data];
1445 else if (strncmp (secname, ".rel", 4) == 0
1446 && (s->flags & SEC_LOAD) != 0)
1447 place = &hold[orphan_rel];
1448 else if ((s->flags & SEC_CODE) == 0)
1449 place = &hold[orphan_rodata];
1451 place = &hold[orphan_text];
1456 if (place->os == NULL)
1458 if (place->name != NULL)
1459 place->os = lang_output_section_find (place->name);
1461 place->os = output_rel_find (s, isdyn);
1465 after = lang_output_section_find_by_flags (s, &place->os);
1467 /* *ABS* is always the first output section statement. */
1468 after = &lang_output_section_statement.head->output_section_statement;
1471 /* Choose a unique name for the section. This will be needed if the
1472 same section name appears in the input file with different
1473 loadable or allocatable characteristics. */
1474 if (bfd_get_section_by_name (output_bfd, secname) != NULL)
1476 static int count = 1;
1477 secname = bfd_get_unique_section_name (output_bfd, secname, &count);
1478 if (secname == NULL)
1479 einfo ("%F%P: place_orphan failed: %E\n");
1482 lang_insert_orphan (file, s, secname, after, place, NULL, NULL);
1489 if test x"$LDEMUL_FINISH" != xgld"$EMULATION_NAME"_finish; then
1490 cat >>e${EMULATION_NAME}.c <<EOF
1493 gld${EMULATION_NAME}_layout_sections_again (void)
1495 lang_reset_memory_regions ();
1497 /* Resize the sections. */
1498 lang_size_sections (NULL, TRUE);
1500 /* Redo special stuff. */
1501 ldemul_after_allocation ();
1503 /* Do the assignments again. */
1504 lang_do_assignments ();
1508 gld${EMULATION_NAME}_finish (void)
1510 if (bfd_elf_discard_info (output_bfd, &link_info))
1511 gld${EMULATION_NAME}_layout_sections_again ();
1518 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1519 cat >>e${EMULATION_NAME}.c <<EOF
1522 gld${EMULATION_NAME}_get_script (int *isfile)
1525 if test -n "$COMPILE_IN"
1527 # Scripts compiled in.
1529 # sed commands to quote an ld script as a C string.
1530 sc="-f stringify.sed"
1532 cat >>e${EMULATION_NAME}.c <<EOF
1536 if (link_info.relocatable && config.build_constructors)
1539 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1540 echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c
1541 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1542 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1543 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1544 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
1545 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1546 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1548 if test -n "$GENERATE_PIE_SCRIPT" ; then
1549 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1550 echo ' ; else if (link_info.pie && link_info.combreloc' >> e${EMULATION_NAME}.c
1551 echo ' && link_info.relro' >> e${EMULATION_NAME}.c
1552 echo ' && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1553 sed $sc ldscripts/${EMULATION_NAME}.xdw >> e${EMULATION_NAME}.c
1554 echo ' ; else if (link_info.pie && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1555 sed $sc ldscripts/${EMULATION_NAME}.xdc >> e${EMULATION_NAME}.c
1557 echo ' ; else if (link_info.pie) return' >> e${EMULATION_NAME}.c
1558 sed $sc ldscripts/${EMULATION_NAME}.xd >> e${EMULATION_NAME}.c
1560 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1561 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1562 echo ' ; else if (link_info.shared && link_info.combreloc' >> e${EMULATION_NAME}.c
1563 echo ' && link_info.relro' >> e${EMULATION_NAME}.c
1564 echo ' && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1565 sed $sc ldscripts/${EMULATION_NAME}.xsw >> e${EMULATION_NAME}.c
1566 echo ' ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1567 sed $sc ldscripts/${EMULATION_NAME}.xsc >> e${EMULATION_NAME}.c
1569 echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c
1570 sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
1572 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1573 echo ' ; else if (link_info.combreloc && link_info.relro' >> e${EMULATION_NAME}.c
1574 echo ' && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1575 sed $sc ldscripts/${EMULATION_NAME}.xw >> e${EMULATION_NAME}.c
1576 echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c
1577 sed $sc ldscripts/${EMULATION_NAME}.xc >> e${EMULATION_NAME}.c
1579 echo ' ; else return' >> e${EMULATION_NAME}.c
1580 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1581 echo '; }' >> e${EMULATION_NAME}.c
1584 # Scripts read from the filesystem.
1586 cat >>e${EMULATION_NAME}.c <<EOF
1590 if (link_info.relocatable && config.build_constructors)
1591 return "ldscripts/${EMULATION_NAME}.xu";
1592 else if (link_info.relocatable)
1593 return "ldscripts/${EMULATION_NAME}.xr";
1594 else if (!config.text_read_only)
1595 return "ldscripts/${EMULATION_NAME}.xbn";
1597 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
1599 cat >>e${EMULATION_NAME}.c <<EOF
1600 else if (!config.magic_demand_paged)
1601 return "ldscripts/${EMULATION_NAME}.xn";
1604 if test -n "$GENERATE_PIE_SCRIPT" ; then
1605 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1606 cat >>e${EMULATION_NAME}.c <<EOF
1607 else if (link_info.pie && link_info.combreloc
1608 && link_info.relro && (link_info.flags & DT_BIND_NOW))
1609 return "ldscripts/${EMULATION_NAME}.xdw";
1610 else if (link_info.pie && link_info.combreloc)
1611 return "ldscripts/${EMULATION_NAME}.xdc";
1614 cat >>e${EMULATION_NAME}.c <<EOF
1615 else if (link_info.pie)
1616 return "ldscripts/${EMULATION_NAME}.xd";
1619 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1620 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1621 cat >>e${EMULATION_NAME}.c <<EOF
1622 else if (link_info.shared && link_info.combreloc
1623 && link_info.relro && (link_info.flags & DT_BIND_NOW))
1624 return "ldscripts/${EMULATION_NAME}.xsw";
1625 else if (link_info.shared && link_info.combreloc)
1626 return "ldscripts/${EMULATION_NAME}.xsc";
1629 cat >>e${EMULATION_NAME}.c <<EOF
1630 else if (link_info.shared)
1631 return "ldscripts/${EMULATION_NAME}.xs";
1634 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1635 cat >>e${EMULATION_NAME}.c <<EOF
1636 else if (link_info.combreloc && link_info.relro
1637 && (link_info.flags & DT_BIND_NOW))
1638 return "ldscripts/${EMULATION_NAME}.xw";
1639 else if (link_info.combreloc)
1640 return "ldscripts/${EMULATION_NAME}.xc";
1643 cat >>e${EMULATION_NAME}.c <<EOF
1645 return "ldscripts/${EMULATION_NAME}.x";
1652 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1654 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1655 cat >>e${EMULATION_NAME}.c <<EOF
1656 $PARSE_AND_LIST_PROLOGUE
1660 cat >>e${EMULATION_NAME}.c <<EOF
1662 #define OPTION_DISABLE_NEW_DTAGS (400)
1663 #define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
1664 #define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
1665 #define OPTION_EH_FRAME_HDR (OPTION_GROUP + 1)
1666 #define OPTION_EXCLUDE_LIBS (OPTION_EH_FRAME_HDR + 1)
1669 gld${EMULATION_NAME}_add_options
1670 (int ns, char **shortopts, int nl, struct option **longopts,
1671 int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
1673 static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:";
1674 static const struct option xtra_long[] = {
1677 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1678 cat >>e${EMULATION_NAME}.c <<EOF
1679 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1680 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1681 {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
1682 {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
1683 {"Bgroup", no_argument, NULL, OPTION_GROUP},
1687 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
1688 cat >>e${EMULATION_NAME}.c <<EOF
1689 $PARSE_AND_LIST_LONGOPTS
1693 cat >>e${EMULATION_NAME}.c <<EOF
1694 {NULL, no_argument, NULL, 0}
1697 *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
1698 memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
1699 *longopts = (struct option *)
1700 xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
1701 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
1705 gld${EMULATION_NAME}_handle_option (int optc)
1714 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1715 cat >>e${EMULATION_NAME}.c <<EOF
1716 case OPTION_DISABLE_NEW_DTAGS:
1717 link_info.new_dtags = FALSE;
1720 case OPTION_ENABLE_NEW_DTAGS:
1721 link_info.new_dtags = TRUE;
1724 case OPTION_EH_FRAME_HDR:
1725 link_info.eh_frame_hdr = TRUE;
1729 link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
1730 /* Groups must be self-contained. */
1731 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
1732 link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
1735 case OPTION_EXCLUDE_LIBS:
1736 add_excluded_libs (optarg);
1740 if (strcmp (optarg, "initfirst") == 0)
1741 link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
1742 else if (strcmp (optarg, "interpose") == 0)
1743 link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
1744 else if (strcmp (optarg, "loadfltr") == 0)
1745 link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
1746 else if (strcmp (optarg, "nodefaultlib") == 0)
1747 link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
1748 else if (strcmp (optarg, "nodelete") == 0)
1749 link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
1750 else if (strcmp (optarg, "nodlopen") == 0)
1751 link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
1752 else if (strcmp (optarg, "nodump") == 0)
1753 link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
1754 else if (strcmp (optarg, "now") == 0)
1756 link_info.flags |= (bfd_vma) DF_BIND_NOW;
1757 link_info.flags_1 |= (bfd_vma) DF_1_NOW;
1759 else if (strcmp (optarg, "origin") == 0)
1761 link_info.flags |= (bfd_vma) DF_ORIGIN;
1762 link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
1764 else if (strcmp (optarg, "defs") == 0)
1765 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
1766 else if (strcmp (optarg, "muldefs") == 0)
1767 link_info.allow_multiple_definition = TRUE;
1768 else if (strcmp (optarg, "combreloc") == 0)
1769 link_info.combreloc = TRUE;
1770 else if (strcmp (optarg, "nocombreloc") == 0)
1771 link_info.combreloc = FALSE;
1772 else if (strcmp (optarg, "nocopyreloc") == 0)
1773 link_info.nocopyreloc = TRUE;
1774 else if (strcmp (optarg, "execstack") == 0)
1776 link_info.execstack = TRUE;
1777 link_info.noexecstack = FALSE;
1779 else if (strcmp (optarg, "noexecstack") == 0)
1781 link_info.noexecstack = TRUE;
1782 link_info.execstack = FALSE;
1784 else if (strcmp (optarg, "relro") == 0)
1785 link_info.relro = TRUE;
1786 else if (strcmp (optarg, "norelro") == 0)
1787 link_info.relro = FALSE;
1788 /* What about the other Solaris -z options? FIXME. */
1793 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
1794 cat >>e${EMULATION_NAME}.c <<EOF
1795 $PARSE_AND_LIST_ARGS_CASES
1799 cat >>e${EMULATION_NAME}.c <<EOF
1807 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1808 cat >>e${EMULATION_NAME}.c <<EOF
1811 gld${EMULATION_NAME}_list_options (FILE * file)
1815 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1816 cat >>e${EMULATION_NAME}.c <<EOF
1817 fprintf (file, _(" -Bgroup\t\tSelects group name lookup rules for DSO\n"));
1818 fprintf (file, _(" --disable-new-dtags\tDisable new dynamic tags\n"));
1819 fprintf (file, _(" --enable-new-dtags\tEnable new dynamic tags\n"));
1820 fprintf (file, _(" --eh-frame-hdr\tCreate .eh_frame_hdr section\n"));
1821 fprintf (file, _(" -z combreloc\t\tMerge dynamic relocs into one section and sort\n"));
1822 fprintf (file, _(" -z defs\t\tReport unresolved symbols in object files.\n"));
1823 fprintf (file, _(" -z execstack\t\tMark executable as requiring executable stack\n"));
1824 fprintf (file, _(" -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
1825 fprintf (file, _(" -z interpose\t\tMark object to interpose all DSOs but executable\n"));
1826 fprintf (file, _(" -z loadfltr\t\tMark object requiring immediate process\n"));
1827 fprintf (file, _(" -z muldefs\t\tAllow multiple definitions\n"));
1828 fprintf (file, _(" -z nocombreloc\tDon't merge dynamic relocs into one section\n"));
1829 fprintf (file, _(" -z nocopyreloc\tDon't create copy relocs\n"));
1830 fprintf (file, _(" -z nodefaultlib\tMark object not to use default search paths\n"));
1831 fprintf (file, _(" -z nodelete\t\tMark DSO non-deletable at runtime\n"));
1832 fprintf (file, _(" -z nodlopen\t\tMark DSO not available to dlopen\n"));
1833 fprintf (file, _(" -z nodump\t\tMark DSO not available to dldump\n"));
1834 fprintf (file, _(" -z noexecstack\tMark executable as not requiring executable stack\n"));
1835 fprintf (file, _(" -z norelro\t\tDon't create RELRO program header\n"));
1836 fprintf (file, _(" -z now\t\tMark object non-lazy runtime binding\n"));
1837 fprintf (file, _(" -z origin\t\tMark object requiring immediate \$ORIGIN processing\n\t\t\t at runtime\n"));
1838 fprintf (file, _(" -z relro\t\tCreate RELRO program header\n"));
1839 fprintf (file, _(" -z KEYWORD\t\tIgnored for Solaris compatibility\n"));
1843 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
1844 cat >>e${EMULATION_NAME}.c <<EOF
1845 $PARSE_AND_LIST_OPTIONS
1849 cat >>e${EMULATION_NAME}.c <<EOF
1853 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
1854 cat >>e${EMULATION_NAME}.c <<EOF
1855 $PARSE_AND_LIST_EPILOGUE
1860 cat >>e${EMULATION_NAME}.c <<EOF
1861 #define gld${EMULATION_NAME}_add_options NULL
1862 #define gld${EMULATION_NAME}_handle_option NULL
1864 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1865 cat >>e${EMULATION_NAME}.c <<EOF
1866 #define gld${EMULATION_NAME}_list_options NULL
1871 cat >>e${EMULATION_NAME}.c <<EOF
1873 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1875 ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
1876 ${LDEMUL_SYSLIB-syslib_default},
1877 ${LDEMUL_HLL-hll_default},
1878 ${LDEMUL_AFTER_PARSE-after_parse_default},
1879 ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
1880 ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
1881 ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
1882 ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
1883 ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
1884 ${LDEMUL_DO_ASSIGNMENTS-gld${EMULATION_NAME}_provide_init_fini_syms},
1885 ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
1886 "${EMULATION_NAME}",
1888 ${LDEMUL_FINISH-gld${EMULATION_NAME}_finish},
1889 ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
1890 ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
1891 ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
1892 ${LDEMUL_SET_SYMBOLS-NULL},
1893 ${LDEMUL_PARSE_ARGS-NULL},
1894 gld${EMULATION_NAME}_add_options,
1895 gld${EMULATION_NAME}_handle_option,
1896 ${LDEMUL_UNRECOGNIZED_FILE-NULL},
1897 ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
1898 ${LDEMUL_RECOGNIZED_FILE-gld${EMULATION_NAME}_load_symbols},
1899 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
1900 ${LDEMUL_NEW_VERS_PATTERN-NULL}