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}_before_allocation (void);
61 static bfd_boolean gld${EMULATION_NAME}_place_orphan
62 (lang_input_statement_type *file, asection *s);
63 static void gld${EMULATION_NAME}_layout_sections_again (void);
64 static void gld${EMULATION_NAME}_finish (void) ATTRIBUTE_UNUSED;
68 if [ "x${USE_LIBPATH}" = xyes ] ; then
70 *-*-linux-* | *-*-k*bsd*-*)
71 cat >>e${EMULATION_NAME}.c <<EOF
80 # Import any needed special functions and/or overrides.
82 if test -n "$EXTRA_EM_FILE" ; then
83 . ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
86 # Functions in this file can be overridden by setting the LDEMUL_* shell
87 # variables. If the name of the overriding function is the same as is
88 # defined in this file, then don't output this file's version.
89 # If a different overriding name is given then output the standard function
90 # as presumably it is called from the overriding function.
92 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
93 cat >>e${EMULATION_NAME}.c <<EOF
96 gld${EMULATION_NAME}_before_parse (void)
98 ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
99 config.dynamic_link = ${DYNAMIC_LINK-TRUE};
100 config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
106 if test x"$LDEMUL_RECOGNIZED_FILE" != xgld"${EMULATION_NAME}"_load_symbols; then
107 cat >>e${EMULATION_NAME}.c <<EOF
108 /* Handle as_needed DT_NEEDED. */
111 gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *entry)
115 /* Tell the ELF linker that we don't want the output file to have a
116 DT_NEEDED entry for this file, unless it is used to resolve
117 references in a regular object. */
118 if (entry->as_needed)
119 class = DYN_AS_NEEDED;
121 /* Tell the ELF linker that we don't want the output file to have a
122 DT_NEEDED entry for any dynamic library in DT_NEEDED tags from
124 if (!entry->add_needed)
125 class |= DYN_NO_ADD_NEEDED;
128 || (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) == 0)
131 bfd_elf_set_dyn_lib_class (entry->the_bfd, class);
133 /* Continue on with normal load_symbols processing. */
139 cat >>e${EMULATION_NAME}.c <<EOF
141 /* These variables are required to pass information back and forth
142 between after_open and check_needed and stat_needed and vercheck. */
144 static struct bfd_link_needed_list *global_needed;
145 static struct stat global_stat;
146 static bfd_boolean global_found;
147 static struct bfd_link_needed_list *global_vercheck_needed;
148 static bfd_boolean global_vercheck_failed;
151 /* On Linux, it's possible to have different versions of the same
152 shared library linked against different versions of libc. The
153 dynamic linker somehow tags which libc version to use in
154 /etc/ld.so.cache, and, based on the libc that it sees in the
155 executable, chooses which version of the shared library to use.
157 We try to do a similar check here by checking whether this shared
158 library needs any other shared libraries which may conflict with
159 libraries we have already included in the link. If it does, we
160 skip it, and try to find another shared library farther on down the
163 This is called via lang_for_each_input_file.
164 GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
165 which we are checking. This sets GLOBAL_VERCHECK_FAILED if we find
166 a conflicting version. */
169 gld${EMULATION_NAME}_vercheck (lang_input_statement_type *s)
172 struct bfd_link_needed_list *l;
174 if (global_vercheck_failed)
176 if (s->the_bfd == NULL
177 || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
180 soname = bfd_elf_get_dt_soname (s->the_bfd);
182 soname = lbasename (bfd_get_filename (s->the_bfd));
184 for (l = global_vercheck_needed; l != NULL; l = l->next)
188 if (strcmp (soname, l->name) == 0)
190 /* Probably can't happen, but it's an easy check. */
194 if (strchr (l->name, '/') != NULL)
197 suffix = strstr (l->name, ".so.");
201 suffix += sizeof ".so." - 1;
203 if (strncmp (soname, l->name, suffix - l->name) == 0)
205 /* Here we know that S is a dynamic object FOO.SO.VER1, and
206 the object we are considering needs a dynamic object
207 FOO.SO.VER2, and VER1 and VER2 are different. This
208 appears to be a version mismatch, so we tell the caller
209 to try a different version of this library. */
210 global_vercheck_failed = TRUE;
217 /* See if an input file matches a DT_NEEDED entry by running stat on
221 gld${EMULATION_NAME}_stat_needed (lang_input_statement_type *s)
229 if (s->the_bfd == NULL)
232 && (bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0)
235 if (bfd_stat (s->the_bfd, &st) != 0)
237 einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
241 /* Some operating systems, e.g. Windows, do not provide a meaningful
242 st_ino; they always set it to zero. (Windows does provide a
243 meaningful st_dev.) Do not indicate a duplicate library in that
244 case. While there is no guarantee that a system that provides
245 meaningful inode numbers will never set st_ino to zero, this is
246 merely an optimization, so we do not need to worry about false
248 if (st.st_dev == global_stat.st_dev
249 && st.st_ino == global_stat.st_ino
256 /* We issue a warning if it looks like we are including two
257 different versions of the same shared library. For example,
258 there may be a problem if -lc picks up libc.so.6 but some other
259 shared library has a DT_NEEDED entry of libc.so.5. This is a
260 heuristic test, and it will only work if the name looks like
261 NAME.so.VERSION. FIXME: Depending on file names is error-prone.
262 If we really want to issue warnings about mixing version numbers
263 of shared libraries, we need to find a better way. */
265 if (strchr (global_needed->name, '/') != NULL)
267 suffix = strstr (global_needed->name, ".so.");
270 suffix += sizeof ".so." - 1;
272 soname = bfd_elf_get_dt_soname (s->the_bfd);
274 soname = lbasename (s->filename);
276 if (strncmp (soname, global_needed->name, suffix - global_needed->name) == 0)
277 einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
278 global_needed->name, global_needed->by, soname);
287 /* This function is called for each possible name for a dynamic object
288 named by a DT_NEEDED entry. The FORCE parameter indicates whether
289 to skip the check for a conflicting version. */
292 gld${EMULATION_NAME}_try_needed (struct dt_needed *needed,
296 const char *name = needed->name;
300 abfd = bfd_openr (name, bfd_get_target (output_bfd));
303 if (! bfd_check_format (abfd, bfd_object))
308 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
314 /* For DT_NEEDED, they have to match. */
315 if (abfd->xvec != output_bfd->xvec)
321 /* Check whether this object would include any conflicting library
322 versions. If FORCE is set, then we skip this check; we use this
323 the second time around, if we couldn't find any compatible
324 instance of the shared library. */
328 struct bfd_link_needed_list *needed;
330 if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
331 einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
335 global_vercheck_needed = needed;
336 global_vercheck_failed = FALSE;
337 lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
338 if (global_vercheck_failed)
341 /* Return FALSE to force the caller to move on to try
342 another file on the search path. */
346 /* But wait! It gets much worse. On Linux, if a shared
347 library does not use libc at all, we are supposed to skip
348 it the first time around in case we encounter a shared
349 library later on with the same name which does use the
350 version of libc that we want. This is much too horrible
351 to use on any system other than Linux. */
355 *-*-linux-* | *-*-k*bsd*-*)
356 cat >>e${EMULATION_NAME}.c <<EOF
358 struct bfd_link_needed_list *l;
360 for (l = needed; l != NULL; l = l->next)
361 if (strncmp (l->name, "libc.so", 7) == 0)
373 cat >>e${EMULATION_NAME}.c <<EOF
377 /* We've found a dynamic object matching the DT_NEEDED entry. */
379 /* We have already checked that there is no other input file of the
380 same name. We must now check again that we are not including the
381 same file twice. We need to do this because on many systems
382 libc.so is a symlink to, e.g., libc.so.1. The SONAME entry will
383 reference libc.so.1. If we have already included libc.so, we
384 don't want to include libc.so.1 if they are the same file, and we
385 can only check that using stat. */
387 if (bfd_stat (abfd, &global_stat) != 0)
388 einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
390 /* First strip off everything before the last '/'. */
391 soname = lbasename (abfd->filename);
393 if (trace_file_tries)
394 info_msg (_("found %s at %s\n"), soname, name);
396 global_found = FALSE;
397 lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
400 /* Return TRUE to indicate that we found the file, even though
401 we aren't going to do anything with it. */
405 /* Specify the soname to use. */
406 bfd_elf_set_dt_needed_name (abfd, soname);
408 /* Tell the ELF linker that we don't want the output file to have a
409 DT_NEEDED entry for this file, unless it is used to resolve
410 references in a regular object. */
411 class = DYN_DT_NEEDED;
413 /* Tell the ELF linker that we don't want the output file to have a
414 DT_NEEDED entry for this file at all if the entry is from a file
415 with DYN_NO_ADD_NEEDED. */
416 if (needed->by != NULL
417 && (bfd_elf_get_dyn_lib_class (needed->by) & DYN_NO_ADD_NEEDED) != 0)
418 class |= DYN_NO_NEEDED | DYN_NO_ADD_NEEDED;
420 bfd_elf_set_dyn_lib_class (abfd, class);
422 /* Add this file into the symbol table. */
423 if (! bfd_link_add_symbols (abfd, &link_info))
424 einfo ("%F%B: could not read symbols: %E\n", abfd);
430 /* Search for a needed file in a path. */
433 gld${EMULATION_NAME}_search_needed (const char *path,
434 struct dt_needed *n, int force)
437 const char *name = n->name;
439 struct dt_needed needed;
442 return gld${EMULATION_NAME}_try_needed (n, force);
444 if (path == NULL || *path == '\0')
448 needed.name = n->name;
453 char *filename, *sset;
455 s = strchr (path, ':');
457 s = path + strlen (path);
459 filename = (char *) xmalloc (s - path + len + 2);
464 memcpy (filename, path, s - path);
465 filename[s - path] = '/';
466 sset = filename + (s - path) + 1;
470 needed.name = filename;
471 if (gld${EMULATION_NAME}_try_needed (&needed, force))
485 if [ "x${USE_LIBPATH}" = xyes ] ; then
486 cat >>e${EMULATION_NAME}.c <<EOF
488 /* Add the sysroot to every entry in a colon-separated path. */
491 gld${EMULATION_NAME}_add_sysroot (const char *path)
500 if (path[i++] == ':')
506 len = len + (colons + 1) * strlen (ld_sysroot);
507 ret = xmalloc (len + 1);
508 strcpy (ret, ld_sysroot);
509 p = ret + strlen (ret);
515 strcpy (p, ld_sysroot);
527 *-*-linux-* | *-*-k*bsd*-*)
528 cat >>e${EMULATION_NAME}.c <<EOF
529 /* For a native linker, check the file /etc/ld.so.conf for directories
530 in which we may find shared libraries. /etc/ld.so.conf is really
531 only meaningful on Linux. */
533 struct gld${EMULATION_NAME}_ld_so_conf
540 gld${EMULATION_NAME}_parse_ld_so_conf
541 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename);
544 gld${EMULATION_NAME}_parse_ld_so_conf_include
545 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename,
553 if (pattern[0] != '/')
555 char *p = strrchr (filename, '/');
556 size_t patlen = strlen (pattern) + 1;
558 newp = xmalloc (p - filename + 1 + patlen);
559 memcpy (newp, filename, p - filename + 1);
560 memcpy (newp + (p - filename + 1), pattern, patlen);
565 if (glob (pattern, 0, NULL, &gl) == 0)
569 for (i = 0; i < gl.gl_pathc; ++i)
570 gld${EMULATION_NAME}_parse_ld_so_conf (info, gl.gl_pathv[i]);
574 /* If we do not have glob, treat the pattern as a literal filename. */
575 gld${EMULATION_NAME}_parse_ld_so_conf (info, pattern);
583 gld${EMULATION_NAME}_parse_ld_so_conf
584 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename)
586 FILE *f = fopen (filename, FOPEN_RT);
594 line = xmalloc (linelen);
599 /* Normally this would use getline(3), but we need to be portable. */
600 while ((q = fgets (p, linelen - (p - line), f)) != NULL
601 && strlen (q) == linelen - (p - line) - 1
602 && line[linelen - 2] != '\n')
604 line = xrealloc (line, 2 * linelen);
605 p = line + linelen - 1;
609 if (q == NULL && p == line)
612 p = strchr (line, '\n');
616 /* Because the file format does not know any form of quoting we
617 can search forward for the next '#' character and if found
618 make it terminating the line. */
619 p = strchr (line, '#');
623 /* Remove leading whitespace. NUL is no whitespace character. */
625 while (*p == ' ' || *p == '\f' || *p == '\r' || *p == '\t' || *p == '\v')
628 /* If the line is blank it is ignored. */
632 if (!strncmp (p, "include", 7) && (p[7] == ' ' || p[7] == '\t'))
638 while (*p == ' ' || *p == '\t')
646 while (*p != ' ' && *p != '\t' && *p)
652 gld${EMULATION_NAME}_parse_ld_so_conf_include (info, filename,
660 while (*p && *p != '=' && *p != ' ' && *p != '\t' && *p != '\f'
661 && *p != '\r' && *p != '\v')
664 while (p != dir && p[-1] == '/')
666 if (info->path == NULL)
668 info->alloc = p - dir + 1 + 256;
669 info->path = xmalloc (info->alloc);
674 if (info->len + 1 + (p - dir) >= info->alloc)
676 info->alloc += p - dir + 256;
677 info->path = xrealloc (info->path, info->alloc);
679 info->path[info->len++] = ':';
681 memcpy (info->path + info->len, dir, p - dir);
682 info->len += p - dir;
683 info->path[info->len] = '\0';
692 gld${EMULATION_NAME}_check_ld_so_conf (const char *name, int force)
694 static bfd_boolean initialized;
695 static char *ld_so_conf;
696 struct dt_needed needed;
701 struct gld${EMULATION_NAME}_ld_so_conf info;
703 tmppath = concat (ld_sysroot, "/etc/ld.so.conf", NULL);
705 info.len = info.alloc = 0;
706 gld${EMULATION_NAME}_parse_ld_so_conf (&info, tmppath);
710 char *d = gld${EMULATION_NAME}_add_sysroot (info.path);
717 if (ld_so_conf == NULL)
723 return gld${EMULATION_NAME}_search_needed (ld_so_conf, &needed, force);
731 cat >>e${EMULATION_NAME}.c <<EOF
733 /* See if an input file matches a DT_NEEDED entry by name. */
736 gld${EMULATION_NAME}_check_needed (lang_input_statement_type *s)
741 /* If this input file was an as-needed entry, and wasn't found to be
742 needed at the stage it was linked, then don't say we have loaded it. */
744 && (s->the_bfd == NULL
745 || (bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0))
748 if (s->filename != NULL)
752 if (strcmp (s->filename, global_needed->name) == 0)
758 if (s->search_dirs_flag)
760 f = strrchr (s->filename, '/');
762 && strcmp (f + 1, global_needed->name) == 0)
770 if (s->the_bfd != NULL)
774 soname = bfd_elf_get_dt_soname (s->the_bfd);
776 && strcmp (soname, global_needed->name) == 0)
786 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
787 cat >>e${EMULATION_NAME}.c <<EOF
789 /* This is called after all the input files have been opened. */
792 gld${EMULATION_NAME}_after_open (void)
794 struct bfd_link_needed_list *needed, *l;
796 /* We only need to worry about this when doing a final link. */
797 if (link_info.relocatable || !link_info.executable)
800 /* Get the list of files which appear in DT_NEEDED entries in
801 dynamic objects included in the link (often there will be none).
802 For each such file, we want to track down the corresponding
803 library, and include the symbol table in the link. This is what
804 the runtime dynamic linker will do. Tracking the files down here
805 permits one dynamic object to include another without requiring
806 special action by the person doing the link. Note that the
807 needed list can actually grow while we are stepping through this
809 needed = bfd_elf_get_needed_list (output_bfd, &link_info);
810 for (l = needed; l != NULL; l = l->next)
812 struct bfd_link_needed_list *ll;
813 struct dt_needed n, nn;
816 /* If the lib that needs this one was --as-needed and wasn't
817 found to be needed, then this lib isn't needed either. */
819 && (bfd_elf_get_dyn_lib_class (l->by) & DYN_AS_NEEDED) != 0)
822 /* If we've already seen this file, skip it. */
823 for (ll = needed; ll != l; ll = ll->next)
825 || (bfd_elf_get_dyn_lib_class (ll->by) & DYN_AS_NEEDED) == 0)
826 && strcmp (ll->name, l->name) == 0)
831 /* See if this file was included in the link explicitly. */
833 global_found = FALSE;
834 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
841 if (trace_file_tries)
842 info_msg (_("%s needed by %B\n"), l->name, l->by);
844 /* We need to find this file and include the symbol table. We
845 want to search for the file in the same way that the dynamic
846 linker will search. That means that we want to use
847 rpath_link, rpath, then the environment variable
848 LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
849 entries (native only), then the linker script LIB_SEARCH_DIRS.
850 We do not search using the -L arguments.
852 We search twice. The first time, we skip objects which may
853 introduce version mismatches. The second time, we force
854 their use. See gld${EMULATION_NAME}_vercheck comment. */
855 for (force = 0; force < 2; force++)
858 search_dirs_type *search;
860 if [ "x${NATIVE}" = xyes ] ; then
861 cat >>e${EMULATION_NAME}.c <<EOF
862 const char *lib_path;
865 if [ "x${USE_LIBPATH}" = xyes ] ; then
866 cat >>e${EMULATION_NAME}.c <<EOF
867 struct bfd_link_needed_list *rp;
871 cat >>e${EMULATION_NAME}.c <<EOF
873 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
877 if [ "x${USE_LIBPATH}" = xyes ] ; then
878 cat >>e${EMULATION_NAME}.c <<EOF
879 if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
884 if [ "x${NATIVE}" = xyes ] ; then
885 cat >>e${EMULATION_NAME}.c <<EOF
886 if (command_line.rpath_link == NULL
887 && command_line.rpath == NULL)
889 lib_path = (const char *) getenv ("LD_RUN_PATH");
890 if (gld${EMULATION_NAME}_search_needed (lib_path, &n,
894 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
895 if (gld${EMULATION_NAME}_search_needed (lib_path, &n, force))
899 if [ "x${USE_LIBPATH}" = xyes ] ; then
900 cat >>e${EMULATION_NAME}.c <<EOF
902 rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
903 for (; !found && rp != NULL; rp = rp->next)
905 char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
906 found = (rp->by == l->by
907 && gld${EMULATION_NAME}_search_needed (tmpname,
917 cat >>e${EMULATION_NAME}.c <<EOF
918 len = strlen (l->name);
919 for (search = search_head; search != NULL; search = search->next)
925 filename = (char *) xmalloc (strlen (search->name) + len + 2);
926 sprintf (filename, "%s/%s", search->name, l->name);
928 if (gld${EMULATION_NAME}_try_needed (&nn, force))
935 if [ "x${USE_LIBPATH}" = xyes ] ; then
937 *-*-linux-* | *-*-k*bsd*-*)
938 cat >>e${EMULATION_NAME}.c <<EOF
939 if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
946 cat >>e${EMULATION_NAME}.c <<EOF
952 einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
960 cat >>e${EMULATION_NAME}.c <<EOF
962 /* Look through an expression for an assignment statement. */
965 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
967 bfd_boolean provide = FALSE;
969 switch (exp->type.node_class)
975 /* We call record_link_assignment even if the symbol is defined.
976 This is because if it is defined by a dynamic object, we
977 actually want to use the value defined by the linker script,
978 not the value from the dynamic object (because we are setting
979 symbols like etext). If the symbol is defined by a regular
980 object, then, as it happens, calling record_link_assignment
982 if (strcmp (exp->assign.dst, ".") != 0)
984 if (!bfd_elf_record_link_assignment (&link_info, exp->assign.dst,
986 einfo ("%P%F: failed to record assignment to %s: %E\n",
989 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
993 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
994 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
998 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
999 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1000 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1004 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1013 /* This is called by the before_allocation routine via
1014 lang_for_each_statement. It locates any assignment statements, and
1015 tells the ELF backend about them, in case they are assignments to
1016 symbols which are referred to by dynamic objects. */
1019 gld${EMULATION_NAME}_find_statement_assignment (lang_statement_union_type *s)
1021 if (s->header.type == lang_assignment_statement_enum)
1022 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1027 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
1028 if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
1029 ELF_INTERPRETER_SET_DEFAULT="
1030 if (sinterp != NULL)
1032 sinterp->contents = (unsigned char *) ${ELF_INTERPRETER_NAME};
1033 sinterp->size = strlen ((char *) sinterp->contents) + 1;
1038 ELF_INTERPRETER_SET_DEFAULT=
1040 cat >>e${EMULATION_NAME}.c <<EOF
1043 gld${EMULATION_NAME}_provide_bound_symbols (const char *sec,
1047 asection *s = bfd_get_section_by_name (output_bfd, sec);
1048 _bfd_elf_provide_section_bound_symbols (&link_info, s, start, end);
1051 /* If not building a shared library, provide
1053 __preinit_array_start
1060 They are set here rather than via PROVIDE in the linker
1061 script, because using PROVIDE inside an output section
1062 statement results in unnecessary output sections. Using
1063 PROVIDE outside an output section statement runs the risk of
1064 section alignment affecting where the section starts. */
1067 gld${EMULATION_NAME}_provide_init_fini_syms (void)
1069 if (!link_info.relocatable && link_info.executable)
1071 gld${EMULATION_NAME}_provide_bound_symbols (".preinit_array",
1072 "__preinit_array_start",
1073 "__preinit_array_end");
1074 gld${EMULATION_NAME}_provide_bound_symbols (".init_array",
1075 "__init_array_start",
1076 "__init_array_end");
1077 gld${EMULATION_NAME}_provide_bound_symbols (".fini_array",
1078 "__fini_array_start",
1079 "__fini_array_end");
1083 /* This is called after the sections have been attached to output
1084 sections, but before any sizes or addresses have been set. */
1087 gld${EMULATION_NAME}_before_allocation (void)
1092 if (link_info.hash->type == bfd_link_elf_hash_table)
1093 _bfd_elf_tls_setup (output_bfd, &link_info);
1095 /* If we are going to make any variable assignments, we need to let
1096 the ELF backend know about them in case the variables are
1097 referred to by dynamic objects. */
1098 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
1100 gld${EMULATION_NAME}_provide_init_fini_syms ();
1102 /* Let the ELF backend work out the sizes of any sections required
1103 by dynamic linking. */
1104 rpath = command_line.rpath;
1106 rpath = (const char *) getenv ("LD_RUN_PATH");
1107 if (! (bfd_elf_size_dynamic_sections
1108 (output_bfd, command_line.soname, rpath,
1109 command_line.filter_shlib,
1110 (const char * const *) command_line.auxiliary_filters,
1111 &link_info, &sinterp, lang_elf_version_info)))
1112 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1114 ${ELF_INTERPRETER_SET_DEFAULT}
1115 /* Let the user override the dynamic linker we are using. */
1116 if (command_line.interpreter != NULL
1119 sinterp->contents = (bfd_byte *) command_line.interpreter;
1120 sinterp->size = strlen (command_line.interpreter) + 1;
1123 /* Look for any sections named .gnu.warning. As a GNU extensions,
1124 we treat such sections as containing warning messages. We print
1125 out the warning message, and then zero out the section size so
1126 that it does not get copied into the output file. */
1129 LANG_FOR_EACH_INPUT_STATEMENT (is)
1133 bfd_size_type prefix_len;
1136 const char * gnu_warning_prefix = _("warning: ");
1138 if (is->just_syms_flag)
1141 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
1146 prefix_len = strlen (gnu_warning_prefix);
1147 msg = xmalloc ((size_t) (prefix_len + sz + 1));
1148 strcpy (msg, gnu_warning_prefix);
1149 if (! bfd_get_section_contents (is->the_bfd, s, msg + prefix_len,
1151 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
1153 msg[prefix_len + sz] = '\0';
1154 ret = link_info.callbacks->warning (&link_info, msg,
1155 (const char *) NULL,
1156 is->the_bfd, (asection *) NULL,
1161 /* Clobber the section size, so that we don't waste copying the
1162 warning into the output file. */
1165 /* Also set SEC_EXCLUDE, so that symbols defined in the warning
1166 section don't get copied to the output. */
1167 s->flags |= SEC_EXCLUDE;
1171 if (!link_info.relocatable)
1172 strip_excluded_output_sections ();
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 ();
1513 _bfd_elf_fix_excluded_sec_syms (output_bfd, &link_info);
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}