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}
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, 2006, 2007, 2008, 2009
17 Free Software Foundation, Inc.
18 Written by Steve Chamberlain <sac@cygnus.com>
19 ELF support by Ian Lance Taylor <ian@cygnus.com>
21 This file is part of the GNU Binutils.
23 This program is free software; you can redistribute it and/or modify
24 it under the terms of the GNU General Public License as published by
25 the Free Software Foundation; either version 3 of the License, or
26 (at your option) any later version.
28 This program is distributed in the hope that it will be useful,
29 but WITHOUT ANY WARRANTY; without even the implied warranty of
30 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
31 GNU General Public License for more details.
33 You should have received a copy of the GNU General Public License
34 along with this program; if not, write to the Free Software
35 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
36 MA 02110-1301, USA. */
38 #define TARGET_IS_${EMULATION_NAME}
42 #include "libiberty.h"
43 #include "safe-ctype.h"
59 #include "elf/common.h"
62 /* Declare functions used by various EXTRA_EM_FILEs. */
63 static void gld${EMULATION_NAME}_before_parse (void);
64 static void gld${EMULATION_NAME}_after_open (void);
65 static void gld${EMULATION_NAME}_before_allocation (void);
66 static void gld${EMULATION_NAME}_after_allocation (void);
67 static lang_output_section_statement_type *gld${EMULATION_NAME}_place_orphan
68 (asection *, const char *, int);
71 if [ "x${USE_LIBPATH}" = xyes ] ; then
73 *-*-linux-* | *-*-k*bsd*-*)
83 # Import any needed special functions and/or overrides.
85 source_em ${srcdir}/emultempl/elf-generic.em
86 if test -n "$EXTRA_EM_FILE" ; then
87 source_em ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
90 # Functions in this file can be overridden by setting the LDEMUL_* shell
91 # variables. If the name of the overriding function is the same as is
92 # defined in this file, then don't output this file's version.
93 # If a different overriding name is given then output the standard function
94 # as presumably it is called from the overriding function.
96 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
100 gld${EMULATION_NAME}_before_parse (void)
102 ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
103 config.dynamic_link = ${DYNAMIC_LINK-TRUE};
104 config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
110 if test x"$LDEMUL_RECOGNIZED_FILE" != xgld"${EMULATION_NAME}"_load_symbols; then
112 /* Handle as_needed DT_NEEDED. */
115 gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *entry)
119 /* Tell the ELF linker that we don't want the output file to have a
120 DT_NEEDED entry for this file, unless it is used to resolve
121 references in a regular object. */
122 if (entry->as_needed)
123 class = DYN_AS_NEEDED;
125 /* Tell the ELF linker that we don't want the output file to have a
126 DT_NEEDED entry for any dynamic library in DT_NEEDED tags from
128 if (!entry->add_needed)
129 class |= DYN_NO_ADD_NEEDED;
131 if (entry->just_syms_flag
132 && (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) != 0)
133 einfo (_("%P%F: --just-symbols may not be used on DSO: %B\n"),
137 || (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) == 0)
140 bfd_elf_set_dyn_lib_class (entry->the_bfd, class);
142 /* Continue on with normal load_symbols processing. */
150 /* These variables are required to pass information back and forth
151 between after_open and check_needed and stat_needed and vercheck. */
153 static struct bfd_link_needed_list *global_needed;
154 static struct stat global_stat;
155 static lang_input_statement_type *global_found;
156 static struct bfd_link_needed_list *global_vercheck_needed;
157 static bfd_boolean global_vercheck_failed;
160 /* On Linux, it's possible to have different versions of the same
161 shared library linked against different versions of libc. The
162 dynamic linker somehow tags which libc version to use in
163 /etc/ld.so.cache, and, based on the libc that it sees in the
164 executable, chooses which version of the shared library to use.
166 We try to do a similar check here by checking whether this shared
167 library needs any other shared libraries which may conflict with
168 libraries we have already included in the link. If it does, we
169 skip it, and try to find another shared library farther on down the
172 This is called via lang_for_each_input_file.
173 GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
174 which we are checking. This sets GLOBAL_VERCHECK_FAILED if we find
175 a conflicting version. */
178 gld${EMULATION_NAME}_vercheck (lang_input_statement_type *s)
181 struct bfd_link_needed_list *l;
183 if (global_vercheck_failed)
185 if (s->the_bfd == NULL
186 || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
189 soname = bfd_elf_get_dt_soname (s->the_bfd);
191 soname = lbasename (bfd_get_filename (s->the_bfd));
193 for (l = global_vercheck_needed; l != NULL; l = l->next)
197 if (strcmp (soname, l->name) == 0)
199 /* Probably can't happen, but it's an easy check. */
203 if (strchr (l->name, '/') != NULL)
206 suffix = strstr (l->name, ".so.");
210 suffix += sizeof ".so." - 1;
212 if (strncmp (soname, l->name, suffix - l->name) == 0)
214 /* Here we know that S is a dynamic object FOO.SO.VER1, and
215 the object we are considering needs a dynamic object
216 FOO.SO.VER2, and VER1 and VER2 are different. This
217 appears to be a version mismatch, so we tell the caller
218 to try a different version of this library. */
219 global_vercheck_failed = TRUE;
226 /* See if an input file matches a DT_NEEDED entry by running stat on
230 gld${EMULATION_NAME}_stat_needed (lang_input_statement_type *s)
236 if (global_found != NULL)
238 if (s->the_bfd == NULL)
241 /* If this input file was an as-needed entry, and wasn't found to be
242 needed at the stage it was linked, then don't say we have loaded it. */
243 if ((bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0)
246 if (bfd_stat (s->the_bfd, &st) != 0)
248 einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
252 /* Some operating systems, e.g. Windows, do not provide a meaningful
253 st_ino; they always set it to zero. (Windows does provide a
254 meaningful st_dev.) Do not indicate a duplicate library in that
255 case. While there is no guarantee that a system that provides
256 meaningful inode numbers will never set st_ino to zero, this is
257 merely an optimization, so we do not need to worry about false
259 if (st.st_dev == global_stat.st_dev
260 && st.st_ino == global_stat.st_ino
267 /* We issue a warning if it looks like we are including two
268 different versions of the same shared library. For example,
269 there may be a problem if -lc picks up libc.so.6 but some other
270 shared library has a DT_NEEDED entry of libc.so.5. This is a
271 heuristic test, and it will only work if the name looks like
272 NAME.so.VERSION. FIXME: Depending on file names is error-prone.
273 If we really want to issue warnings about mixing version numbers
274 of shared libraries, we need to find a better way. */
276 if (strchr (global_needed->name, '/') != NULL)
278 suffix = strstr (global_needed->name, ".so.");
281 suffix += sizeof ".so." - 1;
283 soname = bfd_elf_get_dt_soname (s->the_bfd);
285 soname = lbasename (s->filename);
287 if (strncmp (soname, global_needed->name, suffix - global_needed->name) == 0)
288 einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
289 global_needed->name, global_needed->by, soname);
298 /* This function is called for each possible name for a dynamic object
299 named by a DT_NEEDED entry. The FORCE parameter indicates whether
300 to skip the check for a conflicting version. */
303 gld${EMULATION_NAME}_try_needed (struct dt_needed *needed,
307 const char *name = needed->name;
311 abfd = bfd_openr (name, bfd_get_target (link_info.output_bfd));
314 if (! bfd_check_format (abfd, bfd_object))
319 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
325 /* For DT_NEEDED, they have to match. */
326 if (abfd->xvec != link_info.output_bfd->xvec)
332 /* Check whether this object would include any conflicting library
333 versions. If FORCE is set, then we skip this check; we use this
334 the second time around, if we couldn't find any compatible
335 instance of the shared library. */
339 struct bfd_link_needed_list *needed;
341 if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
342 einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
346 global_vercheck_needed = needed;
347 global_vercheck_failed = FALSE;
348 lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
349 if (global_vercheck_failed)
352 /* Return FALSE to force the caller to move on to try
353 another file on the search path. */
357 /* But wait! It gets much worse. On Linux, if a shared
358 library does not use libc at all, we are supposed to skip
359 it the first time around in case we encounter a shared
360 library later on with the same name which does use the
361 version of libc that we want. This is much too horrible
362 to use on any system other than Linux. */
366 *-*-linux-* | *-*-k*bsd*-*)
369 struct bfd_link_needed_list *l;
371 for (l = needed; l != NULL; l = l->next)
372 if (CONST_STRNEQ (l->name, "libc.so"))
388 /* We've found a dynamic object matching the DT_NEEDED entry. */
390 /* We have already checked that there is no other input file of the
391 same name. We must now check again that we are not including the
392 same file twice. We need to do this because on many systems
393 libc.so is a symlink to, e.g., libc.so.1. The SONAME entry will
394 reference libc.so.1. If we have already included libc.so, we
395 don't want to include libc.so.1 if they are the same file, and we
396 can only check that using stat. */
398 if (bfd_stat (abfd, &global_stat) != 0)
399 einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
401 /* First strip off everything before the last '/'. */
402 soname = lbasename (abfd->filename);
404 if (trace_file_tries)
405 info_msg (_("found %s at %s\n"), soname, name);
408 lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
409 if (global_found != NULL)
411 /* Return TRUE to indicate that we found the file, even though
412 we aren't going to do anything with it. */
416 /* Specify the soname to use. */
417 bfd_elf_set_dt_needed_name (abfd, soname);
419 /* Tell the ELF linker that we don't want the output file to have a
420 DT_NEEDED entry for this file, unless it is used to resolve
421 references in a regular object. */
422 class = DYN_DT_NEEDED;
424 /* Tell the ELF linker that we don't want the output file to have a
425 DT_NEEDED entry for this file at all if the entry is from a file
426 with DYN_NO_ADD_NEEDED. */
427 if (needed->by != NULL
428 && (bfd_elf_get_dyn_lib_class (needed->by) & DYN_NO_ADD_NEEDED) != 0)
429 class |= DYN_NO_NEEDED | DYN_NO_ADD_NEEDED;
431 bfd_elf_set_dyn_lib_class (abfd, class);
433 /* Add this file into the symbol table. */
434 if (! bfd_link_add_symbols (abfd, &link_info))
435 einfo ("%F%B: could not read symbols: %E\n", abfd);
441 /* Search for a needed file in a path. */
444 gld${EMULATION_NAME}_search_needed (const char *path,
445 struct dt_needed *n, int force)
448 const char *name = n->name;
450 struct dt_needed needed;
453 return gld${EMULATION_NAME}_try_needed (n, force);
455 if (path == NULL || *path == '\0')
459 needed.name = n->name;
464 char *filename, *sset;
466 s = strchr (path, config.rpath_separator);
468 s = path + strlen (path);
470 filename = (char *) xmalloc (s - path + len + 2);
475 memcpy (filename, path, s - path);
476 filename[s - path] = '/';
477 sset = filename + (s - path) + 1;
481 needed.name = filename;
482 if (gld${EMULATION_NAME}_try_needed (&needed, force))
496 if [ "x${USE_LIBPATH}" = xyes ] ; then
499 /* Add the sysroot to every entry in a path separated by
500 config.rpath_separator. */
503 gld${EMULATION_NAME}_add_sysroot (const char *path)
512 if (path[i++] == config.rpath_separator)
518 len = len + (colons + 1) * strlen (ld_sysroot);
519 ret = xmalloc (len + 1);
520 strcpy (ret, ld_sysroot);
521 p = ret + strlen (ret);
524 if (path[i] == config.rpath_separator)
527 strcpy (p, ld_sysroot);
539 *-*-freebsd* | *-*-dragonfly*)
541 /* Read the system search path the FreeBSD way rather than the Linux way. */
542 #ifdef HAVE_ELF_HINTS_H
543 #include <elf-hints.h>
545 #include "elf-hints-local.h"
549 gld${EMULATION_NAME}_check_ld_elf_hints (const char *name, int force)
551 static bfd_boolean initialized;
552 static char *ld_elf_hints;
553 struct dt_needed needed;
560 tmppath = concat (ld_sysroot, _PATH_ELF_HINTS, (const char *) NULL);
561 f = fopen (tmppath, FOPEN_RB);
565 struct elfhints_hdr hdr;
567 if (fread (&hdr, 1, sizeof (hdr), f) == sizeof (hdr)
568 && hdr.magic == ELFHINTS_MAGIC
571 if (fseek (f, hdr.strtab + hdr.dirlist, SEEK_SET) != -1)
575 b = xmalloc (hdr.dirlistlen + 1);
576 if (fread (b, 1, hdr.dirlistlen + 1, f) ==
578 ld_elf_hints = gld${EMULATION_NAME}_add_sysroot (b);
589 if (ld_elf_hints == NULL)
594 return gld${EMULATION_NAME}_search_needed (ld_elf_hints, & needed,
601 *-*-linux-* | *-*-k*bsd*-*)
603 /* For a native linker, check the file /etc/ld.so.conf for directories
604 in which we may find shared libraries. /etc/ld.so.conf is really
605 only meaningful on Linux. */
607 struct gld${EMULATION_NAME}_ld_so_conf
614 gld${EMULATION_NAME}_parse_ld_so_conf
615 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename);
618 gld${EMULATION_NAME}_parse_ld_so_conf_include
619 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename,
627 if (pattern[0] != '/')
629 char *p = strrchr (filename, '/');
630 size_t patlen = strlen (pattern) + 1;
632 newp = xmalloc (p - filename + 1 + patlen);
633 memcpy (newp, filename, p - filename + 1);
634 memcpy (newp + (p - filename + 1), pattern, patlen);
639 if (glob (pattern, 0, NULL, &gl) == 0)
643 for (i = 0; i < gl.gl_pathc; ++i)
644 gld${EMULATION_NAME}_parse_ld_so_conf (info, gl.gl_pathv[i]);
648 /* If we do not have glob, treat the pattern as a literal filename. */
649 gld${EMULATION_NAME}_parse_ld_so_conf (info, pattern);
657 gld${EMULATION_NAME}_parse_ld_so_conf
658 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename)
660 FILE *f = fopen (filename, FOPEN_RT);
668 line = xmalloc (linelen);
673 /* Normally this would use getline(3), but we need to be portable. */
674 while ((q = fgets (p, linelen - (p - line), f)) != NULL
675 && strlen (q) == linelen - (p - line) - 1
676 && line[linelen - 2] != '\n')
678 line = xrealloc (line, 2 * linelen);
679 p = line + linelen - 1;
683 if (q == NULL && p == line)
686 p = strchr (line, '\n');
690 /* Because the file format does not know any form of quoting we
691 can search forward for the next '#' character and if found
692 make it terminating the line. */
693 p = strchr (line, '#');
697 /* Remove leading whitespace. NUL is no whitespace character. */
699 while (*p == ' ' || *p == '\f' || *p == '\r' || *p == '\t' || *p == '\v')
702 /* If the line is blank it is ignored. */
706 if (CONST_STRNEQ (p, "include") && (p[7] == ' ' || p[7] == '\t'))
712 while (*p == ' ' || *p == '\t')
720 while (*p != ' ' && *p != '\t' && *p)
726 gld${EMULATION_NAME}_parse_ld_so_conf_include (info, filename,
734 while (*p && *p != '=' && *p != ' ' && *p != '\t' && *p != '\f'
735 && *p != '\r' && *p != '\v')
738 while (p != dir && p[-1] == '/')
740 if (info->path == NULL)
742 info->alloc = p - dir + 1 + 256;
743 info->path = xmalloc (info->alloc);
748 if (info->len + 1 + (p - dir) >= info->alloc)
750 info->alloc += p - dir + 256;
751 info->path = xrealloc (info->path, info->alloc);
753 info->path[info->len++] = config.rpath_separator;
755 memcpy (info->path + info->len, dir, p - dir);
756 info->len += p - dir;
757 info->path[info->len] = '\0';
767 gld${EMULATION_NAME}_check_ld_so_conf (const char *name, int force)
769 static bfd_boolean initialized;
770 static char *ld_so_conf;
771 struct dt_needed needed;
776 struct gld${EMULATION_NAME}_ld_so_conf info;
779 info.len = info.alloc = 0;
780 tmppath = concat (ld_sysroot, "${prefix}/etc/ld.so.conf",
781 (const char *) NULL);
782 if (!gld${EMULATION_NAME}_parse_ld_so_conf (&info, tmppath))
785 tmppath = concat (ld_sysroot, "/etc/ld.so.conf",
786 (const char *) NULL);
787 gld${EMULATION_NAME}_parse_ld_so_conf (&info, tmppath);
793 char *d = gld${EMULATION_NAME}_add_sysroot (info.path);
800 if (ld_so_conf == NULL)
806 return gld${EMULATION_NAME}_search_needed (ld_so_conf, &needed, force);
816 /* See if an input file matches a DT_NEEDED entry by name. */
819 gld${EMULATION_NAME}_check_needed (lang_input_statement_type *s)
823 /* Stop looking if we've found a loaded lib. */
824 if (global_found != NULL
825 && (bfd_elf_get_dyn_lib_class (global_found->the_bfd)
826 & DYN_AS_NEEDED) == 0)
829 if (s->filename == NULL || s->the_bfd == NULL)
832 /* Don't look for a second non-loaded as-needed lib. */
833 if (global_found != NULL
834 && (bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0)
837 if (strcmp (s->filename, global_needed->name) == 0)
843 if (s->search_dirs_flag)
845 const char *f = strrchr (s->filename, '/');
847 && strcmp (f + 1, global_needed->name) == 0)
854 soname = bfd_elf_get_dt_soname (s->the_bfd);
856 && strcmp (soname, global_needed->name) == 0)
865 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
869 gld${EMULATION_NAME}_id_note_section_size (bfd *abfd,
870 struct bfd_link_info *link_info)
872 const char *style = link_info->emit_note_gnu_build_id;
877 size = offsetof (Elf_External_Note, name[sizeof "GNU"]);
878 size = (size + 3) & -(bfd_size_type) 4;
880 if (!strcmp (style, "md5") || !strcmp (style, "uuid"))
882 else if (!strcmp (style, "sha1"))
884 else if (!strncmp (style, "0x", 2))
886 /* ID is in string form (hex). Convert to bits. */
887 const char *id = style + 2;
890 if (ISXDIGIT (id[0]) && ISXDIGIT (id[1]))
895 else if (*id == '-' || *id == ':')
902 } while (*id != '\0');
911 read_hex (const char xdigit)
913 if (ISDIGIT (xdigit))
915 if (ISUPPER (xdigit))
916 return xdigit - 'A' + 0xa;
917 if (ISLOWER (xdigit))
918 return xdigit - 'a' + 0xa;
930 gld${EMULATION_NAME}_write_build_id_section (bfd *abfd)
932 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
933 struct build_id_info *info =
934 elf_tdata (abfd)->after_write_object_contents_info;
936 Elf_Internal_Shdr *i_shdr;
937 unsigned char *contents, *id_bits;
939 Elf_External_Note *e_note;
942 if (bfd_is_abs_section (asec->output_section))
944 einfo (_("%P: warning: .note.gnu.build-id section discarded,"
945 " --build-id ignored.\n"));
948 i_shdr = &elf_section_data (asec->output_section)->this_hdr;
950 if (i_shdr->contents == NULL)
952 if (asec->contents == NULL)
953 asec->contents = xmalloc (asec->size);
954 contents = asec->contents;
957 contents = i_shdr->contents + asec->output_offset;
959 e_note = (void *) contents;
960 size = offsetof (Elf_External_Note, name[sizeof "GNU"]);
961 size = (size + 3) & -(bfd_size_type) 4;
962 id_bits = contents + size;
963 size = asec->size - size;
965 bfd_h_put_32 (abfd, sizeof "GNU", &e_note->namesz);
966 bfd_h_put_32 (abfd, size, &e_note->descsz);
967 bfd_h_put_32 (abfd, NT_GNU_BUILD_ID, &e_note->type);
968 memcpy (e_note->name, "GNU", sizeof "GNU");
970 if (!strcmp (info->style, "md5"))
974 if (bed->s->checksum_contents (abfd,
975 (void (*) (const void *, size_t, void *))
978 md5_finish_ctx (&ctx, id_bits);
982 else if (!strcmp (info->style, "sha1"))
985 sha1_init_ctx (&ctx);
986 if (bed->s->checksum_contents (abfd,
987 (void (*) (const void *, size_t, void *))
990 sha1_finish_ctx (&ctx, id_bits);
994 else if (!strcmp (info->style, "uuid"))
997 int fd = open ("/dev/urandom", O_RDONLY);
1000 n = read (fd, id_bits, size);
1005 else if (!strncmp (info->style, "0x", 2))
1007 /* ID is in string form (hex). Convert to bits. */
1008 const char *id = info->style + 2;
1012 if (ISXDIGIT (id[0]) && ISXDIGIT (id[1]))
1014 id_bits[n] = read_hex (*id++) << 4;
1015 id_bits[n++] |= read_hex (*id++);
1017 else if (*id == '-' || *id == ':')
1020 abort (); /* Should have been validated earlier. */
1021 } while (*id != '\0');
1024 abort (); /* Should have been validated earlier. */
1027 return (bfd_seek (abfd,
1028 i_shdr->sh_offset + asec->output_offset, SEEK_SET) == 0
1029 && bfd_bwrite (contents, size, abfd) == size);
1033 /* This is called after all the input files have been opened. */
1036 gld${EMULATION_NAME}_after_open (void)
1038 struct bfd_link_needed_list *needed, *l;
1039 struct elf_link_hash_table *htab;
1041 htab = elf_hash_table (&link_info);
1042 if (!is_elf_hash_table (htab))
1045 if (link_info.emit_note_gnu_build_id)
1051 abfd = link_info.input_bfds;
1055 /* PR 10555: If there are no input files do not
1056 try to create a .note.gnu-build-id section. */
1057 free (link_info.emit_note_gnu_build_id);
1058 link_info.emit_note_gnu_build_id = NULL;
1062 size = gld${EMULATION_NAME}_id_note_section_size (abfd, &link_info);
1065 einfo ("%P: warning: unrecognized --build-id style ignored.\n");
1066 free (link_info.emit_note_gnu_build_id);
1067 link_info.emit_note_gnu_build_id = NULL;
1071 s = bfd_make_section_with_flags (abfd, ".note.gnu.build-id",
1072 SEC_ALLOC | SEC_LOAD
1073 | SEC_IN_MEMORY | SEC_LINKER_CREATED
1074 | SEC_READONLY | SEC_DATA);
1075 if (s != NULL && bfd_set_section_alignment (abfd, s, 2))
1077 struct elf_obj_tdata *t = elf_tdata (link_info.output_bfd);
1078 struct build_id_info *b = xmalloc (sizeof *b);
1080 b->style = link_info.emit_note_gnu_build_id;
1082 elf_section_type (s) = SHT_NOTE;
1084 t->after_write_object_contents
1085 = &gld${EMULATION_NAME}_write_build_id_section;
1086 t->after_write_object_contents_info = b;
1090 einfo ("%P: warning: Cannot create .note.gnu.build-id section,"
1091 " --build-id ignored.\n");
1092 free (link_info.emit_note_gnu_build_id);
1093 link_info.emit_note_gnu_build_id = NULL;
1099 if (link_info.relocatable)
1102 if (link_info.eh_frame_hdr
1103 && !link_info.traditional_format)
1108 for (abfd = link_info.input_bfds; abfd; abfd = abfd->link_next)
1110 s = bfd_get_section_by_name (abfd, ".eh_frame");
1111 if (s && s->size > 8 && !bfd_is_abs_section (s->output_section))
1116 const struct elf_backend_data *bed;
1118 bed = get_elf_backend_data (abfd);
1119 s = bfd_make_section_with_flags (abfd, ".eh_frame_hdr",
1120 bed->dynamic_sec_flags
1123 && bfd_set_section_alignment (abfd, s, 2))
1124 htab->eh_info.hdr_sec = s;
1126 einfo ("%P: warning: Cannot create .eh_frame_hdr section,"
1127 " --eh-frame-hdr ignored.\n");
1131 /* Get the list of files which appear in DT_NEEDED entries in
1132 dynamic objects included in the link (often there will be none).
1133 For each such file, we want to track down the corresponding
1134 library, and include the symbol table in the link. This is what
1135 the runtime dynamic linker will do. Tracking the files down here
1136 permits one dynamic object to include another without requiring
1137 special action by the person doing the link. Note that the
1138 needed list can actually grow while we are stepping through this
1140 if (!link_info.executable)
1142 needed = bfd_elf_get_needed_list (link_info.output_bfd, &link_info);
1143 for (l = needed; l != NULL; l = l->next)
1145 struct bfd_link_needed_list *ll;
1146 struct dt_needed n, nn;
1149 /* If the lib that needs this one was --as-needed and wasn't
1150 found to be needed, then this lib isn't needed either. */
1152 && (bfd_elf_get_dyn_lib_class (l->by) & DYN_AS_NEEDED) != 0)
1155 /* If we've already seen this file, skip it. */
1156 for (ll = needed; ll != l; ll = ll->next)
1158 || (bfd_elf_get_dyn_lib_class (ll->by) & DYN_AS_NEEDED) == 0)
1159 && strcmp (ll->name, l->name) == 0)
1164 /* See if this file was included in the link explicitly. */
1166 global_found = NULL;
1167 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
1168 if (global_found != NULL
1169 && (bfd_elf_get_dyn_lib_class (global_found->the_bfd)
1170 & DYN_AS_NEEDED) == 0)
1176 if (trace_file_tries)
1177 info_msg (_("%s needed by %B\n"), l->name, l->by);
1179 /* As-needed libs specified on the command line (or linker script)
1180 take priority over libs found in search dirs. */
1181 if (global_found != NULL)
1183 nn.name = global_found->filename;
1184 if (gld${EMULATION_NAME}_try_needed (&nn, TRUE))
1188 /* We need to find this file and include the symbol table. We
1189 want to search for the file in the same way that the dynamic
1190 linker will search. That means that we want to use
1191 rpath_link, rpath, then the environment variable
1192 LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
1193 entries (native only), then the linker script LIB_SEARCH_DIRS.
1194 We do not search using the -L arguments.
1196 We search twice. The first time, we skip objects which may
1197 introduce version mismatches. The second time, we force
1198 their use. See gld${EMULATION_NAME}_vercheck comment. */
1199 for (force = 0; force < 2; force++)
1202 search_dirs_type *search;
1204 if [ "x${NATIVE}" = xyes ] ; then
1206 const char *lib_path;
1209 if [ "x${USE_LIBPATH}" = xyes ] ; then
1211 struct bfd_link_needed_list *rp;
1217 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
1221 if [ "x${USE_LIBPATH}" = xyes ] ; then
1223 if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
1228 if [ "x${NATIVE}" = xyes ] ; then
1230 if (command_line.rpath_link == NULL
1231 && command_line.rpath == NULL)
1233 lib_path = (const char *) getenv ("LD_RUN_PATH");
1234 if (gld${EMULATION_NAME}_search_needed (lib_path, &n,
1238 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
1239 if (gld${EMULATION_NAME}_search_needed (lib_path, &n, force))
1243 if [ "x${USE_LIBPATH}" = xyes ] ; then
1246 rp = bfd_elf_get_runpath_list (link_info.output_bfd, &link_info);
1247 for (; !found && rp != NULL; rp = rp->next)
1249 char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
1250 found = (rp->by == l->by
1251 && gld${EMULATION_NAME}_search_needed (tmpname,
1261 if [ "x${USE_LIBPATH}" = xyes ] ; then
1263 *-*-freebsd* | *-*-dragonfly*)
1265 if (gld${EMULATION_NAME}_check_ld_elf_hints (l->name, force))
1271 *-*-linux-* | *-*-k*bsd*-*)
1274 if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
1282 len = strlen (l->name);
1283 for (search = search_head; search != NULL; search = search->next)
1287 if (search->cmdline)
1289 filename = (char *) xmalloc (strlen (search->name) + len + 2);
1290 sprintf (filename, "%s/%s", search->name, l->name);
1292 if (gld${EMULATION_NAME}_try_needed (&nn, force))
1305 einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
1315 /* Look through an expression for an assignment statement. */
1318 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
1320 bfd_boolean provide = FALSE;
1322 switch (exp->type.node_class)
1328 /* We call record_link_assignment even if the symbol is defined.
1329 This is because if it is defined by a dynamic object, we
1330 actually want to use the value defined by the linker script,
1331 not the value from the dynamic object (because we are setting
1332 symbols like etext). If the symbol is defined by a regular
1333 object, then, as it happens, calling record_link_assignment
1335 if (strcmp (exp->assign.dst, ".") != 0)
1337 if (!bfd_elf_record_link_assignment (link_info.output_bfd,
1339 exp->assign.dst, provide,
1340 exp->assign.hidden))
1341 einfo ("%P%F: failed to record assignment to %s: %E\n",
1344 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1348 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1349 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1353 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1354 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1355 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1359 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1368 /* This is called by the before_allocation routine via
1369 lang_for_each_statement. It locates any assignment statements, and
1370 tells the ELF backend about them, in case they are assignments to
1371 symbols which are referred to by dynamic objects. */
1374 gld${EMULATION_NAME}_find_statement_assignment (lang_statement_union_type *s)
1376 if (s->header.type == lang_assignment_statement_enum)
1377 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1382 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
1383 if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
1384 ELF_INTERPRETER_SET_DEFAULT="
1385 if (sinterp != NULL)
1387 sinterp->contents = (unsigned char *) ${ELF_INTERPRETER_NAME};
1388 sinterp->size = strlen ((char *) sinterp->contents) + 1;
1393 ELF_INTERPRETER_SET_DEFAULT=
1397 /* This is called after the sections have been attached to output
1398 sections, but before any sizes or addresses have been set. */
1401 gld${EMULATION_NAME}_before_allocation (void)
1406 if (link_info.hash->type == bfd_link_elf_hash_table)
1407 _bfd_elf_tls_setup (link_info.output_bfd, &link_info);
1409 /* If we are going to make any variable assignments, we need to let
1410 the ELF backend know about them in case the variables are
1411 referred to by dynamic objects. */
1412 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
1414 /* Let the ELF backend work out the sizes of any sections required
1415 by dynamic linking. */
1416 rpath = command_line.rpath;
1418 rpath = (const char *) getenv ("LD_RUN_PATH");
1419 if (! (bfd_elf_size_dynamic_sections
1420 (link_info.output_bfd, command_line.soname, rpath,
1421 command_line.filter_shlib,
1422 (const char * const *) command_line.auxiliary_filters,
1423 &link_info, &sinterp, lang_elf_version_info)))
1424 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1426 ${ELF_INTERPRETER_SET_DEFAULT}
1427 /* Let the user override the dynamic linker we are using. */
1428 if (command_line.interpreter != NULL
1431 sinterp->contents = (bfd_byte *) command_line.interpreter;
1432 sinterp->size = strlen (command_line.interpreter) + 1;
1435 /* Look for any sections named .gnu.warning. As a GNU extensions,
1436 we treat such sections as containing warning messages. We print
1437 out the warning message, and then zero out the section size so
1438 that it does not get copied into the output file. */
1441 LANG_FOR_EACH_INPUT_STATEMENT (is)
1448 if (is->just_syms_flag)
1451 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
1456 msg = xmalloc ((size_t) (sz + 1));
1457 if (! bfd_get_section_contents (is->the_bfd, s, msg,
1459 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
1462 ret = link_info.callbacks->warning (&link_info, msg,
1463 (const char *) NULL,
1464 is->the_bfd, (asection *) NULL,
1469 /* Clobber the section size, so that we don't waste space
1470 copying the warning into the output file. If we've already
1471 sized the output section, adjust its size. The adjustment
1472 is on rawsize because targets that size sections early will
1473 have called lang_reset_memory_regions after sizing. */
1474 if (s->output_section != NULL
1475 && s->output_section->rawsize >= s->size)
1476 s->output_section->rawsize -= s->size;
1480 /* Also set SEC_EXCLUDE, so that local symbols defined in the
1481 warning section don't get copied to the output. */
1482 s->flags |= SEC_EXCLUDE | SEC_KEEP;
1486 before_allocation_default ();
1488 if (!bfd_elf_size_dynsym_hash_dynstr (link_info.output_bfd, &link_info))
1489 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1495 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
1498 /* Try to open a dynamic archive. This is where we know that ELF
1499 dynamic libraries have an extension of .so (or .sl on oddball systems
1503 gld${EMULATION_NAME}_open_dynamic_archive
1504 (const char *arch, search_dirs_type *search, lang_input_statement_type *entry)
1506 const char *filename;
1509 if (! entry->is_archive)
1512 filename = entry->filename;
1514 /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
1515 is defined, but it does not seem worth the headache to optimize
1516 away those two bytes of space. */
1517 string = (char *) xmalloc (strlen (search->name)
1520 #ifdef EXTRA_SHLIB_EXTENSION
1521 + strlen (EXTRA_SHLIB_EXTENSION)
1523 + sizeof "/lib.so");
1525 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
1527 #ifdef EXTRA_SHLIB_EXTENSION
1528 /* Try the .so extension first. If that fails build a new filename
1529 using EXTRA_SHLIB_EXTENSION. */
1530 if (! ldfile_try_open_bfd (string, entry))
1532 sprintf (string, "%s/lib%s%s%s", search->name,
1533 filename, arch, EXTRA_SHLIB_EXTENSION);
1536 if (! ldfile_try_open_bfd (string, entry))
1541 #ifdef EXTRA_SHLIB_EXTENSION
1545 entry->filename = string;
1547 /* We have found a dynamic object to include in the link. The ELF
1548 backend linker will create a DT_NEEDED entry in the .dynamic
1549 section naming this file. If this file includes a DT_SONAME
1550 entry, it will be used. Otherwise, the ELF linker will just use
1551 the name of the file. For an archive found by searching, like
1552 this one, the DT_NEEDED entry should consist of just the name of
1553 the file, without the path information used to find it. Note
1554 that we only need to do this if we have a dynamic object; an
1555 archive will never be referenced by a DT_NEEDED entry.
1557 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
1558 very pretty. I haven't been able to think of anything that is
1560 if (bfd_check_format (entry->the_bfd, bfd_object)
1561 && (entry->the_bfd->flags & DYNAMIC) != 0)
1563 ASSERT (entry->is_archive && entry->search_dirs_flag);
1565 /* Rather than duplicating the logic above. Just use the
1566 filename we recorded earlier. */
1568 filename = lbasename (entry->filename);
1569 bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
1578 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
1581 /* A variant of lang_output_section_find used by place_orphan. */
1583 static lang_output_section_statement_type *
1584 output_rel_find (asection *sec, int isdyn)
1586 lang_output_section_statement_type *lookup;
1587 lang_output_section_statement_type *last = NULL;
1588 lang_output_section_statement_type *last_alloc = NULL;
1589 lang_output_section_statement_type *last_ro_alloc = NULL;
1590 lang_output_section_statement_type *last_rel = NULL;
1591 lang_output_section_statement_type *last_rel_alloc = NULL;
1592 int rela = sec->name[4] == 'a';
1594 for (lookup = &lang_output_section_statement.head->output_section_statement;
1596 lookup = lookup->next)
1598 if (lookup->constraint >= 0
1599 && CONST_STRNEQ (lookup->name, ".rel"))
1601 int lookrela = lookup->name[4] == 'a';
1603 /* .rel.dyn must come before all other reloc sections, to suit
1608 /* Don't place after .rel.plt as doing so results in wrong
1610 if (strcmp (".plt", lookup->name + 4 + lookrela) == 0)
1613 if (rela == lookrela || last_rel == NULL)
1615 if ((rela == lookrela || last_rel_alloc == NULL)
1616 && lookup->bfd_section != NULL
1617 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1618 last_rel_alloc = lookup;
1622 if (lookup->bfd_section != NULL
1623 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1625 last_alloc = lookup;
1626 if ((lookup->bfd_section->flags & SEC_READONLY) != 0)
1627 last_ro_alloc = lookup;
1632 return last_rel_alloc;
1638 return last_ro_alloc;
1646 /* Place an orphan section. We use this to put random SHF_ALLOC
1647 sections in the right segment. */
1649 static lang_output_section_statement_type *
1650 gld${EMULATION_NAME}_place_orphan (asection *s,
1651 const char *secname,
1654 static struct orphan_save hold[] =
1657 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1660 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1663 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1669 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1672 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1675 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_SMALL_DATA,
1681 enum orphan_save_index
1692 static int orphan_init_done = 0;
1693 struct orphan_save *place;
1694 lang_output_section_statement_type *after;
1695 lang_output_section_statement_type *os;
1697 int iself = s->owner->xvec->flavour == bfd_target_elf_flavour;
1698 unsigned int sh_type = iself ? elf_section_type (s) : SHT_NULL;
1700 if (! link_info.relocatable
1701 && link_info.combreloc
1702 && (s->flags & SEC_ALLOC))
1708 secname = ".rela.dyn";
1712 secname = ".rel.dyn";
1718 else if (CONST_STRNEQ (secname, ".rel"))
1720 secname = secname[4] == 'a' ? ".rela.dyn" : ".rel.dyn";
1725 /* Look through the script to see where to place this section. */
1726 if (constraint == 0)
1727 for (os = lang_output_section_find (secname);
1729 os = next_matching_output_section_statement (os, 0))
1731 /* If we don't match an existing output section, tell
1732 lang_insert_orphan to create a new output section. */
1733 constraint = SPECIAL;
1735 if (os->bfd_section != NULL
1736 && (os->bfd_section->flags == 0
1737 || (_bfd_elf_match_sections_by_type (link_info.output_bfd,
1740 && ((s->flags ^ os->bfd_section->flags)
1741 & (SEC_LOAD | SEC_ALLOC)) == 0)))
1743 /* We already have an output section statement with this
1744 name, and its bfd section has compatible flags.
1745 If the section already exists but does not have any flags
1746 set, then it has been created by the linker, probably as a
1747 result of a --section-start command line switch. */
1748 lang_add_section (&os->children, s, os);
1753 if (!orphan_init_done)
1755 lang_output_section_statement_type *lookup;
1756 struct orphan_save *ho;
1758 for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
1759 if (ho->name != NULL)
1761 ho->os = lang_output_section_find (ho->name);
1762 if (ho->os != NULL && ho->os->flags == 0)
1763 ho->os->flags = ho->flags;
1765 lookup = hold[orphan_bss].os;
1767 lookup = &lang_output_section_statement.head->output_section_statement;
1768 for (; lookup != NULL; lookup = lookup->next)
1769 if ((lookup->bfd_section != NULL
1770 && (lookup->bfd_section->flags & SEC_DEBUGGING) != 0)
1771 || strcmp (lookup->name, ".comment") == 0)
1773 hold[orphan_nonalloc].os = lookup ? lookup->prev : NULL;
1774 hold[orphan_nonalloc].name = ".comment";
1775 orphan_init_done = 1;
1778 /* If this is a final link, then always put .gnu.warning.SYMBOL
1779 sections into the .text section to get them out of the way. */
1780 if (link_info.executable
1781 && ! link_info.relocatable
1782 && CONST_STRNEQ (s->name, ".gnu.warning.")
1783 && hold[orphan_text].os != NULL)
1785 os = hold[orphan_text].os;
1786 lang_add_section (&os->children, s, os);
1790 /* Decide which segment the section should go in based on the
1791 section name and section flags. We put loadable .note sections
1792 right after the .interp section, so that the PT_NOTE segment is
1793 stored right after the program headers where the OS can read it
1794 in the first page. */
1797 if ((s->flags & (SEC_ALLOC | SEC_DEBUGGING)) == 0)
1798 place = &hold[orphan_nonalloc];
1799 else if ((s->flags & SEC_ALLOC) == 0)
1801 else if ((s->flags & SEC_LOAD) != 0
1802 && ((iself && sh_type == SHT_NOTE)
1803 || (!iself && CONST_STRNEQ (secname, ".note"))))
1804 place = &hold[orphan_interp];
1805 else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
1806 place = &hold[orphan_bss];
1807 else if ((s->flags & SEC_SMALL_DATA) != 0)
1808 place = &hold[orphan_sdata];
1809 else if ((s->flags & SEC_READONLY) == 0)
1810 place = &hold[orphan_data];
1811 else if (((iself && (sh_type == SHT_RELA || sh_type == SHT_REL))
1812 || (!iself && CONST_STRNEQ (secname, ".rel")))
1813 && (s->flags & SEC_LOAD) != 0)
1814 place = &hold[orphan_rel];
1815 else if ((s->flags & SEC_CODE) == 0)
1816 place = &hold[orphan_rodata];
1818 place = &hold[orphan_text];
1823 if (place->os == NULL)
1825 if (place->name != NULL)
1826 place->os = lang_output_section_find (place->name);
1828 place->os = output_rel_find (s, isdyn);
1832 after = lang_output_section_find_by_flags
1833 (s, &place->os, _bfd_elf_match_sections_by_type);
1835 /* *ABS* is always the first output section statement. */
1836 after = &lang_output_section_statement.head->output_section_statement;
1839 return lang_insert_orphan (s, secname, constraint, after, place, NULL, NULL);
1844 if test x"$LDEMUL_AFTER_ALLOCATION" != xgld"$EMULATION_NAME"_after_allocation; then
1848 gld${EMULATION_NAME}_after_allocation (void)
1850 bfd_boolean need_layout = bfd_elf_discard_info (link_info.output_bfd,
1852 gld${EMULATION_NAME}_map_segments (need_layout);
1857 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1861 gld${EMULATION_NAME}_get_script (int *isfile)
1864 if test -n "$COMPILE_IN"
1866 # Scripts compiled in.
1868 # sed commands to quote an ld script as a C string.
1869 sc="-f stringify.sed"
1875 if (link_info.relocatable && config.build_constructors)
1878 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1879 echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c
1880 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1881 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1882 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1883 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
1884 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1885 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1887 if test -n "$GENERATE_PIE_SCRIPT" ; then
1888 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1889 echo ' ; else if (link_info.pie && link_info.combreloc' >> e${EMULATION_NAME}.c
1890 echo ' && link_info.relro' >> e${EMULATION_NAME}.c
1891 echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1892 sed $sc ldscripts/${EMULATION_NAME}.xdw >> e${EMULATION_NAME}.c
1893 echo ' ; else if (link_info.pie && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1894 sed $sc ldscripts/${EMULATION_NAME}.xdc >> e${EMULATION_NAME}.c
1896 echo ' ; else if (link_info.pie) return' >> e${EMULATION_NAME}.c
1897 sed $sc ldscripts/${EMULATION_NAME}.xd >> e${EMULATION_NAME}.c
1899 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1900 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1901 echo ' ; else if (link_info.shared && link_info.combreloc' >> e${EMULATION_NAME}.c
1902 echo ' && link_info.relro' >> e${EMULATION_NAME}.c
1903 echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1904 sed $sc ldscripts/${EMULATION_NAME}.xsw >> e${EMULATION_NAME}.c
1905 echo ' ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1906 sed $sc ldscripts/${EMULATION_NAME}.xsc >> e${EMULATION_NAME}.c
1908 echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c
1909 sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
1911 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1912 echo ' ; else if (link_info.combreloc && link_info.relro' >> e${EMULATION_NAME}.c
1913 echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1914 sed $sc ldscripts/${EMULATION_NAME}.xw >> e${EMULATION_NAME}.c
1915 echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c
1916 sed $sc ldscripts/${EMULATION_NAME}.xc >> e${EMULATION_NAME}.c
1918 echo ' ; else return' >> e${EMULATION_NAME}.c
1919 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1920 echo '; }' >> e${EMULATION_NAME}.c
1923 # Scripts read from the filesystem.
1929 if (link_info.relocatable && config.build_constructors)
1930 return "ldscripts/${EMULATION_NAME}.xu";
1931 else if (link_info.relocatable)
1932 return "ldscripts/${EMULATION_NAME}.xr";
1933 else if (!config.text_read_only)
1934 return "ldscripts/${EMULATION_NAME}.xbn";
1936 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
1939 else if (!config.magic_demand_paged)
1940 return "ldscripts/${EMULATION_NAME}.xn";
1943 if test -n "$GENERATE_PIE_SCRIPT" ; then
1944 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1946 else if (link_info.pie && link_info.combreloc
1947 && link_info.relro && (link_info.flags & DF_BIND_NOW))
1948 return "ldscripts/${EMULATION_NAME}.xdw";
1949 else if (link_info.pie && link_info.combreloc)
1950 return "ldscripts/${EMULATION_NAME}.xdc";
1954 else if (link_info.pie)
1955 return "ldscripts/${EMULATION_NAME}.xd";
1958 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1959 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1961 else if (link_info.shared && link_info.combreloc
1962 && link_info.relro && (link_info.flags & DF_BIND_NOW))
1963 return "ldscripts/${EMULATION_NAME}.xsw";
1964 else if (link_info.shared && link_info.combreloc)
1965 return "ldscripts/${EMULATION_NAME}.xsc";
1969 else if (link_info.shared)
1970 return "ldscripts/${EMULATION_NAME}.xs";
1973 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1975 else if (link_info.combreloc && link_info.relro
1976 && (link_info.flags & DF_BIND_NOW))
1977 return "ldscripts/${EMULATION_NAME}.xw";
1978 else if (link_info.combreloc)
1979 return "ldscripts/${EMULATION_NAME}.xc";
1984 return "ldscripts/${EMULATION_NAME}.x";
1991 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1993 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1995 $PARSE_AND_LIST_PROLOGUE
2001 #define OPTION_DISABLE_NEW_DTAGS (400)
2002 #define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
2003 #define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
2004 #define OPTION_EH_FRAME_HDR (OPTION_GROUP + 1)
2005 #define OPTION_EXCLUDE_LIBS (OPTION_EH_FRAME_HDR + 1)
2006 #define OPTION_HASH_STYLE (OPTION_EXCLUDE_LIBS + 1)
2007 #define OPTION_BUILD_ID (OPTION_HASH_STYLE + 1)
2010 gld${EMULATION_NAME}_add_options
2011 (int ns, char **shortopts, int nl, struct option **longopts,
2012 int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
2014 static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:";
2015 static const struct option xtra_long[] = {
2016 {"build-id", optional_argument, NULL, OPTION_BUILD_ID},
2019 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2021 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
2022 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
2023 {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
2024 {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
2025 {"hash-style", required_argument, NULL, OPTION_HASH_STYLE},
2026 {"Bgroup", no_argument, NULL, OPTION_GROUP},
2030 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
2032 $PARSE_AND_LIST_LONGOPTS
2037 {NULL, no_argument, NULL, 0}
2040 *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
2041 memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
2042 *longopts = (struct option *)
2043 xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
2044 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
2047 #define DEFAULT_BUILD_ID_STYLE "sha1"
2050 gld${EMULATION_NAME}_handle_option (int optc)
2057 case OPTION_BUILD_ID:
2058 if (link_info.emit_note_gnu_build_id != NULL)
2060 free (link_info.emit_note_gnu_build_id);
2061 link_info.emit_note_gnu_build_id = NULL;
2064 optarg = DEFAULT_BUILD_ID_STYLE;
2065 if (strcmp (optarg, "none"))
2066 link_info.emit_note_gnu_build_id = xstrdup (optarg);
2071 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2073 case OPTION_DISABLE_NEW_DTAGS:
2074 link_info.new_dtags = FALSE;
2077 case OPTION_ENABLE_NEW_DTAGS:
2078 link_info.new_dtags = TRUE;
2081 case OPTION_EH_FRAME_HDR:
2082 link_info.eh_frame_hdr = TRUE;
2086 link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
2087 /* Groups must be self-contained. */
2088 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2089 link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
2092 case OPTION_EXCLUDE_LIBS:
2093 add_excluded_libs (optarg);
2096 case OPTION_HASH_STYLE:
2097 link_info.emit_hash = FALSE;
2098 link_info.emit_gnu_hash = FALSE;
2099 if (strcmp (optarg, "sysv") == 0)
2100 link_info.emit_hash = TRUE;
2101 else if (strcmp (optarg, "gnu") == 0)
2102 link_info.emit_gnu_hash = TRUE;
2103 else if (strcmp (optarg, "both") == 0)
2105 link_info.emit_hash = TRUE;
2106 link_info.emit_gnu_hash = TRUE;
2109 einfo (_("%P%F: invalid hash style \`%s'\n"), optarg);
2113 if (strcmp (optarg, "initfirst") == 0)
2114 link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
2115 else if (strcmp (optarg, "interpose") == 0)
2116 link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
2117 else if (strcmp (optarg, "loadfltr") == 0)
2118 link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
2119 else if (strcmp (optarg, "nodefaultlib") == 0)
2120 link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
2121 else if (strcmp (optarg, "nodelete") == 0)
2122 link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
2123 else if (strcmp (optarg, "nodlopen") == 0)
2124 link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
2125 else if (strcmp (optarg, "nodump") == 0)
2126 link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
2127 else if (strcmp (optarg, "now") == 0)
2129 link_info.flags |= (bfd_vma) DF_BIND_NOW;
2130 link_info.flags_1 |= (bfd_vma) DF_1_NOW;
2132 else if (strcmp (optarg, "lazy") == 0)
2134 link_info.flags &= ~(bfd_vma) DF_BIND_NOW;
2135 link_info.flags_1 &= ~(bfd_vma) DF_1_NOW;
2137 else if (strcmp (optarg, "origin") == 0)
2139 link_info.flags |= (bfd_vma) DF_ORIGIN;
2140 link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
2142 else if (strcmp (optarg, "defs") == 0)
2143 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2144 else if (strcmp (optarg, "muldefs") == 0)
2145 link_info.allow_multiple_definition = TRUE;
2146 else if (strcmp (optarg, "combreloc") == 0)
2147 link_info.combreloc = TRUE;
2148 else if (strcmp (optarg, "nocombreloc") == 0)
2149 link_info.combreloc = FALSE;
2150 else if (strcmp (optarg, "nocopyreloc") == 0)
2151 link_info.nocopyreloc = TRUE;
2152 else if (strcmp (optarg, "execstack") == 0)
2154 link_info.execstack = TRUE;
2155 link_info.noexecstack = FALSE;
2157 else if (strcmp (optarg, "noexecstack") == 0)
2159 link_info.noexecstack = TRUE;
2160 link_info.execstack = FALSE;
2164 if test -n "$COMMONPAGESIZE"; then
2166 else if (strcmp (optarg, "relro") == 0)
2167 link_info.relro = TRUE;
2168 else if (strcmp (optarg, "norelro") == 0)
2169 link_info.relro = FALSE;
2174 else if (CONST_STRNEQ (optarg, "max-page-size="))
2178 config.maxpagesize = strtoul (optarg + 14, &end, 0);
2179 if (*end || (config.maxpagesize & (config.maxpagesize - 1)) != 0)
2180 einfo (_("%P%F: invalid maxium page size \`%s'\n"),
2183 else if (CONST_STRNEQ (optarg, "common-page-size="))
2186 config.commonpagesize = strtoul (optarg + 17, &end, 0);
2188 || (config.commonpagesize & (config.commonpagesize - 1)) != 0)
2189 einfo (_("%P%F: invalid common page size \`%s'\n"),
2192 /* What about the other Solaris -z options? FIXME. */
2197 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
2199 $PARSE_AND_LIST_ARGS_CASES
2211 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
2215 gld${EMULATION_NAME}_list_options (FILE * file)
2218 --build-id[=STYLE] Generate build ID note\n"));
2221 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2224 -Bgroup Selects group name lookup rules for DSO\n"));
2226 --disable-new-dtags Disable new dynamic tags\n"));
2228 --enable-new-dtags Enable new dynamic tags\n"));
2230 --eh-frame-hdr Create .eh_frame_hdr section\n"));
2232 --hash-style=STYLE Set hash style to sysv, gnu or both\n"));
2234 -z combreloc Merge dynamic relocs into one section and sort\n"));
2236 -z defs Report unresolved symbols in object files.\n"));
2238 -z execstack Mark executable as requiring executable stack\n"));
2240 -z initfirst Mark DSO to be initialized first at runtime\n"));
2242 -z interpose Mark object to interpose all DSOs but executable\n"));
2244 -z lazy Mark object lazy runtime binding (default)\n"));
2246 -z loadfltr Mark object requiring immediate process\n"));
2248 -z muldefs Allow multiple definitions\n"));
2250 -z nocombreloc Don't merge dynamic relocs into one section\n"));
2252 -z nocopyreloc Don't create copy relocs\n"));
2254 -z nodefaultlib Mark object not to use default search paths\n"));
2256 -z nodelete Mark DSO non-deletable at runtime\n"));
2258 -z nodlopen Mark DSO not available to dlopen\n"));
2260 -z nodump Mark DSO not available to dldump\n"));
2262 -z noexecstack Mark executable as not requiring executable stack\n"));
2265 if test -n "$COMMONPAGESIZE"; then
2268 -z norelro Don't create RELRO program header\n"));
2274 -z now Mark object non-lazy runtime binding\n"));
2276 -z origin Mark object requiring immediate \$ORIGIN\n\
2277 processing at runtime\n"));
2280 if test -n "$COMMONPAGESIZE"; then
2283 -z relro Create RELRO program header\n"));
2289 -z max-page-size=SIZE Set maximum page size to SIZE\n"));
2291 -z common-page-size=SIZE Set common page size to SIZE\n"));
2293 -z KEYWORD Ignored for Solaris compatibility\n"));
2297 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
2299 $PARSE_AND_LIST_OPTIONS
2307 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
2309 $PARSE_AND_LIST_EPILOGUE
2315 #define gld${EMULATION_NAME}_add_options NULL
2316 #define gld${EMULATION_NAME}_handle_option NULL
2318 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
2320 #define gld${EMULATION_NAME}_list_options NULL
2327 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
2329 ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
2330 ${LDEMUL_SYSLIB-syslib_default},
2331 ${LDEMUL_HLL-hll_default},
2332 ${LDEMUL_AFTER_PARSE-after_parse_default},
2333 ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
2334 ${LDEMUL_AFTER_ALLOCATION-gld${EMULATION_NAME}_after_allocation},
2335 ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
2336 ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
2337 ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
2338 ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
2339 "${EMULATION_NAME}",
2341 ${LDEMUL_FINISH-finish_default},
2342 ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
2343 ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
2344 ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
2345 ${LDEMUL_SET_SYMBOLS-NULL},
2346 ${LDEMUL_PARSE_ARGS-NULL},
2347 gld${EMULATION_NAME}_add_options,
2348 gld${EMULATION_NAME}_handle_option,
2349 ${LDEMUL_UNRECOGNIZED_FILE-NULL},
2350 ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
2351 ${LDEMUL_RECOGNIZED_FILE-gld${EMULATION_NAME}_load_symbols},
2352 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
2353 ${LDEMUL_NEW_VERS_PATTERN-NULL}