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"
61 #include "filenames.h"
63 /* Declare functions used by various EXTRA_EM_FILEs. */
64 static void gld${EMULATION_NAME}_before_parse (void);
65 static void gld${EMULATION_NAME}_after_open (void);
66 static void gld${EMULATION_NAME}_before_allocation (void);
67 static void gld${EMULATION_NAME}_after_allocation (void);
68 static lang_output_section_statement_type *gld${EMULATION_NAME}_place_orphan
69 (asection *, const char *, int);
72 if [ "x${USE_LIBPATH}" = xyes ] ; then
74 *-*-linux-* | *-*-k*bsd*-*)
84 # Import any needed special functions and/or overrides.
86 source_em ${srcdir}/emultempl/elf-generic.em
87 if test -n "$EXTRA_EM_FILE" ; then
88 source_em ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
91 # Functions in this file can be overridden by setting the LDEMUL_* shell
92 # variables. If the name of the overriding function is the same as is
93 # defined in this file, then don't output this file's version.
94 # If a different overriding name is given then output the standard function
95 # as presumably it is called from the overriding function.
97 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
101 gld${EMULATION_NAME}_before_parse (void)
103 ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
104 config.dynamic_link = ${DYNAMIC_LINK-TRUE};
105 config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
111 if test x"$LDEMUL_RECOGNIZED_FILE" != xgld"${EMULATION_NAME}"_load_symbols; then
113 /* Handle the generation of DT_NEEDED tags. */
116 gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *entry)
120 /* Tell the ELF linker that we don't want the output file to have a
121 DT_NEEDED entry for this file, unless it is used to resolve
122 references in a regular object. */
123 if (entry->add_DT_NEEDED_for_regular)
124 link_class = DYN_AS_NEEDED;
126 /* Tell the ELF linker that we don't want the output file to have a
127 DT_NEEDED entry for any dynamic library in DT_NEEDED tags from
129 if (!entry->add_DT_NEEDED_for_dynamic)
130 link_class |= DYN_NO_ADD_NEEDED;
132 if (entry->just_syms_flag
133 && (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) != 0)
134 einfo (_("%P%F: --just-symbols may not be used on DSO: %B\n"),
138 || (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) == 0)
141 bfd_elf_set_dyn_lib_class (entry->the_bfd,
142 (enum dynamic_lib_link_class) link_class);
144 /* Continue on with normal load_symbols processing. */
152 /* These variables are required to pass information back and forth
153 between after_open and check_needed and stat_needed and vercheck. */
155 static struct bfd_link_needed_list *global_needed;
156 static struct stat global_stat;
157 static lang_input_statement_type *global_found;
158 static struct bfd_link_needed_list *global_vercheck_needed;
159 static bfd_boolean global_vercheck_failed;
161 /* These variables are used to implement target options */
163 static char *audit; /* colon (typically) separated list of libs */
164 static char *depaudit; /* colon (typically) separated list of libs */
166 /* On Linux, it's possible to have different versions of the same
167 shared library linked against different versions of libc. The
168 dynamic linker somehow tags which libc version to use in
169 /etc/ld.so.cache, and, based on the libc that it sees in the
170 executable, chooses which version of the shared library to use.
172 We try to do a similar check here by checking whether this shared
173 library needs any other shared libraries which may conflict with
174 libraries we have already included in the link. If it does, we
175 skip it, and try to find another shared library farther on down the
178 This is called via lang_for_each_input_file.
179 GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
180 which we are checking. This sets GLOBAL_VERCHECK_FAILED if we find
181 a conflicting version. */
184 gld${EMULATION_NAME}_vercheck (lang_input_statement_type *s)
187 struct bfd_link_needed_list *l;
189 if (global_vercheck_failed)
191 if (s->the_bfd == NULL
192 || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
195 soname = bfd_elf_get_dt_soname (s->the_bfd);
197 soname = lbasename (bfd_get_filename (s->the_bfd));
199 for (l = global_vercheck_needed; l != NULL; l = l->next)
203 if (strcmp (soname, l->name) == 0)
205 /* Probably can't happen, but it's an easy check. */
209 if (strchr (l->name, '/') != NULL)
212 suffix = strstr (l->name, ".so.");
216 suffix += sizeof ".so." - 1;
218 if (strncmp (soname, l->name, suffix - l->name) == 0)
220 /* Here we know that S is a dynamic object FOO.SO.VER1, and
221 the object we are considering needs a dynamic object
222 FOO.SO.VER2, and VER1 and VER2 are different. This
223 appears to be a version mismatch, so we tell the caller
224 to try a different version of this library. */
225 global_vercheck_failed = TRUE;
232 /* See if an input file matches a DT_NEEDED entry by running stat on
236 gld${EMULATION_NAME}_stat_needed (lang_input_statement_type *s)
242 if (global_found != NULL)
244 if (s->the_bfd == NULL)
247 /* If this input file was an as-needed entry, and wasn't found to be
248 needed at the stage it was linked, then don't say we have loaded it. */
249 if ((bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0)
252 if (bfd_stat (s->the_bfd, &st) != 0)
254 einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
258 /* Some operating systems, e.g. Windows, do not provide a meaningful
259 st_ino; they always set it to zero. (Windows does provide a
260 meaningful st_dev.) Do not indicate a duplicate library in that
261 case. While there is no guarantee that a system that provides
262 meaningful inode numbers will never set st_ino to zero, this is
263 merely an optimization, so we do not need to worry about false
265 if (st.st_dev == global_stat.st_dev
266 && st.st_ino == global_stat.st_ino
273 /* We issue a warning if it looks like we are including two
274 different versions of the same shared library. For example,
275 there may be a problem if -lc picks up libc.so.6 but some other
276 shared library has a DT_NEEDED entry of libc.so.5. This is a
277 heuristic test, and it will only work if the name looks like
278 NAME.so.VERSION. FIXME: Depending on file names is error-prone.
279 If we really want to issue warnings about mixing version numbers
280 of shared libraries, we need to find a better way. */
282 if (strchr (global_needed->name, '/') != NULL)
284 suffix = strstr (global_needed->name, ".so.");
287 suffix += sizeof ".so." - 1;
289 soname = bfd_elf_get_dt_soname (s->the_bfd);
291 soname = lbasename (s->filename);
293 if (strncmp (soname, global_needed->name, suffix - global_needed->name) == 0)
294 einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
295 global_needed->name, global_needed->by, soname);
304 /* This function is called for each possible name for a dynamic object
305 named by a DT_NEEDED entry. The FORCE parameter indicates whether
306 to skip the check for a conflicting version. */
309 gld${EMULATION_NAME}_try_needed (struct dt_needed *needed,
313 const char *name = needed->name;
317 abfd = bfd_openr (name, bfd_get_target (link_info.output_bfd));
320 if (! bfd_check_format (abfd, bfd_object))
325 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
331 /* For DT_NEEDED, they have to match. */
332 if (abfd->xvec != link_info.output_bfd->xvec)
338 /* Check whether this object would include any conflicting library
339 versions. If FORCE is set, then we skip this check; we use this
340 the second time around, if we couldn't find any compatible
341 instance of the shared library. */
345 struct bfd_link_needed_list *needs;
347 if (! bfd_elf_get_bfd_needed_list (abfd, &needs))
348 einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
352 global_vercheck_needed = needs;
353 global_vercheck_failed = FALSE;
354 lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
355 if (global_vercheck_failed)
358 /* Return FALSE to force the caller to move on to try
359 another file on the search path. */
363 /* But wait! It gets much worse. On Linux, if a shared
364 library does not use libc at all, we are supposed to skip
365 it the first time around in case we encounter a shared
366 library later on with the same name which does use the
367 version of libc that we want. This is much too horrible
368 to use on any system other than Linux. */
372 *-*-linux-* | *-*-k*bsd*-*)
375 struct bfd_link_needed_list *l;
377 for (l = needs; l != NULL; l = l->next)
378 if (CONST_STRNEQ (l->name, "libc.so"))
394 /* We've found a dynamic object matching the DT_NEEDED entry. */
396 /* We have already checked that there is no other input file of the
397 same name. We must now check again that we are not including the
398 same file twice. We need to do this because on many systems
399 libc.so is a symlink to, e.g., libc.so.1. The SONAME entry will
400 reference libc.so.1. If we have already included libc.so, we
401 don't want to include libc.so.1 if they are the same file, and we
402 can only check that using stat. */
404 if (bfd_stat (abfd, &global_stat) != 0)
405 einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
407 /* First strip off everything before the last '/'. */
408 soname = lbasename (abfd->filename);
410 if (trace_file_tries)
411 info_msg (_("found %s at %s\n"), soname, name);
414 lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
415 if (global_found != NULL)
417 /* Return TRUE to indicate that we found the file, even though
418 we aren't going to do anything with it. */
422 /* Specify the soname to use. */
423 bfd_elf_set_dt_needed_name (abfd, soname);
425 /* Tell the ELF linker that we don't want the output file to have a
426 DT_NEEDED entry for this file, unless it is used to resolve
427 references in a regular object. */
428 link_class = DYN_DT_NEEDED;
430 /* Tell the ELF linker that we don't want the output file to have a
431 DT_NEEDED entry for this file at all if the entry is from a file
432 with DYN_NO_ADD_NEEDED. */
433 if (needed->by != NULL
434 && (bfd_elf_get_dyn_lib_class (needed->by) & DYN_NO_ADD_NEEDED) != 0)
435 link_class |= DYN_NO_NEEDED | DYN_NO_ADD_NEEDED;
437 bfd_elf_set_dyn_lib_class (abfd, (enum dynamic_lib_link_class) link_class);
439 /* Add this file into the symbol table. */
440 if (! bfd_link_add_symbols (abfd, &link_info))
441 einfo ("%F%B: could not read symbols: %E\n", abfd);
447 /* Search for a needed file in a path. */
450 gld${EMULATION_NAME}_search_needed (const char *path,
451 struct dt_needed *n, int force)
454 const char *name = n->name;
456 struct dt_needed needed;
459 return gld${EMULATION_NAME}_try_needed (n, force);
461 if (path == NULL || *path == '\0')
465 needed.name = n->name;
470 char *filename, *sset;
472 s = strchr (path, config.rpath_separator);
474 s = path + strlen (path);
476 #if HAVE_DOS_BASED_FILE_SYSTEM
477 /* Assume a match on the second char is part of drive specifier. */
478 else if (config.rpath_separator == ':'
482 s = strchr (s + 1, config.rpath_separator);
484 s = path + strlen (path);
487 filename = (char *) xmalloc (s - path + len + 2);
492 memcpy (filename, path, s - path);
493 filename[s - path] = '/';
494 sset = filename + (s - path) + 1;
498 needed.name = filename;
499 if (gld${EMULATION_NAME}_try_needed (&needed, force))
513 if [ "x${USE_LIBPATH}" = xyes ] ; then
516 /* Add the sysroot to every entry in a path separated by
517 config.rpath_separator. */
520 gld${EMULATION_NAME}_add_sysroot (const char *path)
529 if (path[i++] == config.rpath_separator)
535 len = len + (colons + 1) * strlen (ld_sysroot);
536 ret = xmalloc (len + 1);
537 strcpy (ret, ld_sysroot);
538 p = ret + strlen (ret);
541 if (path[i] == config.rpath_separator)
544 strcpy (p, ld_sysroot);
556 *-*-freebsd* | *-*-dragonfly*)
558 /* Read the system search path the FreeBSD way rather than the Linux way. */
559 #ifdef HAVE_ELF_HINTS_H
560 #include <elf-hints.h>
562 #include "elf-hints-local.h"
566 gld${EMULATION_NAME}_check_ld_elf_hints (const char *name, int force)
568 static bfd_boolean initialized;
569 static char *ld_elf_hints;
570 struct dt_needed needed;
577 tmppath = concat (ld_sysroot, _PATH_ELF_HINTS, (const char *) NULL);
578 f = fopen (tmppath, FOPEN_RB);
582 struct elfhints_hdr hdr;
584 if (fread (&hdr, 1, sizeof (hdr), f) == sizeof (hdr)
585 && hdr.magic == ELFHINTS_MAGIC
588 if (fseek (f, hdr.strtab + hdr.dirlist, SEEK_SET) != -1)
592 b = xmalloc (hdr.dirlistlen + 1);
593 if (fread (b, 1, hdr.dirlistlen + 1, f) ==
595 ld_elf_hints = gld${EMULATION_NAME}_add_sysroot (b);
606 if (ld_elf_hints == NULL)
611 return gld${EMULATION_NAME}_search_needed (ld_elf_hints, & needed,
618 *-*-linux-* | *-*-k*bsd*-*)
620 /* For a native linker, check the file /etc/ld.so.conf for directories
621 in which we may find shared libraries. /etc/ld.so.conf is really
622 only meaningful on Linux. */
624 struct gld${EMULATION_NAME}_ld_so_conf
631 gld${EMULATION_NAME}_parse_ld_so_conf
632 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename);
635 gld${EMULATION_NAME}_parse_ld_so_conf_include
636 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename,
644 if (pattern[0] != '/')
646 char *p = strrchr (filename, '/');
647 size_t patlen = strlen (pattern) + 1;
649 newp = xmalloc (p - filename + 1 + patlen);
650 memcpy (newp, filename, p - filename + 1);
651 memcpy (newp + (p - filename + 1), pattern, patlen);
656 if (glob (pattern, 0, NULL, &gl) == 0)
660 for (i = 0; i < gl.gl_pathc; ++i)
661 gld${EMULATION_NAME}_parse_ld_so_conf (info, gl.gl_pathv[i]);
665 /* If we do not have glob, treat the pattern as a literal filename. */
666 gld${EMULATION_NAME}_parse_ld_so_conf (info, pattern);
674 gld${EMULATION_NAME}_parse_ld_so_conf
675 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename)
677 FILE *f = fopen (filename, FOPEN_RT);
685 line = xmalloc (linelen);
690 /* Normally this would use getline(3), but we need to be portable. */
691 while ((q = fgets (p, linelen - (p - line), f)) != NULL
692 && strlen (q) == linelen - (p - line) - 1
693 && line[linelen - 2] != '\n')
695 line = xrealloc (line, 2 * linelen);
696 p = line + linelen - 1;
700 if (q == NULL && p == line)
703 p = strchr (line, '\n');
707 /* Because the file format does not know any form of quoting we
708 can search forward for the next '#' character and if found
709 make it terminating the line. */
710 p = strchr (line, '#');
714 /* Remove leading whitespace. NUL is no whitespace character. */
716 while (*p == ' ' || *p == '\f' || *p == '\r' || *p == '\t' || *p == '\v')
719 /* If the line is blank it is ignored. */
723 if (CONST_STRNEQ (p, "include") && (p[7] == ' ' || p[7] == '\t'))
729 while (*p == ' ' || *p == '\t')
737 while (*p != ' ' && *p != '\t' && *p)
743 gld${EMULATION_NAME}_parse_ld_so_conf_include (info, filename,
751 while (*p && *p != '=' && *p != ' ' && *p != '\t' && *p != '\f'
752 && *p != '\r' && *p != '\v')
755 while (p != dir && p[-1] == '/')
757 if (info->path == NULL)
759 info->alloc = p - dir + 1 + 256;
760 info->path = xmalloc (info->alloc);
765 if (info->len + 1 + (p - dir) >= info->alloc)
767 info->alloc += p - dir + 256;
768 info->path = xrealloc (info->path, info->alloc);
770 info->path[info->len++] = config.rpath_separator;
772 memcpy (info->path + info->len, dir, p - dir);
773 info->len += p - dir;
774 info->path[info->len] = '\0';
784 gld${EMULATION_NAME}_check_ld_so_conf (const char *name, int force)
786 static bfd_boolean initialized;
787 static char *ld_so_conf;
788 struct dt_needed needed;
793 struct gld${EMULATION_NAME}_ld_so_conf info;
796 info.len = info.alloc = 0;
797 tmppath = concat (ld_sysroot, "${prefix}/etc/ld.so.conf",
798 (const char *) NULL);
799 if (!gld${EMULATION_NAME}_parse_ld_so_conf (&info, tmppath))
802 tmppath = concat (ld_sysroot, "/etc/ld.so.conf",
803 (const char *) NULL);
804 gld${EMULATION_NAME}_parse_ld_so_conf (&info, tmppath);
810 char *d = gld${EMULATION_NAME}_add_sysroot (info.path);
817 if (ld_so_conf == NULL)
823 return gld${EMULATION_NAME}_search_needed (ld_so_conf, &needed, force);
833 /* See if an input file matches a DT_NEEDED entry by name. */
836 gld${EMULATION_NAME}_check_needed (lang_input_statement_type *s)
840 /* Stop looking if we've found a loaded lib. */
841 if (global_found != NULL
842 && (bfd_elf_get_dyn_lib_class (global_found->the_bfd)
843 & DYN_AS_NEEDED) == 0)
846 if (s->filename == NULL || s->the_bfd == NULL)
849 /* Don't look for a second non-loaded as-needed lib. */
850 if (global_found != NULL
851 && (bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0)
854 if (strcmp (s->filename, global_needed->name) == 0)
860 if (s->search_dirs_flag)
862 const char *f = strrchr (s->filename, '/');
864 && strcmp (f + 1, global_needed->name) == 0)
871 soname = bfd_elf_get_dt_soname (s->the_bfd);
873 && strcmp (soname, global_needed->name) == 0)
882 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
886 gld${EMULATION_NAME}_id_note_section_size (bfd *abfd,
887 struct bfd_link_info *linfo)
889 const char *style = linfo->emit_note_gnu_build_id;
894 size = offsetof (Elf_External_Note, name[sizeof "GNU"]);
895 size = (size + 3) & -(bfd_size_type) 4;
897 if (!strcmp (style, "md5") || !strcmp (style, "uuid"))
899 else if (!strcmp (style, "sha1"))
901 else if (!strncmp (style, "0x", 2))
903 /* ID is in string form (hex). Convert to bits. */
904 const char *id = style + 2;
907 if (ISXDIGIT (id[0]) && ISXDIGIT (id[1]))
912 else if (*id == '-' || *id == ':')
919 } while (*id != '\0');
928 read_hex (const char xdigit)
930 if (ISDIGIT (xdigit))
932 if (ISUPPER (xdigit))
933 return xdigit - 'A' + 0xa;
934 if (ISLOWER (xdigit))
935 return xdigit - 'a' + 0xa;
947 gld${EMULATION_NAME}_write_build_id_section (bfd *abfd)
949 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
950 struct build_id_info *info = (struct build_id_info *)
951 elf_tdata (abfd)->after_write_object_contents_info;
953 Elf_Internal_Shdr *i_shdr;
954 unsigned char *contents, *id_bits;
956 Elf_External_Note *e_note;
959 if (bfd_is_abs_section (asec->output_section))
961 einfo (_("%P: warning: .note.gnu.build-id section discarded,"
962 " --build-id ignored.\n"));
965 i_shdr = &elf_section_data (asec->output_section)->this_hdr;
967 if (i_shdr->contents == NULL)
969 if (asec->contents == NULL)
970 asec->contents = (unsigned char *) xmalloc (asec->size);
971 contents = asec->contents;
974 contents = i_shdr->contents + asec->output_offset;
976 e_note = (Elf_External_Note *) contents;
977 size = offsetof (Elf_External_Note, name[sizeof "GNU"]);
978 size = (size + 3) & -(bfd_size_type) 4;
979 id_bits = contents + size;
980 size = asec->size - size;
982 bfd_h_put_32 (abfd, sizeof "GNU", &e_note->namesz);
983 bfd_h_put_32 (abfd, size, &e_note->descsz);
984 bfd_h_put_32 (abfd, NT_GNU_BUILD_ID, &e_note->type);
985 memcpy (e_note->name, "GNU", sizeof "GNU");
987 if (!strcmp (info->style, "md5"))
991 if (bed->s->checksum_contents (abfd,
992 (void (*) (const void *, size_t, void *))
995 md5_finish_ctx (&ctx, id_bits);
999 else if (!strcmp (info->style, "sha1"))
1001 struct sha1_ctx ctx;
1002 sha1_init_ctx (&ctx);
1003 if (bed->s->checksum_contents (abfd,
1004 (void (*) (const void *, size_t, void *))
1005 &sha1_process_bytes,
1007 sha1_finish_ctx (&ctx, id_bits);
1011 else if (!strcmp (info->style, "uuid"))
1014 int fd = open ("/dev/urandom", O_RDONLY);
1017 n = read (fd, id_bits, size);
1022 else if (!strncmp (info->style, "0x", 2))
1024 /* ID is in string form (hex). Convert to bits. */
1025 const char *id = info->style + 2;
1029 if (ISXDIGIT (id[0]) && ISXDIGIT (id[1]))
1031 id_bits[n] = read_hex (*id++) << 4;
1032 id_bits[n++] |= read_hex (*id++);
1034 else if (*id == '-' || *id == ':')
1037 abort (); /* Should have been validated earlier. */
1038 } while (*id != '\0');
1041 abort (); /* Should have been validated earlier. */
1044 return (bfd_seek (abfd,
1045 i_shdr->sh_offset + asec->output_offset, SEEK_SET) == 0
1046 && bfd_bwrite (contents, size, abfd) == size);
1050 /* This is called after all the input files have been opened. */
1053 gld${EMULATION_NAME}_after_open (void)
1055 struct bfd_link_needed_list *needed, *l;
1056 struct elf_link_hash_table *htab;
1058 htab = elf_hash_table (&link_info);
1059 if (!is_elf_hash_table (htab))
1062 if (link_info.emit_note_gnu_build_id)
1068 /* Find an ELF input. */
1069 for (abfd = link_info.input_bfds;
1070 abfd != (bfd *) NULL; abfd = abfd->link_next)
1071 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1076 /* PR 10555: If there are no input files do not
1077 try to create a .note.gnu-build-id section. */
1078 free (link_info.emit_note_gnu_build_id);
1079 link_info.emit_note_gnu_build_id = NULL;
1083 size = gld${EMULATION_NAME}_id_note_section_size (abfd, &link_info);
1086 einfo ("%P: warning: unrecognized --build-id style ignored.\n");
1087 free (link_info.emit_note_gnu_build_id);
1088 link_info.emit_note_gnu_build_id = NULL;
1092 s = bfd_make_section_with_flags (abfd, ".note.gnu.build-id",
1093 SEC_ALLOC | SEC_LOAD
1094 | SEC_IN_MEMORY | SEC_LINKER_CREATED
1095 | SEC_READONLY | SEC_DATA);
1096 if (s != NULL && bfd_set_section_alignment (abfd, s, 2))
1098 struct elf_obj_tdata *t = elf_tdata (link_info.output_bfd);
1099 struct build_id_info *b =
1100 (struct build_id_info *) xmalloc (sizeof *b);
1102 b->style = link_info.emit_note_gnu_build_id;
1104 elf_section_type (s) = SHT_NOTE;
1106 t->after_write_object_contents
1107 = &gld${EMULATION_NAME}_write_build_id_section;
1108 t->after_write_object_contents_info = b;
1112 einfo ("%P: warning: Cannot create .note.gnu.build-id section,"
1113 " --build-id ignored.\n");
1114 free (link_info.emit_note_gnu_build_id);
1115 link_info.emit_note_gnu_build_id = NULL;
1121 if (link_info.relocatable)
1124 if (link_info.eh_frame_hdr
1125 && !link_info.traditional_format)
1127 bfd *abfd, *elfbfd = NULL;
1128 bfd_boolean warn_eh_frame = FALSE;
1131 for (abfd = link_info.input_bfds; abfd; abfd = abfd->link_next)
1133 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1137 s = bfd_get_section_by_name (abfd, ".eh_frame");
1141 && !bfd_is_abs_section (s->output_section));
1143 if (elfbfd && warn_eh_frame)
1148 const struct elf_backend_data *bed;
1150 bed = get_elf_backend_data (elfbfd);
1151 s = bfd_make_section_with_flags (elfbfd, ".eh_frame_hdr",
1152 bed->dynamic_sec_flags
1155 && bfd_set_section_alignment (elfbfd, s, 2))
1157 htab->eh_info.hdr_sec = s;
1158 warn_eh_frame = FALSE;
1162 einfo ("%P: warning: Cannot create .eh_frame_hdr section,"
1163 " --eh-frame-hdr ignored.\n");
1166 /* Get the list of files which appear in DT_NEEDED entries in
1167 dynamic objects included in the link (often there will be none).
1168 For each such file, we want to track down the corresponding
1169 library, and include the symbol table in the link. This is what
1170 the runtime dynamic linker will do. Tracking the files down here
1171 permits one dynamic object to include another without requiring
1172 special action by the person doing the link. Note that the
1173 needed list can actually grow while we are stepping through this
1175 if (!link_info.executable)
1177 needed = bfd_elf_get_needed_list (link_info.output_bfd, &link_info);
1178 for (l = needed; l != NULL; l = l->next)
1180 struct bfd_link_needed_list *ll;
1181 struct dt_needed n, nn;
1184 /* If the lib that needs this one was --as-needed and wasn't
1185 found to be needed, then this lib isn't needed either. */
1187 && (bfd_elf_get_dyn_lib_class (l->by) & DYN_AS_NEEDED) != 0)
1190 /* If we've already seen this file, skip it. */
1191 for (ll = needed; ll != l; ll = ll->next)
1193 || (bfd_elf_get_dyn_lib_class (ll->by) & DYN_AS_NEEDED) == 0)
1194 && strcmp (ll->name, l->name) == 0)
1199 /* See if this file was included in the link explicitly. */
1201 global_found = NULL;
1202 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
1203 if (global_found != NULL
1204 && (bfd_elf_get_dyn_lib_class (global_found->the_bfd)
1205 & DYN_AS_NEEDED) == 0)
1211 if (trace_file_tries)
1212 info_msg (_("%s needed by %B\n"), l->name, l->by);
1214 /* As-needed libs specified on the command line (or linker script)
1215 take priority over libs found in search dirs. */
1216 if (global_found != NULL)
1218 nn.name = global_found->filename;
1219 if (gld${EMULATION_NAME}_try_needed (&nn, TRUE))
1223 /* We need to find this file and include the symbol table. We
1224 want to search for the file in the same way that the dynamic
1225 linker will search. That means that we want to use
1226 rpath_link, rpath, then the environment variable
1227 LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
1228 entries (native only), then the linker script LIB_SEARCH_DIRS.
1229 We do not search using the -L arguments.
1231 We search twice. The first time, we skip objects which may
1232 introduce version mismatches. The second time, we force
1233 their use. See gld${EMULATION_NAME}_vercheck comment. */
1234 for (force = 0; force < 2; force++)
1237 search_dirs_type *search;
1239 if [ "x${NATIVE}" = xyes ] ; then
1241 const char *lib_path;
1244 if [ "x${USE_LIBPATH}" = xyes ] ; then
1246 struct bfd_link_needed_list *rp;
1252 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
1256 if [ "x${USE_LIBPATH}" = xyes ] ; then
1258 if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
1263 if [ "x${NATIVE}" = xyes ] ; then
1265 if (command_line.rpath_link == NULL
1266 && command_line.rpath == NULL)
1268 lib_path = (const char *) getenv ("LD_RUN_PATH");
1269 if (gld${EMULATION_NAME}_search_needed (lib_path, &n,
1273 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
1274 if (gld${EMULATION_NAME}_search_needed (lib_path, &n, force))
1278 if [ "x${USE_LIBPATH}" = xyes ] ; then
1281 rp = bfd_elf_get_runpath_list (link_info.output_bfd, &link_info);
1282 for (; !found && rp != NULL; rp = rp->next)
1284 char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
1285 found = (rp->by == l->by
1286 && gld${EMULATION_NAME}_search_needed (tmpname,
1296 if [ "x${USE_LIBPATH}" = xyes ] ; then
1298 *-*-freebsd* | *-*-dragonfly*)
1300 if (gld${EMULATION_NAME}_check_ld_elf_hints (l->name, force))
1306 *-*-linux-* | *-*-k*bsd*-*)
1309 if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
1317 len = strlen (l->name);
1318 for (search = search_head; search != NULL; search = search->next)
1322 if (search->cmdline)
1324 filename = (char *) xmalloc (strlen (search->name) + len + 2);
1325 sprintf (filename, "%s/%s", search->name, l->name);
1327 if (gld${EMULATION_NAME}_try_needed (&nn, force))
1340 einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
1350 /* Look through an expression for an assignment statement. */
1353 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
1355 bfd_boolean provide = FALSE;
1357 switch (exp->type.node_class)
1360 case etree_provided:
1364 /* We call record_link_assignment even if the symbol is defined.
1365 This is because if it is defined by a dynamic object, we
1366 actually want to use the value defined by the linker script,
1367 not the value from the dynamic object (because we are setting
1368 symbols like etext). If the symbol is defined by a regular
1369 object, then, as it happens, calling record_link_assignment
1371 if (strcmp (exp->assign.dst, ".") != 0)
1373 if (!bfd_elf_record_link_assignment (link_info.output_bfd,
1375 exp->assign.dst, provide,
1376 exp->assign.hidden))
1377 einfo ("%P%F: failed to record assignment to %s: %E\n",
1380 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1384 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1385 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1389 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1390 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1391 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1395 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1404 /* This is called by the before_allocation routine via
1405 lang_for_each_statement. It locates any assignment statements, and
1406 tells the ELF backend about them, in case they are assignments to
1407 symbols which are referred to by dynamic objects. */
1410 gld${EMULATION_NAME}_find_statement_assignment (lang_statement_union_type *s)
1412 if (s->header.type == lang_assignment_statement_enum)
1413 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1418 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
1419 if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
1420 ELF_INTERPRETER_SET_DEFAULT="
1421 if (sinterp != NULL)
1423 sinterp->contents = (unsigned char *) ${ELF_INTERPRETER_NAME};
1424 sinterp->size = strlen ((char *) sinterp->contents) + 1;
1429 ELF_INTERPRETER_SET_DEFAULT=
1433 /* used by before_allocation and handle_option. */
1435 gld${EMULATION_NAME}_append_to_separated_string (char **to, char *op_arg)
1438 *to = xstrdup (op_arg);
1441 size_t to_len = strlen (*to);
1442 size_t op_arg_len = strlen (op_arg);
1446 /* First see whether OPTARG is already in the path. */
1449 if (strncmp (op_arg, cp, op_arg_len) == 0
1450 && (cp[op_arg_len] == 0
1451 || cp[op_arg_len] == config.rpath_separator))
1455 /* Not yet found. */
1456 cp = strchr (cp, config.rpath_separator);
1464 buf = xmalloc (to_len + op_arg_len + 2);
1465 sprintf (buf, "%s%c%s", *to,
1466 config.rpath_separator, op_arg);
1473 /* This is called after the sections have been attached to output
1474 sections, but before any sizes or addresses have been set. */
1477 gld${EMULATION_NAME}_before_allocation (void)
1483 if (link_info.hash->type == bfd_link_elf_hash_table)
1484 _bfd_elf_tls_setup (link_info.output_bfd, &link_info);
1486 /* If we are going to make any variable assignments, we need to let
1487 the ELF backend know about them in case the variables are
1488 referred to by dynamic objects. */
1489 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
1491 /* Let the ELF backend work out the sizes of any sections required
1492 by dynamic linking. */
1493 rpath = command_line.rpath;
1495 rpath = (const char *) getenv ("LD_RUN_PATH");
1497 for (abfd = link_info.input_bfds; abfd; abfd = abfd->link_next)
1498 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1500 const char *audit_libs = elf_dt_audit (abfd);
1502 /* If the input bfd contains an audit entry, we need to add it as
1503 a dep audit entry. */
1504 if (audit_libs && *audit_libs != '\0')
1506 char *cp = xstrdup (audit_libs);
1510 char *cp2 = strchr (cp, config.rpath_separator);
1518 if (cp != NULL && *cp != '\0')
1519 gld${EMULATION_NAME}_append_to_separated_string (&depaudit, cp);
1521 cp = more ? ++cp2 : NULL;
1527 if (! (bfd_elf_size_dynamic_sections
1528 (link_info.output_bfd, command_line.soname, rpath,
1529 command_line.filter_shlib, audit, depaudit,
1530 (const char * const *) command_line.auxiliary_filters,
1531 &link_info, &sinterp, lang_elf_version_info)))
1532 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1534 ${ELF_INTERPRETER_SET_DEFAULT}
1535 /* Let the user override the dynamic linker we are using. */
1536 if (command_line.interpreter != NULL
1539 sinterp->contents = (bfd_byte *) command_line.interpreter;
1540 sinterp->size = strlen (command_line.interpreter) + 1;
1543 /* Look for any sections named .gnu.warning. As a GNU extensions,
1544 we treat such sections as containing warning messages. We print
1545 out the warning message, and then zero out the section size so
1546 that it does not get copied into the output file. */
1549 LANG_FOR_EACH_INPUT_STATEMENT (is)
1556 if (is->just_syms_flag)
1559 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
1564 msg = (char *) xmalloc ((size_t) (sz + 1));
1565 if (! bfd_get_section_contents (is->the_bfd, s, msg,
1567 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
1570 ret = link_info.callbacks->warning (&link_info, msg,
1571 (const char *) NULL,
1572 is->the_bfd, (asection *) NULL,
1577 /* Clobber the section size, so that we don't waste space
1578 copying the warning into the output file. If we've already
1579 sized the output section, adjust its size. The adjustment
1580 is on rawsize because targets that size sections early will
1581 have called lang_reset_memory_regions after sizing. */
1582 if (s->output_section != NULL
1583 && s->output_section->rawsize >= s->size)
1584 s->output_section->rawsize -= s->size;
1588 /* Also set SEC_EXCLUDE, so that local symbols defined in the
1589 warning section don't get copied to the output. */
1590 s->flags |= SEC_EXCLUDE | SEC_KEEP;
1594 before_allocation_default ();
1596 if (!bfd_elf_size_dynsym_hash_dynstr (link_info.output_bfd, &link_info))
1597 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1603 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
1606 /* Try to open a dynamic archive. This is where we know that ELF
1607 dynamic libraries have an extension of .so (or .sl on oddball systems
1611 gld${EMULATION_NAME}_open_dynamic_archive
1612 (const char *arch, search_dirs_type *search, lang_input_statement_type *entry)
1614 const char *filename;
1617 if (! entry->is_archive)
1620 filename = entry->filename;
1622 /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
1623 is defined, but it does not seem worth the headache to optimize
1624 away those two bytes of space. */
1625 string = (char *) xmalloc (strlen (search->name)
1628 #ifdef EXTRA_SHLIB_EXTENSION
1629 + strlen (EXTRA_SHLIB_EXTENSION)
1631 + sizeof "/lib.so");
1633 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
1635 #ifdef EXTRA_SHLIB_EXTENSION
1636 /* Try the .so extension first. If that fails build a new filename
1637 using EXTRA_SHLIB_EXTENSION. */
1638 if (! ldfile_try_open_bfd (string, entry))
1640 sprintf (string, "%s/lib%s%s%s", search->name,
1641 filename, arch, EXTRA_SHLIB_EXTENSION);
1644 if (! ldfile_try_open_bfd (string, entry))
1649 #ifdef EXTRA_SHLIB_EXTENSION
1653 entry->filename = string;
1655 /* We have found a dynamic object to include in the link. The ELF
1656 backend linker will create a DT_NEEDED entry in the .dynamic
1657 section naming this file. If this file includes a DT_SONAME
1658 entry, it will be used. Otherwise, the ELF linker will just use
1659 the name of the file. For an archive found by searching, like
1660 this one, the DT_NEEDED entry should consist of just the name of
1661 the file, without the path information used to find it. Note
1662 that we only need to do this if we have a dynamic object; an
1663 archive will never be referenced by a DT_NEEDED entry.
1665 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
1666 very pretty. I haven't been able to think of anything that is
1668 if (bfd_check_format (entry->the_bfd, bfd_object)
1669 && (entry->the_bfd->flags & DYNAMIC) != 0)
1671 ASSERT (entry->is_archive && entry->search_dirs_flag);
1673 /* Rather than duplicating the logic above. Just use the
1674 filename we recorded earlier. */
1676 filename = lbasename (entry->filename);
1677 bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
1686 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
1689 /* A variant of lang_output_section_find used by place_orphan. */
1691 static lang_output_section_statement_type *
1692 output_rel_find (asection *sec, int isdyn)
1694 lang_output_section_statement_type *lookup;
1695 lang_output_section_statement_type *last = NULL;
1696 lang_output_section_statement_type *last_alloc = NULL;
1697 lang_output_section_statement_type *last_ro_alloc = NULL;
1698 lang_output_section_statement_type *last_rel = NULL;
1699 lang_output_section_statement_type *last_rel_alloc = NULL;
1700 int rela = sec->name[4] == 'a';
1702 for (lookup = &lang_output_section_statement.head->output_section_statement;
1704 lookup = lookup->next)
1706 if (lookup->constraint >= 0
1707 && CONST_STRNEQ (lookup->name, ".rel"))
1709 int lookrela = lookup->name[4] == 'a';
1711 /* .rel.dyn must come before all other reloc sections, to suit
1716 /* Don't place after .rel.plt as doing so results in wrong
1718 if (strcmp (".plt", lookup->name + 4 + lookrela) == 0)
1721 if (rela == lookrela || last_rel == NULL)
1723 if ((rela == lookrela || last_rel_alloc == NULL)
1724 && lookup->bfd_section != NULL
1725 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1726 last_rel_alloc = lookup;
1730 if (lookup->bfd_section != NULL
1731 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1733 last_alloc = lookup;
1734 if ((lookup->bfd_section->flags & SEC_READONLY) != 0)
1735 last_ro_alloc = lookup;
1740 return last_rel_alloc;
1746 return last_ro_alloc;
1754 /* Place an orphan section. We use this to put random SHF_ALLOC
1755 sections in the right segment. */
1757 static lang_output_section_statement_type *
1758 gld${EMULATION_NAME}_place_orphan (asection *s,
1759 const char *secname,
1762 static struct orphan_save hold[] =
1765 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1768 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1771 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1777 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1780 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1783 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_SMALL_DATA,
1789 enum orphan_save_index
1800 static int orphan_init_done = 0;
1801 struct orphan_save *place;
1802 lang_output_section_statement_type *after;
1803 lang_output_section_statement_type *os;
1804 lang_output_section_statement_type *match_by_name = NULL;
1806 int iself = s->owner->xvec->flavour == bfd_target_elf_flavour;
1807 unsigned int sh_type = iself ? elf_section_type (s) : SHT_NULL;
1809 if (! link_info.relocatable
1810 && link_info.combreloc
1811 && (s->flags & SEC_ALLOC))
1817 secname = ".rela.dyn";
1821 secname = ".rel.dyn";
1827 else if (CONST_STRNEQ (secname, ".rel"))
1829 secname = secname[4] == 'a' ? ".rela.dyn" : ".rel.dyn";
1834 /* Look through the script to see where to place this section. */
1835 if (constraint == 0)
1836 for (os = lang_output_section_find (secname);
1838 os = next_matching_output_section_statement (os, 0))
1840 /* If we don't match an existing output section, tell
1841 lang_insert_orphan to create a new output section. */
1842 constraint = SPECIAL;
1844 if (os->bfd_section != NULL
1845 && (os->bfd_section->flags == 0
1846 || (_bfd_elf_match_sections_by_type (link_info.output_bfd,
1849 && ((s->flags ^ os->bfd_section->flags)
1850 & (SEC_LOAD | SEC_ALLOC)) == 0)))
1852 /* We already have an output section statement with this
1853 name, and its bfd section has compatible flags.
1854 If the section already exists but does not have any flags
1855 set, then it has been created by the linker, probably as a
1856 result of a --section-start command line switch. */
1857 lang_add_section (&os->children, s, os);
1861 /* Save unused output sections in case we can match them
1862 against orphans later. */
1863 if (os->bfd_section == NULL)
1867 /* If we didn't match an active output section, see if we matched an
1868 unused one and use that. */
1871 lang_add_section (&match_by_name->children, s, match_by_name);
1872 return match_by_name;
1875 if (!orphan_init_done)
1877 lang_output_section_statement_type *lookup;
1878 struct orphan_save *ho;
1880 for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
1881 if (ho->name != NULL)
1883 ho->os = lang_output_section_find (ho->name);
1884 if (ho->os != NULL && ho->os->flags == 0)
1885 ho->os->flags = ho->flags;
1887 lookup = hold[orphan_bss].os;
1889 lookup = &lang_output_section_statement.head->output_section_statement;
1890 for (; lookup != NULL; lookup = lookup->next)
1891 if ((lookup->bfd_section != NULL
1892 && (lookup->bfd_section->flags & SEC_DEBUGGING) != 0)
1893 || strcmp (lookup->name, ".comment") == 0)
1895 hold[orphan_nonalloc].os = lookup ? lookup->prev : NULL;
1896 hold[orphan_nonalloc].name = ".comment";
1897 orphan_init_done = 1;
1900 /* If this is a final link, then always put .gnu.warning.SYMBOL
1901 sections into the .text section to get them out of the way. */
1902 if (link_info.executable
1903 && ! link_info.relocatable
1904 && CONST_STRNEQ (s->name, ".gnu.warning.")
1905 && hold[orphan_text].os != NULL)
1907 os = hold[orphan_text].os;
1908 lang_add_section (&os->children, s, os);
1912 /* Decide which segment the section should go in based on the
1913 section name and section flags. We put loadable .note sections
1914 right after the .interp section, so that the PT_NOTE segment is
1915 stored right after the program headers where the OS can read it
1916 in the first page. */
1919 if ((s->flags & (SEC_ALLOC | SEC_DEBUGGING)) == 0)
1920 place = &hold[orphan_nonalloc];
1921 else if ((s->flags & SEC_ALLOC) == 0)
1923 else if ((s->flags & SEC_LOAD) != 0
1924 && ((iself && sh_type == SHT_NOTE)
1925 || (!iself && CONST_STRNEQ (secname, ".note"))))
1926 place = &hold[orphan_interp];
1927 else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
1928 place = &hold[orphan_bss];
1929 else if ((s->flags & SEC_SMALL_DATA) != 0)
1930 place = &hold[orphan_sdata];
1931 else if ((s->flags & SEC_READONLY) == 0)
1932 place = &hold[orphan_data];
1933 else if (((iself && (sh_type == SHT_RELA || sh_type == SHT_REL))
1934 || (!iself && CONST_STRNEQ (secname, ".rel")))
1935 && (s->flags & SEC_LOAD) != 0)
1936 place = &hold[orphan_rel];
1937 else if ((s->flags & SEC_CODE) == 0)
1938 place = &hold[orphan_rodata];
1940 place = &hold[orphan_text];
1945 if (place->os == NULL)
1947 if (place->name != NULL)
1948 place->os = lang_output_section_find (place->name);
1950 place->os = output_rel_find (s, isdyn);
1954 after = lang_output_section_find_by_flags
1955 (s, &place->os, _bfd_elf_match_sections_by_type);
1957 /* *ABS* is always the first output section statement. */
1958 after = &lang_output_section_statement.head->output_section_statement;
1961 return lang_insert_orphan (s, secname, constraint, after, place, NULL, NULL);
1966 if test x"$LDEMUL_AFTER_ALLOCATION" != xgld"$EMULATION_NAME"_after_allocation; then
1970 gld${EMULATION_NAME}_after_allocation (void)
1972 bfd_boolean need_layout = bfd_elf_discard_info (link_info.output_bfd,
1974 gld${EMULATION_NAME}_map_segments (need_layout);
1979 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1983 gld${EMULATION_NAME}_get_script (int *isfile)
1986 if test -n "$COMPILE_IN"
1988 # Scripts compiled in.
1990 # sed commands to quote an ld script as a C string.
1991 sc="-f stringify.sed"
1997 if (link_info.relocatable && config.build_constructors)
2000 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
2001 echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c
2002 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
2003 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
2004 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
2005 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
2006 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
2007 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
2009 if test -n "$GENERATE_PIE_SCRIPT" ; then
2010 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2011 echo ' ; else if (link_info.pie && link_info.combreloc' >> e${EMULATION_NAME}.c
2012 echo ' && link_info.relro' >> e${EMULATION_NAME}.c
2013 echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
2014 sed $sc ldscripts/${EMULATION_NAME}.xdw >> e${EMULATION_NAME}.c
2015 echo ' ; else if (link_info.pie && link_info.combreloc) return' >> e${EMULATION_NAME}.c
2016 sed $sc ldscripts/${EMULATION_NAME}.xdc >> e${EMULATION_NAME}.c
2018 echo ' ; else if (link_info.pie) return' >> e${EMULATION_NAME}.c
2019 sed $sc ldscripts/${EMULATION_NAME}.xd >> e${EMULATION_NAME}.c
2021 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
2022 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2023 echo ' ; else if (link_info.shared && link_info.combreloc' >> e${EMULATION_NAME}.c
2024 echo ' && link_info.relro' >> e${EMULATION_NAME}.c
2025 echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
2026 sed $sc ldscripts/${EMULATION_NAME}.xsw >> e${EMULATION_NAME}.c
2027 echo ' ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
2028 sed $sc ldscripts/${EMULATION_NAME}.xsc >> e${EMULATION_NAME}.c
2030 echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c
2031 sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
2033 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2034 echo ' ; else if (link_info.combreloc && link_info.relro' >> e${EMULATION_NAME}.c
2035 echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
2036 sed $sc ldscripts/${EMULATION_NAME}.xw >> e${EMULATION_NAME}.c
2037 echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c
2038 sed $sc ldscripts/${EMULATION_NAME}.xc >> e${EMULATION_NAME}.c
2040 echo ' ; else return' >> e${EMULATION_NAME}.c
2041 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
2042 echo '; }' >> e${EMULATION_NAME}.c
2045 # Scripts read from the filesystem.
2051 if (link_info.relocatable && config.build_constructors)
2052 return "ldscripts/${EMULATION_NAME}.xu";
2053 else if (link_info.relocatable)
2054 return "ldscripts/${EMULATION_NAME}.xr";
2055 else if (!config.text_read_only)
2056 return "ldscripts/${EMULATION_NAME}.xbn";
2058 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
2061 else if (!config.magic_demand_paged)
2062 return "ldscripts/${EMULATION_NAME}.xn";
2065 if test -n "$GENERATE_PIE_SCRIPT" ; then
2066 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2068 else if (link_info.pie && link_info.combreloc
2069 && link_info.relro && (link_info.flags & DF_BIND_NOW))
2070 return "ldscripts/${EMULATION_NAME}.xdw";
2071 else if (link_info.pie && link_info.combreloc)
2072 return "ldscripts/${EMULATION_NAME}.xdc";
2076 else if (link_info.pie)
2077 return "ldscripts/${EMULATION_NAME}.xd";
2080 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
2081 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2083 else if (link_info.shared && link_info.combreloc
2084 && link_info.relro && (link_info.flags & DF_BIND_NOW))
2085 return "ldscripts/${EMULATION_NAME}.xsw";
2086 else if (link_info.shared && link_info.combreloc)
2087 return "ldscripts/${EMULATION_NAME}.xsc";
2091 else if (link_info.shared)
2092 return "ldscripts/${EMULATION_NAME}.xs";
2095 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2097 else if (link_info.combreloc && link_info.relro
2098 && (link_info.flags & DF_BIND_NOW))
2099 return "ldscripts/${EMULATION_NAME}.xw";
2100 else if (link_info.combreloc)
2101 return "ldscripts/${EMULATION_NAME}.xc";
2106 return "ldscripts/${EMULATION_NAME}.x";
2113 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2115 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
2117 $PARSE_AND_LIST_PROLOGUE
2123 #define OPTION_DISABLE_NEW_DTAGS (400)
2124 #define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
2125 #define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
2126 #define OPTION_EH_FRAME_HDR (OPTION_GROUP + 1)
2127 #define OPTION_EXCLUDE_LIBS (OPTION_EH_FRAME_HDR + 1)
2128 #define OPTION_HASH_STYLE (OPTION_EXCLUDE_LIBS + 1)
2129 #define OPTION_BUILD_ID (OPTION_HASH_STYLE + 1)
2130 #define OPTION_AUDIT (OPTION_BUILD_ID + 1)
2133 gld${EMULATION_NAME}_add_options
2134 (int ns, char **shortopts, int nl, struct option **longopts,
2135 int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
2137 static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:P:";
2138 static const struct option xtra_long[] = {
2139 {"build-id", optional_argument, NULL, OPTION_BUILD_ID},
2140 {"audit", required_argument, NULL, OPTION_AUDIT},
2141 {"depaudit", required_argument, NULL, 'P'},
2144 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2146 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
2147 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
2148 {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
2149 {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
2150 {"hash-style", required_argument, NULL, OPTION_HASH_STYLE},
2151 {"Bgroup", no_argument, NULL, OPTION_GROUP},
2155 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
2157 $PARSE_AND_LIST_LONGOPTS
2162 {NULL, no_argument, NULL, 0}
2165 *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
2166 memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
2167 *longopts = (struct option *)
2168 xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
2169 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
2172 #define DEFAULT_BUILD_ID_STYLE "sha1"
2175 gld${EMULATION_NAME}_handle_option (int optc)
2182 case OPTION_BUILD_ID:
2183 if (link_info.emit_note_gnu_build_id != NULL)
2185 free (link_info.emit_note_gnu_build_id);
2186 link_info.emit_note_gnu_build_id = NULL;
2189 optarg = DEFAULT_BUILD_ID_STYLE;
2190 if (strcmp (optarg, "none"))
2191 link_info.emit_note_gnu_build_id = xstrdup (optarg);
2194 gld${EMULATION_NAME}_append_to_separated_string (&audit, optarg);
2197 gld${EMULATION_NAME}_append_to_separated_string (&depaudit, optarg);
2202 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2204 case OPTION_DISABLE_NEW_DTAGS:
2205 link_info.new_dtags = FALSE;
2208 case OPTION_ENABLE_NEW_DTAGS:
2209 link_info.new_dtags = TRUE;
2212 case OPTION_EH_FRAME_HDR:
2213 link_info.eh_frame_hdr = TRUE;
2217 link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
2218 /* Groups must be self-contained. */
2219 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2220 link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
2223 case OPTION_EXCLUDE_LIBS:
2224 add_excluded_libs (optarg);
2227 case OPTION_HASH_STYLE:
2228 link_info.emit_hash = FALSE;
2229 link_info.emit_gnu_hash = FALSE;
2230 if (strcmp (optarg, "sysv") == 0)
2231 link_info.emit_hash = TRUE;
2232 else if (strcmp (optarg, "gnu") == 0)
2233 link_info.emit_gnu_hash = TRUE;
2234 else if (strcmp (optarg, "both") == 0)
2236 link_info.emit_hash = TRUE;
2237 link_info.emit_gnu_hash = TRUE;
2240 einfo (_("%P%F: invalid hash style \`%s'\n"), optarg);
2244 if (strcmp (optarg, "initfirst") == 0)
2245 link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
2246 else if (strcmp (optarg, "interpose") == 0)
2247 link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
2248 else if (strcmp (optarg, "loadfltr") == 0)
2249 link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
2250 else if (strcmp (optarg, "nodefaultlib") == 0)
2251 link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
2252 else if (strcmp (optarg, "nodelete") == 0)
2253 link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
2254 else if (strcmp (optarg, "nodlopen") == 0)
2255 link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
2256 else if (strcmp (optarg, "nodump") == 0)
2257 link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
2258 else if (strcmp (optarg, "now") == 0)
2260 link_info.flags |= (bfd_vma) DF_BIND_NOW;
2261 link_info.flags_1 |= (bfd_vma) DF_1_NOW;
2263 else if (strcmp (optarg, "lazy") == 0)
2265 link_info.flags &= ~(bfd_vma) DF_BIND_NOW;
2266 link_info.flags_1 &= ~(bfd_vma) DF_1_NOW;
2268 else if (strcmp (optarg, "origin") == 0)
2270 link_info.flags |= (bfd_vma) DF_ORIGIN;
2271 link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
2273 else if (strcmp (optarg, "defs") == 0)
2274 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2275 else if (strcmp (optarg, "muldefs") == 0)
2276 link_info.allow_multiple_definition = TRUE;
2277 else if (strcmp (optarg, "combreloc") == 0)
2278 link_info.combreloc = TRUE;
2279 else if (strcmp (optarg, "nocombreloc") == 0)
2280 link_info.combreloc = FALSE;
2281 else if (strcmp (optarg, "nocopyreloc") == 0)
2282 link_info.nocopyreloc = TRUE;
2283 else if (strcmp (optarg, "execstack") == 0)
2285 link_info.execstack = TRUE;
2286 link_info.noexecstack = FALSE;
2288 else if (strcmp (optarg, "noexecstack") == 0)
2290 link_info.noexecstack = TRUE;
2291 link_info.execstack = FALSE;
2295 if test -n "$COMMONPAGESIZE"; then
2297 else if (strcmp (optarg, "relro") == 0)
2298 link_info.relro = TRUE;
2299 else if (strcmp (optarg, "norelro") == 0)
2300 link_info.relro = FALSE;
2305 else if (CONST_STRNEQ (optarg, "max-page-size="))
2309 config.maxpagesize = strtoul (optarg + 14, &end, 0);
2310 if (*end || (config.maxpagesize & (config.maxpagesize - 1)) != 0)
2311 einfo (_("%P%F: invalid maxium page size \`%s'\n"),
2314 else if (CONST_STRNEQ (optarg, "common-page-size="))
2317 config.commonpagesize = strtoul (optarg + 17, &end, 0);
2319 || (config.commonpagesize & (config.commonpagesize - 1)) != 0)
2320 einfo (_("%P%F: invalid common page size \`%s'\n"),
2323 /* What about the other Solaris -z options? FIXME. */
2328 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
2330 $PARSE_AND_LIST_ARGS_CASES
2342 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
2346 gld${EMULATION_NAME}_list_options (FILE * file)
2349 --build-id[=STYLE] Generate build ID note\n"));
2351 --audit=AUDITLIB Specify a library to use for auditing\n"));
2353 -P AUDITLIB, --depaudit=AUDITLIB\n" "\
2354 Specify a library to use for auditing dependencies\n"));
2357 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2360 -Bgroup Selects group name lookup rules for DSO\n"));
2362 --disable-new-dtags Disable new dynamic tags\n"));
2364 --enable-new-dtags Enable new dynamic tags\n"));
2366 --eh-frame-hdr Create .eh_frame_hdr section\n"));
2368 --hash-style=STYLE Set hash style to sysv, gnu or both\n"));
2370 -z combreloc Merge dynamic relocs into one section and sort\n"));
2372 -z defs Report unresolved symbols in object files.\n"));
2374 -z execstack Mark executable as requiring executable stack\n"));
2376 -z initfirst Mark DSO to be initialized first at runtime\n"));
2378 -z interpose Mark object to interpose all DSOs but executable\n"));
2380 -z lazy Mark object lazy runtime binding (default)\n"));
2382 -z loadfltr Mark object requiring immediate process\n"));
2384 -z muldefs Allow multiple definitions\n"));
2386 -z nocombreloc Don't merge dynamic relocs into one section\n"));
2388 -z nocopyreloc Don't create copy relocs\n"));
2390 -z nodefaultlib Mark object not to use default search paths\n"));
2392 -z nodelete Mark DSO non-deletable at runtime\n"));
2394 -z nodlopen Mark DSO not available to dlopen\n"));
2396 -z nodump Mark DSO not available to dldump\n"));
2398 -z noexecstack Mark executable as not requiring executable stack\n"));
2401 if test -n "$COMMONPAGESIZE"; then
2404 -z norelro Don't create RELRO program header\n"));
2410 -z now Mark object non-lazy runtime binding\n"));
2412 -z origin Mark object requiring immediate \$ORIGIN\n\
2413 processing at runtime\n"));
2416 if test -n "$COMMONPAGESIZE"; then
2419 -z relro Create RELRO program header\n"));
2425 -z max-page-size=SIZE Set maximum page size to SIZE\n"));
2427 -z common-page-size=SIZE Set common page size to SIZE\n"));
2429 -z KEYWORD Ignored for Solaris compatibility\n"));
2433 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
2435 $PARSE_AND_LIST_OPTIONS
2443 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
2445 $PARSE_AND_LIST_EPILOGUE
2451 #define gld${EMULATION_NAME}_add_options NULL
2452 #define gld${EMULATION_NAME}_handle_option NULL
2454 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
2456 #define gld${EMULATION_NAME}_list_options NULL
2463 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
2465 ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
2466 ${LDEMUL_SYSLIB-syslib_default},
2467 ${LDEMUL_HLL-hll_default},
2468 ${LDEMUL_AFTER_PARSE-after_parse_default},
2469 ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
2470 ${LDEMUL_AFTER_ALLOCATION-gld${EMULATION_NAME}_after_allocation},
2471 ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
2472 ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
2473 ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
2474 ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
2475 "${EMULATION_NAME}",
2477 ${LDEMUL_FINISH-finish_default},
2478 ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
2479 ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
2480 ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
2481 ${LDEMUL_SET_SYMBOLS-NULL},
2482 ${LDEMUL_PARSE_ARGS-NULL},
2483 gld${EMULATION_NAME}_add_options,
2484 gld${EMULATION_NAME}_handle_option,
2485 ${LDEMUL_UNRECOGNIZED_FILE-NULL},
2486 ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
2487 ${LDEMUL_RECOGNIZED_FILE-gld${EMULATION_NAME}_load_symbols},
2488 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
2489 ${LDEMUL_NEW_VERS_PATTERN-NULL}