Import binutils 2.18
[nacl-binutils.git] / ld / emultempl / elf32.em
blobd60d4ddeec7e0d3bfe6a36900e49ac1b987f8002
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
4 # ELF emulations.
5 test -z "${ELFSIZE}" && ELFSIZE=32
6 if [ -z "$MACHINE" ]; then
7   OUTPUT_ARCH=${ARCH}
8 else
9   OUTPUT_ARCH=${ARCH}:${MACHINE}
11 fragment <<EOF
12 /* This file is is generated by a shell script.  DO NOT EDIT! */
14 /* ${ELFSIZE} bit ELF emulation code for ${EMULATION_NAME}
15    Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
16    2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
17    Written by Steve Chamberlain <sac@cygnus.com>
18    ELF support by Ian Lance Taylor <ian@cygnus.com>
20    This file is part of the GNU Binutils.
22    This program is free software; you can redistribute it and/or modify
23    it under the terms of the GNU General Public License as published by
24    the Free Software Foundation; either version 3 of the License, or
25    (at your option) any later version.
27    This program is distributed in the hope that it will be useful,
28    but WITHOUT ANY WARRANTY; without even the implied warranty of
29    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
30    GNU General Public License for more details.
32    You should have received a copy of the GNU General Public License
33    along with this program; if not, write to the Free Software
34    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
35    MA 02110-1301, USA.  */
37 #define TARGET_IS_${EMULATION_NAME}
39 #include "sysdep.h"
40 #include "bfd.h"
41 #include "libiberty.h"
42 #include "safe-ctype.h"
43 #include "getopt.h"
44 #include "md5.h"
45 #include "sha1.h"
46 #include <fcntl.h>
48 #include "bfdlink.h"
50 #include "ld.h"
51 #include "ldmain.h"
52 #include "ldmisc.h"
53 #include "ldexp.h"
54 #include "ldlang.h"
55 #include "ldfile.h"
56 #include "ldemul.h"
57 #include <ldgram.h>
58 #include "elf/common.h"
59 #include "elf-bfd.h"
61 /* Declare functions used by various EXTRA_EM_FILEs.  */
62 static void gld${EMULATION_NAME}_before_parse (void);
63 static void gld${EMULATION_NAME}_after_open (void);
64 static void gld${EMULATION_NAME}_before_allocation (void);
65 static bfd_boolean gld${EMULATION_NAME}_place_orphan (asection *s);
66 static void gld${EMULATION_NAME}_finish (void);
68 EOF
70 if [ "x${USE_LIBPATH}" = xyes ] ; then
71   case ${target} in
72     *-*-linux-* | *-*-k*bsd*-*)
73   fragment <<EOF
74 #ifdef HAVE_GLOB
75 #include <glob.h>
76 #endif
77 EOF
78     ;;
79   esac
82 # Import any needed special functions and/or overrides.
84 source_em ${srcdir}/emultempl/elf-generic.em
85 if test -n "$EXTRA_EM_FILE" ; then
86   source_em ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
89 # Functions in this file can be overridden by setting the LDEMUL_* shell
90 # variables.  If the name of the overriding function is the same as is
91 # defined in this file, then don't output this file's version.
92 # If a different overriding name is given then output the standard function
93 # as presumably it is called from the overriding function.
95 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
96 fragment <<EOF
98 static void
99 gld${EMULATION_NAME}_before_parse (void)
101   ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
102   config.dynamic_link = ${DYNAMIC_LINK-TRUE};
103   config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
109 if test x"$LDEMUL_RECOGNIZED_FILE" != xgld"${EMULATION_NAME}"_load_symbols; then
110 fragment <<EOF
111 /* Handle as_needed DT_NEEDED.  */
113 static bfd_boolean
114 gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *entry)
116   int class = 0;
118   /* Tell the ELF linker that we don't want the output file to have a
119      DT_NEEDED entry for this file, unless it is used to resolve
120      references in a regular object.  */
121   if (entry->as_needed)
122     class = DYN_AS_NEEDED;
124   /* Tell the ELF linker that we don't want the output file to have a
125      DT_NEEDED entry for any dynamic library in DT_NEEDED tags from
126      this file at all.  */
127   if (!entry->add_needed)
128     class |= DYN_NO_ADD_NEEDED;
130   if (entry->just_syms_flag
131       && (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) != 0)
132     einfo (_("%P%F: --just-symbols may not be used on DSO: %B\n"),
133            entry->the_bfd);
135   if (!class
136       || (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) == 0)
137     return FALSE;
139   bfd_elf_set_dyn_lib_class (entry->the_bfd, class);
141   /* Continue on with normal load_symbols processing.  */
142   return FALSE;
147 fragment <<EOF
149 /* These variables are required to pass information back and forth
150    between after_open and check_needed and stat_needed and vercheck.  */
152 static struct bfd_link_needed_list *global_needed;
153 static struct stat global_stat;
154 static lang_input_statement_type *global_found;
155 static struct bfd_link_needed_list *global_vercheck_needed;
156 static bfd_boolean global_vercheck_failed;
159 /* On Linux, it's possible to have different versions of the same
160    shared library linked against different versions of libc.  The
161    dynamic linker somehow tags which libc version to use in
162    /etc/ld.so.cache, and, based on the libc that it sees in the
163    executable, chooses which version of the shared library to use.
165    We try to do a similar check here by checking whether this shared
166    library needs any other shared libraries which may conflict with
167    libraries we have already included in the link.  If it does, we
168    skip it, and try to find another shared library farther on down the
169    link path.
171    This is called via lang_for_each_input_file.
172    GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
173    which we are checking.  This sets GLOBAL_VERCHECK_FAILED if we find
174    a conflicting version.  */
176 static void
177 gld${EMULATION_NAME}_vercheck (lang_input_statement_type *s)
179   const char *soname;
180   struct bfd_link_needed_list *l;
182   if (global_vercheck_failed)
183     return;
184   if (s->the_bfd == NULL
185       || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
186     return;
188   soname = bfd_elf_get_dt_soname (s->the_bfd);
189   if (soname == NULL)
190     soname = lbasename (bfd_get_filename (s->the_bfd));
192   for (l = global_vercheck_needed; l != NULL; l = l->next)
193     {
194       const char *suffix;
196       if (strcmp (soname, l->name) == 0)
197         {
198           /* Probably can't happen, but it's an easy check.  */
199           continue;
200         }
202       if (strchr (l->name, '/') != NULL)
203         continue;
205       suffix = strstr (l->name, ".so.");
206       if (suffix == NULL)
207         continue;
209       suffix += sizeof ".so." - 1;
211       if (strncmp (soname, l->name, suffix - l->name) == 0)
212         {
213           /* Here we know that S is a dynamic object FOO.SO.VER1, and
214              the object we are considering needs a dynamic object
215              FOO.SO.VER2, and VER1 and VER2 are different.  This
216              appears to be a version mismatch, so we tell the caller
217              to try a different version of this library.  */
218           global_vercheck_failed = TRUE;
219           return;
220         }
221     }
225 /* See if an input file matches a DT_NEEDED entry by running stat on
226    the file.  */
228 static void
229 gld${EMULATION_NAME}_stat_needed (lang_input_statement_type *s)
231   struct stat st;
232   const char *suffix;
233   const char *soname;
235   if (global_found != NULL)
236     return;
237   if (s->the_bfd == NULL)
238     return;
240   /* If this input file was an as-needed entry, and wasn't found to be
241      needed at the stage it was linked, then don't say we have loaded it.  */
242   if ((bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0)
243     return;
245   if (bfd_stat (s->the_bfd, &st) != 0)
246     {
247       einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
248       return;
249     }
251   /* Some operating systems, e.g. Windows, do not provide a meaningful
252      st_ino; they always set it to zero.  (Windows does provide a
253      meaningful st_dev.)  Do not indicate a duplicate library in that
254      case.  While there is no guarantee that a system that provides
255      meaningful inode numbers will never set st_ino to zero, this is
256      merely an optimization, so we do not need to worry about false
257      negatives.  */
258   if (st.st_dev == global_stat.st_dev
259       && st.st_ino == global_stat.st_ino
260       && st.st_ino != 0)
261     {
262       global_found = s;
263       return;
264     }
266   /* We issue a warning if it looks like we are including two
267      different versions of the same shared library.  For example,
268      there may be a problem if -lc picks up libc.so.6 but some other
269      shared library has a DT_NEEDED entry of libc.so.5.  This is a
270      heuristic test, and it will only work if the name looks like
271      NAME.so.VERSION.  FIXME: Depending on file names is error-prone.
272      If we really want to issue warnings about mixing version numbers
273      of shared libraries, we need to find a better way.  */
275   if (strchr (global_needed->name, '/') != NULL)
276     return;
277   suffix = strstr (global_needed->name, ".so.");
278   if (suffix == NULL)
279     return;
280   suffix += sizeof ".so." - 1;
282   soname = bfd_elf_get_dt_soname (s->the_bfd);
283   if (soname == NULL)
284     soname = lbasename (s->filename);
286   if (strncmp (soname, global_needed->name, suffix - global_needed->name) == 0)
287     einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
288            global_needed->name, global_needed->by, soname);
291 struct dt_needed
293   bfd *by;
294   const char *name;
297 /* This function is called for each possible name for a dynamic object
298    named by a DT_NEEDED entry.  The FORCE parameter indicates whether
299    to skip the check for a conflicting version.  */
301 static bfd_boolean
302 gld${EMULATION_NAME}_try_needed (struct dt_needed *needed,
303                                  int force)
305   bfd *abfd;
306   const char *name = needed->name;
307   const char *soname;
308   int class;
310   abfd = bfd_openr (name, bfd_get_target (output_bfd));
311   if (abfd == NULL)
312     return FALSE;
313   if (! bfd_check_format (abfd, bfd_object))
314     {
315       bfd_close (abfd);
316       return FALSE;
317     }
318   if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
319     {
320       bfd_close (abfd);
321       return FALSE;
322     }
324   /* For DT_NEEDED, they have to match.  */
325   if (abfd->xvec != output_bfd->xvec)
326     {
327       bfd_close (abfd);
328       return FALSE;
329     }
331   /* Check whether this object would include any conflicting library
332      versions.  If FORCE is set, then we skip this check; we use this
333      the second time around, if we couldn't find any compatible
334      instance of the shared library.  */
336   if (! force)
337     {
338       struct bfd_link_needed_list *needed;
340       if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
341         einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
343       if (needed != NULL)
344         {
345           global_vercheck_needed = needed;
346           global_vercheck_failed = FALSE;
347           lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
348           if (global_vercheck_failed)
349             {
350               bfd_close (abfd);
351               /* Return FALSE to force the caller to move on to try
352                  another file on the search path.  */
353               return FALSE;
354             }
356           /* But wait!  It gets much worse.  On Linux, if a shared
357              library does not use libc at all, we are supposed to skip
358              it the first time around in case we encounter a shared
359              library later on with the same name which does use the
360              version of libc that we want.  This is much too horrible
361              to use on any system other than Linux.  */
364 case ${target} in
365   *-*-linux-* | *-*-k*bsd*-*)
366     fragment <<EOF
367           {
368             struct bfd_link_needed_list *l;
370             for (l = needed; l != NULL; l = l->next)
371               if (CONST_STRNEQ (l->name, "libc.so"))
372                 break;
373             if (l == NULL)
374               {
375                 bfd_close (abfd);
376                 return FALSE;
377               }
378           }
381     ;;
382 esac
383 fragment <<EOF
384         }
385     }
387   /* We've found a dynamic object matching the DT_NEEDED entry.  */
389   /* We have already checked that there is no other input file of the
390      same name.  We must now check again that we are not including the
391      same file twice.  We need to do this because on many systems
392      libc.so is a symlink to, e.g., libc.so.1.  The SONAME entry will
393      reference libc.so.1.  If we have already included libc.so, we
394      don't want to include libc.so.1 if they are the same file, and we
395      can only check that using stat.  */
397   if (bfd_stat (abfd, &global_stat) != 0)
398     einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
400   /* First strip off everything before the last '/'.  */
401   soname = lbasename (abfd->filename);
403   if (trace_file_tries)
404     info_msg (_("found %s at %s\n"), soname, name);
406   global_found = NULL;
407   lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
408   if (global_found != NULL)
409     {
410       /* Return TRUE to indicate that we found the file, even though
411          we aren't going to do anything with it.  */
412       return TRUE;
413     }
415   /* Specify the soname to use.  */
416   bfd_elf_set_dt_needed_name (abfd, soname);
418   /* Tell the ELF linker that we don't want the output file to have a
419      DT_NEEDED entry for this file, unless it is used to resolve
420      references in a regular object.  */
421   class = DYN_DT_NEEDED;
423   /* Tell the ELF linker that we don't want the output file to have a
424      DT_NEEDED entry for this file at all if the entry is from a file
425      with DYN_NO_ADD_NEEDED.  */
426   if (needed->by != NULL
427       && (bfd_elf_get_dyn_lib_class (needed->by) & DYN_NO_ADD_NEEDED) != 0)
428     class |= DYN_NO_NEEDED | DYN_NO_ADD_NEEDED;
430   bfd_elf_set_dyn_lib_class (abfd, class);
432   /* Add this file into the symbol table.  */
433   if (! bfd_link_add_symbols (abfd, &link_info))
434     einfo ("%F%B: could not read symbols: %E\n", abfd);
436   return TRUE;
440 /* Search for a needed file in a path.  */
442 static bfd_boolean
443 gld${EMULATION_NAME}_search_needed (const char *path,
444                                     struct dt_needed *n, int force)
446   const char *s;
447   const char *name = n->name;
448   size_t len;
449   struct dt_needed needed;
451   if (name[0] == '/')
452     return gld${EMULATION_NAME}_try_needed (n, force);
454   if (path == NULL || *path == '\0')
455     return FALSE;
457   needed.by = n->by;
458   needed.name = n->name;
460   len = strlen (name);
461   while (1)
462     {
463       char *filename, *sset;
465       s = strchr (path, config.rpath_separator);
466       if (s == NULL)
467         s = path + strlen (path);
469       filename = (char *) xmalloc (s - path + len + 2);
470       if (s == path)
471         sset = filename;
472       else
473         {
474           memcpy (filename, path, s - path);
475           filename[s - path] = '/';
476           sset = filename + (s - path) + 1;
477         }
478       strcpy (sset, name);
480       needed.name = filename;
481       if (gld${EMULATION_NAME}_try_needed (&needed, force))
482         return TRUE;
484       free (filename);
486       if (*s == '\0')
487         break;
488       path = s + 1;
489     }
491   return FALSE;
495 if [ "x${USE_LIBPATH}" = xyes ] ; then
496   fragment <<EOF
498 /* Add the sysroot to every entry in a path separated by
499    config.rpath_separator.  */
501 static char *
502 gld${EMULATION_NAME}_add_sysroot (const char *path)
504   int len, colons, i;
505   char *ret, *p;
507   len = strlen (path);
508   colons = 0;
509   i = 0;
510   while (path[i])
511     if (path[i++] == config.rpath_separator)
512       colons++;
514   if (path[i])
515     colons++;
517   len = len + (colons + 1) * strlen (ld_sysroot);
518   ret = xmalloc (len + 1);
519   strcpy (ret, ld_sysroot);
520   p = ret + strlen (ret);
521   i = 0;
522   while (path[i])
523     if (path[i] == config.rpath_separator)
524       {
525         *p++ = path[i++];
526         strcpy (p, ld_sysroot);
527         p = p + strlen (p);
528       }
529     else
530       *p++ = path[i++];
532   *p = 0;
533   return ret;
537   case ${target} in
538     *-*-freebsd* | *-*-dragonfly*)
539       fragment <<EOF
540 /* Read the system search path the FreeBSD way rather than the Linux way.  */
541 #ifdef HAVE_ELF_HINTS_H
542 #include <elf-hints.h>
543 #else
544 #include "elf-hints-local.h"
545 #endif
547 static bfd_boolean
548 gld${EMULATION_NAME}_check_ld_elf_hints (const char *name, int force)
550   static bfd_boolean initialized;
551   static char *ld_elf_hints;
552   struct dt_needed needed;
554   if (!initialized)
555     {
556       FILE *f;
557       char *tmppath;
559       tmppath = concat (ld_sysroot, _PATH_ELF_HINTS, NULL);
560       f = fopen (tmppath, FOPEN_RB);
561       free (tmppath);
562       if (f != NULL)
563         {
564           struct elfhints_hdr hdr;
566           if (fread (&hdr, 1, sizeof (hdr), f) == sizeof (hdr)
567               && hdr.magic == ELFHINTS_MAGIC
568               && hdr.version == 1)
569             {
570               if (fseek (f, hdr.strtab + hdr.dirlist, SEEK_SET) != -1)
571                 {
572                   char *b;
574                   b = xmalloc (hdr.dirlistlen + 1);
575                   if (fread (b, 1, hdr.dirlistlen + 1, f) ==
576                       hdr.dirlistlen + 1)
577                     ld_elf_hints = gld${EMULATION_NAME}_add_sysroot (b);
579                   free (b);
580                 }
581             }
582           fclose (f);
583         }
585       initialized = TRUE;
586     }
588   if (ld_elf_hints == NULL)
589     return FALSE;
591   needed.by = NULL;
592   needed.name = name;
593   return gld${EMULATION_NAME}_search_needed (ld_elf_hints, & needed,
594                                              force);
597     # FreeBSD
598     ;;
600     *-*-linux-* | *-*-k*bsd*-*)
601       fragment <<EOF
602 /* For a native linker, check the file /etc/ld.so.conf for directories
603    in which we may find shared libraries.  /etc/ld.so.conf is really
604    only meaningful on Linux.  */
606 struct gld${EMULATION_NAME}_ld_so_conf
608   char *path;
609   size_t len, alloc;
612 static bfd_boolean
613 gld${EMULATION_NAME}_parse_ld_so_conf
614      (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename);
616 static void
617 gld${EMULATION_NAME}_parse_ld_so_conf_include
618      (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename,
619       const char *pattern)
621   char *newp = NULL;
622 #ifdef HAVE_GLOB
623   glob_t gl;
624 #endif
626   if (pattern[0] != '/')
627     {
628       char *p = strrchr (filename, '/');
629       size_t patlen = strlen (pattern) + 1;
631       newp = xmalloc (p - filename + 1 + patlen);
632       memcpy (newp, filename, p - filename + 1);
633       memcpy (newp + (p - filename + 1), pattern, patlen);
634       pattern = newp;
635     }
637 #ifdef HAVE_GLOB
638   if (glob (pattern, 0, NULL, &gl) == 0)
639     {
640       size_t i;
642       for (i = 0; i < gl.gl_pathc; ++i)
643         gld${EMULATION_NAME}_parse_ld_so_conf (info, gl.gl_pathv[i]);
644       globfree (&gl);
645     }
646 #else
647   /* If we do not have glob, treat the pattern as a literal filename.  */
648   gld${EMULATION_NAME}_parse_ld_so_conf (info, pattern);
649 #endif
651   if (newp)
652     free (newp);
655 static bfd_boolean
656 gld${EMULATION_NAME}_parse_ld_so_conf
657      (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename)
659   FILE *f = fopen (filename, FOPEN_RT);
660   char *line;
661   size_t linelen;
663   if (f == NULL)
664     return FALSE;
666   linelen = 256;
667   line = xmalloc (linelen);
668   do
669     {
670       char *p = line, *q;
672       /* Normally this would use getline(3), but we need to be portable.  */
673       while ((q = fgets (p, linelen - (p - line), f)) != NULL
674              && strlen (q) == linelen - (p - line) - 1
675              && line[linelen - 2] != '\n')
676         {
677           line = xrealloc (line, 2 * linelen);
678           p = line + linelen - 1;
679           linelen += linelen;
680         }
682       if (q == NULL && p == line)
683         break;
685       p = strchr (line, '\n');
686       if (p)
687         *p = '\0';
689       /* Because the file format does not know any form of quoting we
690          can search forward for the next '#' character and if found
691          make it terminating the line.  */
692       p = strchr (line, '#');
693       if (p)
694         *p = '\0';
696       /* Remove leading whitespace.  NUL is no whitespace character.  */
697       p = line;
698       while (*p == ' ' || *p == '\f' || *p == '\r' || *p == '\t' || *p == '\v')
699         ++p;
701       /* If the line is blank it is ignored.  */
702       if (p[0] == '\0')
703         continue;
705       if (CONST_STRNEQ (p, "include") && (p[7] == ' ' || p[7] == '\t'))
706         {
707           char *dir, c;
708           p += 8;
709           do
710             {
711               while (*p == ' ' || *p == '\t')
712                 ++p;
714               if (*p == '\0')
715                 break;
717               dir = p;
719               while (*p != ' ' && *p != '\t' && *p)
720                 ++p;
722               c = *p;
723               *p++ = '\0';
724               if (dir[0] != '\0')
725                 gld${EMULATION_NAME}_parse_ld_so_conf_include (info, filename,
726                                                                dir);
727             }
728           while (c != '\0');
729         }
730       else
731         {
732           char *dir = p;
733           while (*p && *p != '=' && *p != ' ' && *p != '\t' && *p != '\f'
734                  && *p != '\r' && *p != '\v')
735             ++p;
737           while (p != dir && p[-1] == '/')
738             --p;
739           if (info->path == NULL)
740             {
741               info->alloc = p - dir + 1 + 256;
742               info->path = xmalloc (info->alloc);
743               info->len = 0;
744             }
745           else
746             {
747               if (info->len + 1 + (p - dir) >= info->alloc)
748                 {
749                   info->alloc += p - dir + 256;
750                   info->path = xrealloc (info->path, info->alloc);
751                 }
752               info->path[info->len++] = config.rpath_separator;
753             }
754           memcpy (info->path + info->len, dir, p - dir);
755           info->len += p - dir;
756           info->path[info->len] = '\0';
757         }
758     }
759   while (! feof (f));
760   free (line);
761   fclose (f);
762   return TRUE;
765 static bfd_boolean
766 gld${EMULATION_NAME}_check_ld_so_conf (const char *name, int force)
768   static bfd_boolean initialized;
769   static char *ld_so_conf;
770   struct dt_needed needed;
772   if (! initialized)
773     {
774       char *tmppath;
775       struct gld${EMULATION_NAME}_ld_so_conf info;
777       info.path = NULL;
778       info.len = info.alloc = 0;
779       tmppath = concat (ld_sysroot, "${prefix}/etc/ld.so.conf", NULL);
780       if (!gld${EMULATION_NAME}_parse_ld_so_conf (&info, tmppath))
781         {
782           free (tmppath);
783           tmppath = concat (ld_sysroot, "/etc/ld.so.conf", NULL);
784           gld${EMULATION_NAME}_parse_ld_so_conf (&info, tmppath);
785         }
786       free (tmppath);
788       if (info.path)
789         {
790           char *d = gld${EMULATION_NAME}_add_sysroot (info.path);
791           free (info.path);
792           ld_so_conf = d;
793         }
794       initialized = TRUE;
795     }
797   if (ld_so_conf == NULL)
798     return FALSE;
801   needed.by = NULL;
802   needed.name = name;
803   return gld${EMULATION_NAME}_search_needed (ld_so_conf, &needed, force);
807     # Linux
808     ;;
809   esac
811 fragment <<EOF
813 /* See if an input file matches a DT_NEEDED entry by name.  */
815 static void
816 gld${EMULATION_NAME}_check_needed (lang_input_statement_type *s)
818   const char *soname;
820   /* Stop looking if we've found a loaded lib.  */
821   if (global_found != NULL
822       && (bfd_elf_get_dyn_lib_class (global_found->the_bfd)
823           & DYN_AS_NEEDED) == 0)
824     return;
826   if (s->filename == NULL || s->the_bfd == NULL)
827     return;
829   /* Don't look for a second non-loaded as-needed lib.  */
830   if (global_found != NULL
831       && (bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0)
832     return;
834   if (strcmp (s->filename, global_needed->name) == 0)
835     {
836       global_found = s;
837       return;
838     }
840   if (s->search_dirs_flag)
841     {
842       const char *f = strrchr (s->filename, '/');
843       if (f != NULL
844           && strcmp (f + 1, global_needed->name) == 0)
845         {
846           global_found = s;
847           return;
848         }
849     }
851   soname = bfd_elf_get_dt_soname (s->the_bfd);
852   if (soname != NULL
853       && strcmp (soname, global_needed->name) == 0)
854     {
855       global_found = s;
856       return;
857     }
862 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
863 fragment <<EOF
865 static bfd_size_type
866 gld${EMULATION_NAME}_id_note_section_size (bfd *abfd,
867                                            struct bfd_link_info *link_info)
869   const char *style = link_info->emit_note_gnu_build_id;
870   bfd_size_type size;
872   abfd = abfd;
874   size = offsetof (Elf_External_Note, name[sizeof "GNU"]);
875   size = (size + 3) & -(bfd_size_type) 4;
877   if (!strcmp (style, "md5") || !strcmp (style, "uuid"))
878     size += 128 / 8;
879   else if (!strcmp (style, "sha1"))
880     size += 160 / 8;
881   else if (!strncmp (style, "0x", 2))
882     {
883       /* ID is in string form (hex).  Convert to bits.  */
884       const char *id = style + 2;
885       do
886         {
887           if (ISXDIGIT (id[0]) && ISXDIGIT (id[1]))
888             {
889               ++size;
890               id += 2;
891             }
892           else if (*id == '-' || *id == ':')
893             ++id;
894           else
895             {
896               size = 0;
897               break;
898             }
899         } while (*id != '\0');
900     }
901   else
902     size = 0;
904   return size;
907 static unsigned char
908 read_hex (const char xdigit)
910   if (ISDIGIT (xdigit))
911     return xdigit - '0';
912   if (ISUPPER (xdigit))
913     return xdigit - 'A' + 0xa;
914   if (ISLOWER (xdigit))
915     return xdigit - 'a' + 0xa;
916   abort ();
917   return 0;
920 struct build_id_info
922   const char *style;
923   asection *sec;
926 static bfd_boolean
927 gld${EMULATION_NAME}_write_build_id_section (bfd *abfd)
929   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
930   struct build_id_info *info =
931     elf_tdata (abfd)->after_write_object_contents_info;
932   asection *asec;
933   Elf_Internal_Shdr *i_shdr;
934   unsigned char *contents, *id_bits;
935   bfd_size_type size;
936   Elf_External_Note *e_note;
938   asec = info->sec;
939   if (asec->output_section == NULL)
940     {
941       einfo (_("%P: .note.gnu.build-id section missing"));
942       return FALSE;
943     }
944   i_shdr = &elf_section_data (asec->output_section)->this_hdr;
946   if (i_shdr->contents == NULL)
947     {
948       if (asec->contents == NULL)
949         asec->contents = xmalloc (asec->size);
950       contents = asec->contents;
951     }
952   else
953     contents = i_shdr->contents + asec->output_offset;
955   e_note = (void *) contents;
956   size = offsetof (Elf_External_Note, name[sizeof "GNU"]);
957   size = (size + 3) & -(bfd_size_type) 4;
958   id_bits = contents + size;
959   size = asec->size - size;
961   bfd_h_put_32 (abfd, sizeof "GNU", &e_note->namesz);
962   bfd_h_put_32 (abfd, size, &e_note->descsz);
963   bfd_h_put_32 (abfd, NT_GNU_BUILD_ID, &e_note->type);
964   memcpy (e_note->name, "GNU", sizeof "GNU");
966   if (!strcmp (info->style, "md5"))
967     {
968       struct md5_ctx ctx;
969       md5_init_ctx (&ctx);
970       if (bed->s->checksum_contents (abfd,
971                                      (void (*) (const void *, size_t, void *))
972                                      &md5_process_bytes,
973                                      &ctx))
974         md5_finish_ctx (&ctx, id_bits);
975       else
976         return FALSE;
977     }
978   else if (!strcmp (info->style, "sha1"))
979     {
980       struct sha1_ctx ctx;
981       sha1_init_ctx (&ctx);
982       if (bed->s->checksum_contents (abfd,
983                                      (void (*) (const void *, size_t, void *))
984                                      &sha1_process_bytes,
985                                      &ctx))
986         sha1_finish_ctx (&ctx, id_bits);
987       else
988         return FALSE;
989     }
990   else if (!strcmp (info->style, "uuid"))
991     {
992       int n;
993       int fd = open ("/dev/urandom", O_RDONLY);
994       if (fd < 0)
995         return FALSE;
996       n = read (fd, id_bits, size);
997       close (fd);
998       if (n < (int) size)
999         return FALSE;
1000     }
1001   else if (!strncmp (info->style, "0x", 2))
1002     {
1003       /* ID is in string form (hex).  Convert to bits.  */
1004       const char *id = info->style + 2;
1005       size_t n = 0;
1006       do
1007         {
1008           if (ISXDIGIT (id[0]) && ISXDIGIT (id[1]))
1009             {
1010               id_bits[n] = read_hex (*id++) << 4;
1011               id_bits[n++] |= read_hex (*id++);
1012             }
1013           else if (*id == '-' || *id == ':')
1014             ++id;
1015           else
1016             abort ();           /* Should have been validated earlier.  */
1017         } while (*id != '\0');
1018     }
1019   else
1020     abort ();                   /* Should have been validated earlier.  */
1022   size = asec->size;
1023   return (bfd_seek (abfd,
1024                     i_shdr->sh_offset + asec->output_offset, SEEK_SET) == 0
1025           && bfd_bwrite (contents, size, abfd) == size);
1029 /* This is called after all the input files have been opened.  */
1031 static void
1032 gld${EMULATION_NAME}_after_open (void)
1034   struct bfd_link_needed_list *needed, *l;
1035   struct elf_link_hash_table *htab;
1037   htab = elf_hash_table (&link_info);
1038   if (!is_elf_hash_table (htab))
1039     return;
1041   if (link_info.emit_note_gnu_build_id)
1042     {
1043       bfd *abfd;
1044       asection *s;
1045       bfd_size_type size;
1047       abfd = link_info.input_bfds;
1049       size = gld${EMULATION_NAME}_id_note_section_size (abfd, &link_info);
1050       if (size == 0)
1051         {
1052           einfo ("%P: warning: unrecognized --build-id style ignored.\n");
1053           free (link_info.emit_note_gnu_build_id);
1054           link_info.emit_note_gnu_build_id = NULL;
1055         }
1056       else
1057         {
1058           s = bfd_make_section_with_flags (abfd, ".note.gnu.build-id",
1059                                            SEC_ALLOC | SEC_LOAD
1060                                            | SEC_IN_MEMORY | SEC_LINKER_CREATED
1061                                            | SEC_READONLY | SEC_DATA);
1062           if (s != NULL && bfd_set_section_alignment (abfd, s, 2))
1063             {
1064               struct elf_obj_tdata *t = elf_tdata (output_bfd);
1065               struct build_id_info *b = xmalloc (sizeof *b);
1066               b->style = link_info.emit_note_gnu_build_id;
1067               b->sec = s;
1068               elf_section_type (s) = SHT_NOTE;
1069               s->size = size;
1070               t->after_write_object_contents
1071                 = &gld${EMULATION_NAME}_write_build_id_section;
1072               t->after_write_object_contents_info = b;
1073             }
1074           else
1075             {
1076               einfo ("%P: warning: Cannot create .note.gnu.build-id section,"
1077                      " --build-id ignored.\n");
1078               free (link_info.emit_note_gnu_build_id);
1079               link_info.emit_note_gnu_build_id = NULL;
1080             }
1081         }
1082     }
1084   if (link_info.relocatable)
1085     return;
1087   if (link_info.eh_frame_hdr
1088       && !link_info.traditional_format)
1089     {
1090       bfd *abfd;
1091       asection *s;
1093       for (abfd = link_info.input_bfds; abfd; abfd = abfd->link_next)
1094         {
1095           s = bfd_get_section_by_name (abfd, ".eh_frame");
1096           if (s && s->size > 8 && !bfd_is_abs_section (s->output_section))
1097             break;
1098         }
1099       if (abfd)
1100         {
1101           const struct elf_backend_data *bed;
1103           bed = get_elf_backend_data (abfd);
1104           s = bfd_make_section_with_flags (abfd, ".eh_frame_hdr",
1105                                            bed->dynamic_sec_flags
1106                                            | SEC_READONLY);
1107           if (s != NULL
1108               && bfd_set_section_alignment (abfd, s, 2))
1109             htab->eh_info.hdr_sec = s;
1110           else
1111             einfo ("%P: warning: Cannot create .eh_frame_hdr section,"
1112                    " --eh-frame-hdr ignored.\n");
1113         }
1114     }
1116   /* Get the list of files which appear in DT_NEEDED entries in
1117      dynamic objects included in the link (often there will be none).
1118      For each such file, we want to track down the corresponding
1119      library, and include the symbol table in the link.  This is what
1120      the runtime dynamic linker will do.  Tracking the files down here
1121      permits one dynamic object to include another without requiring
1122      special action by the person doing the link.  Note that the
1123      needed list can actually grow while we are stepping through this
1124      loop.  */
1125   if (!link_info.executable)
1126     return;
1127   needed = bfd_elf_get_needed_list (output_bfd, &link_info);
1128   for (l = needed; l != NULL; l = l->next)
1129     {
1130       struct bfd_link_needed_list *ll;
1131       struct dt_needed n, nn;
1132       int force;
1134       /* If the lib that needs this one was --as-needed and wasn't
1135          found to be needed, then this lib isn't needed either.  */
1136       if (l->by != NULL
1137           && (bfd_elf_get_dyn_lib_class (l->by) & DYN_AS_NEEDED) != 0)
1138         continue;
1140       /* If we've already seen this file, skip it.  */
1141       for (ll = needed; ll != l; ll = ll->next)
1142         if ((ll->by == NULL
1143              || (bfd_elf_get_dyn_lib_class (ll->by) & DYN_AS_NEEDED) == 0)
1144             && strcmp (ll->name, l->name) == 0)
1145           break;
1146       if (ll != l)
1147         continue;
1149       /* See if this file was included in the link explicitly.  */
1150       global_needed = l;
1151       global_found = NULL;
1152       lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
1153       if (global_found != NULL
1154           && (bfd_elf_get_dyn_lib_class (global_found->the_bfd)
1155               & DYN_AS_NEEDED) == 0)
1156         continue;
1158       n.by = l->by;
1159       n.name = l->name;
1160       nn.by = l->by;
1161       if (trace_file_tries)
1162         info_msg (_("%s needed by %B\n"), l->name, l->by);
1164       /* As-needed libs specified on the command line (or linker script)
1165          take priority over libs found in search dirs.  */
1166       if (global_found != NULL)
1167         {
1168           nn.name = global_found->filename;
1169           if (gld${EMULATION_NAME}_try_needed (&nn, TRUE))
1170             continue;
1171         }
1173       /* We need to find this file and include the symbol table.  We
1174          want to search for the file in the same way that the dynamic
1175          linker will search.  That means that we want to use
1176          rpath_link, rpath, then the environment variable
1177          LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
1178          entries (native only), then the linker script LIB_SEARCH_DIRS.
1179          We do not search using the -L arguments.
1181          We search twice.  The first time, we skip objects which may
1182          introduce version mismatches.  The second time, we force
1183          their use.  See gld${EMULATION_NAME}_vercheck comment.  */
1184       for (force = 0; force < 2; force++)
1185         {
1186           size_t len;
1187           search_dirs_type *search;
1189 if [ "x${NATIVE}" = xyes ] ; then
1190 fragment <<EOF
1191           const char *lib_path;
1194 if [ "x${USE_LIBPATH}" = xyes ] ; then
1195 fragment <<EOF
1196           struct bfd_link_needed_list *rp;
1197           int found;
1200 fragment <<EOF
1202           if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
1203                                                   &n, force))
1204             break;
1206 if [ "x${USE_LIBPATH}" = xyes ] ; then
1207 fragment <<EOF
1208           if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
1209                                                   &n, force))
1210             break;
1213 if [ "x${NATIVE}" = xyes ] ; then
1214 fragment <<EOF
1215           if (command_line.rpath_link == NULL
1216               && command_line.rpath == NULL)
1217             {
1218               lib_path = (const char *) getenv ("LD_RUN_PATH");
1219               if (gld${EMULATION_NAME}_search_needed (lib_path, &n,
1220                                                       force))
1221                 break;
1222             }
1223           lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
1224           if (gld${EMULATION_NAME}_search_needed (lib_path, &n, force))
1225             break;
1228 if [ "x${USE_LIBPATH}" = xyes ] ; then
1229 fragment <<EOF
1230           found = 0;
1231           rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
1232           for (; !found && rp != NULL; rp = rp->next)
1233             {
1234               char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
1235               found = (rp->by == l->by
1236                        && gld${EMULATION_NAME}_search_needed (tmpname,
1237                                                               &n,
1238                                                               force));
1239               free (tmpname);
1240             }
1241           if (found)
1242             break;
1246 if [ "x${USE_LIBPATH}" = xyes ] ; then
1247   case ${target} in
1248     *-*-freebsd* | *-*-dragonfly*)
1249       fragment <<EOF
1250           if (gld${EMULATION_NAME}_check_ld_elf_hints (l->name, force))
1251             break;
1253     # FreeBSD
1254     ;;
1256     *-*-linux-* | *-*-k*bsd*-*)
1257     # Linux
1258       fragment <<EOF
1259           if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
1260             break;
1263     ;;
1264   esac
1266 fragment <<EOF
1267           len = strlen (l->name);
1268           for (search = search_head; search != NULL; search = search->next)
1269             {
1270               char *filename;
1272               if (search->cmdline)
1273                 continue;
1274               filename = (char *) xmalloc (strlen (search->name) + len + 2);
1275               sprintf (filename, "%s/%s", search->name, l->name);
1276               nn.name = filename;
1277               if (gld${EMULATION_NAME}_try_needed (&nn, force))
1278                 break;
1279               free (filename);
1280             }
1281           if (search != NULL)
1282             break;
1284 fragment <<EOF
1285         }
1287       if (force < 2)
1288         continue;
1290       einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
1291              l->name, l->by);
1292     }
1298 fragment <<EOF
1300 /* Look through an expression for an assignment statement.  */
1302 static void
1303 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
1305   bfd_boolean provide = FALSE;
1307   switch (exp->type.node_class)
1308     {
1309     case etree_provide:
1310       provide = TRUE;
1311       /* Fall thru */
1312     case etree_assign:
1313       /* We call record_link_assignment even if the symbol is defined.
1314          This is because if it is defined by a dynamic object, we
1315          actually want to use the value defined by the linker script,
1316          not the value from the dynamic object (because we are setting
1317          symbols like etext).  If the symbol is defined by a regular
1318          object, then, as it happens, calling record_link_assignment
1319          will do no harm.  */
1320       if (strcmp (exp->assign.dst, ".") != 0)
1321         {
1322           if (!bfd_elf_record_link_assignment (output_bfd, &link_info,
1323                                                exp->assign.dst, provide,
1324                                                exp->assign.hidden))
1325             einfo ("%P%F: failed to record assignment to %s: %E\n",
1326                    exp->assign.dst);
1327         }
1328       gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1329       break;
1331     case etree_binary:
1332       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1333       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1334       break;
1336     case etree_trinary:
1337       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1338       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1339       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1340       break;
1342     case etree_unary:
1343       gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1344       break;
1346     default:
1347       break;
1348     }
1352 /* This is called by the before_allocation routine via
1353    lang_for_each_statement.  It locates any assignment statements, and
1354    tells the ELF backend about them, in case they are assignments to
1355    symbols which are referred to by dynamic objects.  */
1357 static void
1358 gld${EMULATION_NAME}_find_statement_assignment (lang_statement_union_type *s)
1360   if (s->header.type == lang_assignment_statement_enum)
1361     gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1366 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
1367   if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
1368     ELF_INTERPRETER_SET_DEFAULT="
1369   if (sinterp != NULL)
1370     {
1371       sinterp->contents = (unsigned char *) ${ELF_INTERPRETER_NAME};
1372       sinterp->size = strlen ((char *) sinterp->contents) + 1;
1373     }
1376   else
1377     ELF_INTERPRETER_SET_DEFAULT=
1378   fi
1379 fragment <<EOF
1381 /* This is called after the sections have been attached to output
1382    sections, but before any sizes or addresses have been set.  */
1384 static void
1385 gld${EMULATION_NAME}_before_allocation (void)
1387   const char *rpath;
1388   asection *sinterp;
1390   if (link_info.hash->type == bfd_link_elf_hash_table)
1391     _bfd_elf_tls_setup (output_bfd, &link_info);
1393   /* If we are going to make any variable assignments, we need to let
1394      the ELF backend know about them in case the variables are
1395      referred to by dynamic objects.  */
1396   lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
1398   /* Let the ELF backend work out the sizes of any sections required
1399      by dynamic linking.  */
1400   rpath = command_line.rpath;
1401   if (rpath == NULL)
1402     rpath = (const char *) getenv ("LD_RUN_PATH");
1403   if (! (bfd_elf_size_dynamic_sections
1404          (output_bfd, command_line.soname, rpath,
1405           command_line.filter_shlib,
1406           (const char * const *) command_line.auxiliary_filters,
1407           &link_info, &sinterp, lang_elf_version_info)))
1408     einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1410 ${ELF_INTERPRETER_SET_DEFAULT}
1411   /* Let the user override the dynamic linker we are using.  */
1412   if (command_line.interpreter != NULL
1413       && sinterp != NULL)
1414     {
1415       sinterp->contents = (bfd_byte *) command_line.interpreter;
1416       sinterp->size = strlen (command_line.interpreter) + 1;
1417     }
1419   /* Look for any sections named .gnu.warning.  As a GNU extensions,
1420      we treat such sections as containing warning messages.  We print
1421      out the warning message, and then zero out the section size so
1422      that it does not get copied into the output file.  */
1424   {
1425     LANG_FOR_EACH_INPUT_STATEMENT (is)
1426       {
1427         asection *s;
1428         bfd_size_type sz;
1429         char *msg;
1430         bfd_boolean ret;
1432         if (is->just_syms_flag)
1433           continue;
1435         s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
1436         if (s == NULL)
1437           continue;
1439         sz = s->size;
1440         msg = xmalloc ((size_t) (sz + 1));
1441         if (! bfd_get_section_contents (is->the_bfd, s, msg,
1442                                         (file_ptr) 0, sz))
1443           einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
1444                  is->the_bfd);
1445         msg[sz] = '\0';
1446         ret = link_info.callbacks->warning (&link_info, msg,
1447                                             (const char *) NULL,
1448                                             is->the_bfd, (asection *) NULL,
1449                                             (bfd_vma) 0);
1450         ASSERT (ret);
1451         free (msg);
1453         /* Clobber the section size, so that we don't waste space
1454            copying the warning into the output file.  If we've already
1455            sized the output section, adjust its size.  The adjustment
1456            is on rawsize because targets that size sections early will
1457            have called lang_reset_memory_regions after sizing.  */
1458         if (s->output_section != NULL
1459             && s->output_section->rawsize >= s->size)
1460           s->output_section->rawsize -= s->size;
1462         s->size = 0;
1464         /* Also set SEC_EXCLUDE, so that local symbols defined in the
1465            warning section don't get copied to the output.  */
1466         s->flags |= SEC_EXCLUDE | SEC_KEEP;
1467       }
1468   }
1470   before_allocation_default ();
1472   if (!bfd_elf_size_dynsym_hash_dynstr (output_bfd, &link_info))
1473     einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1479 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
1480 fragment <<EOF
1482 /* Try to open a dynamic archive.  This is where we know that ELF
1483    dynamic libraries have an extension of .so (or .sl on oddball systems
1484    like hpux).  */
1486 static bfd_boolean
1487 gld${EMULATION_NAME}_open_dynamic_archive
1488   (const char *arch, search_dirs_type *search, lang_input_statement_type *entry)
1490   const char *filename;
1491   char *string;
1493   if (! entry->is_archive)
1494     return FALSE;
1496   filename = entry->filename;
1498   /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
1499      is defined, but it does not seem worth the headache to optimize
1500      away those two bytes of space.  */
1501   string = (char *) xmalloc (strlen (search->name)
1502                              + strlen (filename)
1503                              + strlen (arch)
1504 #ifdef EXTRA_SHLIB_EXTENSION
1505                              + strlen (EXTRA_SHLIB_EXTENSION)
1506 #endif
1507                              + sizeof "/lib.so");
1509   sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
1511 #ifdef EXTRA_SHLIB_EXTENSION
1512   /* Try the .so extension first.  If that fails build a new filename
1513      using EXTRA_SHLIB_EXTENSION.  */
1514   if (! ldfile_try_open_bfd (string, entry))
1515     sprintf (string, "%s/lib%s%s%s", search->name,
1516              filename, arch, EXTRA_SHLIB_EXTENSION);
1517 #endif
1519   if (! ldfile_try_open_bfd (string, entry))
1520     {
1521       free (string);
1522       return FALSE;
1523     }
1525   entry->filename = string;
1527   /* We have found a dynamic object to include in the link.  The ELF
1528      backend linker will create a DT_NEEDED entry in the .dynamic
1529      section naming this file.  If this file includes a DT_SONAME
1530      entry, it will be used.  Otherwise, the ELF linker will just use
1531      the name of the file.  For an archive found by searching, like
1532      this one, the DT_NEEDED entry should consist of just the name of
1533      the file, without the path information used to find it.  Note
1534      that we only need to do this if we have a dynamic object; an
1535      archive will never be referenced by a DT_NEEDED entry.
1537      FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
1538      very pretty.  I haven't been able to think of anything that is
1539      pretty, though.  */
1540   if (bfd_check_format (entry->the_bfd, bfd_object)
1541       && (entry->the_bfd->flags & DYNAMIC) != 0)
1542     {
1543       ASSERT (entry->is_archive && entry->search_dirs_flag);
1545       /* Rather than duplicating the logic above.  Just use the
1546          filename we recorded earlier.  */
1548       filename = lbasename (entry->filename);
1549       bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
1550     }
1552   return TRUE;
1558 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
1559 fragment <<EOF
1561 /* A variant of lang_output_section_find used by place_orphan.  */
1563 static lang_output_section_statement_type *
1564 output_rel_find (asection *sec, int isdyn)
1566   lang_output_section_statement_type *lookup;
1567   lang_output_section_statement_type *last = NULL;
1568   lang_output_section_statement_type *last_alloc = NULL;
1569   lang_output_section_statement_type *last_ro_alloc = NULL;
1570   lang_output_section_statement_type *last_rel = NULL;
1571   lang_output_section_statement_type *last_rel_alloc = NULL;
1572   int rela = sec->name[4] == 'a';
1574   for (lookup = &lang_output_section_statement.head->output_section_statement;
1575        lookup != NULL;
1576        lookup = lookup->next)
1577     {
1578       if (lookup->constraint != -1
1579           && CONST_STRNEQ (lookup->name, ".rel"))
1580         {
1581           int lookrela = lookup->name[4] == 'a';
1583           /* .rel.dyn must come before all other reloc sections, to suit
1584              GNU ld.so.  */
1585           if (isdyn)
1586             break;
1588           /* Don't place after .rel.plt as doing so results in wrong
1589              dynamic tags.  */
1590           if (strcmp (".plt", lookup->name + 4 + lookrela) == 0)
1591             break;
1593           if (rela == lookrela || last_rel == NULL)
1594             last_rel = lookup;
1595           if ((rela == lookrela || last_rel_alloc == NULL)
1596               && lookup->bfd_section != NULL
1597               && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1598             last_rel_alloc = lookup;
1599         }
1601       last = lookup;
1602       if (lookup->bfd_section != NULL
1603           && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1604         {
1605           last_alloc = lookup;
1606           if ((lookup->bfd_section->flags & SEC_READONLY) != 0)
1607             last_ro_alloc = lookup;
1608         }
1609     }
1611   if (last_rel_alloc)
1612     return last_rel_alloc;
1614   if (last_rel)
1615     return last_rel;
1617   if (last_ro_alloc)
1618     return last_ro_alloc;
1620   if (last_alloc)
1621     return last_alloc;
1623   return last;
1626 /* Place an orphan section.  We use this to put random SHF_ALLOC
1627    sections in the right segment.  */
1629 static bfd_boolean
1630 gld${EMULATION_NAME}_place_orphan (asection *s)
1632   static struct orphan_save hold[] =
1633     {
1634       { ".text",
1635         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1636         0, 0, 0, 0 },
1637       { ".rodata",
1638         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1639         0, 0, 0, 0 },
1640       { ".data",
1641         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1642         0, 0, 0, 0 },
1643       { ".bss",
1644         SEC_ALLOC,
1645         0, 0, 0, 0 },
1646       { 0,
1647         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1648         0, 0, 0, 0 },
1649       { ".interp",
1650         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1651         0, 0, 0, 0 },
1652       { ".sdata",
1653         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_SMALL_DATA,
1654         0, 0, 0, 0 }
1655     };
1656   enum orphan_save_index
1657     {
1658       orphan_text = 0,
1659       orphan_rodata,
1660       orphan_data,
1661       orphan_bss,
1662       orphan_rel,
1663       orphan_interp,
1664       orphan_sdata
1665     };
1666   static int orphan_init_done = 0;
1667   struct orphan_save *place;
1668   const char *secname;
1669   lang_output_section_statement_type *after;
1670   lang_output_section_statement_type *os;
1671   int isdyn = 0;
1672   int iself = s->owner->xvec->flavour == bfd_target_elf_flavour;
1673   unsigned int sh_type = iself ? elf_section_type (s) : SHT_NULL;
1675   secname = bfd_get_section_name (s->owner, s);
1677   if (! link_info.relocatable
1678       && link_info.combreloc
1679       && (s->flags & SEC_ALLOC))
1680     {
1681       if (iself)
1682         switch (sh_type)
1683           {
1684           case SHT_RELA:
1685             secname = ".rela.dyn";
1686             isdyn = 1;
1687             break;
1688           case SHT_REL:
1689             secname = ".rel.dyn";
1690             isdyn = 1;
1691             break;
1692           default:
1693             break;
1694           }
1695       else if (CONST_STRNEQ (secname, ".rel"))
1696         {
1697           secname = secname[4] == 'a' ? ".rela.dyn" : ".rel.dyn";
1698           isdyn = 1;
1699         }
1700     }
1702   if (isdyn || (!config.unique_orphan_sections && !unique_section_p (s)))
1703     {
1704       /* Look through the script to see where to place this section.  */
1705       os = lang_output_section_find (secname);
1707       if (os != NULL
1708           && (os->bfd_section == NULL
1709               || os->bfd_section->flags == 0
1710               || (_bfd_elf_match_sections_by_type (output_bfd,
1711                                                    os->bfd_section,
1712                                                    s->owner, s)
1713                   && ((s->flags ^ os->bfd_section->flags)
1714                       & (SEC_LOAD | SEC_ALLOC)) == 0)))
1715         {
1716           /* We already have an output section statement with this
1717              name, and its bfd section, if any, has compatible flags.
1718              If the section already exists but does not have any flags
1719              set, then it has been created by the linker, probably as a
1720              result of a --section-start command line switch.  */
1721           lang_add_section (&os->children, s, os);
1722           return TRUE;
1723         }
1724     }
1726   if (!orphan_init_done)
1727     {
1728       struct orphan_save *ho;
1729       for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
1730         if (ho->name != NULL)
1731           {
1732             ho->os = lang_output_section_find (ho->name);
1733             if (ho->os != NULL && ho->os->flags == 0)
1734               ho->os->flags = ho->flags;
1735           }
1736       orphan_init_done = 1;
1737     }
1739   /* If this is a final link, then always put .gnu.warning.SYMBOL
1740      sections into the .text section to get them out of the way.  */
1741   if (link_info.executable
1742       && ! link_info.relocatable
1743       && CONST_STRNEQ (secname, ".gnu.warning.")
1744       && hold[orphan_text].os != NULL)
1745     {
1746       lang_add_section (&hold[orphan_text].os->children, s,
1747                         hold[orphan_text].os);
1748       return TRUE;
1749     }
1751   /* Decide which segment the section should go in based on the
1752      section name and section flags.  We put loadable .note sections
1753      right after the .interp section, so that the PT_NOTE segment is
1754      stored right after the program headers where the OS can read it
1755      in the first page.  */
1757   place = NULL;
1758   if ((s->flags & SEC_ALLOC) == 0)
1759     ;
1760   else if ((s->flags & SEC_LOAD) != 0
1761            && ((iself && sh_type == SHT_NOTE)
1762                || (!iself && CONST_STRNEQ (secname, ".note"))))
1763     place = &hold[orphan_interp];
1764   else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
1765     place = &hold[orphan_bss];
1766   else if ((s->flags & SEC_SMALL_DATA) != 0)
1767     place = &hold[orphan_sdata];
1768   else if ((s->flags & SEC_READONLY) == 0)
1769     place = &hold[orphan_data];
1770   else if (((iself && (sh_type == SHT_RELA || sh_type == SHT_REL))
1771             || (!iself && CONST_STRNEQ (secname, ".rel")))
1772            && (s->flags & SEC_LOAD) != 0)
1773     place = &hold[orphan_rel];
1774   else if ((s->flags & SEC_CODE) == 0)
1775     place = &hold[orphan_rodata];
1776   else
1777     place = &hold[orphan_text];
1779   after = NULL;
1780   if (place != NULL)
1781     {
1782       if (place->os == NULL)
1783         {
1784           if (place->name != NULL)
1785             place->os = lang_output_section_find (place->name);
1786           else
1787             place->os = output_rel_find (s, isdyn);
1788         }
1789       after = place->os;
1790       if (after == NULL)
1791         after = lang_output_section_find_by_flags
1792           (s, &place->os, _bfd_elf_match_sections_by_type);
1793       if (after == NULL)
1794         /* *ABS* is always the first output section statement.  */
1795         after = &lang_output_section_statement.head->output_section_statement;
1796     }
1798   /* Choose a unique name for the section.  This will be needed if the
1799      same section name appears in the input file with different
1800      loadable or allocatable characteristics.  */
1801   if (bfd_get_section_by_name (output_bfd, secname) != NULL)
1802     {
1803       static int count = 1;
1804       secname = bfd_get_unique_section_name (output_bfd, secname, &count);
1805       if (secname == NULL)
1806         einfo ("%F%P: place_orphan failed: %E\n");
1807     }
1809   lang_insert_orphan (s, secname, after, place, NULL, NULL);
1811   return TRUE;
1816 if test x"$LDEMUL_FINISH" != xgld"$EMULATION_NAME"_finish; then
1817 fragment <<EOF
1819 static void
1820 gld${EMULATION_NAME}_finish (void)
1822   bfd_boolean need_layout = bfd_elf_discard_info (output_bfd, &link_info);
1824   gld${EMULATION_NAME}_map_segments (need_layout);
1825   finish_default ();
1830 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1831 fragment <<EOF
1833 static char *
1834 gld${EMULATION_NAME}_get_script (int *isfile)
1837 if test -n "$COMPILE_IN"
1838 then
1839 # Scripts compiled in.
1841 # sed commands to quote an ld script as a C string.
1842 sc="-f stringify.sed"
1844 fragment <<EOF
1846   *isfile = 0;
1848   if (link_info.relocatable && config.build_constructors)
1849     return
1851 sed $sc ldscripts/${EMULATION_NAME}.xu                  >> e${EMULATION_NAME}.c
1852 echo '  ; else if (link_info.relocatable) return'       >> e${EMULATION_NAME}.c
1853 sed $sc ldscripts/${EMULATION_NAME}.xr                  >> e${EMULATION_NAME}.c
1854 echo '  ; else if (!config.text_read_only) return'      >> e${EMULATION_NAME}.c
1855 sed $sc ldscripts/${EMULATION_NAME}.xbn                 >> e${EMULATION_NAME}.c
1856 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
1857 echo '  ; else if (!config.magic_demand_paged) return'  >> e${EMULATION_NAME}.c
1858 sed $sc ldscripts/${EMULATION_NAME}.xn                  >> e${EMULATION_NAME}.c
1860 if test -n "$GENERATE_PIE_SCRIPT" ; then
1861 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1862 echo '  ; else if (link_info.pie && link_info.combreloc' >> e${EMULATION_NAME}.c
1863 echo '             && link_info.relro' >> e${EMULATION_NAME}.c
1864 echo '             && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1865 sed $sc ldscripts/${EMULATION_NAME}.xdw                 >> e${EMULATION_NAME}.c
1866 echo '  ; else if (link_info.pie && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1867 sed $sc ldscripts/${EMULATION_NAME}.xdc                 >> e${EMULATION_NAME}.c
1869 echo '  ; else if (link_info.pie) return'               >> e${EMULATION_NAME}.c
1870 sed $sc ldscripts/${EMULATION_NAME}.xd                  >> e${EMULATION_NAME}.c
1872 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1873 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1874 echo '  ; else if (link_info.shared && link_info.combreloc' >> e${EMULATION_NAME}.c
1875 echo '             && link_info.relro' >> e${EMULATION_NAME}.c
1876 echo '             && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1877 sed $sc ldscripts/${EMULATION_NAME}.xsw                 >> e${EMULATION_NAME}.c
1878 echo '  ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1879 sed $sc ldscripts/${EMULATION_NAME}.xsc                 >> e${EMULATION_NAME}.c
1881 echo '  ; else if (link_info.shared) return'            >> e${EMULATION_NAME}.c
1882 sed $sc ldscripts/${EMULATION_NAME}.xs                  >> e${EMULATION_NAME}.c
1884 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1885 echo '  ; else if (link_info.combreloc && link_info.relro' >> e${EMULATION_NAME}.c
1886 echo '             && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1887 sed $sc ldscripts/${EMULATION_NAME}.xw                  >> e${EMULATION_NAME}.c
1888 echo '  ; else if (link_info.combreloc) return'         >> e${EMULATION_NAME}.c
1889 sed $sc ldscripts/${EMULATION_NAME}.xc                  >> e${EMULATION_NAME}.c
1891 echo '  ; else return'                                  >> e${EMULATION_NAME}.c
1892 sed $sc ldscripts/${EMULATION_NAME}.x                   >> e${EMULATION_NAME}.c
1893 echo '; }'                                              >> e${EMULATION_NAME}.c
1895 else
1896 # Scripts read from the filesystem.
1898 fragment <<EOF
1900   *isfile = 1;
1902   if (link_info.relocatable && config.build_constructors)
1903     return "ldscripts/${EMULATION_NAME}.xu";
1904   else if (link_info.relocatable)
1905     return "ldscripts/${EMULATION_NAME}.xr";
1906   else if (!config.text_read_only)
1907     return "ldscripts/${EMULATION_NAME}.xbn";
1909 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
1910 else
1911 fragment <<EOF
1912   else if (!config.magic_demand_paged)
1913     return "ldscripts/${EMULATION_NAME}.xn";
1916 if test -n "$GENERATE_PIE_SCRIPT" ; then
1917 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1918 fragment <<EOF
1919   else if (link_info.pie && link_info.combreloc
1920            && link_info.relro && (link_info.flags & DT_BIND_NOW))
1921     return "ldscripts/${EMULATION_NAME}.xdw";
1922   else if (link_info.pie && link_info.combreloc)
1923     return "ldscripts/${EMULATION_NAME}.xdc";
1926 fragment <<EOF
1927   else if (link_info.pie)
1928     return "ldscripts/${EMULATION_NAME}.xd";
1931 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1932 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1933 fragment <<EOF
1934   else if (link_info.shared && link_info.combreloc
1935            && link_info.relro && (link_info.flags & DT_BIND_NOW))
1936     return "ldscripts/${EMULATION_NAME}.xsw";
1937   else if (link_info.shared && link_info.combreloc)
1938     return "ldscripts/${EMULATION_NAME}.xsc";
1941 fragment <<EOF
1942   else if (link_info.shared)
1943     return "ldscripts/${EMULATION_NAME}.xs";
1946 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1947 fragment <<EOF
1948   else if (link_info.combreloc && link_info.relro
1949            && (link_info.flags & DT_BIND_NOW))
1950     return "ldscripts/${EMULATION_NAME}.xw";
1951   else if (link_info.combreloc)
1952     return "ldscripts/${EMULATION_NAME}.xc";
1955 fragment <<EOF
1956   else
1957     return "ldscripts/${EMULATION_NAME}.x";
1964 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1966 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1967 fragment <<EOF
1968  $PARSE_AND_LIST_PROLOGUE
1972 fragment <<EOF
1974 #define OPTION_DISABLE_NEW_DTAGS        (400)
1975 #define OPTION_ENABLE_NEW_DTAGS         (OPTION_DISABLE_NEW_DTAGS + 1)
1976 #define OPTION_GROUP                    (OPTION_ENABLE_NEW_DTAGS + 1)
1977 #define OPTION_EH_FRAME_HDR             (OPTION_GROUP + 1)
1978 #define OPTION_EXCLUDE_LIBS             (OPTION_EH_FRAME_HDR + 1)
1979 #define OPTION_HASH_STYLE               (OPTION_EXCLUDE_LIBS + 1)
1980 #define OPTION_BUILD_ID                 (OPTION_HASH_STYLE + 1)
1982 static void
1983 gld${EMULATION_NAME}_add_options
1984   (int ns, char **shortopts, int nl, struct option **longopts,
1985    int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
1987   static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:";
1988   static const struct option xtra_long[] = {
1989     {"build-id", optional_argument, NULL, OPTION_BUILD_ID},
1992 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1993 fragment <<EOF
1994     {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1995     {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1996     {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
1997     {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
1998     {"hash-style", required_argument, NULL, OPTION_HASH_STYLE},
1999     {"Bgroup", no_argument, NULL, OPTION_GROUP},
2003 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
2004 fragment <<EOF
2005     $PARSE_AND_LIST_LONGOPTS
2009 fragment <<EOF
2010     {NULL, no_argument, NULL, 0}
2011   };
2013   *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
2014   memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
2015   *longopts = (struct option *)
2016     xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
2017   memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
2020 #define DEFAULT_BUILD_ID_STYLE  "sha1"
2022 static bfd_boolean
2023 gld${EMULATION_NAME}_handle_option (int optc)
2025   switch (optc)
2026     {
2027     default:
2028       return FALSE;
2030     case OPTION_BUILD_ID:
2031       if (link_info.emit_note_gnu_build_id != NULL)
2032         {
2033           free (link_info.emit_note_gnu_build_id);
2034           link_info.emit_note_gnu_build_id = NULL;
2035         }
2036       if (optarg == NULL)
2037         optarg = DEFAULT_BUILD_ID_STYLE;
2038       if (strcmp (optarg, "none"))
2039         link_info.emit_note_gnu_build_id = xstrdup (optarg);
2040       break;
2044 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2045 fragment <<EOF
2046     case OPTION_DISABLE_NEW_DTAGS:
2047       link_info.new_dtags = FALSE;
2048       break;
2050     case OPTION_ENABLE_NEW_DTAGS:
2051       link_info.new_dtags = TRUE;
2052       break;
2054     case OPTION_EH_FRAME_HDR:
2055       link_info.eh_frame_hdr = TRUE;
2056       break;
2058     case OPTION_GROUP:
2059       link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
2060       /* Groups must be self-contained.  */
2061       link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2062       link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
2063       break;
2065     case OPTION_EXCLUDE_LIBS:
2066       add_excluded_libs (optarg);
2067       break;
2069     case OPTION_HASH_STYLE:
2070       link_info.emit_hash = FALSE;
2071       link_info.emit_gnu_hash = FALSE;
2072       if (strcmp (optarg, "sysv") == 0)
2073         link_info.emit_hash = TRUE;
2074       else if (strcmp (optarg, "gnu") == 0)
2075         link_info.emit_gnu_hash = TRUE;
2076       else if (strcmp (optarg, "both") == 0)
2077         {
2078           link_info.emit_hash = TRUE;
2079           link_info.emit_gnu_hash = TRUE;
2080         }
2081       else
2082         einfo (_("%P%F: invalid hash style \`%s'\n"), optarg);
2083       break;
2085     case 'z':
2086       if (strcmp (optarg, "initfirst") == 0)
2087         link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
2088       else if (strcmp (optarg, "interpose") == 0)
2089         link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
2090       else if (strcmp (optarg, "loadfltr") == 0)
2091         link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
2092       else if (strcmp (optarg, "nodefaultlib") == 0)
2093         link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
2094       else if (strcmp (optarg, "nodelete") == 0)
2095         link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
2096       else if (strcmp (optarg, "nodlopen") == 0)
2097         link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
2098       else if (strcmp (optarg, "nodump") == 0)
2099         link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
2100       else if (strcmp (optarg, "now") == 0)
2101         {
2102           link_info.flags |= (bfd_vma) DF_BIND_NOW;
2103           link_info.flags_1 |= (bfd_vma) DF_1_NOW;
2104         }
2105       else if (strcmp (optarg, "lazy") == 0)
2106         {
2107           link_info.flags &= ~(bfd_vma) DF_BIND_NOW;
2108           link_info.flags_1 &= ~(bfd_vma) DF_1_NOW;
2109         }
2110       else if (strcmp (optarg, "origin") == 0)
2111         {
2112           link_info.flags |= (bfd_vma) DF_ORIGIN;
2113           link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
2114         }
2115       else if (strcmp (optarg, "defs") == 0)
2116         link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2117       else if (strcmp (optarg, "muldefs") == 0)
2118         link_info.allow_multiple_definition = TRUE;
2119       else if (strcmp (optarg, "combreloc") == 0)
2120         link_info.combreloc = TRUE;
2121       else if (strcmp (optarg, "nocombreloc") == 0)
2122         link_info.combreloc = FALSE;
2123       else if (strcmp (optarg, "nocopyreloc") == 0)
2124         link_info.nocopyreloc = TRUE;
2125       else if (strcmp (optarg, "execstack") == 0)
2126         {
2127           link_info.execstack = TRUE;
2128           link_info.noexecstack = FALSE;
2129         }
2130       else if (strcmp (optarg, "noexecstack") == 0)
2131         {
2132           link_info.noexecstack = TRUE;
2133           link_info.execstack = FALSE;
2134         }
2137   if test -n "$COMMONPAGESIZE"; then
2138 fragment <<EOF
2139       else if (strcmp (optarg, "relro") == 0)
2140         link_info.relro = TRUE;
2141       else if (strcmp (optarg, "norelro") == 0)
2142         link_info.relro = FALSE;
2144   fi
2146 fragment <<EOF
2147       else if (CONST_STRNEQ (optarg, "max-page-size="))
2148         {
2149           char *end;
2151           config.maxpagesize = strtoul (optarg + 14, &end, 0);
2152           if (*end || (config.maxpagesize & (config.maxpagesize - 1)) != 0)
2153             einfo (_("%P%F: invalid maxium page size \`%s'\n"),
2154                    optarg + 14);
2155           ASSERT (default_target != NULL);
2156           bfd_emul_set_maxpagesize (default_target, config.maxpagesize);
2157         }
2158       else if (CONST_STRNEQ (optarg, "common-page-size="))
2159         {
2160           char *end;
2161           config.commonpagesize = strtoul (optarg + 17, &end, 0);
2162           if (*end
2163               || (config.commonpagesize & (config.commonpagesize - 1)) != 0)
2164             einfo (_("%P%F: invalid common page size \`%s'\n"),
2165                    optarg + 17);
2166           ASSERT (default_target != NULL);
2167           bfd_emul_set_commonpagesize (default_target,
2168                                        config.commonpagesize);
2169         }
2170       /* What about the other Solaris -z options? FIXME.  */
2171       break;
2175 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
2176 fragment <<EOF
2177  $PARSE_AND_LIST_ARGS_CASES
2181 fragment <<EOF
2182     }
2184   return TRUE;
2189 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
2190 fragment <<EOF
2192 static void
2193 gld${EMULATION_NAME}_list_options (FILE * file)
2195   fprintf (file, _("  --build-id[=STYLE]\tGenerate build ID note\n"));
2198 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2199 fragment <<EOF
2200   fprintf (file, _("  -Bgroup\t\tSelects group name lookup rules for DSO\n"));
2201   fprintf (file, _("  --disable-new-dtags\tDisable new dynamic tags\n"));
2202   fprintf (file, _("  --enable-new-dtags\tEnable new dynamic tags\n"));
2203   fprintf (file, _("  --eh-frame-hdr\tCreate .eh_frame_hdr section\n"));
2204   fprintf (file, _("  --hash-style=STYLE\tSet hash style to sysv, gnu or both\n"));
2205   fprintf (file, _("  -z combreloc\t\tMerge dynamic relocs into one section and sort\n"));
2206   fprintf (file, _("  -z defs\t\tReport unresolved symbols in object files.\n"));
2207   fprintf (file, _("  -z execstack\t\tMark executable as requiring executable stack\n"));
2208   fprintf (file, _("  -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
2209   fprintf (file, _("  -z interpose\t\tMark object to interpose all DSOs but executable\n"));
2210   fprintf (file, _("  -z lazy\t\tMark object lazy runtime binding (default)\n"));
2211   fprintf (file, _("  -z loadfltr\t\tMark object requiring immediate process\n"));
2212   fprintf (file, _("  -z muldefs\t\tAllow multiple definitions\n"));
2213   fprintf (file, _("  -z nocombreloc\tDon't merge dynamic relocs into one section\n"));
2214   fprintf (file, _("  -z nocopyreloc\tDon't create copy relocs\n"));
2215   fprintf (file, _("  -z nodefaultlib\tMark object not to use default search paths\n"));
2216   fprintf (file, _("  -z nodelete\t\tMark DSO non-deletable at runtime\n"));
2217   fprintf (file, _("  -z nodlopen\t\tMark DSO not available to dlopen\n"));
2218   fprintf (file, _("  -z nodump\t\tMark DSO not available to dldump\n"));
2219   fprintf (file, _("  -z noexecstack\tMark executable as not requiring executable stack\n"));
2222   if test -n "$COMMONPAGESIZE"; then
2223 fragment <<EOF
2224   fprintf (file, _("  -z norelro\t\tDon't create RELRO program header\n"));
2226   fi
2228 fragment <<EOF
2229   fprintf (file, _("  -z now\t\tMark object non-lazy runtime binding\n"));
2230   fprintf (file, _("  -z origin\t\tMark object requiring immediate \$ORIGIN processing\n\t\t\t  at runtime\n"));
2233   if test -n "$COMMONPAGESIZE"; then
2234 fragment <<EOF
2235   fprintf (file, _("  -z relro\t\tCreate RELRO program header\n"));
2237   fi
2239 fragment <<EOF
2240   fprintf (file, _("  -z max-page-size=SIZE\tSet maximum page size to SIZE\n"));
2241   fprintf (file, _("  -z common-page-size=SIZE\n\t\t\tSet common page size to SIZE\n"));
2242   fprintf (file, _("  -z KEYWORD\t\tIgnored for Solaris compatibility\n"));
2246 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
2247 fragment <<EOF
2248  $PARSE_AND_LIST_OPTIONS
2252 fragment <<EOF
2256 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
2257 fragment <<EOF
2258  $PARSE_AND_LIST_EPILOGUE
2262 else
2263 fragment <<EOF
2264 #define gld${EMULATION_NAME}_add_options NULL
2265 #define gld${EMULATION_NAME}_handle_option NULL
2267 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
2268 fragment <<EOF
2269 #define gld${EMULATION_NAME}_list_options NULL
2274 fragment <<EOF
2276 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
2278   ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
2279   ${LDEMUL_SYSLIB-syslib_default},
2280   ${LDEMUL_HLL-hll_default},
2281   ${LDEMUL_AFTER_PARSE-after_parse_default},
2282   ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
2283   ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
2284   ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
2285   ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
2286   ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
2287   ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
2288   "${EMULATION_NAME}",
2289   "${OUTPUT_FORMAT}",
2290   ${LDEMUL_FINISH-gld${EMULATION_NAME}_finish},
2291   ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
2292   ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
2293   ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
2294   ${LDEMUL_SET_SYMBOLS-NULL},
2295   ${LDEMUL_PARSE_ARGS-NULL},
2296   gld${EMULATION_NAME}_add_options,
2297   gld${EMULATION_NAME}_handle_option,
2298   ${LDEMUL_UNRECOGNIZED_FILE-NULL},
2299   ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
2300   ${LDEMUL_RECOGNIZED_FILE-gld${EMULATION_NAME}_load_symbols},
2301   ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
2302   ${LDEMUL_NEW_VERS_PATTERN-NULL}