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