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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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}_strip_empty_sections (void);
65 static void gld${EMULATION_NAME}_provide_init_fini_syms (void);
66 static void gld${EMULATION_NAME}_finish (void) ATTRIBUTE_UNUSED;
70 if [ "x${USE_LIBPATH}" = xyes ] ; then
73 cat >>e${EMULATION_NAME}.c <<EOF
82 # Import any needed special functions and/or overrides.
84 if test -n "$EXTRA_EM_FILE" ; then
85 . ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
88 # Functions in this file can be overridden by setting the LDEMUL_* shell
89 # variables. If the name of the overriding function is the same as is
90 # defined in this file, then don't output this file's version.
91 # If a different overriding name is given then output the standard function
92 # as presumably it is called from the overriding function.
94 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
95 cat >>e${EMULATION_NAME}.c <<EOF
98 gld${EMULATION_NAME}_before_parse (void)
100 ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
101 config.dynamic_link = ${DYNAMIC_LINK-TRUE};
102 config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
108 if test x"$LDEMUL_RECOGNIZED_FILE" != xgld"${EMULATION_NAME}"_load_symbols; then
109 cat >>e${EMULATION_NAME}.c <<EOF
110 /* Handle as_needed DT_NEEDED. */
113 gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *entry)
117 /* Tell the ELF linker that we don't want the output file to have a
118 DT_NEEDED entry for this file, unless it is used to resolve
119 references in a regular object. */
120 if (entry->as_needed)
121 class = DYN_AS_NEEDED;
123 /* Tell the ELF linker that we don't want the output file to have a
124 DT_NEEDED entry for any dynamic library in DT_NEEDED tags from
126 if (!entry->add_needed)
127 class |= DYN_NO_ADD_NEEDED;
130 || (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) == 0)
133 bfd_elf_set_dyn_lib_class (entry->the_bfd, class);
135 /* Continue on with normal load_symbols processing. */
141 cat >>e${EMULATION_NAME}.c <<EOF
143 /* These variables are required to pass information back and forth
144 between after_open and check_needed and stat_needed and vercheck. */
146 static struct bfd_link_needed_list *global_needed;
147 static struct stat global_stat;
148 static bfd_boolean global_found;
149 static struct bfd_link_needed_list *global_vercheck_needed;
150 static bfd_boolean global_vercheck_failed;
153 /* On Linux, it's possible to have different versions of the same
154 shared library linked against different versions of libc. The
155 dynamic linker somehow tags which libc version to use in
156 /etc/ld.so.cache, and, based on the libc that it sees in the
157 executable, chooses which version of the shared library to use.
159 We try to do a similar check here by checking whether this shared
160 library needs any other shared libraries which may conflict with
161 libraries we have already included in the link. If it does, we
162 skip it, and try to find another shared library farther on down the
165 This is called via lang_for_each_input_file.
166 GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
167 which we are checking. This sets GLOBAL_VERCHECK_FAILED if we find
168 a conflicting version. */
171 gld${EMULATION_NAME}_vercheck (lang_input_statement_type *s)
174 struct bfd_link_needed_list *l;
176 if (global_vercheck_failed)
178 if (s->the_bfd == NULL
179 || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
182 soname = bfd_elf_get_dt_soname (s->the_bfd);
184 soname = lbasename (bfd_get_filename (s->the_bfd));
186 for (l = global_vercheck_needed; l != NULL; l = l->next)
190 if (strcmp (soname, l->name) == 0)
192 /* Probably can't happen, but it's an easy check. */
196 if (strchr (l->name, '/') != NULL)
199 suffix = strstr (l->name, ".so.");
203 suffix += sizeof ".so." - 1;
205 if (strncmp (soname, l->name, suffix - l->name) == 0)
207 /* Here we know that S is a dynamic object FOO.SO.VER1, and
208 the object we are considering needs a dynamic object
209 FOO.SO.VER2, and VER1 and VER2 are different. This
210 appears to be a version mismatch, so we tell the caller
211 to try a different version of this library. */
212 global_vercheck_failed = TRUE;
219 /* See if an input file matches a DT_NEEDED entry by running stat on
223 gld${EMULATION_NAME}_stat_needed (lang_input_statement_type *s)
231 if (s->the_bfd == NULL)
234 if (bfd_stat (s->the_bfd, &st) != 0)
236 einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
240 /* Some operating systems, e.g. Windows, do not provide a meaningful
241 st_ino; they always set it to zero. (Windows does provide a
242 meaningful st_dev.) Do not indicate a duplicate library in that
243 case. While there is no guarantee that a system that provides
244 meaningful inode numbers will never set st_ino to zero, this is
245 merely an optimization, so we do not need to worry about false
247 if (st.st_dev == global_stat.st_dev
248 && st.st_ino == global_stat.st_ino
255 /* We issue a warning if it looks like we are including two
256 different versions of the same shared library. For example,
257 there may be a problem if -lc picks up libc.so.6 but some other
258 shared library has a DT_NEEDED entry of libc.so.5. This is a
259 heuristic test, and it will only work if the name looks like
260 NAME.so.VERSION. FIXME: Depending on file names is error-prone.
261 If we really want to issue warnings about mixing version numbers
262 of shared libraries, we need to find a better way. */
264 if (strchr (global_needed->name, '/') != NULL)
266 suffix = strstr (global_needed->name, ".so.");
269 suffix += sizeof ".so." - 1;
271 soname = bfd_elf_get_dt_soname (s->the_bfd);
273 soname = lbasename (s->filename);
275 if (strncmp (soname, global_needed->name, suffix - global_needed->name) == 0)
276 einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
277 global_needed->name, global_needed->by, soname);
286 /* This function is called for each possible name for a dynamic object
287 named by a DT_NEEDED entry. The FORCE parameter indicates whether
288 to skip the check for a conflicting version. */
291 gld${EMULATION_NAME}_try_needed (struct dt_needed *needed,
295 const char *name = needed->name;
299 abfd = bfd_openr (name, bfd_get_target (output_bfd));
302 if (! bfd_check_format (abfd, bfd_object))
307 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
313 /* For DT_NEEDED, they have to match. */
314 if (abfd->xvec != output_bfd->xvec)
320 /* Check whether this object would include any conflicting library
321 versions. If FORCE is set, then we skip this check; we use this
322 the second time around, if we couldn't find any compatible
323 instance of the shared library. */
327 struct bfd_link_needed_list *needed;
329 if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
330 einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
334 global_vercheck_needed = needed;
335 global_vercheck_failed = FALSE;
336 lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
337 if (global_vercheck_failed)
340 /* Return FALSE to force the caller to move on to try
341 another file on the search path. */
345 /* But wait! It gets much worse. On Linux, if a shared
346 library does not use libc at all, we are supposed to skip
347 it the first time around in case we encounter a shared
348 library later on with the same name which does use the
349 version of libc that we want. This is much too horrible
350 to use on any system other than Linux. */
355 cat >>e${EMULATION_NAME}.c <<EOF
357 struct bfd_link_needed_list *l;
359 for (l = needed; l != NULL; l = l->next)
360 if (strncmp (l->name, "libc.so", 7) == 0)
372 cat >>e${EMULATION_NAME}.c <<EOF
376 /* We've found a dynamic object matching the DT_NEEDED entry. */
378 /* We have already checked that there is no other input file of the
379 same name. We must now check again that we are not including the
380 same file twice. We need to do this because on many systems
381 libc.so is a symlink to, e.g., libc.so.1. The SONAME entry will
382 reference libc.so.1. If we have already included libc.so, we
383 don't want to include libc.so.1 if they are the same file, and we
384 can only check that using stat. */
386 if (bfd_stat (abfd, &global_stat) != 0)
387 einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
389 /* First strip off everything before the last '/'. */
390 soname = lbasename (abfd->filename);
392 if (trace_file_tries)
393 info_msg (_("found %s at %s\n"), soname, name);
395 global_found = FALSE;
396 lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
399 /* Return TRUE to indicate that we found the file, even though
400 we aren't going to do anything with it. */
404 /* Specify the soname to use. */
405 bfd_elf_set_dt_needed_name (abfd, soname);
407 /* Tell the ELF linker that we don't want the output file to have a
408 DT_NEEDED entry for this file, unless it is used to resolve
409 references in a regular object. */
410 class = DYN_DT_NEEDED;
412 /* Tell the ELF linker that we don't want the output file to have a
413 DT_NEEDED entry for this file at all if the entry is from a file
414 with DYN_NO_ADD_NEEDED. */
415 if (needed->by != NULL
416 && (bfd_elf_get_dyn_lib_class (needed->by) & DYN_NO_ADD_NEEDED) != 0)
417 class |= DYN_NO_NEEDED | DYN_NO_ADD_NEEDED;
419 bfd_elf_set_dyn_lib_class (abfd, class);
421 /* Add this file into the symbol table. */
422 if (! bfd_link_add_symbols (abfd, &link_info))
423 einfo ("%F%B: could not read symbols: %E\n", abfd);
429 /* Search for a needed file in a path. */
432 gld${EMULATION_NAME}_search_needed (const char *path,
433 struct dt_needed *n, int force)
436 const char *name = n->name;
438 struct dt_needed needed;
441 return gld${EMULATION_NAME}_try_needed (n, force);
443 if (path == NULL || *path == '\0')
447 needed.name = n->name;
452 char *filename, *sset;
454 s = strchr (path, ':');
456 s = path + strlen (path);
458 filename = (char *) xmalloc (s - path + len + 2);
463 memcpy (filename, path, s - path);
464 filename[s - path] = '/';
465 sset = filename + (s - path) + 1;
469 needed.name = filename;
470 if (gld${EMULATION_NAME}_try_needed (&needed, force))
484 if [ "x${USE_LIBPATH}" = xyes ] ; then
485 cat >>e${EMULATION_NAME}.c <<EOF
487 /* Add the sysroot to every entry in a colon-separated path. */
490 gld${EMULATION_NAME}_add_sysroot (const char *path)
499 if (path[i++] == ':')
505 len = len + (colons + 1) * strlen (ld_sysroot);
506 ret = xmalloc (len + 1);
507 strcpy (ret, ld_sysroot);
508 p = ret + strlen (ret);
514 strcpy (p, ld_sysroot);
527 cat >>e${EMULATION_NAME}.c <<EOF
528 /* For a native linker, check the file /etc/ld.so.conf for directories
529 in which we may find shared libraries. /etc/ld.so.conf is really
530 only meaningful on Linux. */
532 struct gld${EMULATION_NAME}_ld_so_conf
539 gld${EMULATION_NAME}_parse_ld_so_conf
540 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename);
543 gld${EMULATION_NAME}_parse_ld_so_conf_include
544 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename,
552 if (pattern[0] != '/')
554 char *p = strrchr (filename, '/');
555 size_t patlen = strlen (pattern) + 1;
557 newp = xmalloc (p - filename + 1 + patlen);
558 memcpy (newp, filename, p - filename + 1);
559 memcpy (newp + (p - filename + 1), pattern, patlen);
564 if (glob (pattern, 0, NULL, &gl) == 0)
568 for (i = 0; i < gl.gl_pathc; ++i)
569 gld${EMULATION_NAME}_parse_ld_so_conf (info, gl.gl_pathv[i]);
573 /* If we do not have glob, treat the pattern as a literal filename. */
574 gld${EMULATION_NAME}_parse_ld_so_conf (info, pattern);
582 gld${EMULATION_NAME}_parse_ld_so_conf
583 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename)
585 FILE *f = fopen (filename, FOPEN_RT);
593 line = xmalloc (linelen);
598 /* Normally this would use getline(3), but we need to be portable. */
599 while ((q = fgets (p, linelen - (p - line), f)) != NULL
600 && strlen (q) == linelen - (p - line) - 1
601 && line[linelen - 2] != '\n')
603 line = xrealloc (line, 2 * linelen);
604 p = line + linelen - 1;
608 if (q == NULL && p == line)
611 p = strchr (line, '\n');
615 /* Because the file format does not know any form of quoting we
616 can search forward for the next '#' character and if found
617 make it terminating the line. */
618 p = strchr (line, '#');
622 /* Remove leading whitespace. NUL is no whitespace character. */
624 while (*p == ' ' || *p == '\f' || *p == '\r' || *p == '\t' || *p == '\v')
627 /* If the line is blank it is ignored. */
631 if (!strncmp (p, "include", 7) && (p[7] == ' ' || p[7] == '\t'))
637 while (*p == ' ' || *p == '\t')
645 while (*p != ' ' && *p != '\t' && *p)
651 gld${EMULATION_NAME}_parse_ld_so_conf_include (info, filename,
659 while (*p && *p != '=' && *p != ' ' && *p != '\t' && *p != '\f'
660 && *p != '\r' && *p != '\v')
663 while (p != dir && p[-1] == '/')
665 if (info->path == NULL)
667 info->alloc = p - dir + 1 + 256;
668 info->path = xmalloc (info->alloc);
673 if (info->len + 1 + (p - dir) >= info->alloc)
675 info->alloc += p - dir + 256;
676 info->path = xrealloc (info->path, info->alloc);
678 info->path[info->len++] = ':';
680 memcpy (info->path + info->len, dir, p - dir);
681 info->len += p - dir;
682 info->path[info->len] = '\0';
691 gld${EMULATION_NAME}_check_ld_so_conf (const char *name, int force)
693 static bfd_boolean initialized;
694 static char *ld_so_conf;
695 struct dt_needed needed;
700 struct gld${EMULATION_NAME}_ld_so_conf info;
702 tmppath = concat (ld_sysroot, "/etc/ld.so.conf", NULL);
704 info.len = info.alloc = 0;
705 gld${EMULATION_NAME}_parse_ld_so_conf (&info, tmppath);
709 char *d = gld${EMULATION_NAME}_add_sysroot (info.path);
716 if (ld_so_conf == NULL)
722 return gld${EMULATION_NAME}_search_needed (ld_so_conf, &needed, force);
730 cat >>e${EMULATION_NAME}.c <<EOF
732 /* See if an input file matches a DT_NEEDED entry by name. */
735 gld${EMULATION_NAME}_check_needed (lang_input_statement_type *s)
740 if (s->filename != NULL)
744 if (strcmp (s->filename, global_needed->name) == 0)
750 if (s->search_dirs_flag)
752 f = strrchr (s->filename, '/');
754 && strcmp (f + 1, global_needed->name) == 0)
762 if (s->the_bfd != NULL)
766 soname = bfd_elf_get_dt_soname (s->the_bfd);
768 && strcmp (soname, global_needed->name) == 0)
778 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
779 cat >>e${EMULATION_NAME}.c <<EOF
781 /* This is called after all the input files have been opened. */
784 gld${EMULATION_NAME}_after_open (void)
786 struct bfd_link_needed_list *needed, *l;
788 /* We only need to worry about this when doing a final link. */
789 if (link_info.relocatable || !link_info.executable)
792 /* Get the list of files which appear in DT_NEEDED entries in
793 dynamic objects included in the link (often there will be none).
794 For each such file, we want to track down the corresponding
795 library, and include the symbol table in the link. This is what
796 the runtime dynamic linker will do. Tracking the files down here
797 permits one dynamic object to include another without requiring
798 special action by the person doing the link. Note that the
799 needed list can actually grow while we are stepping through this
801 needed = bfd_elf_get_needed_list (output_bfd, &link_info);
802 for (l = needed; l != NULL; l = l->next)
804 struct bfd_link_needed_list *ll;
805 struct dt_needed n, nn;
808 /* If the lib that needs this one was --as-needed and wasn't
809 found to be needed, then this lib isn't needed either. */
811 && (bfd_elf_get_dyn_lib_class (l->by) & DYN_AS_NEEDED) != 0)
814 /* If we've already seen this file, skip it. */
815 for (ll = needed; ll != l; ll = ll->next)
817 || (bfd_elf_get_dyn_lib_class (ll->by) & DYN_AS_NEEDED) == 0)
818 && strcmp (ll->name, l->name) == 0)
823 /* See if this file was included in the link explicitly. */
825 global_found = FALSE;
826 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
833 if (trace_file_tries)
834 info_msg (_("%s needed by %B\n"), l->name, l->by);
836 /* We need to find this file and include the symbol table. We
837 want to search for the file in the same way that the dynamic
838 linker will search. That means that we want to use
839 rpath_link, rpath, then the environment variable
840 LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
841 entries (native only), then the linker script LIB_SEARCH_DIRS.
842 We do not search using the -L arguments.
844 We search twice. The first time, we skip objects which may
845 introduce version mismatches. The second time, we force
846 their use. See gld${EMULATION_NAME}_vercheck comment. */
847 for (force = 0; force < 2; force++)
850 search_dirs_type *search;
852 if [ "x${NATIVE}" = xyes ] ; then
853 cat >>e${EMULATION_NAME}.c <<EOF
854 const char *lib_path;
857 if [ "x${USE_LIBPATH}" = xyes ] ; then
858 cat >>e${EMULATION_NAME}.c <<EOF
859 struct bfd_link_needed_list *rp;
863 cat >>e${EMULATION_NAME}.c <<EOF
865 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
869 if [ "x${USE_LIBPATH}" = xyes ] ; then
870 cat >>e${EMULATION_NAME}.c <<EOF
871 if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
876 if [ "x${NATIVE}" = xyes ] ; then
877 cat >>e${EMULATION_NAME}.c <<EOF
878 if (command_line.rpath_link == NULL
879 && command_line.rpath == NULL)
881 lib_path = (const char *) getenv ("LD_RUN_PATH");
882 if (gld${EMULATION_NAME}_search_needed (lib_path, &n,
886 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
887 if (gld${EMULATION_NAME}_search_needed (lib_path, &n, force))
891 if [ "x${USE_LIBPATH}" = xyes ] ; then
892 cat >>e${EMULATION_NAME}.c <<EOF
894 rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
895 for (; !found && rp != NULL; rp = rp->next)
897 char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
898 found = (rp->by == l->by
899 && gld${EMULATION_NAME}_search_needed (tmpname,
909 cat >>e${EMULATION_NAME}.c <<EOF
910 len = strlen (l->name);
911 for (search = search_head; search != NULL; search = search->next)
917 filename = (char *) xmalloc (strlen (search->name) + len + 2);
918 sprintf (filename, "%s/%s", search->name, l->name);
920 if (gld${EMULATION_NAME}_try_needed (&nn, force))
927 if [ "x${USE_LIBPATH}" = xyes ] ; then
930 cat >>e${EMULATION_NAME}.c <<EOF
931 if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
938 cat >>e${EMULATION_NAME}.c <<EOF
944 einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
952 cat >>e${EMULATION_NAME}.c <<EOF
954 /* Look through an expression for an assignment statement. */
957 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
959 bfd_boolean provide = FALSE;
961 switch (exp->type.node_class)
967 /* We call record_link_assignment even if the symbol is defined.
968 This is because if it is defined by a dynamic object, we
969 actually want to use the value defined by the linker script,
970 not the value from the dynamic object (because we are setting
971 symbols like etext). If the symbol is defined by a regular
972 object, then, as it happens, calling record_link_assignment
974 if (strcmp (exp->assign.dst, ".") != 0)
976 if (!bfd_elf_record_link_assignment (output_bfd, &link_info,
977 exp->assign.dst, provide))
978 einfo ("%P%F: failed to record assignment to %s: %E\n",
981 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
985 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
986 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
990 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
991 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
992 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
996 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1005 /* This is called by the before_allocation routine via
1006 lang_for_each_statement. It locates any assignment statements, and
1007 tells the ELF backend about them, in case they are assignments to
1008 symbols which are referred to by dynamic objects. */
1011 gld${EMULATION_NAME}_find_statement_assignment (lang_statement_union_type *s)
1013 if (s->header.type == lang_assignment_statement_enum)
1014 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1019 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
1020 if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
1021 ELF_INTERPRETER_SET_DEFAULT="
1022 if (sinterp != NULL)
1024 sinterp->contents = (unsigned char *) ${ELF_INTERPRETER_NAME};
1025 sinterp->size = strlen ((char *) sinterp->contents) + 1;
1030 ELF_INTERPRETER_SET_DEFAULT=
1032 cat >>e${EMULATION_NAME}.c <<EOF
1034 /* This is called after the sections have been attached to output
1035 sections, but before any sizes or addresses have been set. */
1038 gld${EMULATION_NAME}_before_allocation (void)
1043 if (link_info.hash->type == bfd_link_elf_hash_table)
1044 _bfd_elf_tls_setup (output_bfd, &link_info);
1046 /* If we are going to make any variable assignments, we need to let
1047 the ELF backend know about them in case the variables are
1048 referred to by dynamic objects. */
1049 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
1051 /* Let the ELF backend work out the sizes of any sections required
1052 by dynamic linking. */
1053 rpath = command_line.rpath;
1055 rpath = (const char *) getenv ("LD_RUN_PATH");
1056 if (! (bfd_elf_size_dynamic_sections
1057 (output_bfd, command_line.soname, rpath,
1058 command_line.filter_shlib,
1059 (const char * const *) command_line.auxiliary_filters,
1060 &link_info, &sinterp, lang_elf_version_info)))
1061 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1062 ${ELF_INTERPRETER_SET_DEFAULT}
1063 /* Let the user override the dynamic linker we are using. */
1064 if (command_line.interpreter != NULL
1067 sinterp->contents = (bfd_byte *) command_line.interpreter;
1068 sinterp->size = strlen (command_line.interpreter) + 1;
1071 /* Look for any sections named .gnu.warning. As a GNU extensions,
1072 we treat such sections as containing warning messages. We print
1073 out the warning message, and then zero out the section size so
1074 that it does not get copied into the output file. */
1077 LANG_FOR_EACH_INPUT_STATEMENT (is)
1081 bfd_size_type prefix_len;
1084 const char * gnu_warning_prefix = _("warning: ");
1086 if (is->just_syms_flag)
1089 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
1094 prefix_len = strlen (gnu_warning_prefix);
1095 msg = xmalloc ((size_t) (prefix_len + sz + 1));
1096 strcpy (msg, gnu_warning_prefix);
1097 if (! bfd_get_section_contents (is->the_bfd, s, msg + prefix_len,
1099 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
1101 msg[prefix_len + sz] = '\0';
1102 ret = link_info.callbacks->warning (&link_info, msg,
1103 (const char *) NULL,
1104 is->the_bfd, (asection *) NULL,
1109 /* Clobber the section size, so that we don't waste copying the
1110 warning into the output file. */
1113 /* Also set SEC_EXCLUDE, so that symbols defined in the warning
1114 section don't get copied to the output. */
1115 s->flags |= SEC_EXCLUDE;
1123 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
1124 cat >>e${EMULATION_NAME}.c <<EOF
1126 /* Try to open a dynamic archive. This is where we know that ELF
1127 dynamic libraries have an extension of .so (or .sl on oddball systems
1131 gld${EMULATION_NAME}_open_dynamic_archive
1132 (const char *arch, search_dirs_type *search, lang_input_statement_type *entry)
1134 const char *filename;
1137 if (! entry->is_archive)
1140 filename = entry->filename;
1142 /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
1143 is defined, but it does not seem worth the headache to optimize
1144 away those two bytes of space. */
1145 string = (char *) xmalloc (strlen (search->name)
1148 #ifdef EXTRA_SHLIB_EXTENSION
1149 + strlen (EXTRA_SHLIB_EXTENSION)
1151 + sizeof "/lib.so");
1153 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
1155 #ifdef EXTRA_SHLIB_EXTENSION
1156 /* Try the .so extension first. If that fails build a new filename
1157 using EXTRA_SHLIB_EXTENSION. */
1158 if (! ldfile_try_open_bfd (string, entry))
1159 sprintf (string, "%s/lib%s%s%s", search->name,
1160 filename, arch, EXTRA_SHLIB_EXTENSION);
1163 if (! ldfile_try_open_bfd (string, entry))
1169 entry->filename = string;
1171 /* We have found a dynamic object to include in the link. The ELF
1172 backend linker will create a DT_NEEDED entry in the .dynamic
1173 section naming this file. If this file includes a DT_SONAME
1174 entry, it will be used. Otherwise, the ELF linker will just use
1175 the name of the file. For an archive found by searching, like
1176 this one, the DT_NEEDED entry should consist of just the name of
1177 the file, without the path information used to find it. Note
1178 that we only need to do this if we have a dynamic object; an
1179 archive will never be referenced by a DT_NEEDED entry.
1181 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
1182 very pretty. I haven't been able to think of anything that is
1184 if (bfd_check_format (entry->the_bfd, bfd_object)
1185 && (entry->the_bfd->flags & DYNAMIC) != 0)
1187 ASSERT (entry->is_archive && entry->search_dirs_flag);
1189 /* Rather than duplicating the logic above. Just use the
1190 filename we recorded earlier. */
1192 filename = lbasename (entry->filename);
1193 bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
1202 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
1203 cat >>e${EMULATION_NAME}.c <<EOF
1205 /* A variant of lang_output_section_find used by place_orphan. */
1207 static lang_output_section_statement_type *
1208 output_rel_find (asection *sec, int isdyn)
1210 lang_output_section_statement_type *lookup;
1211 lang_output_section_statement_type *last = NULL;
1212 lang_output_section_statement_type *last_alloc = NULL;
1213 lang_output_section_statement_type *last_rel = NULL;
1214 lang_output_section_statement_type *last_rel_alloc = NULL;
1215 int rela = sec->name[4] == 'a';
1217 for (lookup = &lang_output_section_statement.head->output_section_statement;
1219 lookup = lookup->next)
1221 if (lookup->constraint != -1
1222 && strncmp (".rel", lookup->name, 4) == 0)
1224 int lookrela = lookup->name[4] == 'a';
1226 /* .rel.dyn must come before all other reloc sections, to suit
1231 /* Don't place after .rel.plt as doing so results in wrong
1233 if (strcmp (".plt", lookup->name + 4 + lookrela) == 0)
1236 if (rela == lookrela || last_rel == NULL)
1238 if ((rela == lookrela || last_rel_alloc == NULL)
1239 && lookup->bfd_section != NULL
1240 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1241 last_rel_alloc = lookup;
1245 if (lookup->bfd_section != NULL
1246 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1247 last_alloc = lookup;
1251 return last_rel_alloc;
1262 /* Place an orphan section. We use this to put random SHF_ALLOC
1263 sections in the right segment. */
1266 gld${EMULATION_NAME}_place_orphan (lang_input_statement_type *file, asection *s)
1268 static struct orphan_save hold[] =
1271 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1274 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1277 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1283 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1286 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1289 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_SMALL_DATA,
1292 enum orphan_save_index
1302 static int orphan_init_done = 0;
1303 struct orphan_save *place;
1304 const char *secname;
1305 lang_output_section_statement_type *after;
1306 lang_output_section_statement_type *os;
1309 secname = bfd_get_section_name (s->owner, s);
1311 if (! link_info.relocatable
1312 && link_info.combreloc
1313 && (s->flags & SEC_ALLOC)
1314 && strncmp (secname, ".rel", 4) == 0)
1316 if (secname[4] == 'a')
1317 secname = ".rela.dyn";
1319 secname = ".rel.dyn";
1323 if (isdyn || (!config.unique_orphan_sections && !unique_section_p (s)))
1325 /* Look through the script to see where to place this section. */
1326 os = lang_output_section_find (secname);
1329 && (os->bfd_section == NULL
1330 || os->bfd_section->flags == 0
1331 || ((s->flags ^ os->bfd_section->flags)
1332 & (SEC_LOAD | SEC_ALLOC)) == 0))
1334 /* We already have an output section statement with this
1335 name, and its bfd section, if any, has compatible flags.
1336 If the section already exists but does not have any flags
1337 set, then it has been created by the linker, probably as a
1338 result of a --section-start command line switch. */
1339 lang_add_section (&os->children, s, os, file);
1344 if (!orphan_init_done)
1346 struct orphan_save *ho;
1347 for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
1348 if (ho->name != NULL)
1350 ho->os = lang_output_section_find (ho->name);
1351 if (ho->os != NULL && ho->os->flags == 0)
1352 ho->os->flags = ho->flags;
1354 orphan_init_done = 1;
1357 /* If this is a final link, then always put .gnu.warning.SYMBOL
1358 sections into the .text section to get them out of the way. */
1359 if (link_info.executable
1360 && ! link_info.relocatable
1361 && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
1362 && hold[orphan_text].os != NULL)
1364 lang_add_section (&hold[orphan_text].os->children, s,
1365 hold[orphan_text].os, file);
1369 /* Decide which segment the section should go in based on the
1370 section name and section flags. We put loadable .note sections
1371 right after the .interp section, so that the PT_NOTE segment is
1372 stored right after the program headers where the OS can read it
1373 in the first page. */
1376 if ((s->flags & SEC_ALLOC) == 0)
1378 else if ((s->flags & SEC_LOAD) != 0
1379 && strncmp (secname, ".note", 5) == 0)
1380 place = &hold[orphan_interp];
1381 else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
1382 place = &hold[orphan_bss];
1383 else if ((s->flags & SEC_SMALL_DATA) != 0)
1384 place = &hold[orphan_sdata];
1385 else if ((s->flags & SEC_READONLY) == 0)
1386 place = &hold[orphan_data];
1387 else if (strncmp (secname, ".rel", 4) == 0
1388 && (s->flags & SEC_LOAD) != 0)
1389 place = &hold[orphan_rel];
1390 else if ((s->flags & SEC_CODE) == 0)
1391 place = &hold[orphan_rodata];
1393 place = &hold[orphan_text];
1398 if (place->os == NULL)
1400 if (place->name != NULL)
1401 place->os = lang_output_section_find (place->name);
1403 place->os = output_rel_find (s, isdyn);
1407 after = lang_output_section_find_by_flags (s, &place->os);
1409 /* *ABS* is always the first output section statement. */
1410 after = &lang_output_section_statement.head->output_section_statement;
1413 /* Choose a unique name for the section. This will be needed if the
1414 same section name appears in the input file with different
1415 loadable or allocatable characteristics. */
1416 if (bfd_get_section_by_name (output_bfd, secname) != NULL)
1418 static int count = 1;
1419 secname = bfd_get_unique_section_name (output_bfd, secname, &count);
1420 if (secname == NULL)
1421 einfo ("%F%P: place_orphan failed: %E\n");
1424 lang_insert_orphan (file, s, secname, after, place, NULL, NULL);
1431 if test x"$LDEMUL_FINISH" != xgld"$EMULATION_NAME"_finish; then
1432 cat >>e${EMULATION_NAME}.c <<EOF
1435 gld${EMULATION_NAME}_provide_bound_symbols (const char *sec,
1440 bfd_vma start_val, end_val;
1442 s = bfd_get_section_by_name (output_bfd, sec);
1446 end_val = start_val + s->size;
1453 _bfd_elf_provide_symbol (&link_info, start, start_val);
1454 _bfd_elf_provide_symbol (&link_info, end, end_val);
1457 /* If not building a shared library, provide
1459 __preinit_array_start
1466 They are set here rather than via PROVIDE in the linker
1467 script, because using PROVIDE inside an output section
1468 statement results in unnecessary output sections. Using
1469 PROVIDE outside an output section statement runs the risk of
1470 section alignment affecting where the section starts. */
1473 gld${EMULATION_NAME}_provide_init_fini_syms (void)
1475 if (!link_info.relocatable && !link_info.shared)
1477 gld${EMULATION_NAME}_provide_bound_symbols (".preinit_array",
1478 "__preinit_array_start",
1479 "__preinit_array_end");
1480 gld${EMULATION_NAME}_provide_bound_symbols (".init_array",
1481 "__init_array_start",
1482 "__init_array_end");
1483 gld${EMULATION_NAME}_provide_bound_symbols (".fini_array",
1484 "__fini_array_start",
1485 "__fini_array_end");
1490 gld${EMULATION_NAME}_layout_sections_again (void)
1492 lang_reset_memory_regions ();
1494 /* Resize the sections. */
1495 lang_size_sections (stat_ptr->head, abs_output_section,
1496 &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE);
1498 /* Redo special stuff. */
1499 ldemul_after_allocation ();
1501 /* Do the assignments again. */
1502 lang_do_assignments (stat_ptr->head, abs_output_section,
1503 (fill_type *) 0, (bfd_vma) 0);
1507 gld${EMULATION_NAME}_strip_empty_sections (void)
1509 if (!link_info.relocatable)
1511 lang_output_section_statement_type *os;
1513 for (os = &lang_output_section_statement.head->output_section_statement;
1519 if (os == abs_output_section || os->constraint == -1)
1521 s = os->bfd_section;
1522 if (s != NULL && s->size == 0 && (s->flags & SEC_KEEP) == 0)
1526 for (p = &output_bfd->sections; *p; p = &(*p)->next)
1529 bfd_section_list_remove (output_bfd, p);
1530 output_bfd->section_count--;
1539 gld${EMULATION_NAME}_finish (void)
1541 if (bfd_elf_discard_info (output_bfd, &link_info))
1542 gld${EMULATION_NAME}_layout_sections_again ();
1544 gld${EMULATION_NAME}_strip_empty_sections ();
1545 gld${EMULATION_NAME}_provide_init_fini_syms ();
1550 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1551 cat >>e${EMULATION_NAME}.c <<EOF
1554 gld${EMULATION_NAME}_get_script (int *isfile)
1557 if test -n "$COMPILE_IN"
1559 # Scripts compiled in.
1561 # sed commands to quote an ld script as a C string.
1562 sc="-f stringify.sed"
1564 cat >>e${EMULATION_NAME}.c <<EOF
1568 if (link_info.relocatable && config.build_constructors)
1571 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1572 echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c
1573 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1574 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1575 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1576 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
1577 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1578 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1580 if test -n "$GENERATE_PIE_SCRIPT" ; then
1581 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1582 echo ' ; else if (link_info.pie && link_info.combreloc' >> e${EMULATION_NAME}.c
1583 echo ' && link_info.relro' >> e${EMULATION_NAME}.c
1584 echo ' && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1585 sed $sc ldscripts/${EMULATION_NAME}.xdw >> e${EMULATION_NAME}.c
1586 echo ' ; else if (link_info.pie && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1587 sed $sc ldscripts/${EMULATION_NAME}.xdc >> e${EMULATION_NAME}.c
1589 echo ' ; else if (link_info.pie) return' >> e${EMULATION_NAME}.c
1590 sed $sc ldscripts/${EMULATION_NAME}.xd >> e${EMULATION_NAME}.c
1592 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1593 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1594 echo ' ; else if (link_info.shared && link_info.combreloc' >> e${EMULATION_NAME}.c
1595 echo ' && link_info.relro' >> e${EMULATION_NAME}.c
1596 echo ' && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1597 sed $sc ldscripts/${EMULATION_NAME}.xsw >> e${EMULATION_NAME}.c
1598 echo ' ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1599 sed $sc ldscripts/${EMULATION_NAME}.xsc >> e${EMULATION_NAME}.c
1601 echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c
1602 sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
1604 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1605 echo ' ; else if (link_info.combreloc && link_info.relro' >> e${EMULATION_NAME}.c
1606 echo ' && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1607 sed $sc ldscripts/${EMULATION_NAME}.xw >> e${EMULATION_NAME}.c
1608 echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c
1609 sed $sc ldscripts/${EMULATION_NAME}.xc >> e${EMULATION_NAME}.c
1611 echo ' ; else return' >> e${EMULATION_NAME}.c
1612 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1613 echo '; }' >> e${EMULATION_NAME}.c
1616 # Scripts read from the filesystem.
1618 cat >>e${EMULATION_NAME}.c <<EOF
1622 if (link_info.relocatable && config.build_constructors)
1623 return "ldscripts/${EMULATION_NAME}.xu";
1624 else if (link_info.relocatable)
1625 return "ldscripts/${EMULATION_NAME}.xr";
1626 else if (!config.text_read_only)
1627 return "ldscripts/${EMULATION_NAME}.xbn";
1629 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
1631 cat >>e${EMULATION_NAME}.c <<EOF
1632 else if (!config.magic_demand_paged)
1633 return "ldscripts/${EMULATION_NAME}.xn";
1636 if test -n "$GENERATE_PIE_SCRIPT" ; then
1637 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1638 cat >>e${EMULATION_NAME}.c <<EOF
1639 else if (link_info.pie && link_info.combreloc
1640 && link_info.relro && (link_info.flags & DT_BIND_NOW))
1641 return "ldscripts/${EMULATION_NAME}.xdw";
1642 else if (link_info.pie && link_info.combreloc)
1643 return "ldscripts/${EMULATION_NAME}.xdc";
1646 cat >>e${EMULATION_NAME}.c <<EOF
1647 else if (link_info.pie)
1648 return "ldscripts/${EMULATION_NAME}.xd";
1651 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1652 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1653 cat >>e${EMULATION_NAME}.c <<EOF
1654 else if (link_info.shared && link_info.combreloc
1655 && link_info.relro && (link_info.flags & DT_BIND_NOW))
1656 return "ldscripts/${EMULATION_NAME}.xsw";
1657 else if (link_info.shared && link_info.combreloc)
1658 return "ldscripts/${EMULATION_NAME}.xsc";
1661 cat >>e${EMULATION_NAME}.c <<EOF
1662 else if (link_info.shared)
1663 return "ldscripts/${EMULATION_NAME}.xs";
1666 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1667 cat >>e${EMULATION_NAME}.c <<EOF
1668 else if (link_info.combreloc && link_info.relro
1669 && (link_info.flags & DT_BIND_NOW))
1670 return "ldscripts/${EMULATION_NAME}.xw";
1671 else if (link_info.combreloc)
1672 return "ldscripts/${EMULATION_NAME}.xc";
1675 cat >>e${EMULATION_NAME}.c <<EOF
1677 return "ldscripts/${EMULATION_NAME}.x";
1684 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1686 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1687 cat >>e${EMULATION_NAME}.c <<EOF
1688 $PARSE_AND_LIST_PROLOGUE
1692 cat >>e${EMULATION_NAME}.c <<EOF
1694 #define OPTION_DISABLE_NEW_DTAGS (400)
1695 #define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
1696 #define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
1697 #define OPTION_EH_FRAME_HDR (OPTION_GROUP + 1)
1698 #define OPTION_EXCLUDE_LIBS (OPTION_EH_FRAME_HDR + 1)
1701 gld${EMULATION_NAME}_add_options
1702 (int ns, char **shortopts, int nl, struct option **longopts,
1703 int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
1705 static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:";
1706 static const struct option xtra_long[] = {
1709 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1710 cat >>e${EMULATION_NAME}.c <<EOF
1711 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1712 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1713 {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
1714 {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
1715 {"Bgroup", no_argument, NULL, OPTION_GROUP},
1719 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
1720 cat >>e${EMULATION_NAME}.c <<EOF
1721 $PARSE_AND_LIST_LONGOPTS
1725 cat >>e${EMULATION_NAME}.c <<EOF
1726 {NULL, no_argument, NULL, 0}
1729 *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
1730 memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
1731 *longopts = (struct option *)
1732 xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
1733 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
1737 gld${EMULATION_NAME}_handle_option (int optc)
1746 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1747 cat >>e${EMULATION_NAME}.c <<EOF
1748 case OPTION_DISABLE_NEW_DTAGS:
1749 link_info.new_dtags = FALSE;
1752 case OPTION_ENABLE_NEW_DTAGS:
1753 link_info.new_dtags = TRUE;
1756 case OPTION_EH_FRAME_HDR:
1757 link_info.eh_frame_hdr = TRUE;
1761 link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
1762 /* Groups must be self-contained. */
1763 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
1764 link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
1767 case OPTION_EXCLUDE_LIBS:
1768 add_excluded_libs (optarg);
1772 if (strcmp (optarg, "initfirst") == 0)
1773 link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
1774 else if (strcmp (optarg, "interpose") == 0)
1775 link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
1776 else if (strcmp (optarg, "loadfltr") == 0)
1777 link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
1778 else if (strcmp (optarg, "nodefaultlib") == 0)
1779 link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
1780 else if (strcmp (optarg, "nodelete") == 0)
1781 link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
1782 else if (strcmp (optarg, "nodlopen") == 0)
1783 link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
1784 else if (strcmp (optarg, "nodump") == 0)
1785 link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
1786 else if (strcmp (optarg, "now") == 0)
1788 link_info.flags |= (bfd_vma) DF_BIND_NOW;
1789 link_info.flags_1 |= (bfd_vma) DF_1_NOW;
1791 else if (strcmp (optarg, "origin") == 0)
1793 link_info.flags |= (bfd_vma) DF_ORIGIN;
1794 link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
1796 else if (strcmp (optarg, "defs") == 0)
1797 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
1798 else if (strcmp (optarg, "muldefs") == 0)
1799 link_info.allow_multiple_definition = TRUE;
1800 else if (strcmp (optarg, "combreloc") == 0)
1801 link_info.combreloc = TRUE;
1802 else if (strcmp (optarg, "nocombreloc") == 0)
1803 link_info.combreloc = FALSE;
1804 else if (strcmp (optarg, "nocopyreloc") == 0)
1805 link_info.nocopyreloc = TRUE;
1806 else if (strcmp (optarg, "execstack") == 0)
1808 link_info.execstack = TRUE;
1809 link_info.noexecstack = FALSE;
1811 else if (strcmp (optarg, "noexecstack") == 0)
1813 link_info.noexecstack = TRUE;
1814 link_info.execstack = FALSE;
1816 else if (strcmp (optarg, "relro") == 0)
1817 link_info.relro = TRUE;
1818 else if (strcmp (optarg, "norelro") == 0)
1819 link_info.relro = FALSE;
1820 /* What about the other Solaris -z options? FIXME. */
1825 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
1826 cat >>e${EMULATION_NAME}.c <<EOF
1827 $PARSE_AND_LIST_ARGS_CASES
1831 cat >>e${EMULATION_NAME}.c <<EOF
1839 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1840 cat >>e${EMULATION_NAME}.c <<EOF
1843 gld${EMULATION_NAME}_list_options (FILE * file)
1847 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1848 cat >>e${EMULATION_NAME}.c <<EOF
1849 fprintf (file, _(" -Bgroup\t\tSelects group name lookup rules for DSO\n"));
1850 fprintf (file, _(" --disable-new-dtags\tDisable new dynamic tags\n"));
1851 fprintf (file, _(" --enable-new-dtags\tEnable new dynamic tags\n"));
1852 fprintf (file, _(" --eh-frame-hdr\tCreate .eh_frame_hdr section\n"));
1853 fprintf (file, _(" -z combreloc\t\tMerge dynamic relocs into one section and sort\n"));
1854 fprintf (file, _(" -z defs\t\tReport unresolved symbols in object files.\n"));
1855 fprintf (file, _(" -z execstack\t\tMark executable as requiring executable stack\n"));
1856 fprintf (file, _(" -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
1857 fprintf (file, _(" -z interpose\t\tMark object to interpose all DSOs but executable\n"));
1858 fprintf (file, _(" -z loadfltr\t\tMark object requiring immediate process\n"));
1859 fprintf (file, _(" -z muldefs\t\tAllow multiple definitions\n"));
1860 fprintf (file, _(" -z nocombreloc\tDon't merge dynamic relocs into one section\n"));
1861 fprintf (file, _(" -z nocopyreloc\tDon't create copy relocs\n"));
1862 fprintf (file, _(" -z nodefaultlib\tMark object not to use default search paths\n"));
1863 fprintf (file, _(" -z nodelete\t\tMark DSO non-deletable at runtime\n"));
1864 fprintf (file, _(" -z nodlopen\t\tMark DSO not available to dlopen\n"));
1865 fprintf (file, _(" -z nodump\t\tMark DSO not available to dldump\n"));
1866 fprintf (file, _(" -z noexecstack\tMark executable as not requiring executable stack\n"));
1867 fprintf (file, _(" -z norelro\t\tDon't create RELRO program header\n"));
1868 fprintf (file, _(" -z now\t\tMark object non-lazy runtime binding\n"));
1869 fprintf (file, _(" -z origin\t\tMark object requiring immediate \$ORIGIN processing\n\t\t\t at runtime\n"));
1870 fprintf (file, _(" -z relro\t\tCreate RELRO program header\n"));
1871 fprintf (file, _(" -z KEYWORD\t\tIgnored for Solaris compatibility\n"));
1875 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
1876 cat >>e${EMULATION_NAME}.c <<EOF
1877 $PARSE_AND_LIST_OPTIONS
1881 cat >>e${EMULATION_NAME}.c <<EOF
1885 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
1886 cat >>e${EMULATION_NAME}.c <<EOF
1887 $PARSE_AND_LIST_EPILOGUE
1892 cat >>e${EMULATION_NAME}.c <<EOF
1893 #define gld${EMULATION_NAME}_add_options NULL
1894 #define gld${EMULATION_NAME}_handle_option NULL
1896 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1897 cat >>e${EMULATION_NAME}.c <<EOF
1898 #define gld${EMULATION_NAME}_list_options NULL
1903 cat >>e${EMULATION_NAME}.c <<EOF
1905 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1907 ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
1908 ${LDEMUL_SYSLIB-syslib_default},
1909 ${LDEMUL_HLL-hll_default},
1910 ${LDEMUL_AFTER_PARSE-after_parse_default},
1911 ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
1912 ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
1913 ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
1914 ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
1915 ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
1916 ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
1917 "${EMULATION_NAME}",
1919 ${LDEMUL_FINISH-gld${EMULATION_NAME}_finish},
1920 ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
1921 ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
1922 ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
1923 ${LDEMUL_SET_SYMBOLS-NULL},
1924 ${LDEMUL_PARSE_ARGS-NULL},
1925 gld${EMULATION_NAME}_add_options,
1926 gld${EMULATION_NAME}_handle_option,
1927 ${LDEMUL_UNRECOGNIZED_FILE-NULL},
1928 ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
1929 ${LDEMUL_RECOGNIZED_FILE-gld${EMULATION_NAME}_load_symbols},
1930 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
1931 ${LDEMUL_NEW_VERS_PATTERN-NULL}