Commit generated files for binutils 2.17.90.
[binutils.git] / ld / emultempl / elf32.em
blobb82e087b446d4cdef6f63b7d4cec1e6476ade97c
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;
1036   if (link_info.emit_note_gnu_build_id)
1037     {
1038       bfd *abfd;
1039       asection *s;
1040       bfd_size_type size;
1042       abfd = link_info.input_bfds;
1044       size = gld${EMULATION_NAME}_id_note_section_size (abfd, &link_info);
1045       if (size == 0)
1046         {
1047           einfo ("%P: warning: unrecognized --build-id style ignored.\n");
1048           free (link_info.emit_note_gnu_build_id);
1049           link_info.emit_note_gnu_build_id = NULL;
1050         }
1051       else
1052         {
1053           s = bfd_make_section_with_flags (abfd, ".note.gnu.build-id",
1054                                            SEC_ALLOC | SEC_LOAD
1055                                            | SEC_IN_MEMORY | SEC_LINKER_CREATED
1056                                            | SEC_READONLY | SEC_DATA);
1057           if (s != NULL && bfd_set_section_alignment (abfd, s, 2))
1058             {
1059               struct elf_obj_tdata *t = elf_tdata (output_bfd);
1060               struct build_id_info *b = xmalloc (sizeof *b);
1061               b->style = link_info.emit_note_gnu_build_id;
1062               b->sec = s;
1063               elf_section_type (s) = SHT_NOTE;
1064               s->size = size;
1065               t->after_write_object_contents
1066                 = &gld${EMULATION_NAME}_write_build_id_section;
1067               t->after_write_object_contents_info = b;
1068             }
1069           else
1070             {
1071               einfo ("%P: warning: Cannot create .note.gnu.build-id section,"
1072                      " --build-id ignored.\n");
1073               free (link_info.emit_note_gnu_build_id);
1074               link_info.emit_note_gnu_build_id = NULL;
1075             }
1076         }
1077     }
1079   if (link_info.eh_frame_hdr
1080       && ! link_info.traditional_format
1081       && ! link_info.relocatable)
1082     {
1083       struct elf_link_hash_table *htab;
1085       htab = elf_hash_table (&link_info);
1086       if (is_elf_hash_table (htab))
1087         {
1088           bfd *abfd;
1089           asection *s;
1091           for (abfd = link_info.input_bfds; abfd; abfd = abfd->link_next)
1092             {
1093               s = bfd_get_section_by_name (abfd, ".eh_frame");
1094               if (s && s->size > 8 && !bfd_is_abs_section (s->output_section))
1095                  break;
1096             }
1097           if (abfd)
1098             {
1099               const struct elf_backend_data *bed;
1101               bed = get_elf_backend_data (abfd);
1102               s = bfd_make_section_with_flags (abfd, ".eh_frame_hdr",
1103                                                bed->dynamic_sec_flags
1104                                                | SEC_READONLY);
1105               if (s != NULL
1106                  && bfd_set_section_alignment (abfd, s, 2))
1107                 htab->eh_info.hdr_sec = s;
1108               else
1109                 einfo ("%P: warning: Cannot create .eh_frame_hdr section,"
1110                        " --eh-frame-hdr ignored.\n");
1111             }
1112         }
1113     }
1115   /* We only need to worry about this when doing a final link.  */
1116   if (link_info.relocatable || !link_info.executable)
1117     return;
1119   /* Get the list of files which appear in DT_NEEDED entries in
1120      dynamic objects included in the link (often there will be none).
1121      For each such file, we want to track down the corresponding
1122      library, and include the symbol table in the link.  This is what
1123      the runtime dynamic linker will do.  Tracking the files down here
1124      permits one dynamic object to include another without requiring
1125      special action by the person doing the link.  Note that the
1126      needed list can actually grow while we are stepping through this
1127      loop.  */
1128   needed = bfd_elf_get_needed_list (output_bfd, &link_info);
1129   for (l = needed; l != NULL; l = l->next)
1130     {
1131       struct bfd_link_needed_list *ll;
1132       struct dt_needed n, nn;
1133       int force;
1135       /* If the lib that needs this one was --as-needed and wasn't
1136          found to be needed, then this lib isn't needed either.  */
1137       if (l->by != NULL
1138           && (bfd_elf_get_dyn_lib_class (l->by) & DYN_AS_NEEDED) != 0)
1139         continue;
1141       /* If we've already seen this file, skip it.  */
1142       for (ll = needed; ll != l; ll = ll->next)
1143         if ((ll->by == NULL
1144              || (bfd_elf_get_dyn_lib_class (ll->by) & DYN_AS_NEEDED) == 0)
1145             && strcmp (ll->name, l->name) == 0)
1146           break;
1147       if (ll != l)
1148         continue;
1150       /* See if this file was included in the link explicitly.  */
1151       global_needed = l;
1152       global_found = NULL;
1153       lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
1154       if (global_found != NULL
1155           && (bfd_elf_get_dyn_lib_class (global_found->the_bfd)
1156               & DYN_AS_NEEDED) == 0)
1157         continue;
1159       n.by = l->by;
1160       n.name = l->name;
1161       nn.by = l->by;
1162       if (trace_file_tries)
1163         info_msg (_("%s needed by %B\n"), l->name, l->by);
1165       /* As-needed libs specified on the command line (or linker script)
1166          take priority over libs found in search dirs.  */
1167       if (global_found != NULL)
1168         {
1169           nn.name = global_found->filename;
1170           if (gld${EMULATION_NAME}_try_needed (&nn, TRUE))
1171             continue;
1172         }
1174       /* We need to find this file and include the symbol table.  We
1175          want to search for the file in the same way that the dynamic
1176          linker will search.  That means that we want to use
1177          rpath_link, rpath, then the environment variable
1178          LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
1179          entries (native only), then the linker script LIB_SEARCH_DIRS.
1180          We do not search using the -L arguments.
1182          We search twice.  The first time, we skip objects which may
1183          introduce version mismatches.  The second time, we force
1184          their use.  See gld${EMULATION_NAME}_vercheck comment.  */
1185       for (force = 0; force < 2; force++)
1186         {
1187           size_t len;
1188           search_dirs_type *search;
1190 if [ "x${NATIVE}" = xyes ] ; then
1191 fragment <<EOF
1192           const char *lib_path;
1195 if [ "x${USE_LIBPATH}" = xyes ] ; then
1196 fragment <<EOF
1197           struct bfd_link_needed_list *rp;
1198           int found;
1201 fragment <<EOF
1203           if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
1204                                                   &n, force))
1205             break;
1207 if [ "x${USE_LIBPATH}" = xyes ] ; then
1208 fragment <<EOF
1209           if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
1210                                                   &n, force))
1211             break;
1214 if [ "x${NATIVE}" = xyes ] ; then
1215 fragment <<EOF
1216           if (command_line.rpath_link == NULL
1217               && command_line.rpath == NULL)
1218             {
1219               lib_path = (const char *) getenv ("LD_RUN_PATH");
1220               if (gld${EMULATION_NAME}_search_needed (lib_path, &n,
1221                                                       force))
1222                 break;
1223             }
1224           lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
1225           if (gld${EMULATION_NAME}_search_needed (lib_path, &n, force))
1226             break;
1229 if [ "x${USE_LIBPATH}" = xyes ] ; then
1230 fragment <<EOF
1231           found = 0;
1232           rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
1233           for (; !found && rp != NULL; rp = rp->next)
1234             {
1235               char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
1236               found = (rp->by == l->by
1237                        && gld${EMULATION_NAME}_search_needed (tmpname,
1238                                                               &n,
1239                                                               force));
1240               free (tmpname);
1241             }
1242           if (found)
1243             break;
1247 if [ "x${USE_LIBPATH}" = xyes ] ; then
1248   case ${target} in
1249     *-*-freebsd* | *-*-dragonfly*)
1250       fragment <<EOF
1251           if (gld${EMULATION_NAME}_check_ld_elf_hints (l->name, force))
1252             break;
1254     # FreeBSD
1255     ;;
1257     *-*-linux-* | *-*-k*bsd*-*)
1258     # Linux
1259       fragment <<EOF
1260           if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
1261             break;
1264     ;;
1265   esac
1267 fragment <<EOF
1268           len = strlen (l->name);
1269           for (search = search_head; search != NULL; search = search->next)
1270             {
1271               char *filename;
1273               if (search->cmdline)
1274                 continue;
1275               filename = (char *) xmalloc (strlen (search->name) + len + 2);
1276               sprintf (filename, "%s/%s", search->name, l->name);
1277               nn.name = filename;
1278               if (gld${EMULATION_NAME}_try_needed (&nn, force))
1279                 break;
1280               free (filename);
1281             }
1282           if (search != NULL)
1283             break;
1285 fragment <<EOF
1286         }
1288       if (force < 2)
1289         continue;
1291       einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
1292              l->name, l->by);
1293     }
1299 fragment <<EOF
1301 /* Look through an expression for an assignment statement.  */
1303 static void
1304 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
1306   bfd_boolean provide = FALSE;
1308   switch (exp->type.node_class)
1309     {
1310     case etree_provide:
1311       provide = TRUE;
1312       /* Fall thru */
1313     case etree_assign:
1314       /* We call record_link_assignment even if the symbol is defined.
1315          This is because if it is defined by a dynamic object, we
1316          actually want to use the value defined by the linker script,
1317          not the value from the dynamic object (because we are setting
1318          symbols like etext).  If the symbol is defined by a regular
1319          object, then, as it happens, calling record_link_assignment
1320          will do no harm.  */
1321       if (strcmp (exp->assign.dst, ".") != 0)
1322         {
1323           if (!bfd_elf_record_link_assignment (output_bfd, &link_info,
1324                                                exp->assign.dst, provide,
1325                                                exp->assign.hidden))
1326             einfo ("%P%F: failed to record assignment to %s: %E\n",
1327                    exp->assign.dst);
1328         }
1329       gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1330       break;
1332     case etree_binary:
1333       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1334       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1335       break;
1337     case etree_trinary:
1338       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1339       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1340       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1341       break;
1343     case etree_unary:
1344       gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1345       break;
1347     default:
1348       break;
1349     }
1353 /* This is called by the before_allocation routine via
1354    lang_for_each_statement.  It locates any assignment statements, and
1355    tells the ELF backend about them, in case they are assignments to
1356    symbols which are referred to by dynamic objects.  */
1358 static void
1359 gld${EMULATION_NAME}_find_statement_assignment (lang_statement_union_type *s)
1361   if (s->header.type == lang_assignment_statement_enum)
1362     gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1367 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
1368   if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
1369     ELF_INTERPRETER_SET_DEFAULT="
1370   if (sinterp != NULL)
1371     {
1372       sinterp->contents = (unsigned char *) ${ELF_INTERPRETER_NAME};
1373       sinterp->size = strlen ((char *) sinterp->contents) + 1;
1374     }
1377   else
1378     ELF_INTERPRETER_SET_DEFAULT=
1379   fi
1380 fragment <<EOF
1382 /* This is called after the sections have been attached to output
1383    sections, but before any sizes or addresses have been set.  */
1385 static void
1386 gld${EMULATION_NAME}_before_allocation (void)
1388   const char *rpath;
1389   asection *sinterp;
1391   if (link_info.hash->type == bfd_link_elf_hash_table)
1392     _bfd_elf_tls_setup (output_bfd, &link_info);
1394   /* If we are going to make any variable assignments, we need to let
1395      the ELF backend know about them in case the variables are
1396      referred to by dynamic objects.  */
1397   lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
1399   /* Let the ELF backend work out the sizes of any sections required
1400      by dynamic linking.  */
1401   rpath = command_line.rpath;
1402   if (rpath == NULL)
1403     rpath = (const char *) getenv ("LD_RUN_PATH");
1404   if (! (bfd_elf_size_dynamic_sections
1405          (output_bfd, command_line.soname, rpath,
1406           command_line.filter_shlib,
1407           (const char * const *) command_line.auxiliary_filters,
1408           &link_info, &sinterp, lang_elf_version_info)))
1409     einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1411 ${ELF_INTERPRETER_SET_DEFAULT}
1412   /* Let the user override the dynamic linker we are using.  */
1413   if (command_line.interpreter != NULL
1414       && sinterp != NULL)
1415     {
1416       sinterp->contents = (bfd_byte *) command_line.interpreter;
1417       sinterp->size = strlen (command_line.interpreter) + 1;
1418     }
1420   /* Look for any sections named .gnu.warning.  As a GNU extensions,
1421      we treat such sections as containing warning messages.  We print
1422      out the warning message, and then zero out the section size so
1423      that it does not get copied into the output file.  */
1425   {
1426     LANG_FOR_EACH_INPUT_STATEMENT (is)
1427       {
1428         asection *s;
1429         bfd_size_type sz;
1430         char *msg;
1431         bfd_boolean ret;
1433         if (is->just_syms_flag)
1434           continue;
1436         s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
1437         if (s == NULL)
1438           continue;
1440         sz = s->size;
1441         msg = xmalloc ((size_t) (sz + 1));
1442         if (! bfd_get_section_contents (is->the_bfd, s, msg,
1443                                         (file_ptr) 0, sz))
1444           einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
1445                  is->the_bfd);
1446         msg[sz] = '\0';
1447         ret = link_info.callbacks->warning (&link_info, msg,
1448                                             (const char *) NULL,
1449                                             is->the_bfd, (asection *) NULL,
1450                                             (bfd_vma) 0);
1451         ASSERT (ret);
1452         free (msg);
1454         /* Clobber the section size, so that we don't waste space
1455            copying the warning into the output file.  If we've already
1456            sized the output section, adjust its size.  The adjustment
1457            is on rawsize because targets that size sections early will
1458            have called lang_reset_memory_regions after sizing.  */
1459         if (s->output_section != NULL
1460             && s->output_section->rawsize >= s->size)
1461           s->output_section->rawsize -= s->size;
1463         s->size = 0;
1465         /* Also set SEC_EXCLUDE, so that local symbols defined in the
1466            warning section don't get copied to the output.  */
1467         s->flags |= SEC_EXCLUDE | SEC_KEEP;
1468       }
1469   }
1471   before_allocation_default ();
1473   if (!bfd_elf_size_dynsym_hash_dynstr (output_bfd, &link_info))
1474     einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1480 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
1481 fragment <<EOF
1483 /* Try to open a dynamic archive.  This is where we know that ELF
1484    dynamic libraries have an extension of .so (or .sl on oddball systems
1485    like hpux).  */
1487 static bfd_boolean
1488 gld${EMULATION_NAME}_open_dynamic_archive
1489   (const char *arch, search_dirs_type *search, lang_input_statement_type *entry)
1491   const char *filename;
1492   char *string;
1494   if (! entry->is_archive)
1495     return FALSE;
1497   filename = entry->filename;
1499   /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
1500      is defined, but it does not seem worth the headache to optimize
1501      away those two bytes of space.  */
1502   string = (char *) xmalloc (strlen (search->name)
1503                              + strlen (filename)
1504                              + strlen (arch)
1505 #ifdef EXTRA_SHLIB_EXTENSION
1506                              + strlen (EXTRA_SHLIB_EXTENSION)
1507 #endif
1508                              + sizeof "/lib.so");
1510   sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
1512 #ifdef EXTRA_SHLIB_EXTENSION
1513   /* Try the .so extension first.  If that fails build a new filename
1514      using EXTRA_SHLIB_EXTENSION.  */
1515   if (! ldfile_try_open_bfd (string, entry))
1516     sprintf (string, "%s/lib%s%s%s", search->name,
1517              filename, arch, EXTRA_SHLIB_EXTENSION);
1518 #endif
1520   if (! ldfile_try_open_bfd (string, entry))
1521     {
1522       free (string);
1523       return FALSE;
1524     }
1526   entry->filename = string;
1528   /* We have found a dynamic object to include in the link.  The ELF
1529      backend linker will create a DT_NEEDED entry in the .dynamic
1530      section naming this file.  If this file includes a DT_SONAME
1531      entry, it will be used.  Otherwise, the ELF linker will just use
1532      the name of the file.  For an archive found by searching, like
1533      this one, the DT_NEEDED entry should consist of just the name of
1534      the file, without the path information used to find it.  Note
1535      that we only need to do this if we have a dynamic object; an
1536      archive will never be referenced by a DT_NEEDED entry.
1538      FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
1539      very pretty.  I haven't been able to think of anything that is
1540      pretty, though.  */
1541   if (bfd_check_format (entry->the_bfd, bfd_object)
1542       && (entry->the_bfd->flags & DYNAMIC) != 0)
1543     {
1544       ASSERT (entry->is_archive && entry->search_dirs_flag);
1546       /* Rather than duplicating the logic above.  Just use the
1547          filename we recorded earlier.  */
1549       filename = lbasename (entry->filename);
1550       bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
1551     }
1553   return TRUE;
1559 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
1560 fragment <<EOF
1562 /* A variant of lang_output_section_find used by place_orphan.  */
1564 static lang_output_section_statement_type *
1565 output_rel_find (asection *sec, int isdyn)
1567   lang_output_section_statement_type *lookup;
1568   lang_output_section_statement_type *last = NULL;
1569   lang_output_section_statement_type *last_alloc = NULL;
1570   lang_output_section_statement_type *last_ro_alloc = NULL;
1571   lang_output_section_statement_type *last_rel = NULL;
1572   lang_output_section_statement_type *last_rel_alloc = NULL;
1573   int rela = sec->name[4] == 'a';
1575   for (lookup = &lang_output_section_statement.head->output_section_statement;
1576        lookup != NULL;
1577        lookup = lookup->next)
1578     {
1579       if (lookup->constraint != -1
1580           && CONST_STRNEQ (lookup->name, ".rel"))
1581         {
1582           int lookrela = lookup->name[4] == 'a';
1584           /* .rel.dyn must come before all other reloc sections, to suit
1585              GNU ld.so.  */
1586           if (isdyn)
1587             break;
1589           /* Don't place after .rel.plt as doing so results in wrong
1590              dynamic tags.  */
1591           if (strcmp (".plt", lookup->name + 4 + lookrela) == 0)
1592             break;
1594           if (rela == lookrela || last_rel == NULL)
1595             last_rel = lookup;
1596           if ((rela == lookrela || last_rel_alloc == NULL)
1597               && lookup->bfd_section != NULL
1598               && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1599             last_rel_alloc = lookup;
1600         }
1602       last = lookup;
1603       if (lookup->bfd_section != NULL
1604           && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1605         {
1606           last_alloc = lookup;
1607           if ((lookup->bfd_section->flags & SEC_READONLY) != 0)
1608             last_ro_alloc = lookup;
1609         }
1610     }
1612   if (last_rel_alloc)
1613     return last_rel_alloc;
1615   if (last_rel)
1616     return last_rel;
1618   if (last_ro_alloc)
1619     return last_ro_alloc;
1621   if (last_alloc)
1622     return last_alloc;
1624   return last;
1627 /* Place an orphan section.  We use this to put random SHF_ALLOC
1628    sections in the right segment.  */
1630 static bfd_boolean
1631 gld${EMULATION_NAME}_place_orphan (asection *s)
1633   static struct orphan_save hold[] =
1634     {
1635       { ".text",
1636         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1637         0, 0, 0, 0 },
1638       { ".rodata",
1639         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1640         0, 0, 0, 0 },
1641       { ".data",
1642         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1643         0, 0, 0, 0 },
1644       { ".bss",
1645         SEC_ALLOC,
1646         0, 0, 0, 0 },
1647       { 0,
1648         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1649         0, 0, 0, 0 },
1650       { ".interp",
1651         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1652         0, 0, 0, 0 },
1653       { ".sdata",
1654         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_SMALL_DATA,
1655         0, 0, 0, 0 }
1656     };
1657   enum orphan_save_index
1658     {
1659       orphan_text = 0,
1660       orphan_rodata,
1661       orphan_data,
1662       orphan_bss,
1663       orphan_rel,
1664       orphan_interp,
1665       orphan_sdata
1666     };
1667   static int orphan_init_done = 0;
1668   struct orphan_save *place;
1669   const char *secname;
1670   lang_output_section_statement_type *after;
1671   lang_output_section_statement_type *os;
1672   int isdyn = 0;
1673   int iself = s->owner->xvec->flavour == bfd_target_elf_flavour;
1674   unsigned int sh_type = iself ? elf_section_type (s) : SHT_NULL;
1676   secname = bfd_get_section_name (s->owner, s);
1678   if (! link_info.relocatable
1679       && link_info.combreloc
1680       && (s->flags & SEC_ALLOC))
1681     {
1682       if (iself)
1683         switch (sh_type)
1684           {
1685           case SHT_RELA:
1686             secname = ".rela.dyn";
1687             isdyn = 1;
1688             break;
1689           case SHT_REL:
1690             secname = ".rel.dyn";
1691             isdyn = 1;
1692             break;
1693           default:
1694             break;
1695           }
1696       else if (CONST_STRNEQ (secname, ".rel"))
1697         {
1698           secname = secname[4] == 'a' ? ".rela.dyn" : ".rel.dyn";
1699           isdyn = 1;
1700         }
1701     }
1703   if (isdyn || (!config.unique_orphan_sections && !unique_section_p (s)))
1704     {
1705       /* Look through the script to see where to place this section.  */
1706       os = lang_output_section_find (secname);
1708       if (os != NULL
1709           && (os->bfd_section == NULL
1710               || os->bfd_section->flags == 0
1711               || (_bfd_elf_match_sections_by_type (output_bfd,
1712                                                    os->bfd_section,
1713                                                    s->owner, s)
1714                   && ((s->flags ^ os->bfd_section->flags)
1715                       & (SEC_LOAD | SEC_ALLOC)) == 0)))
1716         {
1717           /* We already have an output section statement with this
1718              name, and its bfd section, if any, has compatible flags.
1719              If the section already exists but does not have any flags
1720              set, then it has been created by the linker, probably as a
1721              result of a --section-start command line switch.  */
1722           lang_add_section (&os->children, s, os);
1723           return TRUE;
1724         }
1725     }
1727   if (!orphan_init_done)
1728     {
1729       struct orphan_save *ho;
1730       for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
1731         if (ho->name != NULL)
1732           {
1733             ho->os = lang_output_section_find (ho->name);
1734             if (ho->os != NULL && ho->os->flags == 0)
1735               ho->os->flags = ho->flags;
1736           }
1737       orphan_init_done = 1;
1738     }
1740   /* If this is a final link, then always put .gnu.warning.SYMBOL
1741      sections into the .text section to get them out of the way.  */
1742   if (link_info.executable
1743       && ! link_info.relocatable
1744       && CONST_STRNEQ (secname, ".gnu.warning.")
1745       && hold[orphan_text].os != NULL)
1746     {
1747       lang_add_section (&hold[orphan_text].os->children, s,
1748                         hold[orphan_text].os);
1749       return TRUE;
1750     }
1752   /* Decide which segment the section should go in based on the
1753      section name and section flags.  We put loadable .note sections
1754      right after the .interp section, so that the PT_NOTE segment is
1755      stored right after the program headers where the OS can read it
1756      in the first page.  */
1758   place = NULL;
1759   if ((s->flags & SEC_ALLOC) == 0)
1760     ;
1761   else if ((s->flags & SEC_LOAD) != 0
1762            && ((iself && sh_type == SHT_NOTE)
1763                || (!iself && CONST_STRNEQ (secname, ".note"))))
1764     place = &hold[orphan_interp];
1765   else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
1766     place = &hold[orphan_bss];
1767   else if ((s->flags & SEC_SMALL_DATA) != 0)
1768     place = &hold[orphan_sdata];
1769   else if ((s->flags & SEC_READONLY) == 0)
1770     place = &hold[orphan_data];
1771   else if (((iself && (sh_type == SHT_RELA || sh_type == SHT_REL))
1772             || (!iself && CONST_STRNEQ (secname, ".rel")))
1773            && (s->flags & SEC_LOAD) != 0)
1774     place = &hold[orphan_rel];
1775   else if ((s->flags & SEC_CODE) == 0)
1776     place = &hold[orphan_rodata];
1777   else
1778     place = &hold[orphan_text];
1780   after = NULL;
1781   if (place != NULL)
1782     {
1783       if (place->os == NULL)
1784         {
1785           if (place->name != NULL)
1786             place->os = lang_output_section_find (place->name);
1787           else
1788             place->os = output_rel_find (s, isdyn);
1789         }
1790       after = place->os;
1791       if (after == NULL)
1792         after = lang_output_section_find_by_flags
1793           (s, &place->os, _bfd_elf_match_sections_by_type);
1794       if (after == NULL)
1795         /* *ABS* is always the first output section statement.  */
1796         after = &lang_output_section_statement.head->output_section_statement;
1797     }
1799   /* Choose a unique name for the section.  This will be needed if the
1800      same section name appears in the input file with different
1801      loadable or allocatable characteristics.  */
1802   if (bfd_get_section_by_name (output_bfd, secname) != NULL)
1803     {
1804       static int count = 1;
1805       secname = bfd_get_unique_section_name (output_bfd, secname, &count);
1806       if (secname == NULL)
1807         einfo ("%F%P: place_orphan failed: %E\n");
1808     }
1810   lang_insert_orphan (s, secname, after, place, NULL, NULL);
1812   return TRUE;
1817 if test x"$LDEMUL_FINISH" != xgld"$EMULATION_NAME"_finish; then
1818 fragment <<EOF
1820 static void
1821 gld${EMULATION_NAME}_finish (void)
1823   bfd_boolean need_layout = bfd_elf_discard_info (output_bfd, &link_info);
1825   gld${EMULATION_NAME}_map_segments (need_layout);
1826   finish_default ();
1831 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1832 fragment <<EOF
1834 static char *
1835 gld${EMULATION_NAME}_get_script (int *isfile)
1838 if test -n "$COMPILE_IN"
1839 then
1840 # Scripts compiled in.
1842 # sed commands to quote an ld script as a C string.
1843 sc="-f stringify.sed"
1845 fragment <<EOF
1847   *isfile = 0;
1849   if (link_info.relocatable && config.build_constructors)
1850     return
1852 sed $sc ldscripts/${EMULATION_NAME}.xu                  >> e${EMULATION_NAME}.c
1853 echo '  ; else if (link_info.relocatable) return'       >> e${EMULATION_NAME}.c
1854 sed $sc ldscripts/${EMULATION_NAME}.xr                  >> e${EMULATION_NAME}.c
1855 echo '  ; else if (!config.text_read_only) return'      >> e${EMULATION_NAME}.c
1856 sed $sc ldscripts/${EMULATION_NAME}.xbn                 >> e${EMULATION_NAME}.c
1857 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
1858 echo '  ; else if (!config.magic_demand_paged) return'  >> e${EMULATION_NAME}.c
1859 sed $sc ldscripts/${EMULATION_NAME}.xn                  >> e${EMULATION_NAME}.c
1861 if test -n "$GENERATE_PIE_SCRIPT" ; then
1862 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1863 echo '  ; else if (link_info.pie && link_info.combreloc' >> e${EMULATION_NAME}.c
1864 echo '             && link_info.relro' >> e${EMULATION_NAME}.c
1865 echo '             && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1866 sed $sc ldscripts/${EMULATION_NAME}.xdw                 >> e${EMULATION_NAME}.c
1867 echo '  ; else if (link_info.pie && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1868 sed $sc ldscripts/${EMULATION_NAME}.xdc                 >> e${EMULATION_NAME}.c
1870 echo '  ; else if (link_info.pie) return'               >> e${EMULATION_NAME}.c
1871 sed $sc ldscripts/${EMULATION_NAME}.xd                  >> e${EMULATION_NAME}.c
1873 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1874 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1875 echo '  ; else if (link_info.shared && link_info.combreloc' >> e${EMULATION_NAME}.c
1876 echo '             && link_info.relro' >> e${EMULATION_NAME}.c
1877 echo '             && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1878 sed $sc ldscripts/${EMULATION_NAME}.xsw                 >> e${EMULATION_NAME}.c
1879 echo '  ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1880 sed $sc ldscripts/${EMULATION_NAME}.xsc                 >> e${EMULATION_NAME}.c
1882 echo '  ; else if (link_info.shared) return'            >> e${EMULATION_NAME}.c
1883 sed $sc ldscripts/${EMULATION_NAME}.xs                  >> e${EMULATION_NAME}.c
1885 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1886 echo '  ; else if (link_info.combreloc && link_info.relro' >> e${EMULATION_NAME}.c
1887 echo '             && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1888 sed $sc ldscripts/${EMULATION_NAME}.xw                  >> e${EMULATION_NAME}.c
1889 echo '  ; else if (link_info.combreloc) return'         >> e${EMULATION_NAME}.c
1890 sed $sc ldscripts/${EMULATION_NAME}.xc                  >> e${EMULATION_NAME}.c
1892 echo '  ; else return'                                  >> e${EMULATION_NAME}.c
1893 sed $sc ldscripts/${EMULATION_NAME}.x                   >> e${EMULATION_NAME}.c
1894 echo '; }'                                              >> e${EMULATION_NAME}.c
1896 else
1897 # Scripts read from the filesystem.
1899 fragment <<EOF
1901   *isfile = 1;
1903   if (link_info.relocatable && config.build_constructors)
1904     return "ldscripts/${EMULATION_NAME}.xu";
1905   else if (link_info.relocatable)
1906     return "ldscripts/${EMULATION_NAME}.xr";
1907   else if (!config.text_read_only)
1908     return "ldscripts/${EMULATION_NAME}.xbn";
1910 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
1911 else
1912 fragment <<EOF
1913   else if (!config.magic_demand_paged)
1914     return "ldscripts/${EMULATION_NAME}.xn";
1917 if test -n "$GENERATE_PIE_SCRIPT" ; then
1918 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1919 fragment <<EOF
1920   else if (link_info.pie && link_info.combreloc
1921            && link_info.relro && (link_info.flags & DT_BIND_NOW))
1922     return "ldscripts/${EMULATION_NAME}.xdw";
1923   else if (link_info.pie && link_info.combreloc)
1924     return "ldscripts/${EMULATION_NAME}.xdc";
1927 fragment <<EOF
1928   else if (link_info.pie)
1929     return "ldscripts/${EMULATION_NAME}.xd";
1932 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1933 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1934 fragment <<EOF
1935   else if (link_info.shared && link_info.combreloc
1936            && link_info.relro && (link_info.flags & DT_BIND_NOW))
1937     return "ldscripts/${EMULATION_NAME}.xsw";
1938   else if (link_info.shared && link_info.combreloc)
1939     return "ldscripts/${EMULATION_NAME}.xsc";
1942 fragment <<EOF
1943   else if (link_info.shared)
1944     return "ldscripts/${EMULATION_NAME}.xs";
1947 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1948 fragment <<EOF
1949   else if (link_info.combreloc && link_info.relro
1950            && (link_info.flags & DT_BIND_NOW))
1951     return "ldscripts/${EMULATION_NAME}.xw";
1952   else if (link_info.combreloc)
1953     return "ldscripts/${EMULATION_NAME}.xc";
1956 fragment <<EOF
1957   else
1958     return "ldscripts/${EMULATION_NAME}.x";
1965 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1967 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1968 fragment <<EOF
1969  $PARSE_AND_LIST_PROLOGUE
1973 fragment <<EOF
1975 #define OPTION_DISABLE_NEW_DTAGS        (400)
1976 #define OPTION_ENABLE_NEW_DTAGS         (OPTION_DISABLE_NEW_DTAGS + 1)
1977 #define OPTION_GROUP                    (OPTION_ENABLE_NEW_DTAGS + 1)
1978 #define OPTION_EH_FRAME_HDR             (OPTION_GROUP + 1)
1979 #define OPTION_EXCLUDE_LIBS             (OPTION_EH_FRAME_HDR + 1)
1980 #define OPTION_HASH_STYLE               (OPTION_EXCLUDE_LIBS + 1)
1981 #define OPTION_BUILD_ID                 (OPTION_HASH_STYLE + 1)
1983 static void
1984 gld${EMULATION_NAME}_add_options
1985   (int ns, char **shortopts, int nl, struct option **longopts,
1986    int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
1988   static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:";
1989   static const struct option xtra_long[] = {
1990     {"build-id", optional_argument, NULL, OPTION_BUILD_ID},
1993 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1994 fragment <<EOF
1995     {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1996     {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1997     {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
1998     {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
1999     {"hash-style", required_argument, NULL, OPTION_HASH_STYLE},
2000     {"Bgroup", no_argument, NULL, OPTION_GROUP},
2004 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
2005 fragment <<EOF
2006     $PARSE_AND_LIST_LONGOPTS
2010 fragment <<EOF
2011     {NULL, no_argument, NULL, 0}
2012   };
2014   *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
2015   memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
2016   *longopts = (struct option *)
2017     xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
2018   memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
2021 #define DEFAULT_BUILD_ID_STYLE  "sha1"
2023 static bfd_boolean
2024 gld${EMULATION_NAME}_handle_option (int optc)
2026   switch (optc)
2027     {
2028     default:
2029       return FALSE;
2031     case OPTION_BUILD_ID:
2032       if (link_info.emit_note_gnu_build_id != NULL)
2033         {
2034           free (link_info.emit_note_gnu_build_id);
2035           link_info.emit_note_gnu_build_id = NULL;
2036         }
2037       if (optarg == NULL)
2038         optarg = DEFAULT_BUILD_ID_STYLE;
2039       if (strcmp (optarg, "none"))
2040         link_info.emit_note_gnu_build_id = xstrdup (optarg);
2041       break;
2045 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2046 fragment <<EOF
2047     case OPTION_DISABLE_NEW_DTAGS:
2048       link_info.new_dtags = FALSE;
2049       break;
2051     case OPTION_ENABLE_NEW_DTAGS:
2052       link_info.new_dtags = TRUE;
2053       break;
2055     case OPTION_EH_FRAME_HDR:
2056       link_info.eh_frame_hdr = TRUE;
2057       break;
2059     case OPTION_GROUP:
2060       link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
2061       /* Groups must be self-contained.  */
2062       link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2063       link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
2064       break;
2066     case OPTION_EXCLUDE_LIBS:
2067       add_excluded_libs (optarg);
2068       break;
2070     case OPTION_HASH_STYLE:
2071       link_info.emit_hash = FALSE;
2072       link_info.emit_gnu_hash = FALSE;
2073       if (strcmp (optarg, "sysv") == 0)
2074         link_info.emit_hash = TRUE;
2075       else if (strcmp (optarg, "gnu") == 0)
2076         link_info.emit_gnu_hash = TRUE;
2077       else if (strcmp (optarg, "both") == 0)
2078         {
2079           link_info.emit_hash = TRUE;
2080           link_info.emit_gnu_hash = TRUE;
2081         }
2082       else
2083         einfo (_("%P%F: invalid hash style \`%s'\n"), optarg);
2084       break;
2086     case 'z':
2087       if (strcmp (optarg, "initfirst") == 0)
2088         link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
2089       else if (strcmp (optarg, "interpose") == 0)
2090         link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
2091       else if (strcmp (optarg, "loadfltr") == 0)
2092         link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
2093       else if (strcmp (optarg, "nodefaultlib") == 0)
2094         link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
2095       else if (strcmp (optarg, "nodelete") == 0)
2096         link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
2097       else if (strcmp (optarg, "nodlopen") == 0)
2098         link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
2099       else if (strcmp (optarg, "nodump") == 0)
2100         link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
2101       else if (strcmp (optarg, "now") == 0)
2102         {
2103           link_info.flags |= (bfd_vma) DF_BIND_NOW;
2104           link_info.flags_1 |= (bfd_vma) DF_1_NOW;
2105         }
2106       else if (strcmp (optarg, "lazy") == 0)
2107         {
2108           link_info.flags &= ~(bfd_vma) DF_BIND_NOW;
2109           link_info.flags_1 &= ~(bfd_vma) DF_1_NOW;
2110         }
2111       else if (strcmp (optarg, "origin") == 0)
2112         {
2113           link_info.flags |= (bfd_vma) DF_ORIGIN;
2114           link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
2115         }
2116       else if (strcmp (optarg, "defs") == 0)
2117         link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2118       else if (strcmp (optarg, "muldefs") == 0)
2119         link_info.allow_multiple_definition = TRUE;
2120       else if (strcmp (optarg, "combreloc") == 0)
2121         link_info.combreloc = TRUE;
2122       else if (strcmp (optarg, "nocombreloc") == 0)
2123         link_info.combreloc = FALSE;
2124       else if (strcmp (optarg, "nocopyreloc") == 0)
2125         link_info.nocopyreloc = TRUE;
2126       else if (strcmp (optarg, "execstack") == 0)
2127         {
2128           link_info.execstack = TRUE;
2129           link_info.noexecstack = FALSE;
2130         }
2131       else if (strcmp (optarg, "noexecstack") == 0)
2132         {
2133           link_info.noexecstack = TRUE;
2134           link_info.execstack = FALSE;
2135         }
2138   if test -n "$COMMONPAGESIZE"; then
2139 fragment <<EOF
2140       else if (strcmp (optarg, "relro") == 0)
2141         link_info.relro = TRUE;
2142       else if (strcmp (optarg, "norelro") == 0)
2143         link_info.relro = FALSE;
2145   fi
2147 fragment <<EOF
2148       else if (CONST_STRNEQ (optarg, "max-page-size="))
2149         {
2150           char *end;
2152           config.maxpagesize = strtoul (optarg + 14, &end, 0);
2153           if (*end || (config.maxpagesize & (config.maxpagesize - 1)) != 0)
2154             einfo (_("%P%F: invalid maxium page size \`%s'\n"),
2155                    optarg + 14);
2156           ASSERT (default_target != NULL);
2157           bfd_emul_set_maxpagesize (default_target, config.maxpagesize);
2158         }
2159       else if (CONST_STRNEQ (optarg, "common-page-size="))
2160         {
2161           char *end;
2162           config.commonpagesize = strtoul (optarg + 17, &end, 0);
2163           if (*end
2164               || (config.commonpagesize & (config.commonpagesize - 1)) != 0)
2165             einfo (_("%P%F: invalid common page size \`%s'\n"),
2166                    optarg + 17);
2167           ASSERT (default_target != NULL);
2168           bfd_emul_set_commonpagesize (default_target,
2169                                        config.commonpagesize);
2170         }
2171       /* What about the other Solaris -z options? FIXME.  */
2172       break;
2176 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
2177 fragment <<EOF
2178  $PARSE_AND_LIST_ARGS_CASES
2182 fragment <<EOF
2183     }
2185   return TRUE;
2190 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
2191 fragment <<EOF
2193 static void
2194 gld${EMULATION_NAME}_list_options (FILE * file)
2196   fprintf (file, _("  --build-id[=STYLE]\tGenerate build ID note\n"));
2199 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2200 fragment <<EOF
2201   fprintf (file, _("  -Bgroup\t\tSelects group name lookup rules for DSO\n"));
2202   fprintf (file, _("  --disable-new-dtags\tDisable new dynamic tags\n"));
2203   fprintf (file, _("  --enable-new-dtags\tEnable new dynamic tags\n"));
2204   fprintf (file, _("  --eh-frame-hdr\tCreate .eh_frame_hdr section\n"));
2205   fprintf (file, _("  --hash-style=STYLE\tSet hash style to sysv, gnu or both\n"));
2206   fprintf (file, _("  -z combreloc\t\tMerge dynamic relocs into one section and sort\n"));
2207   fprintf (file, _("  -z defs\t\tReport unresolved symbols in object files.\n"));
2208   fprintf (file, _("  -z execstack\t\tMark executable as requiring executable stack\n"));
2209   fprintf (file, _("  -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
2210   fprintf (file, _("  -z interpose\t\tMark object to interpose all DSOs but executable\n"));
2211   fprintf (file, _("  -z lazy\t\tMark object lazy runtime binding (default)\n"));
2212   fprintf (file, _("  -z loadfltr\t\tMark object requiring immediate process\n"));
2213   fprintf (file, _("  -z muldefs\t\tAllow multiple definitions\n"));
2214   fprintf (file, _("  -z nocombreloc\tDon't merge dynamic relocs into one section\n"));
2215   fprintf (file, _("  -z nocopyreloc\tDon't create copy relocs\n"));
2216   fprintf (file, _("  -z nodefaultlib\tMark object not to use default search paths\n"));
2217   fprintf (file, _("  -z nodelete\t\tMark DSO non-deletable at runtime\n"));
2218   fprintf (file, _("  -z nodlopen\t\tMark DSO not available to dlopen\n"));
2219   fprintf (file, _("  -z nodump\t\tMark DSO not available to dldump\n"));
2220   fprintf (file, _("  -z noexecstack\tMark executable as not requiring executable stack\n"));
2223   if test -n "$COMMONPAGESIZE"; then
2224 fragment <<EOF
2225   fprintf (file, _("  -z norelro\t\tDon't create RELRO program header\n"));
2227   fi
2229 fragment <<EOF
2230   fprintf (file, _("  -z now\t\tMark object non-lazy runtime binding\n"));
2231   fprintf (file, _("  -z origin\t\tMark object requiring immediate \$ORIGIN processing\n\t\t\t  at runtime\n"));
2234   if test -n "$COMMONPAGESIZE"; then
2235 fragment <<EOF
2236   fprintf (file, _("  -z relro\t\tCreate RELRO program header\n"));
2238   fi
2240 fragment <<EOF
2241   fprintf (file, _("  -z max-page-size=SIZE\tSet maximum page size to SIZE\n"));
2242   fprintf (file, _("  -z common-page-size=SIZE\n\t\t\tSet common page size to SIZE\n"));
2243   fprintf (file, _("  -z KEYWORD\t\tIgnored for Solaris compatibility\n"));
2247 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
2248 fragment <<EOF
2249  $PARSE_AND_LIST_OPTIONS
2253 fragment <<EOF
2257 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
2258 fragment <<EOF
2259  $PARSE_AND_LIST_EPILOGUE
2263 else
2264 fragment <<EOF
2265 #define gld${EMULATION_NAME}_add_options NULL
2266 #define gld${EMULATION_NAME}_handle_option NULL
2268 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
2269 fragment <<EOF
2270 #define gld${EMULATION_NAME}_list_options NULL
2275 fragment <<EOF
2277 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
2279   ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
2280   ${LDEMUL_SYSLIB-syslib_default},
2281   ${LDEMUL_HLL-hll_default},
2282   ${LDEMUL_AFTER_PARSE-after_parse_default},
2283   ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
2284   ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
2285   ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
2286   ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
2287   ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
2288   ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
2289   "${EMULATION_NAME}",
2290   "${OUTPUT_FORMAT}",
2291   ${LDEMUL_FINISH-gld${EMULATION_NAME}_finish},
2292   ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
2293   ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
2294   ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
2295   ${LDEMUL_SET_SYMBOLS-NULL},
2296   ${LDEMUL_PARSE_ARGS-NULL},
2297   gld${EMULATION_NAME}_add_options,
2298   gld${EMULATION_NAME}_handle_option,
2299   ${LDEMUL_UNRECOGNIZED_FILE-NULL},
2300   ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
2301   ${LDEMUL_RECOGNIZED_FILE-gld${EMULATION_NAME}_load_symbols},
2302   ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
2303   ${LDEMUL_NEW_VERS_PATTERN-NULL}