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