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));
321 /* Linker needs to decompress sections. */
322 abfd->flags |= BFD_DECOMPRESS;
324 if (! bfd_check_format (abfd, bfd_object))
329 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
335 /* For DT_NEEDED, they have to match. */
336 if (abfd->xvec != link_info.output_bfd->xvec)
342 /* Check whether this object would include any conflicting library
343 versions. If FORCE is set, then we skip this check; we use this
344 the second time around, if we couldn't find any compatible
345 instance of the shared library. */
349 struct bfd_link_needed_list *needs;
351 if (! bfd_elf_get_bfd_needed_list (abfd, &needs))
352 einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
356 global_vercheck_needed = needs;
357 global_vercheck_failed = FALSE;
358 lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
359 if (global_vercheck_failed)
362 /* Return FALSE to force the caller to move on to try
363 another file on the search path. */
367 /* But wait! It gets much worse. On Linux, if a shared
368 library does not use libc at all, we are supposed to skip
369 it the first time around in case we encounter a shared
370 library later on with the same name which does use the
371 version of libc that we want. This is much too horrible
372 to use on any system other than Linux. */
376 *-*-linux-* | *-*-k*bsd*-*)
379 struct bfd_link_needed_list *l;
381 for (l = needs; l != NULL; l = l->next)
382 if (CONST_STRNEQ (l->name, "libc.so"))
398 /* We've found a dynamic object matching the DT_NEEDED entry. */
400 /* We have already checked that there is no other input file of the
401 same name. We must now check again that we are not including the
402 same file twice. We need to do this because on many systems
403 libc.so is a symlink to, e.g., libc.so.1. The SONAME entry will
404 reference libc.so.1. If we have already included libc.so, we
405 don't want to include libc.so.1 if they are the same file, and we
406 can only check that using stat. */
408 if (bfd_stat (abfd, &global_stat) != 0)
409 einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
411 /* First strip off everything before the last '/'. */
412 soname = lbasename (abfd->filename);
414 if (trace_file_tries)
415 info_msg (_("found %s at %s\n"), soname, name);
418 lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
419 if (global_found != NULL)
421 /* Return TRUE to indicate that we found the file, even though
422 we aren't going to do anything with it. */
426 /* Specify the soname to use. */
427 bfd_elf_set_dt_needed_name (abfd, soname);
429 /* Tell the ELF linker that we don't want the output file to have a
430 DT_NEEDED entry for this file, unless it is used to resolve
431 references in a regular object. */
432 link_class = DYN_DT_NEEDED;
434 /* Tell the ELF linker that we don't want the output file to have a
435 DT_NEEDED entry for this file at all if the entry is from a file
436 with DYN_NO_ADD_NEEDED. */
437 if (needed->by != NULL
438 && (bfd_elf_get_dyn_lib_class (needed->by) & DYN_NO_ADD_NEEDED) != 0)
439 link_class |= DYN_NO_NEEDED | DYN_NO_ADD_NEEDED;
441 bfd_elf_set_dyn_lib_class (abfd, (enum dynamic_lib_link_class) link_class);
443 /* Add this file into the symbol table. */
444 if (! bfd_link_add_symbols (abfd, &link_info))
445 einfo ("%F%B: could not read symbols: %E\n", abfd);
451 /* Search for a needed file in a path. */
454 gld${EMULATION_NAME}_search_needed (const char *path,
455 struct dt_needed *n, int force)
458 const char *name = n->name;
460 struct dt_needed needed;
463 return gld${EMULATION_NAME}_try_needed (n, force);
465 if (path == NULL || *path == '\0')
469 needed.name = n->name;
474 char *filename, *sset;
476 s = strchr (path, config.rpath_separator);
478 s = path + strlen (path);
480 #if HAVE_DOS_BASED_FILE_SYSTEM
481 /* Assume a match on the second char is part of drive specifier. */
482 else if (config.rpath_separator == ':'
486 s = strchr (s + 1, config.rpath_separator);
488 s = path + strlen (path);
491 filename = (char *) xmalloc (s - path + len + 2);
496 memcpy (filename, path, s - path);
497 filename[s - path] = '/';
498 sset = filename + (s - path) + 1;
502 needed.name = filename;
503 if (gld${EMULATION_NAME}_try_needed (&needed, force))
517 if [ "x${USE_LIBPATH}" = xyes ] ; then
520 /* Add the sysroot to every entry in a path separated by
521 config.rpath_separator. */
524 gld${EMULATION_NAME}_add_sysroot (const char *path)
533 if (path[i++] == config.rpath_separator)
539 len = len + (colons + 1) * strlen (ld_sysroot);
540 ret = xmalloc (len + 1);
541 strcpy (ret, ld_sysroot);
542 p = ret + strlen (ret);
545 if (path[i] == config.rpath_separator)
548 strcpy (p, ld_sysroot);
560 *-*-freebsd* | *-*-dragonfly*)
562 /* Read the system search path the FreeBSD way rather than the Linux way. */
563 #ifdef HAVE_ELF_HINTS_H
564 #include <elf-hints.h>
566 #include "elf-hints-local.h"
570 gld${EMULATION_NAME}_check_ld_elf_hints (const char *name, int force)
572 static bfd_boolean initialized;
573 static char *ld_elf_hints;
574 struct dt_needed needed;
581 tmppath = concat (ld_sysroot, _PATH_ELF_HINTS, (const char *) NULL);
582 f = fopen (tmppath, FOPEN_RB);
586 struct elfhints_hdr hdr;
588 if (fread (&hdr, 1, sizeof (hdr), f) == sizeof (hdr)
589 && hdr.magic == ELFHINTS_MAGIC
592 if (fseek (f, hdr.strtab + hdr.dirlist, SEEK_SET) != -1)
596 b = xmalloc (hdr.dirlistlen + 1);
597 if (fread (b, 1, hdr.dirlistlen + 1, f) ==
599 ld_elf_hints = gld${EMULATION_NAME}_add_sysroot (b);
610 if (ld_elf_hints == NULL)
615 return gld${EMULATION_NAME}_search_needed (ld_elf_hints, & needed,
622 *-*-linux-* | *-*-k*bsd*-*)
624 /* For a native linker, check the file /etc/ld.so.conf for directories
625 in which we may find shared libraries. /etc/ld.so.conf is really
626 only meaningful on Linux. */
628 struct gld${EMULATION_NAME}_ld_so_conf
635 gld${EMULATION_NAME}_parse_ld_so_conf
636 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename);
639 gld${EMULATION_NAME}_parse_ld_so_conf_include
640 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename,
648 if (pattern[0] != '/')
650 char *p = strrchr (filename, '/');
651 size_t patlen = strlen (pattern) + 1;
653 newp = xmalloc (p - filename + 1 + patlen);
654 memcpy (newp, filename, p - filename + 1);
655 memcpy (newp + (p - filename + 1), pattern, patlen);
660 if (glob (pattern, 0, NULL, &gl) == 0)
664 for (i = 0; i < gl.gl_pathc; ++i)
665 gld${EMULATION_NAME}_parse_ld_so_conf (info, gl.gl_pathv[i]);
669 /* If we do not have glob, treat the pattern as a literal filename. */
670 gld${EMULATION_NAME}_parse_ld_so_conf (info, pattern);
678 gld${EMULATION_NAME}_parse_ld_so_conf
679 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename)
681 FILE *f = fopen (filename, FOPEN_RT);
689 line = xmalloc (linelen);
694 /* Normally this would use getline(3), but we need to be portable. */
695 while ((q = fgets (p, linelen - (p - line), f)) != NULL
696 && strlen (q) == linelen - (p - line) - 1
697 && line[linelen - 2] != '\n')
699 line = xrealloc (line, 2 * linelen);
700 p = line + linelen - 1;
704 if (q == NULL && p == line)
707 p = strchr (line, '\n');
711 /* Because the file format does not know any form of quoting we
712 can search forward for the next '#' character and if found
713 make it terminating the line. */
714 p = strchr (line, '#');
718 /* Remove leading whitespace. NUL is no whitespace character. */
720 while (*p == ' ' || *p == '\f' || *p == '\r' || *p == '\t' || *p == '\v')
723 /* If the line is blank it is ignored. */
727 if (CONST_STRNEQ (p, "include") && (p[7] == ' ' || p[7] == '\t'))
733 while (*p == ' ' || *p == '\t')
741 while (*p != ' ' && *p != '\t' && *p)
747 gld${EMULATION_NAME}_parse_ld_so_conf_include (info, filename,
755 while (*p && *p != '=' && *p != ' ' && *p != '\t' && *p != '\f'
756 && *p != '\r' && *p != '\v')
759 while (p != dir && p[-1] == '/')
761 if (info->path == NULL)
763 info->alloc = p - dir + 1 + 256;
764 info->path = xmalloc (info->alloc);
769 if (info->len + 1 + (p - dir) >= info->alloc)
771 info->alloc += p - dir + 256;
772 info->path = xrealloc (info->path, info->alloc);
774 info->path[info->len++] = config.rpath_separator;
776 memcpy (info->path + info->len, dir, p - dir);
777 info->len += p - dir;
778 info->path[info->len] = '\0';
788 gld${EMULATION_NAME}_check_ld_so_conf (const char *name, int force)
790 static bfd_boolean initialized;
791 static char *ld_so_conf;
792 struct dt_needed needed;
797 struct gld${EMULATION_NAME}_ld_so_conf info;
800 info.len = info.alloc = 0;
801 tmppath = concat (ld_sysroot, "${prefix}/etc/ld.so.conf",
802 (const char *) NULL);
803 if (!gld${EMULATION_NAME}_parse_ld_so_conf (&info, tmppath))
806 tmppath = concat (ld_sysroot, "/etc/ld.so.conf",
807 (const char *) NULL);
808 gld${EMULATION_NAME}_parse_ld_so_conf (&info, tmppath);
814 char *d = gld${EMULATION_NAME}_add_sysroot (info.path);
821 if (ld_so_conf == NULL)
827 return gld${EMULATION_NAME}_search_needed (ld_so_conf, &needed, force);
837 /* See if an input file matches a DT_NEEDED entry by name. */
840 gld${EMULATION_NAME}_check_needed (lang_input_statement_type *s)
844 /* Stop looking if we've found a loaded lib. */
845 if (global_found != NULL
846 && (bfd_elf_get_dyn_lib_class (global_found->the_bfd)
847 & DYN_AS_NEEDED) == 0)
850 if (s->filename == NULL || s->the_bfd == NULL)
853 /* Don't look for a second non-loaded as-needed lib. */
854 if (global_found != NULL
855 && (bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0)
858 if (strcmp (s->filename, global_needed->name) == 0)
864 if (s->search_dirs_flag)
866 const char *f = strrchr (s->filename, '/');
868 && strcmp (f + 1, global_needed->name) == 0)
875 soname = bfd_elf_get_dt_soname (s->the_bfd);
877 && strcmp (soname, global_needed->name) == 0)
886 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
890 gld${EMULATION_NAME}_id_note_section_size (bfd *abfd,
891 struct bfd_link_info *linfo)
893 const char *style = linfo->emit_note_gnu_build_id;
898 size = offsetof (Elf_External_Note, name[sizeof "GNU"]);
899 size = (size + 3) & -(bfd_size_type) 4;
901 if (!strcmp (style, "md5") || !strcmp (style, "uuid"))
903 else if (!strcmp (style, "sha1"))
905 else if (!strncmp (style, "0x", 2))
907 /* ID is in string form (hex). Convert to bits. */
908 const char *id = style + 2;
911 if (ISXDIGIT (id[0]) && ISXDIGIT (id[1]))
916 else if (*id == '-' || *id == ':')
923 } while (*id != '\0');
932 read_hex (const char xdigit)
934 if (ISDIGIT (xdigit))
936 if (ISUPPER (xdigit))
937 return xdigit - 'A' + 0xa;
938 if (ISLOWER (xdigit))
939 return xdigit - 'a' + 0xa;
951 gld${EMULATION_NAME}_write_build_id_section (bfd *abfd)
953 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
954 struct build_id_info *info = (struct build_id_info *)
955 elf_tdata (abfd)->after_write_object_contents_info;
957 Elf_Internal_Shdr *i_shdr;
958 unsigned char *contents, *id_bits;
960 Elf_External_Note *e_note;
963 if (bfd_is_abs_section (asec->output_section))
965 einfo (_("%P: warning: .note.gnu.build-id section discarded,"
966 " --build-id ignored.\n"));
969 i_shdr = &elf_section_data (asec->output_section)->this_hdr;
971 if (i_shdr->contents == NULL)
973 if (asec->contents == NULL)
974 asec->contents = (unsigned char *) xmalloc (asec->size);
975 contents = asec->contents;
978 contents = i_shdr->contents + asec->output_offset;
980 e_note = (Elf_External_Note *) contents;
981 size = offsetof (Elf_External_Note, name[sizeof "GNU"]);
982 size = (size + 3) & -(bfd_size_type) 4;
983 id_bits = contents + size;
984 size = asec->size - size;
986 bfd_h_put_32 (abfd, sizeof "GNU", &e_note->namesz);
987 bfd_h_put_32 (abfd, size, &e_note->descsz);
988 bfd_h_put_32 (abfd, NT_GNU_BUILD_ID, &e_note->type);
989 memcpy (e_note->name, "GNU", sizeof "GNU");
991 if (!strcmp (info->style, "md5"))
995 if (bed->s->checksum_contents (abfd,
996 (void (*) (const void *, size_t, void *))
999 md5_finish_ctx (&ctx, id_bits);
1003 else if (!strcmp (info->style, "sha1"))
1005 struct sha1_ctx ctx;
1006 sha1_init_ctx (&ctx);
1007 if (bed->s->checksum_contents (abfd,
1008 (void (*) (const void *, size_t, void *))
1009 &sha1_process_bytes,
1011 sha1_finish_ctx (&ctx, id_bits);
1015 else if (!strcmp (info->style, "uuid"))
1018 int fd = open ("/dev/urandom", O_RDONLY);
1021 n = read (fd, id_bits, size);
1026 else if (!strncmp (info->style, "0x", 2))
1028 /* ID is in string form (hex). Convert to bits. */
1029 const char *id = info->style + 2;
1033 if (ISXDIGIT (id[0]) && ISXDIGIT (id[1]))
1035 id_bits[n] = read_hex (*id++) << 4;
1036 id_bits[n++] |= read_hex (*id++);
1038 else if (*id == '-' || *id == ':')
1041 abort (); /* Should have been validated earlier. */
1042 } while (*id != '\0');
1045 abort (); /* Should have been validated earlier. */
1048 return (bfd_seek (abfd,
1049 i_shdr->sh_offset + asec->output_offset, SEEK_SET) == 0
1050 && bfd_bwrite (contents, size, abfd) == size);
1054 /* This is called after all the input files have been opened. */
1057 gld${EMULATION_NAME}_after_open (void)
1059 struct bfd_link_needed_list *needed, *l;
1060 struct elf_link_hash_table *htab;
1062 after_open_default ();
1064 htab = elf_hash_table (&link_info);
1065 if (!is_elf_hash_table (htab))
1068 if (link_info.emit_note_gnu_build_id)
1074 /* Find an ELF input. */
1075 for (abfd = link_info.input_bfds;
1076 abfd != (bfd *) NULL; abfd = abfd->link_next)
1077 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1082 /* PR 10555: If there are no input files do not
1083 try to create a .note.gnu-build-id section. */
1084 free (link_info.emit_note_gnu_build_id);
1085 link_info.emit_note_gnu_build_id = NULL;
1089 size = gld${EMULATION_NAME}_id_note_section_size (abfd, &link_info);
1092 einfo ("%P: warning: unrecognized --build-id style ignored.\n");
1093 free (link_info.emit_note_gnu_build_id);
1094 link_info.emit_note_gnu_build_id = NULL;
1098 s = bfd_make_section_with_flags (abfd, ".note.gnu.build-id",
1099 SEC_ALLOC | SEC_LOAD
1100 | SEC_IN_MEMORY | SEC_LINKER_CREATED
1101 | SEC_READONLY | SEC_DATA);
1102 if (s != NULL && bfd_set_section_alignment (abfd, s, 2))
1104 struct elf_obj_tdata *t = elf_tdata (link_info.output_bfd);
1105 struct build_id_info *b =
1106 (struct build_id_info *) xmalloc (sizeof *b);
1108 b->style = link_info.emit_note_gnu_build_id;
1110 elf_section_type (s) = SHT_NOTE;
1112 t->after_write_object_contents
1113 = &gld${EMULATION_NAME}_write_build_id_section;
1114 t->after_write_object_contents_info = b;
1118 einfo ("%P: warning: Cannot create .note.gnu.build-id section,"
1119 " --build-id ignored.\n");
1120 free (link_info.emit_note_gnu_build_id);
1121 link_info.emit_note_gnu_build_id = NULL;
1127 if (link_info.relocatable)
1130 if (link_info.eh_frame_hdr
1131 && !link_info.traditional_format)
1133 bfd *abfd, *elfbfd = NULL;
1134 bfd_boolean warn_eh_frame = FALSE;
1137 for (abfd = link_info.input_bfds; abfd; abfd = abfd->link_next)
1139 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1143 s = bfd_get_section_by_name (abfd, ".eh_frame");
1147 && !bfd_is_abs_section (s->output_section));
1149 if (elfbfd && warn_eh_frame)
1154 const struct elf_backend_data *bed;
1156 bed = get_elf_backend_data (elfbfd);
1157 s = bfd_make_section_with_flags (elfbfd, ".eh_frame_hdr",
1158 bed->dynamic_sec_flags
1161 && bfd_set_section_alignment (elfbfd, s, 2))
1163 htab->eh_info.hdr_sec = s;
1164 warn_eh_frame = FALSE;
1168 einfo ("%P: warning: Cannot create .eh_frame_hdr section,"
1169 " --eh-frame-hdr ignored.\n");
1172 /* Get the list of files which appear in DT_NEEDED entries in
1173 dynamic objects included in the link (often there will be none).
1174 For each such file, we want to track down the corresponding
1175 library, and include the symbol table in the link. This is what
1176 the runtime dynamic linker will do. Tracking the files down here
1177 permits one dynamic object to include another without requiring
1178 special action by the person doing the link. Note that the
1179 needed list can actually grow while we are stepping through this
1181 if (!link_info.executable)
1183 needed = bfd_elf_get_needed_list (link_info.output_bfd, &link_info);
1184 for (l = needed; l != NULL; l = l->next)
1186 struct bfd_link_needed_list *ll;
1187 struct dt_needed n, nn;
1190 /* If the lib that needs this one was --as-needed and wasn't
1191 found to be needed, then this lib isn't needed either. */
1193 && (bfd_elf_get_dyn_lib_class (l->by) & DYN_AS_NEEDED) != 0)
1196 /* If we've already seen this file, skip it. */
1197 for (ll = needed; ll != l; ll = ll->next)
1199 || (bfd_elf_get_dyn_lib_class (ll->by) & DYN_AS_NEEDED) == 0)
1200 && strcmp (ll->name, l->name) == 0)
1205 /* See if this file was included in the link explicitly. */
1207 global_found = NULL;
1208 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
1209 if (global_found != NULL
1210 && (bfd_elf_get_dyn_lib_class (global_found->the_bfd)
1211 & DYN_AS_NEEDED) == 0)
1217 if (trace_file_tries)
1218 info_msg (_("%s needed by %B\n"), l->name, l->by);
1220 /* As-needed libs specified on the command line (or linker script)
1221 take priority over libs found in search dirs. */
1222 if (global_found != NULL)
1224 nn.name = global_found->filename;
1225 if (gld${EMULATION_NAME}_try_needed (&nn, TRUE))
1229 /* We need to find this file and include the symbol table. We
1230 want to search for the file in the same way that the dynamic
1231 linker will search. That means that we want to use
1232 rpath_link, rpath, then the environment variable
1233 LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
1234 entries (native only), then the linker script LIB_SEARCH_DIRS.
1235 We do not search using the -L arguments.
1237 We search twice. The first time, we skip objects which may
1238 introduce version mismatches. The second time, we force
1239 their use. See gld${EMULATION_NAME}_vercheck comment. */
1240 for (force = 0; force < 2; force++)
1243 search_dirs_type *search;
1245 if [ "x${NATIVE}" = xyes ] ; then
1247 const char *lib_path;
1250 if [ "x${USE_LIBPATH}" = xyes ] ; then
1252 struct bfd_link_needed_list *rp;
1258 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
1262 if [ "x${USE_LIBPATH}" = xyes ] ; then
1264 if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
1269 if [ "x${NATIVE}" = xyes ] ; then
1271 if (command_line.rpath_link == NULL
1272 && command_line.rpath == NULL)
1274 lib_path = (const char *) getenv ("LD_RUN_PATH");
1275 if (gld${EMULATION_NAME}_search_needed (lib_path, &n,
1279 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
1280 if (gld${EMULATION_NAME}_search_needed (lib_path, &n, force))
1284 if [ "x${USE_LIBPATH}" = xyes ] ; then
1287 rp = bfd_elf_get_runpath_list (link_info.output_bfd, &link_info);
1288 for (; !found && rp != NULL; rp = rp->next)
1290 char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
1291 found = (rp->by == l->by
1292 && gld${EMULATION_NAME}_search_needed (tmpname,
1302 if [ "x${USE_LIBPATH}" = xyes ] ; then
1304 *-*-freebsd* | *-*-dragonfly*)
1306 if (gld${EMULATION_NAME}_check_ld_elf_hints (l->name, force))
1312 *-*-linux-* | *-*-k*bsd*-*)
1315 if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
1323 len = strlen (l->name);
1324 for (search = search_head; search != NULL; search = search->next)
1328 if (search->cmdline)
1330 filename = (char *) xmalloc (strlen (search->name) + len + 2);
1331 sprintf (filename, "%s/%s", search->name, l->name);
1333 if (gld${EMULATION_NAME}_try_needed (&nn, force))
1346 einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
1356 /* Look through an expression for an assignment statement. */
1359 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
1361 bfd_boolean provide = FALSE;
1363 switch (exp->type.node_class)
1366 case etree_provided:
1370 /* We call record_link_assignment even if the symbol is defined.
1371 This is because if it is defined by a dynamic object, we
1372 actually want to use the value defined by the linker script,
1373 not the value from the dynamic object (because we are setting
1374 symbols like etext). If the symbol is defined by a regular
1375 object, then, as it happens, calling record_link_assignment
1377 if (strcmp (exp->assign.dst, ".") != 0)
1379 if (!bfd_elf_record_link_assignment (link_info.output_bfd,
1381 exp->assign.dst, provide,
1382 exp->assign.hidden))
1383 einfo ("%P%F: failed to record assignment to %s: %E\n",
1386 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1390 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1391 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1395 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1396 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1397 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1401 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1410 /* This is called by the before_allocation routine via
1411 lang_for_each_statement. It locates any assignment statements, and
1412 tells the ELF backend about them, in case they are assignments to
1413 symbols which are referred to by dynamic objects. */
1416 gld${EMULATION_NAME}_find_statement_assignment (lang_statement_union_type *s)
1418 if (s->header.type == lang_assignment_statement_enum)
1419 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1424 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
1425 if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
1426 ELF_INTERPRETER_SET_DEFAULT="
1427 if (sinterp != NULL)
1429 sinterp->contents = (unsigned char *) ${ELF_INTERPRETER_NAME};
1430 sinterp->size = strlen ((char *) sinterp->contents) + 1;
1435 ELF_INTERPRETER_SET_DEFAULT=
1439 /* used by before_allocation and handle_option. */
1441 gld${EMULATION_NAME}_append_to_separated_string (char **to, char *op_arg)
1444 *to = xstrdup (op_arg);
1447 size_t to_len = strlen (*to);
1448 size_t op_arg_len = strlen (op_arg);
1452 /* First see whether OPTARG is already in the path. */
1455 if (strncmp (op_arg, cp, op_arg_len) == 0
1456 && (cp[op_arg_len] == 0
1457 || cp[op_arg_len] == config.rpath_separator))
1461 /* Not yet found. */
1462 cp = strchr (cp, config.rpath_separator);
1470 buf = xmalloc (to_len + op_arg_len + 2);
1471 sprintf (buf, "%s%c%s", *to,
1472 config.rpath_separator, op_arg);
1479 /* This is called after the sections have been attached to output
1480 sections, but before any sizes or addresses have been set. */
1483 gld${EMULATION_NAME}_before_allocation (void)
1489 if (link_info.hash->type == bfd_link_elf_hash_table)
1490 _bfd_elf_tls_setup (link_info.output_bfd, &link_info);
1492 /* If we are going to make any variable assignments, we need to let
1493 the ELF backend know about them in case the variables are
1494 referred to by dynamic objects. */
1495 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
1497 /* Let the ELF backend work out the sizes of any sections required
1498 by dynamic linking. */
1499 rpath = command_line.rpath;
1501 rpath = (const char *) getenv ("LD_RUN_PATH");
1503 for (abfd = link_info.input_bfds; abfd; abfd = abfd->link_next)
1504 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1506 const char *audit_libs = elf_dt_audit (abfd);
1508 /* If the input bfd contains an audit entry, we need to add it as
1509 a dep audit entry. */
1510 if (audit_libs && *audit_libs != '\0')
1512 char *cp = xstrdup (audit_libs);
1516 char *cp2 = strchr (cp, config.rpath_separator);
1524 if (cp != NULL && *cp != '\0')
1525 gld${EMULATION_NAME}_append_to_separated_string (&depaudit, cp);
1527 cp = more ? ++cp2 : NULL;
1533 if (! (bfd_elf_size_dynamic_sections
1534 (link_info.output_bfd, command_line.soname, rpath,
1535 command_line.filter_shlib, audit, depaudit,
1536 (const char * const *) command_line.auxiliary_filters,
1537 &link_info, &sinterp, lang_elf_version_info)))
1538 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1540 ${ELF_INTERPRETER_SET_DEFAULT}
1541 /* Let the user override the dynamic linker we are using. */
1542 if (command_line.interpreter != NULL
1545 sinterp->contents = (bfd_byte *) command_line.interpreter;
1546 sinterp->size = strlen (command_line.interpreter) + 1;
1549 /* Look for any sections named .gnu.warning. As a GNU extensions,
1550 we treat such sections as containing warning messages. We print
1551 out the warning message, and then zero out the section size so
1552 that it does not get copied into the output file. */
1555 LANG_FOR_EACH_INPUT_STATEMENT (is)
1562 if (is->just_syms_flag)
1565 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
1570 msg = (char *) xmalloc ((size_t) (sz + 1));
1571 if (! bfd_get_section_contents (is->the_bfd, s, msg,
1573 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
1576 ret = link_info.callbacks->warning (&link_info, msg,
1577 (const char *) NULL,
1578 is->the_bfd, (asection *) NULL,
1583 /* Clobber the section size, so that we don't waste space
1584 copying the warning into the output file. If we've already
1585 sized the output section, adjust its size. The adjustment
1586 is on rawsize because targets that size sections early will
1587 have called lang_reset_memory_regions after sizing. */
1588 if (s->output_section != NULL
1589 && s->output_section->rawsize >= s->size)
1590 s->output_section->rawsize -= s->size;
1594 /* Also set SEC_EXCLUDE, so that local symbols defined in the
1595 warning section don't get copied to the output. */
1596 s->flags |= SEC_EXCLUDE | SEC_KEEP;
1600 before_allocation_default ();
1602 if (!bfd_elf_size_dynsym_hash_dynstr (link_info.output_bfd, &link_info))
1603 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1609 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
1612 /* Try to open a dynamic archive. This is where we know that ELF
1613 dynamic libraries have an extension of .so (or .sl on oddball systems
1617 gld${EMULATION_NAME}_open_dynamic_archive
1618 (const char *arch, search_dirs_type *search, lang_input_statement_type *entry)
1620 const char *filename;
1623 if (! entry->maybe_archive)
1626 filename = entry->filename;
1628 /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
1629 is defined, but it does not seem worth the headache to optimize
1630 away those two bytes of space. */
1631 string = (char *) xmalloc (strlen (search->name)
1634 #ifdef EXTRA_SHLIB_EXTENSION
1635 + strlen (EXTRA_SHLIB_EXTENSION)
1637 + sizeof "/lib.so");
1639 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
1641 #ifdef EXTRA_SHLIB_EXTENSION
1642 /* Try the .so extension first. If that fails build a new filename
1643 using EXTRA_SHLIB_EXTENSION. */
1644 if (! ldfile_try_open_bfd (string, entry))
1646 sprintf (string, "%s/lib%s%s%s", search->name,
1647 filename, arch, EXTRA_SHLIB_EXTENSION);
1650 if (! ldfile_try_open_bfd (string, entry))
1655 #ifdef EXTRA_SHLIB_EXTENSION
1659 entry->filename = string;
1661 /* We have found a dynamic object to include in the link. The ELF
1662 backend linker will create a DT_NEEDED entry in the .dynamic
1663 section naming this file. If this file includes a DT_SONAME
1664 entry, it will be used. Otherwise, the ELF linker will just use
1665 the name of the file. For an archive found by searching, like
1666 this one, the DT_NEEDED entry should consist of just the name of
1667 the file, without the path information used to find it. Note
1668 that we only need to do this if we have a dynamic object; an
1669 archive will never be referenced by a DT_NEEDED entry.
1671 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
1672 very pretty. I haven't been able to think of anything that is
1674 if (bfd_check_format (entry->the_bfd, bfd_object)
1675 && (entry->the_bfd->flags & DYNAMIC) != 0)
1677 ASSERT (entry->maybe_archive && entry->search_dirs_flag);
1679 /* Rather than duplicating the logic above. Just use the
1680 filename we recorded earlier. */
1682 filename = lbasename (entry->filename);
1683 bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
1692 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
1695 /* A variant of lang_output_section_find used by place_orphan. */
1697 static lang_output_section_statement_type *
1698 output_rel_find (asection *sec, int isdyn)
1700 lang_output_section_statement_type *lookup;
1701 lang_output_section_statement_type *last = NULL;
1702 lang_output_section_statement_type *last_alloc = NULL;
1703 lang_output_section_statement_type *last_ro_alloc = NULL;
1704 lang_output_section_statement_type *last_rel = NULL;
1705 lang_output_section_statement_type *last_rel_alloc = NULL;
1706 int rela = sec->name[4] == 'a';
1708 for (lookup = &lang_output_section_statement.head->output_section_statement;
1710 lookup = lookup->next)
1712 if (lookup->constraint >= 0
1713 && CONST_STRNEQ (lookup->name, ".rel"))
1715 int lookrela = lookup->name[4] == 'a';
1717 /* .rel.dyn must come before all other reloc sections, to suit
1722 /* Don't place after .rel.plt as doing so results in wrong
1724 if (strcmp (".plt", lookup->name + 4 + lookrela) == 0)
1727 if (rela == lookrela || last_rel == NULL)
1729 if ((rela == lookrela || last_rel_alloc == NULL)
1730 && lookup->bfd_section != NULL
1731 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1732 last_rel_alloc = lookup;
1736 if (lookup->bfd_section != NULL
1737 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1739 last_alloc = lookup;
1740 if ((lookup->bfd_section->flags & SEC_READONLY) != 0)
1741 last_ro_alloc = lookup;
1746 return last_rel_alloc;
1752 return last_ro_alloc;
1760 /* Place an orphan section. We use this to put random SHF_ALLOC
1761 sections in the right segment. */
1763 static lang_output_section_statement_type *
1764 gld${EMULATION_NAME}_place_orphan (asection *s,
1765 const char *secname,
1768 static struct orphan_save hold[] =
1771 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1774 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1777 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1783 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1786 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1789 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_SMALL_DATA,
1795 enum orphan_save_index
1806 static int orphan_init_done = 0;
1807 struct orphan_save *place;
1808 lang_output_section_statement_type *after;
1809 lang_output_section_statement_type *os;
1810 lang_output_section_statement_type *match_by_name = NULL;
1812 int iself = s->owner->xvec->flavour == bfd_target_elf_flavour;
1813 unsigned int sh_type = iself ? elf_section_type (s) : SHT_NULL;
1815 if (! link_info.relocatable
1816 && link_info.combreloc
1817 && (s->flags & SEC_ALLOC))
1823 secname = ".rela.dyn";
1827 secname = ".rel.dyn";
1833 else if (CONST_STRNEQ (secname, ".rel"))
1835 secname = secname[4] == 'a' ? ".rela.dyn" : ".rel.dyn";
1840 /* Look through the script to see where to place this section. */
1841 if (constraint == 0)
1842 for (os = lang_output_section_find (secname);
1844 os = next_matching_output_section_statement (os, 0))
1846 /* If we don't match an existing output section, tell
1847 lang_insert_orphan to create a new output section. */
1848 constraint = SPECIAL;
1850 if (os->bfd_section != NULL
1851 && (os->bfd_section->flags == 0
1852 || (_bfd_elf_match_sections_by_type (link_info.output_bfd,
1855 && ((s->flags ^ os->bfd_section->flags)
1856 & (SEC_LOAD | SEC_ALLOC)) == 0)))
1858 /* We already have an output section statement with this
1859 name, and its bfd section has compatible flags.
1860 If the section already exists but does not have any flags
1861 set, then it has been created by the linker, probably as a
1862 result of a --section-start command line switch. */
1863 lang_add_section (&os->children, s, os);
1867 /* Save unused output sections in case we can match them
1868 against orphans later. */
1869 if (os->bfd_section == NULL)
1873 /* If we didn't match an active output section, see if we matched an
1874 unused one and use that. */
1877 lang_add_section (&match_by_name->children, s, match_by_name);
1878 return match_by_name;
1881 if (!orphan_init_done)
1883 lang_output_section_statement_type *lookup;
1884 struct orphan_save *ho;
1886 for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
1887 if (ho->name != NULL)
1889 ho->os = lang_output_section_find (ho->name);
1890 if (ho->os != NULL && ho->os->flags == 0)
1891 ho->os->flags = ho->flags;
1893 lookup = hold[orphan_bss].os;
1895 lookup = &lang_output_section_statement.head->output_section_statement;
1896 for (; lookup != NULL; lookup = lookup->next)
1897 if ((lookup->bfd_section != NULL
1898 && (lookup->bfd_section->flags & SEC_DEBUGGING) != 0)
1899 || strcmp (lookup->name, ".comment") == 0)
1901 hold[orphan_nonalloc].os = lookup ? lookup->prev : NULL;
1902 hold[orphan_nonalloc].name = ".comment";
1903 orphan_init_done = 1;
1906 /* If this is a final link, then always put .gnu.warning.SYMBOL
1907 sections into the .text section to get them out of the way. */
1908 if (link_info.executable
1909 && ! link_info.relocatable
1910 && CONST_STRNEQ (s->name, ".gnu.warning.")
1911 && hold[orphan_text].os != NULL)
1913 os = hold[orphan_text].os;
1914 lang_add_section (&os->children, s, os);
1918 /* Decide which segment the section should go in based on the
1919 section name and section flags. We put loadable .note sections
1920 right after the .interp section, so that the PT_NOTE segment is
1921 stored right after the program headers where the OS can read it
1922 in the first page. */
1925 if ((s->flags & (SEC_ALLOC | SEC_DEBUGGING)) == 0)
1926 place = &hold[orphan_nonalloc];
1927 else if ((s->flags & SEC_ALLOC) == 0)
1929 else if ((s->flags & SEC_LOAD) != 0
1930 && ((iself && sh_type == SHT_NOTE)
1931 || (!iself && CONST_STRNEQ (secname, ".note"))))
1932 place = &hold[orphan_interp];
1933 else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
1934 place = &hold[orphan_bss];
1935 else if ((s->flags & SEC_SMALL_DATA) != 0)
1936 place = &hold[orphan_sdata];
1937 else if ((s->flags & SEC_READONLY) == 0)
1938 place = &hold[orphan_data];
1939 else if (((iself && (sh_type == SHT_RELA || sh_type == SHT_REL))
1940 || (!iself && CONST_STRNEQ (secname, ".rel")))
1941 && (s->flags & SEC_LOAD) != 0)
1942 place = &hold[orphan_rel];
1943 else if ((s->flags & SEC_CODE) == 0)
1944 place = &hold[orphan_rodata];
1946 place = &hold[orphan_text];
1951 if (place->os == NULL)
1953 if (place->name != NULL)
1954 place->os = lang_output_section_find (place->name);
1956 place->os = output_rel_find (s, isdyn);
1960 after = lang_output_section_find_by_flags
1961 (s, &place->os, _bfd_elf_match_sections_by_type);
1963 /* *ABS* is always the first output section statement. */
1964 after = &lang_output_section_statement.head->output_section_statement;
1967 return lang_insert_orphan (s, secname, constraint, after, place, NULL, NULL);
1972 if test x"$LDEMUL_AFTER_ALLOCATION" != xgld"$EMULATION_NAME"_after_allocation; then
1976 gld${EMULATION_NAME}_after_allocation (void)
1978 bfd_boolean need_layout = bfd_elf_discard_info (link_info.output_bfd,
1980 gld${EMULATION_NAME}_map_segments (need_layout);
1985 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1989 gld${EMULATION_NAME}_get_script (int *isfile)
1992 if test -n "$COMPILE_IN"
1994 # Scripts compiled in.
1996 # sed commands to quote an ld script as a C string.
1997 sc="-f stringify.sed"
2003 if (link_info.relocatable && config.build_constructors)
2006 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
2007 echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c
2008 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
2009 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
2010 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
2011 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
2012 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
2013 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
2015 if test -n "$GENERATE_PIE_SCRIPT" ; then
2016 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2017 echo ' ; else if (link_info.pie && link_info.combreloc' >> e${EMULATION_NAME}.c
2018 echo ' && link_info.relro' >> e${EMULATION_NAME}.c
2019 echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
2020 sed $sc ldscripts/${EMULATION_NAME}.xdw >> e${EMULATION_NAME}.c
2021 echo ' ; else if (link_info.pie && link_info.combreloc) return' >> e${EMULATION_NAME}.c
2022 sed $sc ldscripts/${EMULATION_NAME}.xdc >> e${EMULATION_NAME}.c
2024 echo ' ; else if (link_info.pie) return' >> e${EMULATION_NAME}.c
2025 sed $sc ldscripts/${EMULATION_NAME}.xd >> e${EMULATION_NAME}.c
2027 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
2028 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2029 echo ' ; else if (link_info.shared && link_info.combreloc' >> e${EMULATION_NAME}.c
2030 echo ' && link_info.relro' >> e${EMULATION_NAME}.c
2031 echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
2032 sed $sc ldscripts/${EMULATION_NAME}.xsw >> e${EMULATION_NAME}.c
2033 echo ' ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
2034 sed $sc ldscripts/${EMULATION_NAME}.xsc >> e${EMULATION_NAME}.c
2036 echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c
2037 sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
2039 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2040 echo ' ; else if (link_info.combreloc && link_info.relro' >> e${EMULATION_NAME}.c
2041 echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
2042 sed $sc ldscripts/${EMULATION_NAME}.xw >> e${EMULATION_NAME}.c
2043 echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c
2044 sed $sc ldscripts/${EMULATION_NAME}.xc >> e${EMULATION_NAME}.c
2046 echo ' ; else return' >> e${EMULATION_NAME}.c
2047 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
2048 echo '; }' >> e${EMULATION_NAME}.c
2051 # Scripts read from the filesystem.
2057 if (link_info.relocatable && config.build_constructors)
2058 return "ldscripts/${EMULATION_NAME}.xu";
2059 else if (link_info.relocatable)
2060 return "ldscripts/${EMULATION_NAME}.xr";
2061 else if (!config.text_read_only)
2062 return "ldscripts/${EMULATION_NAME}.xbn";
2064 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
2067 else if (!config.magic_demand_paged)
2068 return "ldscripts/${EMULATION_NAME}.xn";
2071 if test -n "$GENERATE_PIE_SCRIPT" ; then
2072 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2074 else if (link_info.pie && link_info.combreloc
2075 && link_info.relro && (link_info.flags & DF_BIND_NOW))
2076 return "ldscripts/${EMULATION_NAME}.xdw";
2077 else if (link_info.pie && link_info.combreloc)
2078 return "ldscripts/${EMULATION_NAME}.xdc";
2082 else if (link_info.pie)
2083 return "ldscripts/${EMULATION_NAME}.xd";
2086 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
2087 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2089 else if (link_info.shared && link_info.combreloc
2090 && link_info.relro && (link_info.flags & DF_BIND_NOW))
2091 return "ldscripts/${EMULATION_NAME}.xsw";
2092 else if (link_info.shared && link_info.combreloc)
2093 return "ldscripts/${EMULATION_NAME}.xsc";
2097 else if (link_info.shared)
2098 return "ldscripts/${EMULATION_NAME}.xs";
2101 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2103 else if (link_info.combreloc && link_info.relro
2104 && (link_info.flags & DF_BIND_NOW))
2105 return "ldscripts/${EMULATION_NAME}.xw";
2106 else if (link_info.combreloc)
2107 return "ldscripts/${EMULATION_NAME}.xc";
2112 return "ldscripts/${EMULATION_NAME}.x";
2119 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2121 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
2123 $PARSE_AND_LIST_PROLOGUE
2129 #define OPTION_DISABLE_NEW_DTAGS (400)
2130 #define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
2131 #define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
2132 #define OPTION_EH_FRAME_HDR (OPTION_GROUP + 1)
2133 #define OPTION_EXCLUDE_LIBS (OPTION_EH_FRAME_HDR + 1)
2134 #define OPTION_HASH_STYLE (OPTION_EXCLUDE_LIBS + 1)
2135 #define OPTION_BUILD_ID (OPTION_HASH_STYLE + 1)
2136 #define OPTION_AUDIT (OPTION_BUILD_ID + 1)
2139 gld${EMULATION_NAME}_add_options
2140 (int ns, char **shortopts, int nl, struct option **longopts,
2141 int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
2143 static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:P:";
2144 static const struct option xtra_long[] = {
2145 {"build-id", optional_argument, NULL, OPTION_BUILD_ID},
2146 {"audit", required_argument, NULL, OPTION_AUDIT},
2147 {"depaudit", required_argument, NULL, 'P'},
2150 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2152 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
2153 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
2154 {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
2155 {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
2156 {"hash-style", required_argument, NULL, OPTION_HASH_STYLE},
2157 {"Bgroup", no_argument, NULL, OPTION_GROUP},
2161 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
2163 $PARSE_AND_LIST_LONGOPTS
2168 {NULL, no_argument, NULL, 0}
2171 *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
2172 memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
2173 *longopts = (struct option *)
2174 xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
2175 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
2178 #define DEFAULT_BUILD_ID_STYLE "sha1"
2181 gld${EMULATION_NAME}_handle_option (int optc)
2188 case OPTION_BUILD_ID:
2189 if (link_info.emit_note_gnu_build_id != NULL)
2191 free (link_info.emit_note_gnu_build_id);
2192 link_info.emit_note_gnu_build_id = NULL;
2195 optarg = DEFAULT_BUILD_ID_STYLE;
2196 if (strcmp (optarg, "none"))
2197 link_info.emit_note_gnu_build_id = xstrdup (optarg);
2200 gld${EMULATION_NAME}_append_to_separated_string (&audit, optarg);
2203 gld${EMULATION_NAME}_append_to_separated_string (&depaudit, optarg);
2208 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2210 case OPTION_DISABLE_NEW_DTAGS:
2211 link_info.new_dtags = FALSE;
2214 case OPTION_ENABLE_NEW_DTAGS:
2215 link_info.new_dtags = TRUE;
2218 case OPTION_EH_FRAME_HDR:
2219 link_info.eh_frame_hdr = TRUE;
2223 link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
2224 /* Groups must be self-contained. */
2225 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2226 link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
2229 case OPTION_EXCLUDE_LIBS:
2230 add_excluded_libs (optarg);
2233 case OPTION_HASH_STYLE:
2234 link_info.emit_hash = FALSE;
2235 link_info.emit_gnu_hash = FALSE;
2236 if (strcmp (optarg, "sysv") == 0)
2237 link_info.emit_hash = TRUE;
2238 else if (strcmp (optarg, "gnu") == 0)
2239 link_info.emit_gnu_hash = TRUE;
2240 else if (strcmp (optarg, "both") == 0)
2242 link_info.emit_hash = TRUE;
2243 link_info.emit_gnu_hash = TRUE;
2246 einfo (_("%P%F: invalid hash style \`%s'\n"), optarg);
2250 if (strcmp (optarg, "initfirst") == 0)
2251 link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
2252 else if (strcmp (optarg, "interpose") == 0)
2253 link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
2254 else if (strcmp (optarg, "loadfltr") == 0)
2255 link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
2256 else if (strcmp (optarg, "nodefaultlib") == 0)
2257 link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
2258 else if (strcmp (optarg, "nodelete") == 0)
2259 link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
2260 else if (strcmp (optarg, "nodlopen") == 0)
2261 link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
2262 else if (strcmp (optarg, "nodump") == 0)
2263 link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
2264 else if (strcmp (optarg, "now") == 0)
2266 link_info.flags |= (bfd_vma) DF_BIND_NOW;
2267 link_info.flags_1 |= (bfd_vma) DF_1_NOW;
2269 else if (strcmp (optarg, "lazy") == 0)
2271 link_info.flags &= ~(bfd_vma) DF_BIND_NOW;
2272 link_info.flags_1 &= ~(bfd_vma) DF_1_NOW;
2274 else if (strcmp (optarg, "origin") == 0)
2276 link_info.flags |= (bfd_vma) DF_ORIGIN;
2277 link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
2279 else if (strcmp (optarg, "defs") == 0)
2280 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2281 else if (strcmp (optarg, "muldefs") == 0)
2282 link_info.allow_multiple_definition = TRUE;
2283 else if (strcmp (optarg, "combreloc") == 0)
2284 link_info.combreloc = TRUE;
2285 else if (strcmp (optarg, "nocombreloc") == 0)
2286 link_info.combreloc = FALSE;
2287 else if (strcmp (optarg, "nocopyreloc") == 0)
2288 link_info.nocopyreloc = TRUE;
2289 else if (strcmp (optarg, "execstack") == 0)
2291 link_info.execstack = TRUE;
2292 link_info.noexecstack = FALSE;
2294 else if (strcmp (optarg, "noexecstack") == 0)
2296 link_info.noexecstack = TRUE;
2297 link_info.execstack = FALSE;
2301 if test -n "$COMMONPAGESIZE"; then
2303 else if (strcmp (optarg, "relro") == 0)
2304 link_info.relro = TRUE;
2305 else if (strcmp (optarg, "norelro") == 0)
2306 link_info.relro = FALSE;
2311 else if (CONST_STRNEQ (optarg, "max-page-size="))
2315 config.maxpagesize = strtoul (optarg + 14, &end, 0);
2316 if (*end || (config.maxpagesize & (config.maxpagesize - 1)) != 0)
2317 einfo (_("%P%F: invalid maxium page size \`%s'\n"),
2320 else if (CONST_STRNEQ (optarg, "common-page-size="))
2323 config.commonpagesize = strtoul (optarg + 17, &end, 0);
2325 || (config.commonpagesize & (config.commonpagesize - 1)) != 0)
2326 einfo (_("%P%F: invalid common page size \`%s'\n"),
2329 /* What about the other Solaris -z options? FIXME. */
2334 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
2336 $PARSE_AND_LIST_ARGS_CASES
2348 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
2352 gld${EMULATION_NAME}_list_options (FILE * file)
2355 --build-id[=STYLE] Generate build ID note\n"));
2357 --audit=AUDITLIB Specify a library to use for auditing\n"));
2359 -P AUDITLIB, --depaudit=AUDITLIB\n" "\
2360 Specify a library to use for auditing dependencies\n"));
2363 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2366 -Bgroup Selects group name lookup rules for DSO\n"));
2368 --disable-new-dtags Disable new dynamic tags\n"));
2370 --enable-new-dtags Enable new dynamic tags\n"));
2372 --eh-frame-hdr Create .eh_frame_hdr section\n"));
2374 --hash-style=STYLE Set hash style to sysv, gnu or both\n"));
2376 -z combreloc Merge dynamic relocs into one section and sort\n"));
2378 -z defs Report unresolved symbols in object files.\n"));
2380 -z execstack Mark executable as requiring executable stack\n"));
2382 -z initfirst Mark DSO to be initialized first at runtime\n"));
2384 -z interpose Mark object to interpose all DSOs but executable\n"));
2386 -z lazy Mark object lazy runtime binding (default)\n"));
2388 -z loadfltr Mark object requiring immediate process\n"));
2390 -z muldefs Allow multiple definitions\n"));
2392 -z nocombreloc Don't merge dynamic relocs into one section\n"));
2394 -z nocopyreloc Don't create copy relocs\n"));
2396 -z nodefaultlib Mark object not to use default search paths\n"));
2398 -z nodelete Mark DSO non-deletable at runtime\n"));
2400 -z nodlopen Mark DSO not available to dlopen\n"));
2402 -z nodump Mark DSO not available to dldump\n"));
2404 -z noexecstack Mark executable as not requiring executable stack\n"));
2407 if test -n "$COMMONPAGESIZE"; then
2410 -z norelro Don't create RELRO program header\n"));
2416 -z now Mark object non-lazy runtime binding\n"));
2418 -z origin Mark object requiring immediate \$ORIGIN\n\
2419 processing at runtime\n"));
2422 if test -n "$COMMONPAGESIZE"; then
2425 -z relro Create RELRO program header\n"));
2431 -z max-page-size=SIZE Set maximum page size to SIZE\n"));
2433 -z common-page-size=SIZE Set common page size to SIZE\n"));
2435 -z KEYWORD Ignored for Solaris compatibility\n"));
2439 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
2441 $PARSE_AND_LIST_OPTIONS
2449 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
2451 $PARSE_AND_LIST_EPILOGUE
2457 #define gld${EMULATION_NAME}_add_options NULL
2458 #define gld${EMULATION_NAME}_handle_option NULL
2460 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
2462 #define gld${EMULATION_NAME}_list_options NULL
2469 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
2471 ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
2472 ${LDEMUL_SYSLIB-syslib_default},
2473 ${LDEMUL_HLL-hll_default},
2474 ${LDEMUL_AFTER_PARSE-after_parse_default},
2475 ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
2476 ${LDEMUL_AFTER_ALLOCATION-gld${EMULATION_NAME}_after_allocation},
2477 ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
2478 ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
2479 ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
2480 ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
2481 "${EMULATION_NAME}",
2483 ${LDEMUL_FINISH-finish_default},
2484 ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
2485 ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
2486 ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
2487 ${LDEMUL_SET_SYMBOLS-NULL},
2488 ${LDEMUL_PARSE_ARGS-NULL},
2489 gld${EMULATION_NAME}_add_options,
2490 gld${EMULATION_NAME}_handle_option,
2491 ${LDEMUL_UNRECOGNIZED_FILE-NULL},
2492 ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
2493 ${LDEMUL_RECOGNIZED_FILE-gld${EMULATION_NAME}_load_symbols},
2494 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
2495 ${LDEMUL_NEW_VERS_PATTERN-NULL}