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