Add ld_list_options
[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 (C) 1991-2015 Free Software Foundation, Inc.
16    Written by Steve Chamberlain <sac@cygnus.com>
17    ELF support by Ian Lance Taylor <ian@cygnus.com>
18
19    This file is part of the GNU Binutils.
20
21    This program is free software; you can redistribute it and/or modify
22    it under the terms of the GNU General Public License as published by
23    the Free Software Foundation; either version 3 of the License, or
24    (at your option) any later version.
25
26    This program is distributed in the hope that it will be useful,
27    but WITHOUT ANY WARRANTY; without even the implied warranty of
28    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
29    GNU General Public License for more details.
30
31    You should have received a copy of the GNU General Public License
32    along with this program; if not, write to the Free Software
33    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
34    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 "filenames.h"
43 #include "getopt.h"
44 #include <fcntl.h>
45
46 #include "bfdlink.h"
47
48 #include "ld.h"
49 #include "ldmain.h"
50 #include "ldmisc.h"
51 #include "ldexp.h"
52 #include "ldlang.h"
53 #include "ldfile.h"
54 #include "ldemul.h"
55 #include "ldbuildid.h"
56 #include <ldgram.h>
57 #include "elf/common.h"
58 #include "elf-bfd.h"
59 #include "filenames.h"
60
61 /* Declare functions used by various EXTRA_EM_FILEs.  */
62 static void gld${EMULATION_NAME}_before_parse (void);
63 static void gld${EMULATION_NAME}_after_open (void);
64 static void gld${EMULATION_NAME}_before_allocation (void);
65 static void gld${EMULATION_NAME}_after_allocation (void);
66 static lang_output_section_statement_type *gld${EMULATION_NAME}_place_orphan
67   (asection *, const char *, int);
68 EOF
69
70 if [ "x${USE_LIBPATH}" = xyes ] ; then
71   case ${target} in
72     *-*-linux-* | *-*-k*bsd*-* | *-*-gnu*)
73   fragment <<EOF
74 #ifdef HAVE_GLOB
75 #include <glob.h>
76 #endif
77 EOF
78     ;;
79   esac
80 fi
81
82 # Import any needed special functions and/or overrides.
83 #
84 source_em ${srcdir}/emultempl/elf-generic.em
85 if test -n "$EXTRA_EM_FILE" ; then
86   source_em ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
87 fi
88
89 # Functions in this file can be overridden by setting the LDEMUL_* shell
90 # variables.  If the name of the overriding function is the same as is
91 # defined in this file, then don't output this file's version.
92 # If a different overriding name is given then output the standard function
93 # as presumably it is called from the overriding function.
94 #
95 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
96 fragment <<EOF
97
98 static void
99 gld${EMULATION_NAME}_before_parse (void)
100 {
101   ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
102   input_flags.dynamic = ${DYNAMIC_LINK-TRUE};
103   config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
104   config.separate_code = `if test "x${SEPARATE_CODE}" = xyes ; then echo TRUE ; else echo FALSE ; fi`;
105 }
106
107 EOF
108 fi
109
110 if test x"$LDEMUL_RECOGNIZED_FILE" != xgld"${EMULATION_NAME}"_load_symbols; then
111 fragment <<EOF
112 /* Handle the generation of DT_NEEDED tags.  */
113
114 static bfd_boolean
115 gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *entry)
116 {
117   int link_class = 0;
118
119   /* Tell the ELF linker that we don't want the output file to have a
120      DT_NEEDED entry for this file, unless it is used to resolve
121      references in a regular object.  */
122   if (entry->flags.add_DT_NEEDED_for_regular)
123     link_class = DYN_AS_NEEDED;
124
125   /* Tell the ELF linker that we don't want the output file to have a
126      DT_NEEDED entry for any dynamic library in DT_NEEDED tags from
127      this file at all.  */
128   if (!entry->flags.add_DT_NEEDED_for_dynamic)
129     link_class |= DYN_NO_ADD_NEEDED;
130
131   if (entry->flags.just_syms
132       && (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) != 0)
133     einfo (_("%P%F: --just-symbols may not be used on DSO: %B\n"),
134            entry->the_bfd);
135
136   if (link_class == 0
137       || (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) == 0)
138     return FALSE;
139
140   bfd_elf_set_dyn_lib_class (entry->the_bfd,
141                              (enum dynamic_lib_link_class) link_class);
142
143   /* Continue on with normal load_symbols processing.  */
144   return FALSE;
145 }
146 EOF
147 fi
148
149 fragment <<EOF
150
151 /* These variables are required to pass information back and forth
152    between after_open and check_needed and stat_needed and vercheck.  */
153
154 static struct bfd_link_needed_list *global_needed;
155 static struct stat global_stat;
156 static lang_input_statement_type *global_found;
157 static struct bfd_link_needed_list *global_vercheck_needed;
158 static bfd_boolean global_vercheck_failed;
159
160 /* These variables are used to implement target options */
161
162 static char *audit; /* colon (typically) separated list of libs */
163 static char *depaudit; /* colon (typically) separated list of libs */
164
165 /* Style of .note.gnu.build-id section.  */
166 static const char *emit_note_gnu_build_id;
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: error adding 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 id_note_section_size (bfd *abfd ATTRIBUTE_UNUSED)
894 {
895   const char *style = emit_note_gnu_build_id;
896   bfd_size_type size;
897   bfd_size_type build_id_size;
898
899   size = offsetof (Elf_External_Note, name[sizeof "GNU"]);
900   size = (size + 3) & -(bfd_size_type) 4;
901
902   build_id_size = compute_build_id_size (style);
903   if (build_id_size)
904     size += build_id_size;
905   else
906     size = 0;
907
908   return size;
909 }
910
911 static bfd_boolean
912 write_build_id (bfd *abfd)
913 {
914   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
915   struct elf_obj_tdata *t = elf_tdata (abfd);
916   const char *style;
917   asection *asec;
918   Elf_Internal_Shdr *i_shdr;
919   unsigned char *contents, *id_bits;
920   bfd_size_type size;
921   file_ptr position;
922   Elf_External_Note *e_note;
923
924   style = t->o->build_id.style;
925   asec = t->o->build_id.sec;
926   if (bfd_is_abs_section (asec->output_section))
927     {
928       einfo (_("%P: warning: .note.gnu.build-id section discarded,"
929                " --build-id ignored.\n"));
930       return TRUE;
931     }
932   i_shdr = &elf_section_data (asec->output_section)->this_hdr;
933
934   if (i_shdr->contents == NULL)
935     {
936       if (asec->contents == NULL)
937         asec->contents = (unsigned char *) xmalloc (asec->size);
938       contents = asec->contents;
939     }
940   else
941     contents = i_shdr->contents + asec->output_offset;
942
943   e_note = (Elf_External_Note *) contents;
944   size = offsetof (Elf_External_Note, name[sizeof "GNU"]);
945   size = (size + 3) & -(bfd_size_type) 4;
946   id_bits = contents + size;
947   size = asec->size - size;
948
949   bfd_h_put_32 (abfd, sizeof "GNU", &e_note->namesz);
950   bfd_h_put_32 (abfd, size, &e_note->descsz);
951   bfd_h_put_32 (abfd, NT_GNU_BUILD_ID, &e_note->type);
952   memcpy (e_note->name, "GNU", sizeof "GNU");
953
954   generate_build_id (abfd, style, bed->s->checksum_contents, id_bits, size);
955
956   position = i_shdr->sh_offset + asec->output_offset;
957   size = asec->size;
958   return (bfd_seek (abfd, position, SEEK_SET) == 0
959           && bfd_bwrite (contents, size, abfd) == size);
960 }
961
962 /* Make .note.gnu.build-id section, and set up elf_tdata->build_id.  */
963
964 static bfd_boolean
965 setup_build_id (bfd *ibfd)
966 {
967   asection *s;
968   bfd_size_type size;
969   flagword flags;
970
971   size = id_note_section_size (ibfd);
972   if (size == 0)
973     {
974       einfo ("%P: warning: unrecognized --build-id style ignored.\n");
975       return FALSE;
976     }
977
978   flags = (SEC_ALLOC | SEC_LOAD | SEC_IN_MEMORY
979            | SEC_LINKER_CREATED | SEC_READONLY | SEC_DATA);
980   s = bfd_make_section_with_flags (ibfd, ".note.gnu.build-id", flags);
981   if (s != NULL && bfd_set_section_alignment (ibfd, s, 2))
982     {
983       struct elf_obj_tdata *t = elf_tdata (link_info.output_bfd);
984       t->o->build_id.after_write_object_contents = &write_build_id;
985       t->o->build_id.style = emit_note_gnu_build_id;
986       t->o->build_id.sec = s;
987       elf_section_type (s) = SHT_NOTE;
988       s->size = size;
989       return TRUE;
990     }
991
992   einfo ("%P: warning: Cannot create .note.gnu.build-id section,"
993          " --build-id ignored.\n");
994   return FALSE;
995 }
996
997 /* This is called after all the input files have been opened.  */
998
999 static void
1000 gld${EMULATION_NAME}_after_open (void)
1001 {
1002   struct bfd_link_needed_list *needed, *l;
1003   struct elf_link_hash_table *htab;
1004
1005   after_open_default ();
1006
1007   htab = elf_hash_table (&link_info);
1008   if (!is_elf_hash_table (htab))
1009     return;
1010
1011   if (emit_note_gnu_build_id != NULL)
1012     {
1013       bfd *abfd;
1014
1015       /* Find an ELF input.  */
1016       for (abfd = link_info.input_bfds;
1017            abfd != (bfd *) NULL; abfd = abfd->link.next)
1018         if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
1019             && bfd_count_sections (abfd) != 0)
1020           break;
1021
1022       /* PR 10555: If there are no ELF input files do not try to
1023          create a .note.gnu-build-id section.  */
1024       if (abfd == NULL
1025           || !setup_build_id (abfd))
1026         {
1027           free ((char *) emit_note_gnu_build_id);
1028           emit_note_gnu_build_id = NULL;
1029         }
1030     }
1031
1032   if (link_info.relocatable)
1033     {
1034       if (link_info.execstack == ! link_info.noexecstack)
1035         /* PR ld/16744: If "-z [no]execstack" has been specified on the
1036            command line and we are perfoming a relocatable link then no
1037            PT_GNU_STACK segment will be created and so the
1038            linkinfo.[no]execstack values set in _handle_option() will have no
1039            effect.  Instead we create a .note.GNU-stack section in much the
1040            same way as the assembler does with its --[no]execstack option.  */
1041         (void) bfd_make_section_with_flags (link_info.input_bfds,
1042                                             ".note.GNU-stack",
1043                                             SEC_READONLY | (link_info.execstack ? SEC_CODE : 0));
1044
1045       return;
1046     }
1047
1048   if (link_info.eh_frame_hdr
1049       && !link_info.traditional_format)
1050     {
1051       bfd *abfd, *elfbfd = NULL;
1052       bfd_boolean warn_eh_frame = FALSE;
1053       asection *s;
1054
1055       for (abfd = link_info.input_bfds; abfd; abfd = abfd->link.next)
1056         {
1057           if (bfd_count_sections (abfd) == 0)
1058             continue;
1059           if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1060             elfbfd = abfd;
1061           if (!warn_eh_frame)
1062             {
1063               s = bfd_get_section_by_name (abfd, ".eh_frame");
1064               while (s != NULL
1065                      && (s->size <= 8
1066                          || bfd_is_abs_section (s->output_section)))
1067                 s = bfd_get_next_section_by_name (s);
1068               warn_eh_frame = s != NULL;
1069             }
1070           if (elfbfd && warn_eh_frame)
1071             break;
1072         }
1073       if (elfbfd)
1074         {
1075           const struct elf_backend_data *bed;
1076
1077           bed = get_elf_backend_data (elfbfd);
1078           s = bfd_make_section_with_flags (elfbfd, ".eh_frame_hdr",
1079                                            bed->dynamic_sec_flags
1080                                            | SEC_READONLY);
1081           if (s != NULL
1082               && bfd_set_section_alignment (elfbfd, s, 2))
1083             {
1084               htab->eh_info.hdr_sec = s;
1085               warn_eh_frame = FALSE;
1086             }
1087         }
1088       if (warn_eh_frame)
1089         einfo ("%P: warning: Cannot create .eh_frame_hdr section,"
1090                " --eh-frame-hdr ignored.\n");
1091     }
1092
1093   /* Get the list of files which appear in DT_NEEDED entries in
1094      dynamic objects included in the link (often there will be none).
1095      For each such file, we want to track down the corresponding
1096      library, and include the symbol table in the link.  This is what
1097      the runtime dynamic linker will do.  Tracking the files down here
1098      permits one dynamic object to include another without requiring
1099      special action by the person doing the link.  Note that the
1100      needed list can actually grow while we are stepping through this
1101      loop.  */
1102   needed = bfd_elf_get_needed_list (link_info.output_bfd, &link_info);
1103   for (l = needed; l != NULL; l = l->next)
1104     {
1105       struct bfd_link_needed_list *ll;
1106       struct dt_needed n, nn;
1107       int force;
1108
1109       /* If the lib that needs this one was --as-needed and wasn't
1110          found to be needed, then this lib isn't needed either.  */
1111       if (l->by != NULL
1112           && (bfd_elf_get_dyn_lib_class (l->by) & DYN_AS_NEEDED) != 0)
1113         continue;
1114
1115       /* Skip the lib if --no-copy-dt-needed-entries and
1116          --allow-shlib-undefined is in effect.  */
1117       if (l->by != NULL
1118           && link_info.unresolved_syms_in_shared_libs == RM_IGNORE
1119           && (bfd_elf_get_dyn_lib_class (l->by) & DYN_NO_ADD_NEEDED) != 0)
1120         continue;
1121
1122       /* If we've already seen this file, skip it.  */
1123       for (ll = needed; ll != l; ll = ll->next)
1124         if ((ll->by == NULL
1125              || (bfd_elf_get_dyn_lib_class (ll->by) & DYN_AS_NEEDED) == 0)
1126             && strcmp (ll->name, l->name) == 0)
1127           break;
1128       if (ll != l)
1129         continue;
1130
1131       /* See if this file was included in the link explicitly.  */
1132       global_needed = l;
1133       global_found = NULL;
1134       lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
1135       if (global_found != NULL
1136           && (bfd_elf_get_dyn_lib_class (global_found->the_bfd)
1137               & DYN_AS_NEEDED) == 0)
1138         continue;
1139
1140       n.by = l->by;
1141       n.name = l->name;
1142       nn.by = l->by;
1143       if (verbose)
1144         info_msg (_("%s needed by %B\n"), l->name, l->by);
1145
1146       /* As-needed libs specified on the command line (or linker script)
1147          take priority over libs found in search dirs.  */
1148       if (global_found != NULL)
1149         {
1150           nn.name = global_found->filename;
1151           if (gld${EMULATION_NAME}_try_needed (&nn, TRUE))
1152             continue;
1153         }
1154
1155       /* We need to find this file and include the symbol table.  We
1156          want to search for the file in the same way that the dynamic
1157          linker will search.  That means that we want to use
1158          rpath_link, rpath, then the environment variable
1159          LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
1160          entries (native only), then the linker script LIB_SEARCH_DIRS.
1161          We do not search using the -L arguments.
1162
1163          We search twice.  The first time, we skip objects which may
1164          introduce version mismatches.  The second time, we force
1165          their use.  See gld${EMULATION_NAME}_vercheck comment.  */
1166       for (force = 0; force < 2; force++)
1167         {
1168           size_t len;
1169           search_dirs_type *search;
1170 EOF
1171 if [ "x${NATIVE}" = xyes ] ; then
1172 fragment <<EOF
1173           const char *lib_path;
1174 EOF
1175 fi
1176 if [ "x${USE_LIBPATH}" = xyes ] ; then
1177 fragment <<EOF
1178           struct bfd_link_needed_list *rp;
1179           int found;
1180 EOF
1181 fi
1182 fragment <<EOF
1183
1184           if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
1185                                                   &n, force))
1186             break;
1187 EOF
1188 if [ "x${USE_LIBPATH}" = xyes ] ; then
1189 fragment <<EOF
1190           if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
1191                                                   &n, force))
1192             break;
1193 EOF
1194 fi
1195 if [ "x${NATIVE}" = xyes ] ; then
1196 fragment <<EOF
1197           if (command_line.rpath_link == NULL
1198               && command_line.rpath == NULL)
1199             {
1200               lib_path = (const char *) getenv ("LD_RUN_PATH");
1201               if (gld${EMULATION_NAME}_search_needed (lib_path, &n,
1202                                                       force))
1203                 break;
1204             }
1205           lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
1206           if (gld${EMULATION_NAME}_search_needed (lib_path, &n, force))
1207             break;
1208 EOF
1209 fi
1210 if [ "x${USE_LIBPATH}" = xyes ] ; then
1211 fragment <<EOF
1212           found = 0;
1213           rp = bfd_elf_get_runpath_list (link_info.output_bfd, &link_info);
1214           for (; !found && rp != NULL; rp = rp->next)
1215             {
1216               char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
1217               found = (rp->by == l->by
1218                        && gld${EMULATION_NAME}_search_needed (tmpname,
1219                                                               &n,
1220                                                               force));
1221               free (tmpname);
1222             }
1223           if (found)
1224             break;
1225
1226 EOF
1227 fi
1228 if [ "x${USE_LIBPATH}" = xyes ] ; then
1229   case ${target} in
1230     *-*-freebsd* | *-*-dragonfly*)
1231       fragment <<EOF
1232           if (gld${EMULATION_NAME}_check_ld_elf_hints (l, force))
1233             break;
1234 EOF
1235     # FreeBSD
1236     ;;
1237
1238     *-*-linux-* | *-*-k*bsd*-* | *-*-gnu*)
1239       fragment <<EOF
1240           if (gld${EMULATION_NAME}_check_ld_so_conf (l, force))
1241             break;
1242
1243 EOF
1244     # Linux
1245     ;;
1246   esac
1247 fi
1248 fragment <<EOF
1249           len = strlen (l->name);
1250           for (search = search_head; search != NULL; search = search->next)
1251             {
1252               char *filename;
1253
1254               if (search->cmdline)
1255                 continue;
1256               filename = (char *) xmalloc (strlen (search->name) + len + 2);
1257               sprintf (filename, "%s/%s", search->name, l->name);
1258               nn.name = filename;
1259               if (gld${EMULATION_NAME}_try_needed (&nn, force))
1260                 break;
1261               free (filename);
1262             }
1263           if (search != NULL)
1264             break;
1265 EOF
1266 fragment <<EOF
1267         }
1268
1269       if (force < 2)
1270         continue;
1271
1272       einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
1273              l->name, l->by);
1274     }
1275 }
1276
1277 EOF
1278 fi
1279
1280 fragment <<EOF
1281
1282 /* Look through an expression for an assignment statement.  */
1283
1284 static void
1285 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
1286 {
1287   bfd_boolean provide = FALSE;
1288
1289   switch (exp->type.node_class)
1290     {
1291     case etree_provide:
1292     case etree_provided:
1293       provide = TRUE;
1294       /* Fall thru */
1295     case etree_assign:
1296       /* We call record_link_assignment even if the symbol is defined.
1297          This is because if it is defined by a dynamic object, we
1298          actually want to use the value defined by the linker script,
1299          not the value from the dynamic object (because we are setting
1300          symbols like etext).  If the symbol is defined by a regular
1301          object, then, as it happens, calling record_link_assignment
1302          will do no harm.  */
1303       if (strcmp (exp->assign.dst, ".") != 0)
1304         {
1305           if (!bfd_elf_record_link_assignment (link_info.output_bfd,
1306                                                &link_info,
1307                                                exp->assign.dst, provide,
1308                                                exp->assign.hidden))
1309             einfo ("%P%F: failed to record assignment to %s: %E\n",
1310                    exp->assign.dst);
1311         }
1312       gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1313       break;
1314
1315     case etree_binary:
1316       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1317       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1318       break;
1319
1320     case etree_trinary:
1321       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1322       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1323       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1324       break;
1325
1326     case etree_unary:
1327       gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1328       break;
1329
1330     default:
1331       break;
1332     }
1333 }
1334
1335
1336 /* This is called by the before_allocation routine via
1337    lang_for_each_statement.  It locates any assignment statements, and
1338    tells the ELF backend about them, in case they are assignments to
1339    symbols which are referred to by dynamic objects.  */
1340
1341 static void
1342 gld${EMULATION_NAME}_find_statement_assignment (lang_statement_union_type *s)
1343 {
1344   if (s->header.type == lang_assignment_statement_enum)
1345     gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1346 }
1347
1348 EOF
1349
1350 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
1351   if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
1352     ELF_INTERPRETER_SET_DEFAULT="
1353   if (sinterp != NULL)
1354     {
1355       sinterp->contents = (unsigned char *) ${ELF_INTERPRETER_NAME};
1356       sinterp->size = strlen ((char *) sinterp->contents) + 1;
1357     }
1358
1359 "
1360   else
1361     ELF_INTERPRETER_SET_DEFAULT=
1362   fi
1363 fragment <<EOF
1364
1365 /* used by before_allocation and handle_option. */
1366 static void
1367 gld${EMULATION_NAME}_append_to_separated_string (char **to, char *op_arg)
1368 {
1369   if (*to == NULL)
1370     *to = xstrdup (op_arg);
1371   else
1372     {
1373       size_t to_len = strlen (*to);
1374       size_t op_arg_len = strlen (op_arg);
1375       char *buf;
1376       char *cp = *to;
1377
1378       /* First see whether OPTARG is already in the path.  */
1379       do
1380         {
1381           if (strncmp (op_arg, cp, op_arg_len) == 0
1382               && (cp[op_arg_len] == 0
1383                   || cp[op_arg_len] == config.rpath_separator))
1384             /* We found it.  */
1385             break;
1386
1387           /* Not yet found.  */
1388           cp = strchr (cp, config.rpath_separator);
1389           if (cp != NULL)
1390             ++cp;
1391         }
1392       while (cp != NULL);
1393
1394       if (cp == NULL)
1395         {
1396           buf = xmalloc (to_len + op_arg_len + 2);
1397           sprintf (buf, "%s%c%s", *to,
1398                    config.rpath_separator, op_arg);
1399           free (*to);
1400           *to = buf;
1401         }
1402     }
1403 }
1404
1405 /* This is called after the sections have been attached to output
1406    sections, but before any sizes or addresses have been set.  */
1407
1408 static void
1409 gld${EMULATION_NAME}_before_allocation (void)
1410 {
1411   const char *rpath;
1412   asection *sinterp;
1413   bfd *abfd;
1414   struct elf_link_hash_entry *ehdr_start = NULL;
1415 #if defined(__GNUC__) && GCC_VERSION < 4006
1416   /* Work around a GCC uninitialized warning bug fixed in GCC 4.6.  */
1417   struct bfd_link_hash_entry ehdr_start_save = ehdr_start_save;
1418 #else
1419   struct bfd_link_hash_entry ehdr_start_save;
1420 #endif
1421
1422   if (is_elf_hash_table (link_info.hash))
1423     {
1424       _bfd_elf_tls_setup (link_info.output_bfd, &link_info);
1425
1426       /* Make __ehdr_start hidden if it has been referenced, to
1427          prevent the symbol from being dynamic.  */
1428       if (!link_info.relocatable)
1429        {
1430          struct elf_link_hash_entry *h
1431            = elf_link_hash_lookup (elf_hash_table (&link_info), "__ehdr_start",
1432                                    FALSE, FALSE, TRUE);
1433
1434          /* Only adjust the export class if the symbol was referenced
1435             and not defined, otherwise leave it alone.  */
1436          if (h != NULL
1437              && (h->root.type == bfd_link_hash_new
1438                  || h->root.type == bfd_link_hash_undefined
1439                  || h->root.type == bfd_link_hash_undefweak
1440                  || h->root.type == bfd_link_hash_common))
1441            {
1442              _bfd_elf_link_hash_hide_symbol (&link_info, h, TRUE);
1443              if (ELF_ST_VISIBILITY (h->other) != STV_INTERNAL)
1444                h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN;
1445              /* Don't leave the symbol undefined.  Undefined hidden
1446                 symbols typically won't have dynamic relocations, but
1447                 we most likely will need dynamic relocations for
1448                 __ehdr_start if we are building a PIE or shared
1449                 library.  */
1450              ehdr_start = h;
1451              ehdr_start_save = h->root;
1452              h->root.type = bfd_link_hash_defined;
1453              h->root.u.def.section = bfd_abs_section_ptr;
1454              h->root.u.def.value = 0;
1455            }
1456        }
1457
1458       /* If we are going to make any variable assignments, we need to
1459          let the ELF backend know about them in case the variables are
1460          referred to by dynamic objects.  */
1461       lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
1462     }
1463
1464   /* Let the ELF backend work out the sizes of any sections required
1465      by dynamic linking.  */
1466   rpath = command_line.rpath;
1467   if (rpath == NULL)
1468     rpath = (const char *) getenv ("LD_RUN_PATH");
1469
1470   for (abfd = link_info.input_bfds; abfd; abfd = abfd->link.next)
1471     if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1472       {
1473         const char *audit_libs = elf_dt_audit (abfd);
1474
1475         /* If the input bfd contains an audit entry, we need to add it as
1476            a dep audit entry.  */
1477         if (audit_libs && *audit_libs != '\0')
1478           {
1479             char *cp = xstrdup (audit_libs);
1480             do
1481               {
1482                 int more = 0;
1483                 char *cp2 = strchr (cp, config.rpath_separator);
1484
1485                 if (cp2)
1486                   {
1487                     *cp2 = '\0';
1488                     more = 1;
1489                   }
1490
1491                 if (cp != NULL && *cp != '\0')
1492                   gld${EMULATION_NAME}_append_to_separated_string (&depaudit, cp);
1493
1494                 cp = more ? ++cp2 : NULL;
1495               }
1496             while (cp != NULL);
1497           }
1498       }
1499
1500   if (! (bfd_elf_size_dynamic_sections
1501          (link_info.output_bfd, command_line.soname, rpath,
1502           command_line.filter_shlib, audit, depaudit,
1503           (const char * const *) command_line.auxiliary_filters,
1504           &link_info, &sinterp)))
1505     einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1506
1507 ${ELF_INTERPRETER_SET_DEFAULT}
1508   /* Let the user override the dynamic linker we are using.  */
1509   if (command_line.interpreter != NULL
1510       && sinterp != NULL)
1511     {
1512       sinterp->contents = (bfd_byte *) command_line.interpreter;
1513       sinterp->size = strlen (command_line.interpreter) + 1;
1514     }
1515
1516   /* Look for any sections named .gnu.warning.  As a GNU extensions,
1517      we treat such sections as containing warning messages.  We print
1518      out the warning message, and then zero out the section size so
1519      that it does not get copied into the output file.  */
1520
1521   {
1522     LANG_FOR_EACH_INPUT_STATEMENT (is)
1523       {
1524         asection *s;
1525         bfd_size_type sz;
1526         char *msg;
1527         bfd_boolean ret;
1528
1529         if (is->flags.just_syms)
1530           continue;
1531
1532         s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
1533         if (s == NULL)
1534           continue;
1535
1536         sz = s->size;
1537         msg = (char *) xmalloc ((size_t) (sz + 1));
1538         if (! bfd_get_section_contents (is->the_bfd, s, msg,
1539                                         (file_ptr) 0, sz))
1540           einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
1541                  is->the_bfd);
1542         msg[sz] = '\0';
1543         ret = link_info.callbacks->warning (&link_info, msg,
1544                                             (const char *) NULL,
1545                                             is->the_bfd, (asection *) NULL,
1546                                             (bfd_vma) 0);
1547         ASSERT (ret);
1548         free (msg);
1549
1550         /* Clobber the section size, so that we don't waste space
1551            copying the warning into the output file.  If we've already
1552            sized the output section, adjust its size.  The adjustment
1553            is on rawsize because targets that size sections early will
1554            have called lang_reset_memory_regions after sizing.  */
1555         if (s->output_section != NULL
1556             && s->output_section->rawsize >= s->size)
1557           s->output_section->rawsize -= s->size;
1558
1559         s->size = 0;
1560
1561         /* Also set SEC_EXCLUDE, so that local symbols defined in the
1562            warning section don't get copied to the output.  */
1563         s->flags |= SEC_EXCLUDE | SEC_KEEP;
1564       }
1565   }
1566
1567   before_allocation_default ();
1568
1569   if (!bfd_elf_size_dynsym_hash_dynstr (link_info.output_bfd, &link_info))
1570     einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1571
1572   if (ehdr_start != NULL)
1573     {
1574       /* If we twiddled __ehdr_start to defined earlier, put it back
1575          as it was.  */
1576       ehdr_start->root.type = ehdr_start_save.type;
1577       ehdr_start->root.u = ehdr_start_save.u;
1578     }
1579 }
1580
1581 EOF
1582 fi
1583
1584 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
1585 fragment <<EOF
1586
1587 /* Try to open a dynamic archive.  This is where we know that ELF
1588    dynamic libraries have an extension of .so (or .sl on oddball systems
1589    like hpux).  */
1590
1591 static bfd_boolean
1592 gld${EMULATION_NAME}_open_dynamic_archive
1593   (const char *arch, search_dirs_type *search, lang_input_statement_type *entry)
1594 {
1595   const char *filename;
1596   char *string;
1597   size_t len;
1598   bfd_boolean opened = FALSE;
1599
1600   if (! entry->flags.maybe_archive)
1601     return FALSE;
1602
1603   filename = entry->filename;
1604   len = strlen (search->name) + strlen (filename);
1605   if (entry->flags.full_name_provided)
1606     {
1607       len += sizeof "/";
1608       string = (char *) xmalloc (len);
1609       sprintf (string, "%s/%s", search->name, filename);
1610     }
1611   else
1612     {
1613       size_t xlen = 0;
1614
1615       len += strlen (arch) + sizeof "/lib.so";
1616 #ifdef EXTRA_SHLIB_EXTENSION
1617       xlen = (strlen (EXTRA_SHLIB_EXTENSION) > 3
1618               ? strlen (EXTRA_SHLIB_EXTENSION) - 3
1619               : 0);
1620 #endif
1621       string = (char *) xmalloc (len + xlen);
1622       sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
1623 #ifdef EXTRA_SHLIB_EXTENSION
1624       /* Try the .so extension first.  If that fails build a new filename
1625          using EXTRA_SHLIB_EXTENSION.  */
1626       opened = ldfile_try_open_bfd (string, entry);
1627       if (!opened)
1628         strcpy (string + len - 4, EXTRA_SHLIB_EXTENSION);
1629 #endif
1630     }
1631
1632   if (!opened && !ldfile_try_open_bfd (string, entry))
1633     {
1634       free (string);
1635       return FALSE;
1636     }
1637
1638   entry->filename = string;
1639
1640   /* We have found a dynamic object to include in the link.  The ELF
1641      backend linker will create a DT_NEEDED entry in the .dynamic
1642      section naming this file.  If this file includes a DT_SONAME
1643      entry, it will be used.  Otherwise, the ELF linker will just use
1644      the name of the file.  For an archive found by searching, like
1645      this one, the DT_NEEDED entry should consist of just the name of
1646      the file, without the path information used to find it.  Note
1647      that we only need to do this if we have a dynamic object; an
1648      archive will never be referenced by a DT_NEEDED entry.
1649
1650      FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
1651      very pretty.  I haven't been able to think of anything that is
1652      pretty, though.  */
1653   if (bfd_check_format (entry->the_bfd, bfd_object)
1654       && (entry->the_bfd->flags & DYNAMIC) != 0)
1655     {
1656       ASSERT (entry->flags.maybe_archive && entry->flags.search_dirs);
1657
1658       /* Rather than duplicating the logic above.  Just use the
1659          filename we recorded earlier.  */
1660
1661       if (!entry->flags.full_name_provided)
1662         filename = lbasename (entry->filename);
1663       bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
1664     }
1665
1666   return TRUE;
1667 }
1668
1669 EOF
1670 fi
1671
1672 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
1673 fragment <<EOF
1674
1675 /* A variant of lang_output_section_find used by place_orphan.  */
1676
1677 static lang_output_section_statement_type *
1678 output_rel_find (asection *sec, int isdyn)
1679 {
1680   lang_output_section_statement_type *lookup;
1681   lang_output_section_statement_type *last = NULL;
1682   lang_output_section_statement_type *last_alloc = NULL;
1683   lang_output_section_statement_type *last_ro_alloc = NULL;
1684   lang_output_section_statement_type *last_rel = NULL;
1685   lang_output_section_statement_type *last_rel_alloc = NULL;
1686   int rela = sec->name[4] == 'a';
1687
1688   for (lookup = &lang_output_section_statement.head->output_section_statement;
1689        lookup != NULL;
1690        lookup = lookup->next)
1691     {
1692       if (lookup->constraint >= 0
1693           && CONST_STRNEQ (lookup->name, ".rel"))
1694         {
1695           int lookrela = lookup->name[4] == 'a';
1696
1697           /* .rel.dyn must come before all other reloc sections, to suit
1698              GNU ld.so.  */
1699           if (isdyn)
1700             break;
1701
1702           /* Don't place after .rel.plt as doing so results in wrong
1703              dynamic tags.  */
1704           if (strcmp (".plt", lookup->name + 4 + lookrela) == 0)
1705             break;
1706
1707           if (rela == lookrela || last_rel == NULL)
1708             last_rel = lookup;
1709           if ((rela == lookrela || last_rel_alloc == NULL)
1710               && lookup->bfd_section != NULL
1711               && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1712             last_rel_alloc = lookup;
1713         }
1714
1715       last = lookup;
1716       if (lookup->bfd_section != NULL
1717           && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1718         {
1719           last_alloc = lookup;
1720           if ((lookup->bfd_section->flags & SEC_READONLY) != 0)
1721             last_ro_alloc = lookup;
1722         }
1723     }
1724
1725   if (last_rel_alloc)
1726     return last_rel_alloc;
1727
1728   if (last_rel)
1729     return last_rel;
1730
1731   if (last_ro_alloc)
1732     return last_ro_alloc;
1733
1734   if (last_alloc)
1735     return last_alloc;
1736
1737   return last;
1738 }
1739
1740 /* Place an orphan section.  We use this to put random SHF_ALLOC
1741    sections in the right segment.  */
1742
1743 static lang_output_section_statement_type *
1744 gld${EMULATION_NAME}_place_orphan (asection *s,
1745                                    const char *secname,
1746                                    int constraint)
1747 {
1748   static struct orphan_save hold[] =
1749     {
1750       { ".text",
1751         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1752         0, 0, 0, 0 },
1753       { ".rodata",
1754         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1755         0, 0, 0, 0 },
1756       { ".tdata",
1757         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_THREAD_LOCAL,
1758         0, 0, 0, 0 },
1759       { ".data",
1760         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1761         0, 0, 0, 0 },
1762       { ".bss",
1763         SEC_ALLOC,
1764         0, 0, 0, 0 },
1765       { 0,
1766         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1767         0, 0, 0, 0 },
1768       { ".interp",
1769         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1770         0, 0, 0, 0 },
1771       { ".sdata",
1772         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_SMALL_DATA,
1773         0, 0, 0, 0 },
1774       { ".comment",
1775         SEC_HAS_CONTENTS,
1776         0, 0, 0, 0 },
1777     };
1778   enum orphan_save_index
1779     {
1780       orphan_text = 0,
1781       orphan_rodata,
1782       orphan_tdata,
1783       orphan_data,
1784       orphan_bss,
1785       orphan_rel,
1786       orphan_interp,
1787       orphan_sdata,
1788       orphan_nonalloc
1789     };
1790   static int orphan_init_done = 0;
1791   struct orphan_save *place;
1792   lang_output_section_statement_type *after;
1793   lang_output_section_statement_type *os;
1794   lang_output_section_statement_type *match_by_name = NULL;
1795   int isdyn = 0;
1796   int iself = s->owner->xvec->flavour == bfd_target_elf_flavour;
1797   unsigned int sh_type = iself ? elf_section_type (s) : SHT_NULL;
1798
1799   if (! link_info.relocatable
1800       && link_info.combreloc
1801       && (s->flags & SEC_ALLOC))
1802     {
1803       if (iself)
1804         switch (sh_type)
1805           {
1806           case SHT_RELA:
1807             secname = ".rela.dyn";
1808             isdyn = 1;
1809             break;
1810           case SHT_REL:
1811             secname = ".rel.dyn";
1812             isdyn = 1;
1813             break;
1814           default:
1815             break;
1816           }
1817       else if (CONST_STRNEQ (secname, ".rel"))
1818         {
1819           secname = secname[4] == 'a' ? ".rela.dyn" : ".rel.dyn";
1820           isdyn = 1;
1821         }
1822     }
1823
1824   /* Look through the script to see where to place this section.  */
1825   if (constraint == 0)
1826     for (os = lang_output_section_find (secname);
1827          os != NULL;
1828          os = next_matching_output_section_statement (os, 0))
1829       {
1830         /* If we don't match an existing output section, tell
1831            lang_insert_orphan to create a new output section.  */
1832         constraint = SPECIAL;
1833
1834         if (os->bfd_section != NULL
1835             && (os->bfd_section->flags == 0
1836                 || (_bfd_elf_match_sections_by_type (link_info.output_bfd,
1837                                                      os->bfd_section,
1838                                                      s->owner, s)
1839                     && ((s->flags ^ os->bfd_section->flags)
1840                         & (SEC_LOAD | SEC_ALLOC)) == 0)))
1841           {
1842             /* We already have an output section statement with this
1843                name, and its bfd section has compatible flags.
1844                If the section already exists but does not have any flags
1845                set, then it has been created by the linker, probably as a
1846                result of a --section-start command line switch.  */
1847             lang_add_section (&os->children, s, NULL, os);
1848             return os;
1849           }
1850
1851         /* Save unused output sections in case we can match them
1852            against orphans later.  */
1853         if (os->bfd_section == NULL)
1854           match_by_name = os;
1855       }
1856
1857   /* If we didn't match an active output section, see if we matched an
1858      unused one and use that.  */
1859   if (match_by_name)
1860     {
1861       lang_add_section (&match_by_name->children, s, NULL, match_by_name);
1862       return match_by_name;
1863     }
1864
1865   if (!orphan_init_done)
1866     {
1867       struct orphan_save *ho;
1868
1869       for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
1870         if (ho->name != NULL)
1871           {
1872             ho->os = lang_output_section_find (ho->name);
1873             if (ho->os != NULL && ho->os->flags == 0)
1874               ho->os->flags = ho->flags;
1875           }
1876       orphan_init_done = 1;
1877     }
1878
1879   /* If this is a final link, then always put .gnu.warning.SYMBOL
1880      sections into the .text section to get them out of the way.  */
1881   if (link_info.executable
1882       && ! link_info.relocatable
1883       && CONST_STRNEQ (s->name, ".gnu.warning.")
1884       && hold[orphan_text].os != NULL)
1885     {
1886       os = hold[orphan_text].os;
1887       lang_add_section (&os->children, s, NULL, os);
1888       return os;
1889     }
1890
1891   /* Decide which segment the section should go in based on the
1892      section name and section flags.  We put loadable .note sections
1893      right after the .interp section, so that the PT_NOTE segment is
1894      stored right after the program headers where the OS can read it
1895      in the first page.  */
1896
1897   place = NULL;
1898   if ((s->flags & (SEC_ALLOC | SEC_DEBUGGING)) == 0)
1899     place = &hold[orphan_nonalloc];
1900   else if ((s->flags & SEC_ALLOC) == 0)
1901     ;
1902   else if ((s->flags & SEC_LOAD) != 0
1903            && ((iself && sh_type == SHT_NOTE)
1904                || (!iself && CONST_STRNEQ (secname, ".note"))))
1905     place = &hold[orphan_interp];
1906   else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS | SEC_THREAD_LOCAL)) == 0)
1907     place = &hold[orphan_bss];
1908   else if ((s->flags & SEC_SMALL_DATA) != 0)
1909     place = &hold[orphan_sdata];
1910   else if ((s->flags & SEC_THREAD_LOCAL) != 0)
1911     place = &hold[orphan_tdata];
1912   else if ((s->flags & SEC_READONLY) == 0)
1913     place = &hold[orphan_data];
1914   else if (((iself && (sh_type == SHT_RELA || sh_type == SHT_REL))
1915             || (!iself && CONST_STRNEQ (secname, ".rel")))
1916            && (s->flags & SEC_LOAD) != 0)
1917     place = &hold[orphan_rel];
1918   else if ((s->flags & SEC_CODE) == 0)
1919     place = &hold[orphan_rodata];
1920   else
1921     place = &hold[orphan_text];
1922
1923   after = NULL;
1924   if (place != NULL)
1925     {
1926       if (place->os == NULL)
1927         {
1928           if (place->name != NULL)
1929             place->os = lang_output_section_find (place->name);
1930           else
1931             place->os = output_rel_find (s, isdyn);
1932         }
1933       after = place->os;
1934       if (after == NULL)
1935         after = lang_output_section_find_by_flags
1936           (s, &place->os, _bfd_elf_match_sections_by_type);
1937       if (after == NULL)
1938         /* *ABS* is always the first output section statement.  */
1939         after = &lang_output_section_statement.head->output_section_statement;
1940     }
1941
1942   return lang_insert_orphan (s, secname, constraint, after, place, NULL, NULL);
1943 }
1944 EOF
1945 fi
1946
1947 if test x"$LDEMUL_AFTER_ALLOCATION" != xgld"$EMULATION_NAME"_after_allocation; then
1948 fragment <<EOF
1949
1950 static void
1951 gld${EMULATION_NAME}_after_allocation (void)
1952 {
1953   int need_layout = bfd_elf_discard_info (link_info.output_bfd, &link_info);
1954
1955   if (need_layout < 0)
1956     einfo ("%X%P: .eh_frame/.stab edit: %E\n");
1957   else
1958     gld${EMULATION_NAME}_map_segments (need_layout);
1959 }
1960 EOF
1961 fi
1962
1963 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1964 fragment <<EOF
1965
1966 static char *
1967 gld${EMULATION_NAME}_get_script (int *isfile)
1968 EOF
1969
1970 if test x"$COMPILE_IN" = xyes
1971 then
1972 # Scripts compiled in.
1973
1974 # sed commands to quote an ld script as a C string.
1975 sc="-f stringify.sed"
1976
1977 fragment <<EOF
1978 {
1979   *isfile = 0;
1980
1981   if (link_info.relocatable && config.build_constructors)
1982     return
1983 EOF
1984 sed $sc ldscripts/${EMULATION_NAME}.xu                  >> e${EMULATION_NAME}.c
1985 echo '  ; else if (link_info.relocatable) return'       >> e${EMULATION_NAME}.c
1986 sed $sc ldscripts/${EMULATION_NAME}.xr                  >> e${EMULATION_NAME}.c
1987 echo '  ; else if (!config.text_read_only) return'      >> e${EMULATION_NAME}.c
1988 sed $sc ldscripts/${EMULATION_NAME}.xbn                 >> e${EMULATION_NAME}.c
1989 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
1990 echo '  ; else if (!config.magic_demand_paged) return'  >> e${EMULATION_NAME}.c
1991 sed $sc ldscripts/${EMULATION_NAME}.xn                  >> e${EMULATION_NAME}.c
1992 fi
1993 if test -n "$GENERATE_PIE_SCRIPT" ; then
1994 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1995 echo '  ; else if (link_info.pie && link_info.combreloc' >> e${EMULATION_NAME}.c
1996 echo '             && link_info.relro' >> e${EMULATION_NAME}.c
1997 echo '             && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1998 sed $sc ldscripts/${EMULATION_NAME}.xdw                 >> e${EMULATION_NAME}.c
1999 echo '  ; else if (link_info.pie && link_info.combreloc) return' >> e${EMULATION_NAME}.c
2000 sed $sc ldscripts/${EMULATION_NAME}.xdc                 >> e${EMULATION_NAME}.c
2001 fi
2002 echo '  ; else if (link_info.pie) return'               >> e${EMULATION_NAME}.c
2003 sed $sc ldscripts/${EMULATION_NAME}.xd                  >> e${EMULATION_NAME}.c
2004 fi
2005 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
2006 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2007 echo '  ; else if (link_info.shared && link_info.combreloc' >> e${EMULATION_NAME}.c
2008 echo '             && link_info.relro' >> e${EMULATION_NAME}.c
2009 echo '             && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
2010 sed $sc ldscripts/${EMULATION_NAME}.xsw                 >> e${EMULATION_NAME}.c
2011 echo '  ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
2012 sed $sc ldscripts/${EMULATION_NAME}.xsc                 >> e${EMULATION_NAME}.c
2013 fi
2014 echo '  ; else if (link_info.shared) return'            >> e${EMULATION_NAME}.c
2015 sed $sc ldscripts/${EMULATION_NAME}.xs                  >> e${EMULATION_NAME}.c
2016 fi
2017 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2018 echo '  ; else if (link_info.combreloc && link_info.relro' >> e${EMULATION_NAME}.c
2019 echo '             && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
2020 sed $sc ldscripts/${EMULATION_NAME}.xw                  >> e${EMULATION_NAME}.c
2021 echo '  ; else if (link_info.combreloc) return'         >> e${EMULATION_NAME}.c
2022 sed $sc ldscripts/${EMULATION_NAME}.xc                  >> e${EMULATION_NAME}.c
2023 fi
2024 echo '  ; else return'                                  >> e${EMULATION_NAME}.c
2025 sed $sc ldscripts/${EMULATION_NAME}.x                   >> e${EMULATION_NAME}.c
2026 echo '; }'                                              >> e${EMULATION_NAME}.c
2027
2028 else
2029 # Scripts read from the filesystem.
2030
2031 fragment <<EOF
2032 {
2033   *isfile = 1;
2034
2035   if (link_info.relocatable && config.build_constructors)
2036     return "ldscripts/${EMULATION_NAME}.xu";
2037   else if (link_info.relocatable)
2038     return "ldscripts/${EMULATION_NAME}.xr";
2039   else if (!config.text_read_only)
2040     return "ldscripts/${EMULATION_NAME}.xbn";
2041 EOF
2042 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
2043 else
2044 fragment <<EOF
2045   else if (!config.magic_demand_paged)
2046     return "ldscripts/${EMULATION_NAME}.xn";
2047 EOF
2048 fi
2049 if test -n "$GENERATE_PIE_SCRIPT" ; then
2050 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2051 fragment <<EOF
2052   else if (link_info.pie && link_info.combreloc
2053            && link_info.relro && (link_info.flags & DF_BIND_NOW))
2054     return "ldscripts/${EMULATION_NAME}.xdw";
2055   else if (link_info.pie && link_info.combreloc)
2056     return "ldscripts/${EMULATION_NAME}.xdc";
2057 EOF
2058 fi
2059 fragment <<EOF
2060   else if (link_info.pie)
2061     return "ldscripts/${EMULATION_NAME}.xd";
2062 EOF
2063 fi
2064 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
2065 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2066 fragment <<EOF
2067   else if (link_info.shared && link_info.combreloc
2068            && link_info.relro && (link_info.flags & DF_BIND_NOW))
2069     return "ldscripts/${EMULATION_NAME}.xsw";
2070   else if (link_info.shared && link_info.combreloc)
2071     return "ldscripts/${EMULATION_NAME}.xsc";
2072 EOF
2073 fi
2074 fragment <<EOF
2075   else if (link_info.shared)
2076     return "ldscripts/${EMULATION_NAME}.xs";
2077 EOF
2078 fi
2079 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2080 fragment <<EOF
2081   else if (link_info.combreloc && link_info.relro
2082            && (link_info.flags & DF_BIND_NOW))
2083     return "ldscripts/${EMULATION_NAME}.xw";
2084   else if (link_info.combreloc)
2085     return "ldscripts/${EMULATION_NAME}.xc";
2086 EOF
2087 fi
2088 fragment <<EOF
2089   else
2090     return "ldscripts/${EMULATION_NAME}.x";
2091 }
2092
2093 EOF
2094 fi
2095 fi
2096
2097 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
2098 fragment <<EOF
2099  $PARSE_AND_LIST_PROLOGUE
2100 EOF
2101 fi
2102
2103 fragment <<EOF
2104
2105 #define OPTION_DISABLE_NEW_DTAGS        (400)
2106 #define OPTION_ENABLE_NEW_DTAGS         (OPTION_DISABLE_NEW_DTAGS + 1)
2107 #define OPTION_GROUP                    (OPTION_ENABLE_NEW_DTAGS + 1)
2108 #define OPTION_EH_FRAME_HDR             (OPTION_GROUP + 1)
2109 #define OPTION_EXCLUDE_LIBS             (OPTION_EH_FRAME_HDR + 1)
2110 #define OPTION_HASH_STYLE               (OPTION_EXCLUDE_LIBS + 1)
2111 #define OPTION_BUILD_ID                 (OPTION_HASH_STYLE + 1)
2112 #define OPTION_AUDIT                    (OPTION_BUILD_ID + 1)
2113
2114 static void
2115 gld${EMULATION_NAME}_add_options
2116   (int ns, char **shortopts, int nl, struct option **longopts,
2117    int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
2118 {
2119 EOF
2120 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2121 fragment <<EOF
2122   static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:P:";
2123 EOF
2124 else
2125 fragment <<EOF
2126   static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:";
2127 EOF
2128 fi
2129 fragment <<EOF
2130   static const struct option xtra_long[] = {
2131 EOF
2132 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2133 fragment <<EOF
2134     {"audit", required_argument, NULL, OPTION_AUDIT},
2135     {"Bgroup", no_argument, NULL, OPTION_GROUP},
2136 EOF
2137 fi
2138 fragment <<EOF
2139     {"build-id", optional_argument, NULL, OPTION_BUILD_ID},
2140 EOF
2141 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2142 fragment <<EOF
2143     {"depaudit", required_argument, NULL, 'P'},
2144     {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
2145     {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
2146     {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
2147     {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
2148     {"hash-style", required_argument, NULL, OPTION_HASH_STYLE},
2149 EOF
2150 fi
2151 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
2152 fragment <<EOF
2153     $PARSE_AND_LIST_LONGOPTS
2154 EOF
2155 fi
2156 fragment <<EOF
2157     {NULL, no_argument, NULL, 0}
2158   };
2159
2160   *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
2161   memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
2162   *longopts = (struct option *)
2163     xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
2164   memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
2165 }
2166
2167 #define DEFAULT_BUILD_ID_STYLE  "sha1"
2168
2169 static bfd_boolean
2170 gld${EMULATION_NAME}_handle_option (int optc)
2171 {
2172   switch (optc)
2173     {
2174     default:
2175       return FALSE;
2176
2177     case OPTION_BUILD_ID:
2178       if (emit_note_gnu_build_id != NULL)
2179         {
2180           free ((char *) emit_note_gnu_build_id);
2181           emit_note_gnu_build_id = NULL;
2182         }
2183       if (optarg == NULL)
2184         optarg = DEFAULT_BUILD_ID_STYLE;
2185       if (strcmp (optarg, "none"))
2186         emit_note_gnu_build_id = xstrdup (optarg);
2187       break;
2188
2189 EOF
2190
2191 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2192 fragment <<EOF
2193     case OPTION_AUDIT:
2194         gld${EMULATION_NAME}_append_to_separated_string (&audit, optarg);
2195         break;
2196
2197     case 'P':
2198         gld${EMULATION_NAME}_append_to_separated_string (&depaudit, optarg);
2199         break;
2200
2201     case OPTION_DISABLE_NEW_DTAGS:
2202       link_info.new_dtags = FALSE;
2203       break;
2204
2205     case OPTION_ENABLE_NEW_DTAGS:
2206       link_info.new_dtags = TRUE;
2207       break;
2208
2209     case OPTION_EH_FRAME_HDR:
2210       link_info.eh_frame_hdr = TRUE;
2211       break;
2212
2213     case OPTION_GROUP:
2214       link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
2215       /* Groups must be self-contained.  */
2216       link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2217       link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
2218       break;
2219
2220     case OPTION_EXCLUDE_LIBS:
2221       add_excluded_libs (optarg);
2222       break;
2223
2224     case OPTION_HASH_STYLE:
2225       link_info.emit_hash = FALSE;
2226       link_info.emit_gnu_hash = FALSE;
2227       if (strcmp (optarg, "sysv") == 0)
2228         link_info.emit_hash = TRUE;
2229       else if (strcmp (optarg, "gnu") == 0)
2230         link_info.emit_gnu_hash = TRUE;
2231       else if (strcmp (optarg, "both") == 0)
2232         {
2233           link_info.emit_hash = TRUE;
2234           link_info.emit_gnu_hash = TRUE;
2235         }
2236       else
2237         einfo (_("%P%F: invalid hash style \`%s'\n"), optarg);
2238       break;
2239
2240 EOF
2241 fi
2242 fragment <<EOF
2243     case 'z':
2244       if (strcmp (optarg, "defs") == 0)
2245         link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2246       else if (strcmp (optarg, "muldefs") == 0)
2247         link_info.allow_multiple_definition = TRUE;
2248       else if (CONST_STRNEQ (optarg, "max-page-size="))
2249         {
2250           char *end;
2251
2252           config.maxpagesize = strtoul (optarg + 14, &end, 0);
2253           if (*end || (config.maxpagesize & (config.maxpagesize - 1)) != 0)
2254             einfo (_("%P%F: invalid maxium page size \`%s'\n"),
2255                    optarg + 14);
2256         }
2257       else if (CONST_STRNEQ (optarg, "common-page-size="))
2258         {
2259           char *end;
2260           config.commonpagesize = strtoul (optarg + 17, &end, 0);
2261           if (*end
2262               || (config.commonpagesize & (config.commonpagesize - 1)) != 0)
2263             einfo (_("%P%F: invalid common page size \`%s'\n"),
2264                    optarg + 17);
2265         }
2266       else if (CONST_STRNEQ (optarg, "stack-size="))
2267         {
2268           char *end;
2269           link_info.stacksize = strtoul (optarg + 11, &end, 0);
2270           if (*end || link_info.stacksize < 0)
2271             einfo (_("%P%F: invalid stack size \`%s'\n"), optarg + 11);
2272           if (!link_info.stacksize)
2273             /* Use -1 for explicit no-stack, because zero means
2274                'default'.   */
2275             link_info.stacksize = -1;
2276         }
2277       else if (strcmp (optarg, "execstack") == 0)
2278         {
2279           link_info.execstack = TRUE;
2280           link_info.noexecstack = FALSE;
2281         }
2282       else if (strcmp (optarg, "noexecstack") == 0)
2283         {
2284           link_info.noexecstack = TRUE;
2285           link_info.execstack = FALSE;
2286         }
2287 EOF
2288
2289 if test x"$BNDPLT" = xyes; then
2290 fragment <<EOF
2291       else if (strcmp (optarg, "bndplt") == 0)
2292         link_info.bndplt = TRUE;
2293 EOF
2294 fi
2295
2296 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2297 fragment <<EOF
2298       else if (strcmp (optarg, "global") == 0)
2299         link_info.flags_1 |= (bfd_vma) DF_1_GLOBAL;
2300       else if (strcmp (optarg, "initfirst") == 0)
2301         link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
2302       else if (strcmp (optarg, "interpose") == 0)
2303         link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
2304       else if (strcmp (optarg, "loadfltr") == 0)
2305         link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
2306       else if (strcmp (optarg, "nodefaultlib") == 0)
2307         link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
2308       else if (strcmp (optarg, "nodelete") == 0)
2309         link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
2310       else if (strcmp (optarg, "nodlopen") == 0)
2311         link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
2312       else if (strcmp (optarg, "nodump") == 0)
2313         link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
2314       else if (strcmp (optarg, "now") == 0)
2315         {
2316           link_info.flags |= (bfd_vma) DF_BIND_NOW;
2317           link_info.flags_1 |= (bfd_vma) DF_1_NOW;
2318         }
2319       else if (strcmp (optarg, "lazy") == 0)
2320         {
2321           link_info.flags &= ~(bfd_vma) DF_BIND_NOW;
2322           link_info.flags_1 &= ~(bfd_vma) DF_1_NOW;
2323         }
2324       else if (strcmp (optarg, "origin") == 0)
2325         {
2326           link_info.flags |= (bfd_vma) DF_ORIGIN;
2327           link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
2328         }
2329       else if (strcmp (optarg, "combreloc") == 0)
2330         link_info.combreloc = TRUE;
2331       else if (strcmp (optarg, "nocombreloc") == 0)
2332         link_info.combreloc = FALSE;
2333       else if (strcmp (optarg, "nocopyreloc") == 0)
2334         link_info.nocopyreloc = TRUE;
2335       else if (strcmp (optarg, "relro") == 0)
2336         link_info.relro = TRUE;
2337       else if (strcmp (optarg, "norelro") == 0)
2338         link_info.relro = FALSE;
2339       else if (strcmp (optarg, "text") == 0)
2340         link_info.error_textrel = TRUE;
2341       else if (strcmp (optarg, "notext") == 0)
2342         link_info.error_textrel = FALSE;
2343       else if (strcmp (optarg, "textoff") == 0)
2344         link_info.error_textrel = FALSE;
2345 EOF
2346 fi
2347
2348 fragment <<EOF
2349       else
2350         einfo (_("%P: warning: -z %s ignored.\n"), optarg);
2351       break;
2352 EOF
2353
2354 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
2355 fragment <<EOF
2356  $PARSE_AND_LIST_ARGS_CASES
2357 EOF
2358 fi
2359
2360 fragment <<EOF
2361     }
2362
2363   return TRUE;
2364 }
2365
2366 EOF
2367
2368 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
2369 gld_list_options="gld${EMULATION_NAME}_list_options"
2370 if test -n "$PARSE_AND_LIST_OPTIONS" || test x"$BNDPLT" = xyes; then
2371 fragment <<EOF
2372
2373 static void
2374 gld${EMULATION_NAME}_list_options (FILE * file)
2375 {
2376 EOF
2377
2378 if test x"$BNDPLT" = xyes; then
2379 fragment <<EOF
2380   fprintf (file, _("\
2381   -z bndplt                   Always generate BND prefix in PLT entries\n"));
2382 EOF
2383 fi
2384
2385 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
2386 fragment <<EOF
2387  $PARSE_AND_LIST_OPTIONS
2388 EOF
2389 fi
2390
2391 fragment <<EOF
2392 }
2393 EOF
2394 else
2395   gld_list_options="NULL"
2396 fi
2397
2398 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
2399 fragment <<EOF
2400  $PARSE_AND_LIST_EPILOGUE
2401 EOF
2402 fi
2403 fi
2404
2405 fragment <<EOF
2406
2407 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
2408 {
2409   ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
2410   ${LDEMUL_SYSLIB-syslib_default},
2411   ${LDEMUL_HLL-hll_default},
2412   ${LDEMUL_AFTER_PARSE-after_parse_default},
2413   ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
2414   ${LDEMUL_AFTER_ALLOCATION-gld${EMULATION_NAME}_after_allocation},
2415   ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
2416   ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
2417   ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
2418   ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
2419   "${EMULATION_NAME}",
2420   "${OUTPUT_FORMAT}",
2421   ${LDEMUL_FINISH-finish_default},
2422   ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
2423   ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
2424   ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
2425   ${LDEMUL_SET_SYMBOLS-NULL},
2426   ${LDEMUL_PARSE_ARGS-NULL},
2427   gld${EMULATION_NAME}_add_options,
2428   gld${EMULATION_NAME}_handle_option,
2429   ${LDEMUL_UNRECOGNIZED_FILE-NULL},
2430   ${LDEMUL_LIST_OPTIONS-${gld_list_options}},
2431   ${LDEMUL_RECOGNIZED_FILE-gld${EMULATION_NAME}_load_symbols},
2432   ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
2433   ${LDEMUL_NEW_VERS_PATTERN-NULL},
2434   ${LDEMUL_EXTRA_MAP_FILE_TEXT-NULL}
2435 };
2436 EOF