* emultempl/elf32.em (gld${EMULATION_NAME}_check_ld_so_conf): Replace
[external/binutils.git] / ld / emultempl / elf32.em
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}
10 fi
11 fragment <<EOF
12 /* This file is is generated by a shell script.  DO NOT EDIT! */
13
14 /* ${ELFSIZE} bit ELF emulation code for ${EMULATION_NAME}
15    Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
16    2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
17    Free Software Foundation, Inc.
18    Written by Steve Chamberlain <sac@cygnus.com>
19    ELF support by Ian Lance Taylor <ian@cygnus.com>
20
21    This file is part of the GNU Binutils.
22
23    This program is free software; you can redistribute it and/or modify
24    it under the terms of the GNU General Public License as published by
25    the Free Software Foundation; either version 3 of the License, or
26    (at your option) any later version.
27
28    This program is distributed in the hope that it will be useful,
29    but WITHOUT ANY WARRANTY; without even the implied warranty of
30    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
31    GNU General Public License for more details.
32
33    You should have received a copy of the GNU General Public License
34    along with this program; if not, write to the Free Software
35    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
36    MA 02110-1301, USA.  */
37
38 #define TARGET_IS_${EMULATION_NAME}
39
40 #include "sysdep.h"
41 #include "bfd.h"
42 #include "libiberty.h"
43 #include "filenames.h"
44 #include "safe-ctype.h"
45 #include "getopt.h"
46 #include "md5.h"
47 #include "sha1.h"
48 #include <fcntl.h>
49
50 #include "bfdlink.h"
51
52 #include "ld.h"
53 #include "ldmain.h"
54 #include "ldmisc.h"
55 #include "ldexp.h"
56 #include "ldlang.h"
57 #include "ldfile.h"
58 #include "ldemul.h"
59 #include <ldgram.h>
60 #include "elf/common.h"
61 #include "elf-bfd.h"
62 #include "filenames.h"
63
64 /* Declare functions used by various EXTRA_EM_FILEs.  */
65 static void gld${EMULATION_NAME}_before_parse (void);
66 static void gld${EMULATION_NAME}_after_open (void);
67 static void gld${EMULATION_NAME}_before_allocation (void);
68 static void gld${EMULATION_NAME}_after_allocation (void);
69 static lang_output_section_statement_type *gld${EMULATION_NAME}_place_orphan
70   (asection *, const char *, int);
71 EOF
72
73 if [ "x${USE_LIBPATH}" = xyes ] ; then
74   case ${target} in
75     *-*-linux-* | *-*-k*bsd*-* | *-*-gnu*)
76   fragment <<EOF
77 #ifdef HAVE_GLOB
78 #include <glob.h>
79 #endif
80 EOF
81     ;;
82   esac
83 fi
84
85 # Import any needed special functions and/or overrides.
86 #
87 source_em ${srcdir}/emultempl/elf-generic.em
88 if test -n "$EXTRA_EM_FILE" ; then
89   source_em ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
90 fi
91
92 # Functions in this file can be overridden by setting the LDEMUL_* shell
93 # variables.  If the name of the overriding function is the same as is
94 # defined in this file, then don't output this file's version.
95 # If a different overriding name is given then output the standard function
96 # as presumably it is called from the overriding function.
97 #
98 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
99 fragment <<EOF
100
101 static void
102 gld${EMULATION_NAME}_before_parse (void)
103 {
104   ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
105   input_flags.dynamic = ${DYNAMIC_LINK-TRUE};
106   config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
107   config.separate_code = `if test "x${SEPARATE_CODE}" = xyes ; then echo TRUE ; else echo FALSE ; fi`;
108 }
109
110 EOF
111 fi
112
113 if test x"$LDEMUL_RECOGNIZED_FILE" != xgld"${EMULATION_NAME}"_load_symbols; then
114 fragment <<EOF
115 /* Handle the generation of DT_NEEDED tags.  */
116
117 static bfd_boolean
118 gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *entry)
119 {
120   int link_class = 0;
121
122   /* Tell the ELF linker that we don't want the output file to have a
123      DT_NEEDED entry for this file, unless it is used to resolve
124      references in a regular object.  */
125   if (entry->flags.add_DT_NEEDED_for_regular)
126     link_class = DYN_AS_NEEDED;
127
128   /* Tell the ELF linker that we don't want the output file to have a
129      DT_NEEDED entry for any dynamic library in DT_NEEDED tags from
130      this file at all.  */
131   if (!entry->flags.add_DT_NEEDED_for_dynamic)
132     link_class |= DYN_NO_ADD_NEEDED;
133
134   if (entry->flags.just_syms
135       && (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) != 0)
136     einfo (_("%P%F: --just-symbols may not be used on DSO: %B\n"),
137            entry->the_bfd);
138
139   if (link_class == 0
140       || (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) == 0)
141     return FALSE;
142
143   bfd_elf_set_dyn_lib_class (entry->the_bfd,
144                              (enum dynamic_lib_link_class) link_class);
145
146   /* Continue on with normal load_symbols processing.  */
147   return FALSE;
148 }
149 EOF
150 fi
151
152 fragment <<EOF
153
154 /* These variables are required to pass information back and forth
155    between after_open and check_needed and stat_needed and vercheck.  */
156
157 static struct bfd_link_needed_list *global_needed;
158 static struct stat global_stat;
159 static lang_input_statement_type *global_found;
160 static struct bfd_link_needed_list *global_vercheck_needed;
161 static bfd_boolean global_vercheck_failed;
162
163 /* These variables are used to implement target options */
164
165 static char *audit; /* colon (typically) separated list of libs */
166 static char *depaudit; /* colon (typically) separated list of libs */
167
168 /* On Linux, it's possible to have different versions of the same
169    shared library linked against different versions of libc.  The
170    dynamic linker somehow tags which libc version to use in
171    /etc/ld.so.cache, and, based on the libc that it sees in the
172    executable, chooses which version of the shared library to use.
173
174    We try to do a similar check here by checking whether this shared
175    library needs any other shared libraries which may conflict with
176    libraries we have already included in the link.  If it does, we
177    skip it, and try to find another shared library farther on down the
178    link path.
179
180    This is called via lang_for_each_input_file.
181    GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
182    which we are checking.  This sets GLOBAL_VERCHECK_FAILED if we find
183    a conflicting version.  */
184
185 static void
186 gld${EMULATION_NAME}_vercheck (lang_input_statement_type *s)
187 {
188   const char *soname;
189   struct bfd_link_needed_list *l;
190
191   if (global_vercheck_failed)
192     return;
193   if (s->the_bfd == NULL
194       || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
195     return;
196
197   soname = bfd_elf_get_dt_soname (s->the_bfd);
198   if (soname == NULL)
199     soname = lbasename (bfd_get_filename (s->the_bfd));
200
201   for (l = global_vercheck_needed; l != NULL; l = l->next)
202     {
203       const char *suffix;
204
205       if (filename_cmp (soname, l->name) == 0)
206         {
207           /* Probably can't happen, but it's an easy check.  */
208           continue;
209         }
210
211       if (strchr (l->name, '/') != NULL)
212         continue;
213
214       suffix = strstr (l->name, ".so.");
215       if (suffix == NULL)
216         continue;
217
218       suffix += sizeof ".so." - 1;
219
220       if (filename_ncmp (soname, l->name, suffix - l->name) == 0)
221         {
222           /* Here we know that S is a dynamic object FOO.SO.VER1, and
223              the object we are considering needs a dynamic object
224              FOO.SO.VER2, and VER1 and VER2 are different.  This
225              appears to be a version mismatch, so we tell the caller
226              to try a different version of this library.  */
227           global_vercheck_failed = TRUE;
228           return;
229         }
230     }
231 }
232
233
234 /* See if an input file matches a DT_NEEDED entry by running stat on
235    the file.  */
236
237 static void
238 gld${EMULATION_NAME}_stat_needed (lang_input_statement_type *s)
239 {
240   struct stat st;
241   const char *suffix;
242   const char *soname;
243
244   if (global_found != NULL)
245     return;
246   if (s->the_bfd == NULL)
247     return;
248
249   /* If this input file was an as-needed entry, and wasn't found to be
250      needed at the stage it was linked, then don't say we have loaded it.  */
251   if ((bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0)
252     return;
253
254   if (bfd_stat (s->the_bfd, &st) != 0)
255     {
256       einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
257       return;
258     }
259
260   /* Some operating systems, e.g. Windows, do not provide a meaningful
261      st_ino; they always set it to zero.  (Windows does provide a
262      meaningful st_dev.)  Do not indicate a duplicate library in that
263      case.  While there is no guarantee that a system that provides
264      meaningful inode numbers will never set st_ino to zero, this is
265      merely an optimization, so we do not need to worry about false
266      negatives.  */
267   if (st.st_dev == global_stat.st_dev
268       && st.st_ino == global_stat.st_ino
269       && st.st_ino != 0)
270     {
271       global_found = s;
272       return;
273     }
274
275   /* We issue a warning if it looks like we are including two
276      different versions of the same shared library.  For example,
277      there may be a problem if -lc picks up libc.so.6 but some other
278      shared library has a DT_NEEDED entry of libc.so.5.  This is a
279      heuristic test, and it will only work if the name looks like
280      NAME.so.VERSION.  FIXME: Depending on file names is error-prone.
281      If we really want to issue warnings about mixing version numbers
282      of shared libraries, we need to find a better way.  */
283
284   if (strchr (global_needed->name, '/') != NULL)
285     return;
286   suffix = strstr (global_needed->name, ".so.");
287   if (suffix == NULL)
288     return;
289   suffix += sizeof ".so." - 1;
290
291   soname = bfd_elf_get_dt_soname (s->the_bfd);
292   if (soname == NULL)
293     soname = lbasename (s->filename);
294
295   if (filename_ncmp (soname, global_needed->name, suffix - global_needed->name) == 0)
296     einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
297            global_needed->name, global_needed->by, soname);
298 }
299
300 struct dt_needed
301 {
302   bfd *by;
303   const char *name;
304 };
305
306 /* This function is called for each possible name for a dynamic object
307    named by a DT_NEEDED entry.  The FORCE parameter indicates whether
308    to skip the check for a conflicting version.  */
309
310 static bfd_boolean
311 gld${EMULATION_NAME}_try_needed (struct dt_needed *needed,
312                                  int force)
313 {
314   bfd *abfd;
315   const char *name = needed->name;
316   const char *soname;
317   int link_class;
318
319   abfd = bfd_openr (name, bfd_get_target (link_info.output_bfd));
320   if (abfd == NULL)
321     return FALSE;
322
323   /* Linker needs to decompress sections.  */
324   abfd->flags |= BFD_DECOMPRESS;
325
326   if (! bfd_check_format (abfd, bfd_object))
327     {
328       bfd_close (abfd);
329       return FALSE;
330     }
331   if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
332     {
333       bfd_close (abfd);
334       return FALSE;
335     }
336
337   /* For DT_NEEDED, they have to match.  */
338   if (abfd->xvec != link_info.output_bfd->xvec)
339     {
340       bfd_close (abfd);
341       return FALSE;
342     }
343
344   /* Check whether this object would include any conflicting library
345      versions.  If FORCE is set, then we skip this check; we use this
346      the second time around, if we couldn't find any compatible
347      instance of the shared library.  */
348
349   if (! force)
350     {
351       struct bfd_link_needed_list *needs;
352
353       if (! bfd_elf_get_bfd_needed_list (abfd, &needs))
354         einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
355
356       if (needs != NULL)
357         {
358           global_vercheck_needed = needs;
359           global_vercheck_failed = FALSE;
360           lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
361           if (global_vercheck_failed)
362             {
363               bfd_close (abfd);
364               /* Return FALSE to force the caller to move on to try
365                  another file on the search path.  */
366               return FALSE;
367             }
368
369           /* But wait!  It gets much worse.  On Linux, if a shared
370              library does not use libc at all, we are supposed to skip
371              it the first time around in case we encounter a shared
372              library later on with the same name which does use the
373              version of libc that we want.  This is much too horrible
374              to use on any system other than Linux.  */
375
376 EOF
377 case ${target} in
378   *-*-linux-* | *-*-k*bsd*-* | *-*-gnu*)
379     fragment <<EOF
380           {
381             struct bfd_link_needed_list *l;
382
383             for (l = needs; l != NULL; l = l->next)
384               if (CONST_STRNEQ (l->name, "libc.so"))
385                 break;
386             if (l == NULL)
387               {
388                 bfd_close (abfd);
389                 return FALSE;
390               }
391           }
392
393 EOF
394     ;;
395 esac
396 fragment <<EOF
397         }
398     }
399
400   /* We've found a dynamic object matching the DT_NEEDED entry.  */
401
402   /* We have already checked that there is no other input file of the
403      same name.  We must now check again that we are not including the
404      same file twice.  We need to do this because on many systems
405      libc.so is a symlink to, e.g., libc.so.1.  The SONAME entry will
406      reference libc.so.1.  If we have already included libc.so, we
407      don't want to include libc.so.1 if they are the same file, and we
408      can only check that using stat.  */
409
410   if (bfd_stat (abfd, &global_stat) != 0)
411     einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
412
413   /* First strip off everything before the last '/'.  */
414   soname = lbasename (abfd->filename);
415
416   if (verbose)
417     info_msg (_("found %s at %s\n"), soname, name);
418
419   global_found = NULL;
420   lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
421   if (global_found != NULL)
422     {
423       /* Return TRUE to indicate that we found the file, even though
424          we aren't going to do anything with it.  */
425       return TRUE;
426     }
427
428   /* Specify the soname to use.  */
429   bfd_elf_set_dt_needed_name (abfd, soname);
430
431   /* Tell the ELF linker that we don't want the output file to have a
432      DT_NEEDED entry for this file, unless it is used to resolve
433      references in a regular object.  */
434   link_class = DYN_DT_NEEDED;
435
436   /* Tell the ELF linker that we don't want the output file to have a
437      DT_NEEDED entry for this file at all if the entry is from a file
438      with DYN_NO_ADD_NEEDED.  */
439   if (needed->by != NULL
440       && (bfd_elf_get_dyn_lib_class (needed->by) & DYN_NO_ADD_NEEDED) != 0)
441     link_class |= DYN_NO_NEEDED | DYN_NO_ADD_NEEDED;
442
443   bfd_elf_set_dyn_lib_class (abfd, (enum dynamic_lib_link_class) link_class);
444
445   /* Add this file into the symbol table.  */
446   if (! bfd_link_add_symbols (abfd, &link_info))
447     einfo ("%F%B: could not read symbols: %E\n", abfd);
448
449   return TRUE;
450 }
451
452
453 /* Search for a needed file in a path.  */
454
455 static bfd_boolean
456 gld${EMULATION_NAME}_search_needed (const char *path,
457                                     struct dt_needed *n, int force)
458 {
459   const char *s;
460   const char *name = n->name;
461   size_t len;
462   struct dt_needed needed;
463
464   if (name[0] == '/')
465     return gld${EMULATION_NAME}_try_needed (n, force);
466
467   if (path == NULL || *path == '\0')
468     return FALSE;
469
470   needed.by = n->by;
471   needed.name = n->name;
472
473   len = strlen (name);
474   while (1)
475     {
476       char *filename, *sset;
477
478       s = strchr (path, config.rpath_separator);
479       if (s == NULL)
480         s = path + strlen (path);
481
482 #if HAVE_DOS_BASED_FILE_SYSTEM
483       /* Assume a match on the second char is part of drive specifier.  */
484       else if (config.rpath_separator == ':'
485                && s == path + 1
486                && ISALPHA (*path))
487         {
488           s = strchr (s + 1, config.rpath_separator);
489           if (s == NULL)
490             s = path + strlen (path);
491         }
492 #endif
493       filename = (char *) xmalloc (s - path + len + 2);
494       if (s == path)
495         sset = filename;
496       else
497         {
498           memcpy (filename, path, s - path);
499           filename[s - path] = '/';
500           sset = filename + (s - path) + 1;
501         }
502       strcpy (sset, name);
503
504       needed.name = filename;
505       if (gld${EMULATION_NAME}_try_needed (&needed, force))
506         return TRUE;
507
508       free (filename);
509
510       if (*s == '\0')
511         break;
512       path = s + 1;
513     }
514
515   return FALSE;
516 }
517
518 EOF
519 if [ "x${USE_LIBPATH}" = xyes ] ; then
520   fragment <<EOF
521
522 /* Add the sysroot to every entry in a path separated by
523    config.rpath_separator.  */
524
525 static char *
526 gld${EMULATION_NAME}_add_sysroot (const char *path)
527 {
528   int len, colons, i;
529   char *ret, *p;
530
531   len = strlen (path);
532   colons = 0;
533   i = 0;
534   while (path[i])
535     if (path[i++] == config.rpath_separator)
536       colons++;
537
538   if (path[i])
539     colons++;
540
541   len = len + (colons + 1) * strlen (ld_sysroot);
542   ret = xmalloc (len + 1);
543   strcpy (ret, ld_sysroot);
544   p = ret + strlen (ret);
545   i = 0;
546   while (path[i])
547     if (path[i] == config.rpath_separator)
548       {
549         *p++ = path[i++];
550         strcpy (p, ld_sysroot);
551         p = p + strlen (p);
552       }
553     else
554       *p++ = path[i++];
555
556   *p = 0;
557   return ret;
558 }
559
560 EOF
561   case ${target} in
562     *-*-freebsd* | *-*-dragonfly*)
563       fragment <<EOF
564 /* Read the system search path the FreeBSD way rather than the Linux way.  */
565 #ifdef HAVE_ELF_HINTS_H
566 #include <elf-hints.h>
567 #else
568 #include "elf-hints-local.h"
569 #endif
570
571 static bfd_boolean
572 gld${EMULATION_NAME}_check_ld_elf_hints (const struct bfd_link_needed_list *l,
573                                          int force)
574 {
575   static bfd_boolean initialized;
576   static char *ld_elf_hints;
577   struct dt_needed needed;
578
579   if (!initialized)
580     {
581       FILE *f;
582       char *tmppath;
583
584       tmppath = concat (ld_sysroot, _PATH_ELF_HINTS, (const char *) NULL);
585       f = fopen (tmppath, FOPEN_RB);
586       free (tmppath);
587       if (f != NULL)
588         {
589           struct elfhints_hdr hdr;
590
591           if (fread (&hdr, 1, sizeof (hdr), f) == sizeof (hdr)
592               && hdr.magic == ELFHINTS_MAGIC
593               && hdr.version == 1)
594             {
595               if (fseek (f, hdr.strtab + hdr.dirlist, SEEK_SET) != -1)
596                 {
597                   char *b;
598
599                   b = xmalloc (hdr.dirlistlen + 1);
600                   if (fread (b, 1, hdr.dirlistlen + 1, f) ==
601                       hdr.dirlistlen + 1)
602                     ld_elf_hints = gld${EMULATION_NAME}_add_sysroot (b);
603
604                   free (b);
605                 }
606             }
607           fclose (f);
608         }
609
610       initialized = TRUE;
611     }
612
613   if (ld_elf_hints == NULL)
614     return FALSE;
615
616   needed.by = l->by;
617   needed.name = l->name;
618   return gld${EMULATION_NAME}_search_needed (ld_elf_hints, &needed, force);
619 }
620 EOF
621     # FreeBSD
622     ;;
623
624     *-*-linux-* | *-*-k*bsd*-* | *-*-gnu*)
625       fragment <<EOF
626 /* For a native linker, check the file /etc/ld.so.conf for directories
627    in which we may find shared libraries.  /etc/ld.so.conf is really
628    only meaningful on Linux.  */
629
630 struct gld${EMULATION_NAME}_ld_so_conf
631 {
632   char *path;
633   size_t len, alloc;
634 };
635
636 static bfd_boolean
637 gld${EMULATION_NAME}_parse_ld_so_conf
638      (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename);
639
640 static void
641 gld${EMULATION_NAME}_parse_ld_so_conf_include
642      (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename,
643       const char *pattern)
644 {
645   char *newp = NULL;
646 #ifdef HAVE_GLOB
647   glob_t gl;
648 #endif
649
650   if (pattern[0] != '/')
651     {
652       char *p = strrchr (filename, '/');
653       size_t patlen = strlen (pattern) + 1;
654
655       newp = xmalloc (p - filename + 1 + patlen);
656       memcpy (newp, filename, p - filename + 1);
657       memcpy (newp + (p - filename + 1), pattern, patlen);
658       pattern = newp;
659     }
660
661 #ifdef HAVE_GLOB
662   if (glob (pattern, 0, NULL, &gl) == 0)
663     {
664       size_t i;
665
666       for (i = 0; i < gl.gl_pathc; ++i)
667         gld${EMULATION_NAME}_parse_ld_so_conf (info, gl.gl_pathv[i]);
668       globfree (&gl);
669     }
670 #else
671   /* If we do not have glob, treat the pattern as a literal filename.  */
672   gld${EMULATION_NAME}_parse_ld_so_conf (info, pattern);
673 #endif
674
675   if (newp)
676     free (newp);
677 }
678
679 static bfd_boolean
680 gld${EMULATION_NAME}_parse_ld_so_conf
681      (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename)
682 {
683   FILE *f = fopen (filename, FOPEN_RT);
684   char *line;
685   size_t linelen;
686
687   if (f == NULL)
688     return FALSE;
689
690   linelen = 256;
691   line = xmalloc (linelen);
692   do
693     {
694       char *p = line, *q;
695
696       /* Normally this would use getline(3), but we need to be portable.  */
697       while ((q = fgets (p, linelen - (p - line), f)) != NULL
698              && strlen (q) == linelen - (p - line) - 1
699              && line[linelen - 2] != '\n')
700         {
701           line = xrealloc (line, 2 * linelen);
702           p = line + linelen - 1;
703           linelen += linelen;
704         }
705
706       if (q == NULL && p == line)
707         break;
708
709       p = strchr (line, '\n');
710       if (p)
711         *p = '\0';
712
713       /* Because the file format does not know any form of quoting we
714          can search forward for the next '#' character and if found
715          make it terminating the line.  */
716       p = strchr (line, '#');
717       if (p)
718         *p = '\0';
719
720       /* Remove leading whitespace.  NUL is no whitespace character.  */
721       p = line;
722       while (*p == ' ' || *p == '\f' || *p == '\r' || *p == '\t' || *p == '\v')
723         ++p;
724
725       /* If the line is blank it is ignored.  */
726       if (p[0] == '\0')
727         continue;
728
729       if (CONST_STRNEQ (p, "include") && (p[7] == ' ' || p[7] == '\t'))
730         {
731           char *dir, c;
732           p += 8;
733           do
734             {
735               while (*p == ' ' || *p == '\t')
736                 ++p;
737
738               if (*p == '\0')
739                 break;
740
741               dir = p;
742
743               while (*p != ' ' && *p != '\t' && *p)
744                 ++p;
745
746               c = *p;
747               *p++ = '\0';
748               if (dir[0] != '\0')
749                 gld${EMULATION_NAME}_parse_ld_so_conf_include (info, filename,
750                                                                dir);
751             }
752           while (c != '\0');
753         }
754       else
755         {
756           char *dir = p;
757           while (*p && *p != '=' && *p != ' ' && *p != '\t' && *p != '\f'
758                  && *p != '\r' && *p != '\v')
759             ++p;
760
761           while (p != dir && p[-1] == '/')
762             --p;
763           if (info->path == NULL)
764             {
765               info->alloc = p - dir + 1 + 256;
766               info->path = xmalloc (info->alloc);
767               info->len = 0;
768             }
769           else
770             {
771               if (info->len + 1 + (p - dir) >= info->alloc)
772                 {
773                   info->alloc += p - dir + 256;
774                   info->path = xrealloc (info->path, info->alloc);
775                 }
776               info->path[info->len++] = config.rpath_separator;
777             }
778           memcpy (info->path + info->len, dir, p - dir);
779           info->len += p - dir;
780           info->path[info->len] = '\0';
781         }
782     }
783   while (! feof (f));
784   free (line);
785   fclose (f);
786   return TRUE;
787 }
788
789 static bfd_boolean
790 gld${EMULATION_NAME}_check_ld_so_conf (const struct bfd_link_needed_list *l,
791                                        int force)
792 {
793   static bfd_boolean initialized;
794   static char *ld_so_conf;
795   struct dt_needed needed;
796
797   if (! initialized)
798     {
799       char *tmppath;
800       struct gld${EMULATION_NAME}_ld_so_conf info;
801
802       info.path = NULL;
803       info.len = info.alloc = 0;
804       tmppath = concat (ld_sysroot, "${prefix}/etc/ld.so.conf",
805                         (const char *) NULL);
806       if (!gld${EMULATION_NAME}_parse_ld_so_conf (&info, tmppath))
807         {
808           free (tmppath);
809           tmppath = concat (ld_sysroot, "/etc/ld.so.conf",
810                             (const char *) NULL);
811           gld${EMULATION_NAME}_parse_ld_so_conf (&info, tmppath);
812         }
813       free (tmppath);
814
815       if (info.path)
816         {
817           char *d = gld${EMULATION_NAME}_add_sysroot (info.path);
818           free (info.path);
819           ld_so_conf = d;
820         }
821       initialized = TRUE;
822     }
823
824   if (ld_so_conf == NULL)
825     return FALSE;
826
827
828   needed.by = l->by;
829   needed.name = l->name;
830   return gld${EMULATION_NAME}_search_needed (ld_so_conf, &needed, force);
831 }
832
833 EOF
834     # Linux
835     ;;
836   esac
837 fi
838 fragment <<EOF
839
840 /* See if an input file matches a DT_NEEDED entry by name.  */
841
842 static void
843 gld${EMULATION_NAME}_check_needed (lang_input_statement_type *s)
844 {
845   const char *soname;
846
847   /* Stop looking if we've found a loaded lib.  */
848   if (global_found != NULL
849       && (bfd_elf_get_dyn_lib_class (global_found->the_bfd)
850           & DYN_AS_NEEDED) == 0)
851     return;
852
853   if (s->filename == NULL || s->the_bfd == NULL)
854     return;
855
856   /* Don't look for a second non-loaded as-needed lib.  */
857   if (global_found != NULL
858       && (bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0)
859     return;
860
861   if (filename_cmp (s->filename, global_needed->name) == 0)
862     {
863       global_found = s;
864       return;
865     }
866
867   if (s->flags.search_dirs)
868     {
869       const char *f = strrchr (s->filename, '/');
870       if (f != NULL
871           && filename_cmp (f + 1, global_needed->name) == 0)
872         {
873           global_found = s;
874           return;
875         }
876     }
877
878   soname = bfd_elf_get_dt_soname (s->the_bfd);
879   if (soname != NULL
880       && filename_cmp (soname, global_needed->name) == 0)
881     {
882       global_found = s;
883       return;
884     }
885 }
886
887 EOF
888
889 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
890 fragment <<EOF
891
892 static bfd_size_type
893 gld${EMULATION_NAME}_id_note_section_size (bfd *abfd,
894                                            struct bfd_link_info *linfo)
895 {
896   const char *style = linfo->emit_note_gnu_build_id;
897   bfd_size_type size;
898
899   abfd = abfd;
900
901   size = offsetof (Elf_External_Note, name[sizeof "GNU"]);
902   size = (size + 3) & -(bfd_size_type) 4;
903
904   if (!strcmp (style, "md5") || !strcmp (style, "uuid"))
905     size += 128 / 8;
906   else if (!strcmp (style, "sha1"))
907     size += 160 / 8;
908   else if (!strncmp (style, "0x", 2))
909     {
910       /* ID is in string form (hex).  Convert to bits.  */
911       const char *id = style + 2;
912       do
913         {
914           if (ISXDIGIT (id[0]) && ISXDIGIT (id[1]))
915             {
916               ++size;
917               id += 2;
918             }
919           else if (*id == '-' || *id == ':')
920             ++id;
921           else
922             {
923               size = 0;
924               break;
925             }
926         } while (*id != '\0');
927     }
928   else
929     size = 0;
930
931   return size;
932 }
933
934 static unsigned char
935 read_hex (const char xdigit)
936 {
937   if (ISDIGIT (xdigit))
938     return xdigit - '0';
939   if (ISUPPER (xdigit))
940     return xdigit - 'A' + 0xa;
941   if (ISLOWER (xdigit))
942     return xdigit - 'a' + 0xa;
943   abort ();
944   return 0;
945 }
946
947 struct build_id_info
948 {
949   const char *style;
950   asection *sec;
951 };
952
953 static bfd_boolean
954 gld${EMULATION_NAME}_write_build_id_section (bfd *abfd)
955 {
956   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
957   struct build_id_info *info = (struct build_id_info *)
958     elf_tdata (abfd)->after_write_object_contents_info;
959   asection *asec;
960   Elf_Internal_Shdr *i_shdr;
961   unsigned char *contents, *id_bits;
962   bfd_size_type size;
963   Elf_External_Note *e_note;
964
965   asec = info->sec;
966   if (bfd_is_abs_section (asec->output_section))
967     {
968       einfo (_("%P: warning: .note.gnu.build-id section discarded,"
969                " --build-id ignored.\n"));
970       return TRUE;
971     }
972   i_shdr = &elf_section_data (asec->output_section)->this_hdr;
973
974   if (i_shdr->contents == NULL)
975     {
976       if (asec->contents == NULL)
977         asec->contents = (unsigned char *) xmalloc (asec->size);
978       contents = asec->contents;
979     }
980   else
981     contents = i_shdr->contents + asec->output_offset;
982
983   e_note = (Elf_External_Note *) contents;
984   size = offsetof (Elf_External_Note, name[sizeof "GNU"]);
985   size = (size + 3) & -(bfd_size_type) 4;
986   id_bits = contents + size;
987   size = asec->size - size;
988
989   bfd_h_put_32 (abfd, sizeof "GNU", &e_note->namesz);
990   bfd_h_put_32 (abfd, size, &e_note->descsz);
991   bfd_h_put_32 (abfd, NT_GNU_BUILD_ID, &e_note->type);
992   memcpy (e_note->name, "GNU", sizeof "GNU");
993
994   if (!strcmp (info->style, "md5"))
995     {
996       struct md5_ctx ctx;
997       md5_init_ctx (&ctx);
998       if (bed->s->checksum_contents (abfd,
999                                      (void (*) (const void *, size_t, void *))
1000                                      &md5_process_bytes,
1001                                      &ctx))
1002         md5_finish_ctx (&ctx, id_bits);
1003       else
1004         return FALSE;
1005     }
1006   else if (!strcmp (info->style, "sha1"))
1007     {
1008       struct sha1_ctx ctx;
1009       sha1_init_ctx (&ctx);
1010       if (bed->s->checksum_contents (abfd,
1011                                      (void (*) (const void *, size_t, void *))
1012                                      &sha1_process_bytes,
1013                                      &ctx))
1014         sha1_finish_ctx (&ctx, id_bits);
1015       else
1016         return FALSE;
1017     }
1018   else if (!strcmp (info->style, "uuid"))
1019     {
1020       int n;
1021       int fd = open ("/dev/urandom", O_RDONLY);
1022       if (fd < 0)
1023         return FALSE;
1024       n = read (fd, id_bits, size);
1025       close (fd);
1026       if (n < (int) size)
1027         return FALSE;
1028     }
1029   else if (!strncmp (info->style, "0x", 2))
1030     {
1031       /* ID is in string form (hex).  Convert to bits.  */
1032       const char *id = info->style + 2;
1033       size_t n = 0;
1034       do
1035         {
1036           if (ISXDIGIT (id[0]) && ISXDIGIT (id[1]))
1037             {
1038               id_bits[n] = read_hex (*id++) << 4;
1039               id_bits[n++] |= read_hex (*id++);
1040             }
1041           else if (*id == '-' || *id == ':')
1042             ++id;
1043           else
1044             abort ();           /* Should have been validated earlier.  */
1045         } while (*id != '\0');
1046     }
1047   else
1048     abort ();                   /* Should have been validated earlier.  */
1049
1050   size = asec->size;
1051   return (bfd_seek (abfd,
1052                     i_shdr->sh_offset + asec->output_offset, SEEK_SET) == 0
1053           && bfd_bwrite (contents, size, abfd) == size);
1054 }
1055
1056
1057 /* This is called after all the input files have been opened.  */
1058
1059 static void
1060 gld${EMULATION_NAME}_after_open (void)
1061 {
1062   struct bfd_link_needed_list *needed, *l;
1063   struct elf_link_hash_table *htab;
1064
1065   after_open_default ();
1066
1067   htab = elf_hash_table (&link_info);
1068   if (!is_elf_hash_table (htab))
1069     return;
1070
1071   if (link_info.emit_note_gnu_build_id)
1072     {
1073       bfd *abfd;
1074       asection *s;
1075       bfd_size_type size;
1076
1077       /* Find an ELF input.  */
1078       for (abfd = link_info.input_bfds;
1079            abfd != (bfd *) NULL; abfd = abfd->link_next)
1080         if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1081           break;
1082
1083       if (abfd == NULL)
1084         {
1085           /* PR 10555: If there are no input files do not
1086              try to create a .note.gnu-build-id section.  */
1087           free (link_info.emit_note_gnu_build_id);
1088           link_info.emit_note_gnu_build_id = NULL;
1089         }
1090       else
1091         {
1092           size = gld${EMULATION_NAME}_id_note_section_size (abfd, &link_info);
1093           if (size == 0)
1094             {
1095               einfo ("%P: warning: unrecognized --build-id style ignored.\n");
1096               free (link_info.emit_note_gnu_build_id);
1097               link_info.emit_note_gnu_build_id = NULL;
1098             }
1099           else
1100             {
1101               s = bfd_make_section_with_flags (abfd, ".note.gnu.build-id",
1102                                                SEC_ALLOC | SEC_LOAD
1103                                                | SEC_IN_MEMORY | SEC_LINKER_CREATED
1104                                                | SEC_READONLY | SEC_DATA);
1105               if (s != NULL && bfd_set_section_alignment (abfd, s, 2))
1106                 {
1107                   struct elf_obj_tdata *t = elf_tdata (link_info.output_bfd);
1108                   struct build_id_info *b =
1109                       (struct build_id_info *) xmalloc (sizeof *b);
1110
1111                   b->style = link_info.emit_note_gnu_build_id;
1112                   b->sec = s;
1113                   elf_section_type (s) = SHT_NOTE;
1114                   s->size = size;
1115                   t->after_write_object_contents
1116                     = &gld${EMULATION_NAME}_write_build_id_section;
1117                   t->after_write_object_contents_info = b;
1118                 }
1119               else
1120                 {
1121                   einfo ("%P: warning: Cannot create .note.gnu.build-id section,"
1122                          " --build-id ignored.\n");
1123                   free (link_info.emit_note_gnu_build_id);
1124                   link_info.emit_note_gnu_build_id = NULL;
1125                 }
1126             }
1127         }
1128     }
1129
1130   if (link_info.relocatable)
1131     return;
1132
1133   if (link_info.eh_frame_hdr
1134       && !link_info.traditional_format)
1135     {
1136       bfd *abfd, *elfbfd = NULL;
1137       bfd_boolean warn_eh_frame = FALSE;
1138       asection *s;
1139
1140       for (abfd = link_info.input_bfds; abfd; abfd = abfd->link_next)
1141         {
1142           if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1143             elfbfd = abfd;
1144           if (!warn_eh_frame)
1145             {
1146               s = bfd_get_section_by_name (abfd, ".eh_frame");
1147               while (s != NULL
1148                      && (s->size <= 8
1149                          || bfd_is_abs_section (s->output_section)))
1150                 s = bfd_get_next_section_by_name (s);
1151               warn_eh_frame = s != NULL;
1152             }
1153           if (elfbfd && warn_eh_frame)
1154             break;
1155         }
1156       if (elfbfd)
1157         {
1158           const struct elf_backend_data *bed;
1159
1160           bed = get_elf_backend_data (elfbfd);
1161           s = bfd_make_section_with_flags (elfbfd, ".eh_frame_hdr",
1162                                            bed->dynamic_sec_flags
1163                                            | SEC_READONLY);
1164           if (s != NULL
1165               && bfd_set_section_alignment (elfbfd, s, 2))
1166             {
1167               htab->eh_info.hdr_sec = s;
1168               warn_eh_frame = FALSE;
1169             }
1170         }
1171       if (warn_eh_frame)
1172         einfo ("%P: warning: Cannot create .eh_frame_hdr section,"
1173                " --eh-frame-hdr ignored.\n");
1174     }
1175
1176   /* Get the list of files which appear in DT_NEEDED entries in
1177      dynamic objects included in the link (often there will be none).
1178      For each such file, we want to track down the corresponding
1179      library, and include the symbol table in the link.  This is what
1180      the runtime dynamic linker will do.  Tracking the files down here
1181      permits one dynamic object to include another without requiring
1182      special action by the person doing the link.  Note that the
1183      needed list can actually grow while we are stepping through this
1184      loop.  */
1185   needed = bfd_elf_get_needed_list (link_info.output_bfd, &link_info);
1186   for (l = needed; l != NULL; l = l->next)
1187     {
1188       struct bfd_link_needed_list *ll;
1189       struct dt_needed n, nn;
1190       int force;
1191
1192       /* If the lib that needs this one was --as-needed and wasn't
1193          found to be needed, then this lib isn't needed either.  Skip
1194          the lib when creating a shared object unless we are copying
1195          DT_NEEDED entres.  */
1196       if (l->by != NULL
1197           && ((bfd_elf_get_dyn_lib_class (l->by) & DYN_AS_NEEDED) != 0
1198               || (!link_info.executable
1199                   && bfd_elf_get_dyn_lib_class (l->by) & DYN_NO_ADD_NEEDED) != 0))
1200         continue;
1201
1202       /* If we've already seen this file, skip it.  */
1203       for (ll = needed; ll != l; ll = ll->next)
1204         if ((ll->by == NULL
1205              || (bfd_elf_get_dyn_lib_class (ll->by) & DYN_AS_NEEDED) == 0)
1206             && strcmp (ll->name, l->name) == 0)
1207           break;
1208       if (ll != l)
1209         continue;
1210
1211       /* See if this file was included in the link explicitly.  */
1212       global_needed = l;
1213       global_found = NULL;
1214       lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
1215       if (global_found != NULL
1216           && (bfd_elf_get_dyn_lib_class (global_found->the_bfd)
1217               & DYN_AS_NEEDED) == 0)
1218         continue;
1219
1220       n.by = l->by;
1221       n.name = l->name;
1222       nn.by = l->by;
1223       if (verbose)
1224         info_msg (_("%s needed by %B\n"), l->name, l->by);
1225
1226       /* As-needed libs specified on the command line (or linker script)
1227          take priority over libs found in search dirs.  */
1228       if (global_found != NULL)
1229         {
1230           nn.name = global_found->filename;
1231           if (gld${EMULATION_NAME}_try_needed (&nn, TRUE))
1232             continue;
1233         }
1234
1235       /* We need to find this file and include the symbol table.  We
1236          want to search for the file in the same way that the dynamic
1237          linker will search.  That means that we want to use
1238          rpath_link, rpath, then the environment variable
1239          LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
1240          entries (native only), then the linker script LIB_SEARCH_DIRS.
1241          We do not search using the -L arguments.
1242
1243          We search twice.  The first time, we skip objects which may
1244          introduce version mismatches.  The second time, we force
1245          their use.  See gld${EMULATION_NAME}_vercheck comment.  */
1246       for (force = 0; force < 2; force++)
1247         {
1248           size_t len;
1249           search_dirs_type *search;
1250 EOF
1251 if [ "x${NATIVE}" = xyes ] ; then
1252 fragment <<EOF
1253           const char *lib_path;
1254 EOF
1255 fi
1256 if [ "x${USE_LIBPATH}" = xyes ] ; then
1257 fragment <<EOF
1258           struct bfd_link_needed_list *rp;
1259           int found;
1260 EOF
1261 fi
1262 fragment <<EOF
1263
1264           if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
1265                                                   &n, force))
1266             break;
1267 EOF
1268 if [ "x${USE_LIBPATH}" = xyes ] ; then
1269 fragment <<EOF
1270           if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
1271                                                   &n, force))
1272             break;
1273 EOF
1274 fi
1275 if [ "x${NATIVE}" = xyes ] ; then
1276 fragment <<EOF
1277           if (command_line.rpath_link == NULL
1278               && command_line.rpath == NULL)
1279             {
1280               lib_path = (const char *) getenv ("LD_RUN_PATH");
1281               if (gld${EMULATION_NAME}_search_needed (lib_path, &n,
1282                                                       force))
1283                 break;
1284             }
1285           lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
1286           if (gld${EMULATION_NAME}_search_needed (lib_path, &n, force))
1287             break;
1288 EOF
1289 fi
1290 if [ "x${USE_LIBPATH}" = xyes ] ; then
1291 fragment <<EOF
1292           found = 0;
1293           rp = bfd_elf_get_runpath_list (link_info.output_bfd, &link_info);
1294           for (; !found && rp != NULL; rp = rp->next)
1295             {
1296               char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
1297               found = (rp->by == l->by
1298                        && gld${EMULATION_NAME}_search_needed (tmpname,
1299                                                               &n,
1300                                                               force));
1301               free (tmpname);
1302             }
1303           if (found)
1304             break;
1305
1306 EOF
1307 fi
1308 if [ "x${USE_LIBPATH}" = xyes ] ; then
1309   case ${target} in
1310     *-*-freebsd* | *-*-dragonfly*)
1311       fragment <<EOF
1312           if (gld${EMULATION_NAME}_check_ld_elf_hints (l, force))
1313             break;
1314 EOF
1315     # FreeBSD
1316     ;;
1317
1318     *-*-linux-* | *-*-k*bsd*-* | *-*-gnu*)
1319     # Linux
1320       fragment <<EOF
1321           if (gld${EMULATION_NAME}_check_ld_so_conf (l, force))
1322             break;
1323
1324 EOF
1325     ;;
1326   esac
1327 fi
1328 fragment <<EOF
1329           len = strlen (l->name);
1330           for (search = search_head; search != NULL; search = search->next)
1331             {
1332               char *filename;
1333
1334               if (search->cmdline)
1335                 continue;
1336               filename = (char *) xmalloc (strlen (search->name) + len + 2);
1337               sprintf (filename, "%s/%s", search->name, l->name);
1338               nn.name = filename;
1339               if (gld${EMULATION_NAME}_try_needed (&nn, force))
1340                 break;
1341               free (filename);
1342             }
1343           if (search != NULL)
1344             break;
1345 EOF
1346 fragment <<EOF
1347         }
1348
1349       if (force < 2)
1350         continue;
1351
1352       einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
1353              l->name, l->by);
1354     }
1355 }
1356
1357 EOF
1358 fi
1359
1360 fragment <<EOF
1361
1362 /* Look through an expression for an assignment statement.  */
1363
1364 static void
1365 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
1366 {
1367   bfd_boolean provide = FALSE;
1368
1369   switch (exp->type.node_class)
1370     {
1371     case etree_provide:
1372     case etree_provided:
1373       provide = TRUE;
1374       /* Fall thru */
1375     case etree_assign:
1376       /* We call record_link_assignment even if the symbol is defined.
1377          This is because if it is defined by a dynamic object, we
1378          actually want to use the value defined by the linker script,
1379          not the value from the dynamic object (because we are setting
1380          symbols like etext).  If the symbol is defined by a regular
1381          object, then, as it happens, calling record_link_assignment
1382          will do no harm.  */
1383       if (strcmp (exp->assign.dst, ".") != 0)
1384         {
1385           if (!bfd_elf_record_link_assignment (link_info.output_bfd,
1386                                                &link_info,
1387                                                exp->assign.dst, provide,
1388                                                exp->assign.hidden))
1389             einfo ("%P%F: failed to record assignment to %s: %E\n",
1390                    exp->assign.dst);
1391         }
1392       gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1393       break;
1394
1395     case etree_binary:
1396       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1397       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1398       break;
1399
1400     case etree_trinary:
1401       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1402       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1403       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1404       break;
1405
1406     case etree_unary:
1407       gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1408       break;
1409
1410     default:
1411       break;
1412     }
1413 }
1414
1415
1416 /* This is called by the before_allocation routine via
1417    lang_for_each_statement.  It locates any assignment statements, and
1418    tells the ELF backend about them, in case they are assignments to
1419    symbols which are referred to by dynamic objects.  */
1420
1421 static void
1422 gld${EMULATION_NAME}_find_statement_assignment (lang_statement_union_type *s)
1423 {
1424   if (s->header.type == lang_assignment_statement_enum)
1425     gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1426 }
1427
1428 EOF
1429
1430 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
1431   if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
1432     ELF_INTERPRETER_SET_DEFAULT="
1433   if (sinterp != NULL)
1434     {
1435       sinterp->contents = (unsigned char *) ${ELF_INTERPRETER_NAME};
1436       sinterp->size = strlen ((char *) sinterp->contents) + 1;
1437     }
1438
1439 "
1440   else
1441     ELF_INTERPRETER_SET_DEFAULT=
1442   fi
1443 fragment <<EOF
1444
1445 /* used by before_allocation and handle_option. */
1446 static void
1447 gld${EMULATION_NAME}_append_to_separated_string (char **to, char *op_arg)
1448 {
1449   if (*to == NULL)
1450     *to = xstrdup (op_arg);
1451   else
1452     {
1453       size_t to_len = strlen (*to);
1454       size_t op_arg_len = strlen (op_arg);
1455       char *buf;
1456       char *cp = *to;
1457
1458       /* First see whether OPTARG is already in the path.  */
1459       do
1460         {
1461           if (strncmp (op_arg, cp, op_arg_len) == 0
1462               && (cp[op_arg_len] == 0
1463                   || cp[op_arg_len] == config.rpath_separator))
1464             /* We found it.  */
1465             break;
1466
1467           /* Not yet found.  */
1468           cp = strchr (cp, config.rpath_separator);
1469           if (cp != NULL)
1470             ++cp;
1471         }
1472       while (cp != NULL);
1473
1474       if (cp == NULL)
1475         {
1476           buf = xmalloc (to_len + op_arg_len + 2);
1477           sprintf (buf, "%s%c%s", *to,
1478                    config.rpath_separator, op_arg);
1479           free (*to);
1480           *to = buf;
1481         }
1482     }
1483 }
1484
1485 /* This is called after the sections have been attached to output
1486    sections, but before any sizes or addresses have been set.  */
1487
1488 static void
1489 gld${EMULATION_NAME}_before_allocation (void)
1490 {
1491   const char *rpath;
1492   asection *sinterp;
1493   bfd *abfd;
1494
1495   if (link_info.hash->type == bfd_link_elf_hash_table)
1496     _bfd_elf_tls_setup (link_info.output_bfd, &link_info);
1497
1498   /* If we are going to make any variable assignments, we need to let
1499      the ELF backend know about them in case the variables are
1500      referred to by dynamic objects.  */
1501   lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
1502
1503   /* Let the ELF backend work out the sizes of any sections required
1504      by dynamic linking.  */
1505   rpath = command_line.rpath;
1506   if (rpath == NULL)
1507     rpath = (const char *) getenv ("LD_RUN_PATH");
1508
1509   for (abfd = link_info.input_bfds; abfd; abfd = abfd->link_next)
1510     if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1511       {
1512         const char *audit_libs = elf_dt_audit (abfd);
1513
1514         /* If the input bfd contains an audit entry, we need to add it as
1515            a dep audit entry.  */
1516         if (audit_libs && *audit_libs != '\0')
1517           {
1518             char *cp = xstrdup (audit_libs);
1519             do
1520               {
1521                 int more = 0;
1522                 char *cp2 = strchr (cp, config.rpath_separator);
1523
1524                 if (cp2)
1525                   {
1526                     *cp2 = '\0';
1527                     more = 1;
1528                   }
1529
1530                 if (cp != NULL && *cp != '\0')
1531                   gld${EMULATION_NAME}_append_to_separated_string (&depaudit, cp);
1532
1533                 cp = more ? ++cp2 : NULL;
1534               }
1535             while (cp != NULL);
1536           }
1537       }
1538
1539   if (! (bfd_elf_size_dynamic_sections
1540          (link_info.output_bfd, command_line.soname, rpath,
1541           command_line.filter_shlib, audit, depaudit,
1542           (const char * const *) command_line.auxiliary_filters,
1543           &link_info, &sinterp)))
1544     einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1545
1546 ${ELF_INTERPRETER_SET_DEFAULT}
1547   /* Let the user override the dynamic linker we are using.  */
1548   if (command_line.interpreter != NULL
1549       && sinterp != NULL)
1550     {
1551       sinterp->contents = (bfd_byte *) command_line.interpreter;
1552       sinterp->size = strlen (command_line.interpreter) + 1;
1553     }
1554
1555   /* Look for any sections named .gnu.warning.  As a GNU extensions,
1556      we treat such sections as containing warning messages.  We print
1557      out the warning message, and then zero out the section size so
1558      that it does not get copied into the output file.  */
1559
1560   {
1561     LANG_FOR_EACH_INPUT_STATEMENT (is)
1562       {
1563         asection *s;
1564         bfd_size_type sz;
1565         char *msg;
1566         bfd_boolean ret;
1567
1568         if (is->flags.just_syms)
1569           continue;
1570
1571         s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
1572         if (s == NULL)
1573           continue;
1574
1575         sz = s->size;
1576         msg = (char *) xmalloc ((size_t) (sz + 1));
1577         if (! bfd_get_section_contents (is->the_bfd, s, msg,
1578                                         (file_ptr) 0, sz))
1579           einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
1580                  is->the_bfd);
1581         msg[sz] = '\0';
1582         ret = link_info.callbacks->warning (&link_info, msg,
1583                                             (const char *) NULL,
1584                                             is->the_bfd, (asection *) NULL,
1585                                             (bfd_vma) 0);
1586         ASSERT (ret);
1587         free (msg);
1588
1589         /* Clobber the section size, so that we don't waste space
1590            copying the warning into the output file.  If we've already
1591            sized the output section, adjust its size.  The adjustment
1592            is on rawsize because targets that size sections early will
1593            have called lang_reset_memory_regions after sizing.  */
1594         if (s->output_section != NULL
1595             && s->output_section->rawsize >= s->size)
1596           s->output_section->rawsize -= s->size;
1597
1598         s->size = 0;
1599
1600         /* Also set SEC_EXCLUDE, so that local symbols defined in the
1601            warning section don't get copied to the output.  */
1602         s->flags |= SEC_EXCLUDE | SEC_KEEP;
1603       }
1604   }
1605
1606   before_allocation_default ();
1607
1608   if (!bfd_elf_size_dynsym_hash_dynstr (link_info.output_bfd, &link_info))
1609     einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1610 }
1611
1612 EOF
1613 fi
1614
1615 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
1616 fragment <<EOF
1617
1618 /* Try to open a dynamic archive.  This is where we know that ELF
1619    dynamic libraries have an extension of .so (or .sl on oddball systems
1620    like hpux).  */
1621
1622 static bfd_boolean
1623 gld${EMULATION_NAME}_open_dynamic_archive
1624   (const char *arch, search_dirs_type *search, lang_input_statement_type *entry)
1625 {
1626   const char *filename;
1627   char *string;
1628
1629   if (! entry->flags.maybe_archive)
1630     return FALSE;
1631
1632   filename = entry->filename;
1633
1634   /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
1635      is defined, but it does not seem worth the headache to optimize
1636      away those two bytes of space.  */
1637   string = (char *) xmalloc (strlen (search->name)
1638                              + strlen (filename)
1639                              + strlen (arch)
1640 #ifdef EXTRA_SHLIB_EXTENSION
1641                              + strlen (EXTRA_SHLIB_EXTENSION)
1642 #endif
1643                              + sizeof "/lib.so");
1644
1645   sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
1646
1647 #ifdef EXTRA_SHLIB_EXTENSION
1648   /* Try the .so extension first.  If that fails build a new filename
1649      using EXTRA_SHLIB_EXTENSION.  */
1650   if (! ldfile_try_open_bfd (string, entry))
1651     {
1652       sprintf (string, "%s/lib%s%s%s", search->name,
1653                filename, arch, EXTRA_SHLIB_EXTENSION);
1654 #endif
1655
1656   if (! ldfile_try_open_bfd (string, entry))
1657     {
1658       free (string);
1659       return FALSE;
1660     }
1661 #ifdef EXTRA_SHLIB_EXTENSION
1662     }
1663 #endif
1664
1665   entry->filename = string;
1666
1667   /* We have found a dynamic object to include in the link.  The ELF
1668      backend linker will create a DT_NEEDED entry in the .dynamic
1669      section naming this file.  If this file includes a DT_SONAME
1670      entry, it will be used.  Otherwise, the ELF linker will just use
1671      the name of the file.  For an archive found by searching, like
1672      this one, the DT_NEEDED entry should consist of just the name of
1673      the file, without the path information used to find it.  Note
1674      that we only need to do this if we have a dynamic object; an
1675      archive will never be referenced by a DT_NEEDED entry.
1676
1677      FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
1678      very pretty.  I haven't been able to think of anything that is
1679      pretty, though.  */
1680   if (bfd_check_format (entry->the_bfd, bfd_object)
1681       && (entry->the_bfd->flags & DYNAMIC) != 0)
1682     {
1683       ASSERT (entry->flags.maybe_archive && entry->flags.search_dirs);
1684
1685       /* Rather than duplicating the logic above.  Just use the
1686          filename we recorded earlier.  */
1687
1688       filename = lbasename (entry->filename);
1689       bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
1690     }
1691
1692   return TRUE;
1693 }
1694
1695 EOF
1696 fi
1697
1698 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
1699 fragment <<EOF
1700
1701 /* A variant of lang_output_section_find used by place_orphan.  */
1702
1703 static lang_output_section_statement_type *
1704 output_rel_find (asection *sec, int isdyn)
1705 {
1706   lang_output_section_statement_type *lookup;
1707   lang_output_section_statement_type *last = NULL;
1708   lang_output_section_statement_type *last_alloc = NULL;
1709   lang_output_section_statement_type *last_ro_alloc = NULL;
1710   lang_output_section_statement_type *last_rel = NULL;
1711   lang_output_section_statement_type *last_rel_alloc = NULL;
1712   int rela = sec->name[4] == 'a';
1713
1714   for (lookup = &lang_output_section_statement.head->output_section_statement;
1715        lookup != NULL;
1716        lookup = lookup->next)
1717     {
1718       if (lookup->constraint >= 0
1719           && CONST_STRNEQ (lookup->name, ".rel"))
1720         {
1721           int lookrela = lookup->name[4] == 'a';
1722
1723           /* .rel.dyn must come before all other reloc sections, to suit
1724              GNU ld.so.  */
1725           if (isdyn)
1726             break;
1727
1728           /* Don't place after .rel.plt as doing so results in wrong
1729              dynamic tags.  */
1730           if (strcmp (".plt", lookup->name + 4 + lookrela) == 0)
1731             break;
1732
1733           if (rela == lookrela || last_rel == NULL)
1734             last_rel = lookup;
1735           if ((rela == lookrela || last_rel_alloc == NULL)
1736               && lookup->bfd_section != NULL
1737               && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1738             last_rel_alloc = lookup;
1739         }
1740
1741       last = lookup;
1742       if (lookup->bfd_section != NULL
1743           && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1744         {
1745           last_alloc = lookup;
1746           if ((lookup->bfd_section->flags & SEC_READONLY) != 0)
1747             last_ro_alloc = lookup;
1748         }
1749     }
1750
1751   if (last_rel_alloc)
1752     return last_rel_alloc;
1753
1754   if (last_rel)
1755     return last_rel;
1756
1757   if (last_ro_alloc)
1758     return last_ro_alloc;
1759
1760   if (last_alloc)
1761     return last_alloc;
1762
1763   return last;
1764 }
1765
1766 /* Place an orphan section.  We use this to put random SHF_ALLOC
1767    sections in the right segment.  */
1768
1769 static lang_output_section_statement_type *
1770 gld${EMULATION_NAME}_place_orphan (asection *s,
1771                                    const char *secname,
1772                                    int constraint)
1773 {
1774   static struct orphan_save hold[] =
1775     {
1776       { ".text",
1777         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1778         0, 0, 0, 0 },
1779       { ".rodata",
1780         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1781         0, 0, 0, 0 },
1782       { ".data",
1783         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1784         0, 0, 0, 0 },
1785       { ".bss",
1786         SEC_ALLOC,
1787         0, 0, 0, 0 },
1788       { 0,
1789         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1790         0, 0, 0, 0 },
1791       { ".interp",
1792         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1793         0, 0, 0, 0 },
1794       { ".sdata",
1795         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_SMALL_DATA,
1796         0, 0, 0, 0 },
1797       { ".comment",
1798         SEC_HAS_CONTENTS,
1799         0, 0, 0, 0 },
1800     };
1801   enum orphan_save_index
1802     {
1803       orphan_text = 0,
1804       orphan_rodata,
1805       orphan_data,
1806       orphan_bss,
1807       orphan_rel,
1808       orphan_interp,
1809       orphan_sdata,
1810       orphan_nonalloc
1811     };
1812   static int orphan_init_done = 0;
1813   struct orphan_save *place;
1814   lang_output_section_statement_type *after;
1815   lang_output_section_statement_type *os;
1816   lang_output_section_statement_type *match_by_name = NULL;
1817   int isdyn = 0;
1818   int iself = s->owner->xvec->flavour == bfd_target_elf_flavour;
1819   unsigned int sh_type = iself ? elf_section_type (s) : SHT_NULL;
1820
1821   if (! link_info.relocatable
1822       && link_info.combreloc
1823       && (s->flags & SEC_ALLOC))
1824     {
1825       if (iself)
1826         switch (sh_type)
1827           {
1828           case SHT_RELA:
1829             secname = ".rela.dyn";
1830             isdyn = 1;
1831             break;
1832           case SHT_REL:
1833             secname = ".rel.dyn";
1834             isdyn = 1;
1835             break;
1836           default:
1837             break;
1838           }
1839       else if (CONST_STRNEQ (secname, ".rel"))
1840         {
1841           secname = secname[4] == 'a' ? ".rela.dyn" : ".rel.dyn";
1842           isdyn = 1;
1843         }
1844     }
1845
1846   /* Look through the script to see where to place this section.  */
1847   if (constraint == 0)
1848     for (os = lang_output_section_find (secname);
1849          os != NULL;
1850          os = next_matching_output_section_statement (os, 0))
1851       {
1852         /* If we don't match an existing output section, tell
1853            lang_insert_orphan to create a new output section.  */
1854         constraint = SPECIAL;
1855
1856         if (os->bfd_section != NULL
1857             && (os->bfd_section->flags == 0
1858                 || (_bfd_elf_match_sections_by_type (link_info.output_bfd,
1859                                                      os->bfd_section,
1860                                                      s->owner, s)
1861                     && ((s->flags ^ os->bfd_section->flags)
1862                         & (SEC_LOAD | SEC_ALLOC)) == 0)))
1863           {
1864             /* We already have an output section statement with this
1865                name, and its bfd section has compatible flags.
1866                If the section already exists but does not have any flags
1867                set, then it has been created by the linker, probably as a
1868                result of a --section-start command line switch.  */
1869             lang_add_section (&os->children, s, NULL, os);
1870             return os;
1871           }
1872
1873         /* Save unused output sections in case we can match them
1874            against orphans later.  */
1875         if (os->bfd_section == NULL)
1876           match_by_name = os;
1877       }
1878
1879   /* If we didn't match an active output section, see if we matched an
1880      unused one and use that.  */
1881   if (match_by_name)
1882     {
1883       lang_add_section (&match_by_name->children, s, NULL, match_by_name);
1884       return match_by_name;
1885     }
1886
1887   if (!orphan_init_done)
1888     {
1889       struct orphan_save *ho;
1890
1891       for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
1892         if (ho->name != NULL)
1893           {
1894             ho->os = lang_output_section_find (ho->name);
1895             if (ho->os != NULL && ho->os->flags == 0)
1896               ho->os->flags = ho->flags;
1897           }
1898       orphan_init_done = 1;
1899     }
1900
1901   /* If this is a final link, then always put .gnu.warning.SYMBOL
1902      sections into the .text section to get them out of the way.  */
1903   if (link_info.executable
1904       && ! link_info.relocatable
1905       && CONST_STRNEQ (s->name, ".gnu.warning.")
1906       && hold[orphan_text].os != NULL)
1907     {
1908       os = hold[orphan_text].os;
1909       lang_add_section (&os->children, s, NULL, os);
1910       return os;
1911     }
1912
1913   /* Decide which segment the section should go in based on the
1914      section name and section flags.  We put loadable .note sections
1915      right after the .interp section, so that the PT_NOTE segment is
1916      stored right after the program headers where the OS can read it
1917      in the first page.  */
1918
1919   place = NULL;
1920   if ((s->flags & (SEC_ALLOC | SEC_DEBUGGING)) == 0)
1921     place = &hold[orphan_nonalloc];
1922   else if ((s->flags & SEC_ALLOC) == 0)
1923     ;
1924   else if ((s->flags & SEC_LOAD) != 0
1925            && ((iself && sh_type == SHT_NOTE)
1926                || (!iself && CONST_STRNEQ (secname, ".note"))))
1927     place = &hold[orphan_interp];
1928   else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS | SEC_THREAD_LOCAL)) == 0)
1929     place = &hold[orphan_bss];
1930   else if ((s->flags & SEC_SMALL_DATA) != 0)
1931     place = &hold[orphan_sdata];
1932   else if ((s->flags & SEC_READONLY) == 0)
1933     place = &hold[orphan_data];
1934   else if (((iself && (sh_type == SHT_RELA || sh_type == SHT_REL))
1935             || (!iself && CONST_STRNEQ (secname, ".rel")))
1936            && (s->flags & SEC_LOAD) != 0)
1937     place = &hold[orphan_rel];
1938   else if ((s->flags & SEC_CODE) == 0)
1939     place = &hold[orphan_rodata];
1940   else
1941     place = &hold[orphan_text];
1942
1943   after = NULL;
1944   if (place != NULL)
1945     {
1946       if (place->os == NULL)
1947         {
1948           if (place->name != NULL)
1949             place->os = lang_output_section_find (place->name);
1950           else
1951             place->os = output_rel_find (s, isdyn);
1952         }
1953       after = place->os;
1954       if (after == NULL)
1955         after = lang_output_section_find_by_flags
1956           (s, &place->os, _bfd_elf_match_sections_by_type);
1957       if (after == NULL)
1958         /* *ABS* is always the first output section statement.  */
1959         after = &lang_output_section_statement.head->output_section_statement;
1960     }
1961
1962   return lang_insert_orphan (s, secname, constraint, after, place, NULL, NULL);
1963 }
1964 EOF
1965 fi
1966
1967 if test x"$LDEMUL_AFTER_ALLOCATION" != xgld"$EMULATION_NAME"_after_allocation; then
1968 fragment <<EOF
1969
1970 static void
1971 gld${EMULATION_NAME}_after_allocation (void)
1972 {
1973   bfd_boolean need_layout = bfd_elf_discard_info (link_info.output_bfd,
1974                                                   &link_info);
1975   gld${EMULATION_NAME}_map_segments (need_layout);
1976 }
1977 EOF
1978 fi
1979
1980 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1981 fragment <<EOF
1982
1983 static char *
1984 gld${EMULATION_NAME}_get_script (int *isfile)
1985 EOF
1986
1987 if test -n "$COMPILE_IN"
1988 then
1989 # Scripts compiled in.
1990
1991 # sed commands to quote an ld script as a C string.
1992 sc="-f stringify.sed"
1993
1994 fragment <<EOF
1995 {
1996   *isfile = 0;
1997
1998   if (link_info.relocatable && config.build_constructors)
1999     return
2000 EOF
2001 sed $sc ldscripts/${EMULATION_NAME}.xu                  >> e${EMULATION_NAME}.c
2002 echo '  ; else if (link_info.relocatable) return'       >> e${EMULATION_NAME}.c
2003 sed $sc ldscripts/${EMULATION_NAME}.xr                  >> e${EMULATION_NAME}.c
2004 echo '  ; else if (!config.text_read_only) return'      >> e${EMULATION_NAME}.c
2005 sed $sc ldscripts/${EMULATION_NAME}.xbn                 >> e${EMULATION_NAME}.c
2006 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
2007 echo '  ; else if (!config.magic_demand_paged) return'  >> e${EMULATION_NAME}.c
2008 sed $sc ldscripts/${EMULATION_NAME}.xn                  >> e${EMULATION_NAME}.c
2009 fi
2010 if test -n "$GENERATE_PIE_SCRIPT" ; then
2011 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2012 echo '  ; else if (link_info.pie && link_info.combreloc' >> e${EMULATION_NAME}.c
2013 echo '             && link_info.relro' >> e${EMULATION_NAME}.c
2014 echo '             && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
2015 sed $sc ldscripts/${EMULATION_NAME}.xdw                 >> e${EMULATION_NAME}.c
2016 echo '  ; else if (link_info.pie && link_info.combreloc) return' >> e${EMULATION_NAME}.c
2017 sed $sc ldscripts/${EMULATION_NAME}.xdc                 >> e${EMULATION_NAME}.c
2018 fi
2019 echo '  ; else if (link_info.pie) return'               >> e${EMULATION_NAME}.c
2020 sed $sc ldscripts/${EMULATION_NAME}.xd                  >> e${EMULATION_NAME}.c
2021 fi
2022 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
2023 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2024 echo '  ; else if (link_info.shared && link_info.combreloc' >> e${EMULATION_NAME}.c
2025 echo '             && link_info.relro' >> e${EMULATION_NAME}.c
2026 echo '             && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
2027 sed $sc ldscripts/${EMULATION_NAME}.xsw                 >> e${EMULATION_NAME}.c
2028 echo '  ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
2029 sed $sc ldscripts/${EMULATION_NAME}.xsc                 >> e${EMULATION_NAME}.c
2030 fi
2031 echo '  ; else if (link_info.shared) return'            >> e${EMULATION_NAME}.c
2032 sed $sc ldscripts/${EMULATION_NAME}.xs                  >> e${EMULATION_NAME}.c
2033 fi
2034 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2035 echo '  ; else if (link_info.combreloc && link_info.relro' >> e${EMULATION_NAME}.c
2036 echo '             && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
2037 sed $sc ldscripts/${EMULATION_NAME}.xw                  >> e${EMULATION_NAME}.c
2038 echo '  ; else if (link_info.combreloc) return'         >> e${EMULATION_NAME}.c
2039 sed $sc ldscripts/${EMULATION_NAME}.xc                  >> e${EMULATION_NAME}.c
2040 fi
2041 echo '  ; else return'                                  >> e${EMULATION_NAME}.c
2042 sed $sc ldscripts/${EMULATION_NAME}.x                   >> e${EMULATION_NAME}.c
2043 echo '; }'                                              >> e${EMULATION_NAME}.c
2044
2045 else
2046 # Scripts read from the filesystem.
2047
2048 fragment <<EOF
2049 {
2050   *isfile = 1;
2051
2052   if (link_info.relocatable && config.build_constructors)
2053     return "ldscripts/${EMULATION_NAME}.xu";
2054   else if (link_info.relocatable)
2055     return "ldscripts/${EMULATION_NAME}.xr";
2056   else if (!config.text_read_only)
2057     return "ldscripts/${EMULATION_NAME}.xbn";
2058 EOF
2059 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
2060 else
2061 fragment <<EOF
2062   else if (!config.magic_demand_paged)
2063     return "ldscripts/${EMULATION_NAME}.xn";
2064 EOF
2065 fi
2066 if test -n "$GENERATE_PIE_SCRIPT" ; then
2067 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2068 fragment <<EOF
2069   else if (link_info.pie && link_info.combreloc
2070            && link_info.relro && (link_info.flags & DF_BIND_NOW))
2071     return "ldscripts/${EMULATION_NAME}.xdw";
2072   else if (link_info.pie && link_info.combreloc)
2073     return "ldscripts/${EMULATION_NAME}.xdc";
2074 EOF
2075 fi
2076 fragment <<EOF
2077   else if (link_info.pie)
2078     return "ldscripts/${EMULATION_NAME}.xd";
2079 EOF
2080 fi
2081 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
2082 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2083 fragment <<EOF
2084   else if (link_info.shared && link_info.combreloc
2085            && link_info.relro && (link_info.flags & DF_BIND_NOW))
2086     return "ldscripts/${EMULATION_NAME}.xsw";
2087   else if (link_info.shared && link_info.combreloc)
2088     return "ldscripts/${EMULATION_NAME}.xsc";
2089 EOF
2090 fi
2091 fragment <<EOF
2092   else if (link_info.shared)
2093     return "ldscripts/${EMULATION_NAME}.xs";
2094 EOF
2095 fi
2096 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2097 fragment <<EOF
2098   else if (link_info.combreloc && link_info.relro
2099            && (link_info.flags & DF_BIND_NOW))
2100     return "ldscripts/${EMULATION_NAME}.xw";
2101   else if (link_info.combreloc)
2102     return "ldscripts/${EMULATION_NAME}.xc";
2103 EOF
2104 fi
2105 fragment <<EOF
2106   else
2107     return "ldscripts/${EMULATION_NAME}.x";
2108 }
2109
2110 EOF
2111 fi
2112 fi
2113
2114 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
2115 fragment <<EOF
2116  $PARSE_AND_LIST_PROLOGUE
2117 EOF
2118 fi
2119
2120 fragment <<EOF
2121
2122 #define OPTION_DISABLE_NEW_DTAGS        (400)
2123 #define OPTION_ENABLE_NEW_DTAGS         (OPTION_DISABLE_NEW_DTAGS + 1)
2124 #define OPTION_GROUP                    (OPTION_ENABLE_NEW_DTAGS + 1)
2125 #define OPTION_EH_FRAME_HDR             (OPTION_GROUP + 1)
2126 #define OPTION_EXCLUDE_LIBS             (OPTION_EH_FRAME_HDR + 1)
2127 #define OPTION_HASH_STYLE               (OPTION_EXCLUDE_LIBS + 1)
2128 #define OPTION_BUILD_ID                 (OPTION_HASH_STYLE + 1)
2129 #define OPTION_AUDIT                    (OPTION_BUILD_ID + 1)
2130
2131 static void
2132 gld${EMULATION_NAME}_add_options
2133   (int ns, char **shortopts, int nl, struct option **longopts,
2134    int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
2135 {
2136 EOF
2137 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2138 fragment <<EOF
2139   static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:P:";
2140 EOF
2141 else
2142 fragment <<EOF
2143   static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:";
2144 EOF
2145 fi
2146 fragment <<EOF
2147   static const struct option xtra_long[] = {
2148 EOF
2149 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2150 fragment <<EOF
2151     {"audit", required_argument, NULL, OPTION_AUDIT},
2152     {"Bgroup", no_argument, NULL, OPTION_GROUP},
2153 EOF
2154 fi
2155 fragment <<EOF
2156     {"build-id", optional_argument, NULL, OPTION_BUILD_ID},
2157 EOF
2158 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2159 fragment <<EOF
2160     {"depaudit", required_argument, NULL, 'P'},
2161     {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
2162     {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
2163     {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
2164     {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
2165     {"hash-style", required_argument, NULL, OPTION_HASH_STYLE},
2166 EOF
2167 fi
2168 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
2169 fragment <<EOF
2170     $PARSE_AND_LIST_LONGOPTS
2171 EOF
2172 fi
2173 fragment <<EOF
2174     {NULL, no_argument, NULL, 0}
2175   };
2176
2177   *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
2178   memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
2179   *longopts = (struct option *)
2180     xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
2181   memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
2182 }
2183
2184 #define DEFAULT_BUILD_ID_STYLE  "sha1"
2185
2186 static bfd_boolean
2187 gld${EMULATION_NAME}_handle_option (int optc)
2188 {
2189   switch (optc)
2190     {
2191     default:
2192       return FALSE;
2193
2194     case OPTION_BUILD_ID:
2195       if (link_info.emit_note_gnu_build_id != NULL)
2196         {
2197           free (link_info.emit_note_gnu_build_id);
2198           link_info.emit_note_gnu_build_id = NULL;
2199         }
2200       if (optarg == NULL)
2201         optarg = DEFAULT_BUILD_ID_STYLE;
2202       if (strcmp (optarg, "none"))
2203         link_info.emit_note_gnu_build_id = xstrdup (optarg);
2204       break;
2205
2206 EOF
2207
2208 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2209 fragment <<EOF
2210     case OPTION_AUDIT:
2211         gld${EMULATION_NAME}_append_to_separated_string (&audit, optarg);
2212         break;
2213
2214     case 'P':
2215         gld${EMULATION_NAME}_append_to_separated_string (&depaudit, optarg);
2216         break;
2217
2218     case OPTION_DISABLE_NEW_DTAGS:
2219       link_info.new_dtags = FALSE;
2220       break;
2221
2222     case OPTION_ENABLE_NEW_DTAGS:
2223       link_info.new_dtags = TRUE;
2224       break;
2225
2226     case OPTION_EH_FRAME_HDR:
2227       link_info.eh_frame_hdr = TRUE;
2228       break;
2229
2230     case OPTION_GROUP:
2231       link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
2232       /* Groups must be self-contained.  */
2233       link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2234       link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
2235       break;
2236
2237     case OPTION_EXCLUDE_LIBS:
2238       add_excluded_libs (optarg);
2239       break;
2240
2241     case OPTION_HASH_STYLE:
2242       link_info.emit_hash = FALSE;
2243       link_info.emit_gnu_hash = FALSE;
2244       if (strcmp (optarg, "sysv") == 0)
2245         link_info.emit_hash = TRUE;
2246       else if (strcmp (optarg, "gnu") == 0)
2247         link_info.emit_gnu_hash = TRUE;
2248       else if (strcmp (optarg, "both") == 0)
2249         {
2250           link_info.emit_hash = TRUE;
2251           link_info.emit_gnu_hash = TRUE;
2252         }
2253       else
2254         einfo (_("%P%F: invalid hash style \`%s'\n"), optarg);
2255       break;
2256
2257 EOF
2258 fi
2259 fragment <<EOF
2260     case 'z':
2261       if (strcmp (optarg, "defs") == 0)
2262         link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2263       else if (strcmp (optarg, "muldefs") == 0)
2264         link_info.allow_multiple_definition = TRUE;
2265       else if (CONST_STRNEQ (optarg, "max-page-size="))
2266         {
2267           char *end;
2268
2269           config.maxpagesize = strtoul (optarg + 14, &end, 0);
2270           if (*end || (config.maxpagesize & (config.maxpagesize - 1)) != 0)
2271             einfo (_("%P%F: invalid maxium page size \`%s'\n"),
2272                    optarg + 14);
2273         }
2274       else if (CONST_STRNEQ (optarg, "common-page-size="))
2275         {
2276           char *end;
2277           config.commonpagesize = strtoul (optarg + 17, &end, 0);
2278           if (*end
2279               || (config.commonpagesize & (config.commonpagesize - 1)) != 0)
2280             einfo (_("%P%F: invalid common page size \`%s'\n"),
2281                    optarg + 17);
2282         }
2283       else if (CONST_STRNEQ (optarg, "stack-size="))
2284         {
2285           char *end;
2286           link_info.stacksize = strtoul (optarg + 11, &end, 0);
2287           if (*end || link_info.stacksize < 0)
2288             einfo (_("%P%F: invalid stack size \`%s'\n"), optarg + 11);
2289           if (!link_info.stacksize)
2290             /* Use -1 for explicit no-stack, because zero means
2291                'default'.   */
2292             link_info.stacksize = -1;
2293         }
2294       else if (strcmp (optarg, "execstack") == 0)
2295         {
2296           link_info.execstack = TRUE;
2297           link_info.noexecstack = FALSE;
2298         }
2299       else if (strcmp (optarg, "noexecstack") == 0)
2300         {
2301           link_info.noexecstack = TRUE;
2302           link_info.execstack = FALSE;
2303         }
2304 EOF
2305 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2306 fragment <<EOF
2307       else if (strcmp (optarg, "global") == 0)
2308         link_info.flags_1 |= (bfd_vma) DF_1_GLOBAL;
2309       else if (strcmp (optarg, "initfirst") == 0)
2310         link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
2311       else if (strcmp (optarg, "interpose") == 0)
2312         link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
2313       else if (strcmp (optarg, "loadfltr") == 0)
2314         link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
2315       else if (strcmp (optarg, "nodefaultlib") == 0)
2316         link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
2317       else if (strcmp (optarg, "nodelete") == 0)
2318         link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
2319       else if (strcmp (optarg, "nodlopen") == 0)
2320         link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
2321       else if (strcmp (optarg, "nodump") == 0)
2322         link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
2323       else if (strcmp (optarg, "now") == 0)
2324         {
2325           link_info.flags |= (bfd_vma) DF_BIND_NOW;
2326           link_info.flags_1 |= (bfd_vma) DF_1_NOW;
2327         }
2328       else if (strcmp (optarg, "lazy") == 0)
2329         {
2330           link_info.flags &= ~(bfd_vma) DF_BIND_NOW;
2331           link_info.flags_1 &= ~(bfd_vma) DF_1_NOW;
2332         }
2333       else if (strcmp (optarg, "origin") == 0)
2334         {
2335           link_info.flags |= (bfd_vma) DF_ORIGIN;
2336           link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
2337         }
2338       else if (strcmp (optarg, "combreloc") == 0)
2339         link_info.combreloc = TRUE;
2340       else if (strcmp (optarg, "nocombreloc") == 0)
2341         link_info.combreloc = FALSE;
2342       else if (strcmp (optarg, "nocopyreloc") == 0)
2343         link_info.nocopyreloc = TRUE;
2344       else if (strcmp (optarg, "relro") == 0)
2345         link_info.relro = TRUE;
2346       else if (strcmp (optarg, "norelro") == 0)
2347         link_info.relro = FALSE;
2348       else if (strcmp (optarg, "text") == 0)
2349         link_info.error_textrel = TRUE;
2350       else if (strcmp (optarg, "notext") == 0)
2351         link_info.error_textrel = FALSE;
2352       else if (strcmp (optarg, "textoff") == 0)
2353         link_info.error_textrel = FALSE;
2354 EOF
2355 fi
2356
2357 fragment <<EOF
2358       else
2359         einfo (_("%P: warning: -z %s ignored.\n"), optarg);
2360       break;
2361 EOF
2362
2363 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
2364 fragment <<EOF
2365  $PARSE_AND_LIST_ARGS_CASES
2366 EOF
2367 fi
2368
2369 fragment <<EOF
2370     }
2371
2372   return TRUE;
2373 }
2374
2375 EOF
2376
2377 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
2378 fragment <<EOF
2379
2380 static void
2381 gld${EMULATION_NAME}_list_options (FILE * file)
2382 {
2383 EOF
2384 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2385 fragment <<EOF
2386   fprintf (file, _("\
2387   --audit=AUDITLIB            Specify a library to use for auditing\n"));
2388   fprintf (file, _("\
2389   -Bgroup                     Selects group name lookup rules for DSO\n"));
2390 EOF
2391 fi
2392 fragment <<EOF
2393   fprintf (file, _("\
2394   --build-id[=STYLE]          Generate build ID note\n"));
2395 EOF
2396 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2397 fragment <<EOF
2398   fprintf (file, _("\
2399   -P AUDITLIB, --depaudit=AUDITLIB\n" "\
2400                               Specify a library to use for auditing dependencies\n"));
2401   fprintf (file, _("\
2402   --disable-new-dtags         Disable new dynamic tags\n"));
2403   fprintf (file, _("\
2404   --enable-new-dtags          Enable new dynamic tags\n"));
2405   fprintf (file, _("\
2406   --eh-frame-hdr              Create .eh_frame_hdr section\n"));
2407   fprintf (file, _("\
2408   --exclude-libs=LIBS         Make all symbols in LIBS hidden\n"));
2409   fprintf (file, _("\
2410   --hash-style=STYLE          Set hash style to sysv, gnu or both\n"));
2411   fprintf (file, _("\
2412   -z combreloc                Merge dynamic relocs into one section and sort\n"));
2413 EOF
2414 fi
2415
2416 fragment <<EOF
2417   fprintf (file, _("\
2418   -z common-page-size=SIZE    Set common page size to SIZE\n"));
2419   fprintf (file, _("\
2420   -z defs                     Report unresolved symbols in object files.\n"));
2421   fprintf (file, _("\
2422   -z execstack                Mark executable as requiring executable stack\n"));
2423 EOF
2424
2425 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2426 fragment <<EOF
2427   fprintf (file, _("\
2428   -z global                   Make symbols in DSO available for subsequently\n\
2429                                loaded objects\n"));
2430   fprintf (file, _("\
2431   -z initfirst                Mark DSO to be initialized first at runtime\n"));
2432   fprintf (file, _("\
2433   -z interpose                Mark object to interpose all DSOs but executable\n"));
2434   fprintf (file, _("\
2435   -z lazy                     Mark object lazy runtime binding (default)\n"));
2436   fprintf (file, _("\
2437   -z loadfltr                 Mark object requiring immediate process\n"));
2438 EOF
2439 fi
2440
2441 fragment <<EOF
2442   fprintf (file, _("\
2443   -z max-page-size=SIZE       Set maximum page size to SIZE\n"));
2444   fprintf (file, _("\
2445   -z muldefs                  Allow multiple definitions\n"));
2446 EOF
2447
2448 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2449 fragment <<EOF
2450   fprintf (file, _("\
2451   -z nocombreloc              Don't merge dynamic relocs into one section\n"));
2452   fprintf (file, _("\
2453   -z nocopyreloc              Don't create copy relocs\n"));
2454   fprintf (file, _("\
2455   -z nodefaultlib             Mark object not to use default search paths\n"));
2456   fprintf (file, _("\
2457   -z nodelete                 Mark DSO non-deletable at runtime\n"));
2458   fprintf (file, _("\
2459   -z nodlopen                 Mark DSO not available to dlopen\n"));
2460   fprintf (file, _("\
2461   -z nodump                   Mark DSO not available to dldump\n"));
2462 EOF
2463 fi
2464 fragment <<EOF
2465   fprintf (file, _("\
2466   -z noexecstack              Mark executable as not requiring executable stack\n"));
2467 EOF
2468 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2469 fragment <<EOF
2470   fprintf (file, _("\
2471   -z norelro                  Don't create RELRO program header\n"));
2472   fprintf (file, _("\
2473   -z now                      Mark object non-lazy runtime binding\n"));
2474   fprintf (file, _("\
2475   -z origin                   Mark object requiring immediate \$ORIGIN\n\
2476                                 processing at runtime\n"));
2477   fprintf (file, _("\
2478   -z relro                    Create RELRO program header\n"));
2479   fprintf (file, _("\
2480   -z stacksize=SIZE           Set size of stack segment\n"));
2481 EOF
2482 fi
2483
2484 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
2485 fragment <<EOF
2486  $PARSE_AND_LIST_OPTIONS
2487 EOF
2488 fi
2489
2490 fragment <<EOF
2491 }
2492 EOF
2493
2494 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
2495 fragment <<EOF
2496  $PARSE_AND_LIST_EPILOGUE
2497 EOF
2498 fi
2499 fi
2500
2501 fragment <<EOF
2502
2503 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
2504 {
2505   ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
2506   ${LDEMUL_SYSLIB-syslib_default},
2507   ${LDEMUL_HLL-hll_default},
2508   ${LDEMUL_AFTER_PARSE-after_parse_default},
2509   ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
2510   ${LDEMUL_AFTER_ALLOCATION-gld${EMULATION_NAME}_after_allocation},
2511   ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
2512   ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
2513   ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
2514   ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
2515   "${EMULATION_NAME}",
2516   "${OUTPUT_FORMAT}",
2517   ${LDEMUL_FINISH-finish_default},
2518   ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
2519   ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
2520   ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
2521   ${LDEMUL_SET_SYMBOLS-NULL},
2522   ${LDEMUL_PARSE_ARGS-NULL},
2523   gld${EMULATION_NAME}_add_options,
2524   gld${EMULATION_NAME}_handle_option,
2525   ${LDEMUL_UNRECOGNIZED_FILE-NULL},
2526   ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
2527   ${LDEMUL_RECOGNIZED_FILE-gld${EMULATION_NAME}_load_symbols},
2528   ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
2529   ${LDEMUL_NEW_VERS_PATTERN-NULL}
2530 };
2531 EOF