Relative DT_RPATH/DT_RUNPATH vs. sysroot capable ld.
[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               const char *tmpname = rp->name;
1260
1261               if (IS_ABSOLUTE_PATH (tmpname))
1262                 tmpname = gld${EMULATION_NAME}_add_sysroot (tmpname);
1263               found = (rp->by == l->by
1264                        && gld${EMULATION_NAME}_search_needed (tmpname,
1265                                                               &n,
1266                                                               force));
1267               if (tmpname != rp->name)
1268                 free ((char *) tmpname);
1269             }
1270           if (found)
1271             break;
1272
1273 EOF
1274 fi
1275 if [ "x${USE_LIBPATH}" = xyes ] ; then
1276   case ${target} in
1277     *-*-freebsd* | *-*-dragonfly*)
1278       fragment <<EOF
1279           if (gld${EMULATION_NAME}_check_ld_elf_hints (l, force))
1280             break;
1281 EOF
1282     # FreeBSD
1283     ;;
1284
1285     *-*-linux-* | *-*-k*bsd*-* | *-*-gnu*)
1286       fragment <<EOF
1287           if (gld${EMULATION_NAME}_check_ld_so_conf (l, force))
1288             break;
1289
1290 EOF
1291     # Linux
1292     ;;
1293   esac
1294 fi
1295 fragment <<EOF
1296           len = strlen (l->name);
1297           for (search = search_head; search != NULL; search = search->next)
1298             {
1299               char *filename;
1300
1301               if (search->cmdline)
1302                 continue;
1303               filename = (char *) xmalloc (strlen (search->name) + len + 2);
1304               sprintf (filename, "%s/%s", search->name, l->name);
1305               nn.name = filename;
1306               if (gld${EMULATION_NAME}_try_needed (&nn, force))
1307                 break;
1308               free (filename);
1309             }
1310           if (search != NULL)
1311             break;
1312 EOF
1313 fragment <<EOF
1314         }
1315
1316       if (force < 2)
1317         continue;
1318
1319       einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
1320              l->name, l->by);
1321     }
1322
1323   if (link_info.eh_frame_hdr_type == COMPACT_EH_HDR)
1324     if (bfd_elf_parse_eh_frame_entries (NULL, &link_info) == FALSE)
1325       einfo (_("%P%F: Failed to parse EH frame entries.\n"));
1326 }
1327
1328 EOF
1329 fi
1330
1331 fragment <<EOF
1332
1333 /* Look through an expression for an assignment statement.  */
1334
1335 static void
1336 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
1337 {
1338   bfd_boolean provide = FALSE;
1339
1340   switch (exp->type.node_class)
1341     {
1342     case etree_provide:
1343     case etree_provided:
1344       provide = TRUE;
1345       /* Fall thru */
1346     case etree_assign:
1347       /* We call record_link_assignment even if the symbol is defined.
1348          This is because if it is defined by a dynamic object, we
1349          actually want to use the value defined by the linker script,
1350          not the value from the dynamic object (because we are setting
1351          symbols like etext).  If the symbol is defined by a regular
1352          object, then, as it happens, calling record_link_assignment
1353          will do no harm.  */
1354       if (strcmp (exp->assign.dst, ".") != 0)
1355         {
1356           if (!bfd_elf_record_link_assignment (link_info.output_bfd,
1357                                                &link_info,
1358                                                exp->assign.dst, provide,
1359                                                exp->assign.hidden))
1360             einfo ("%P%F: failed to record assignment to %s: %E\n",
1361                    exp->assign.dst);
1362         }
1363       gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1364       break;
1365
1366     case etree_binary:
1367       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1368       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1369       break;
1370
1371     case etree_trinary:
1372       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1373       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1374       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1375       break;
1376
1377     case etree_unary:
1378       gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1379       break;
1380
1381     default:
1382       break;
1383     }
1384 }
1385
1386
1387 /* This is called by the before_allocation routine via
1388    lang_for_each_statement.  It locates any assignment statements, and
1389    tells the ELF backend about them, in case they are assignments to
1390    symbols which are referred to by dynamic objects.  */
1391
1392 static void
1393 gld${EMULATION_NAME}_find_statement_assignment (lang_statement_union_type *s)
1394 {
1395   if (s->header.type == lang_assignment_statement_enum)
1396     gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1397 }
1398
1399 EOF
1400
1401 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
1402   if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
1403     ELF_INTERPRETER_SET_DEFAULT="
1404   if (sinterp != NULL)
1405     {
1406       sinterp->contents = (unsigned char *) ${ELF_INTERPRETER_NAME};
1407       sinterp->size = strlen ((char *) sinterp->contents) + 1;
1408     }
1409
1410 "
1411   else
1412     ELF_INTERPRETER_SET_DEFAULT=
1413   fi
1414 fragment <<EOF
1415
1416 /* used by before_allocation and handle_option. */
1417 static void
1418 gld${EMULATION_NAME}_append_to_separated_string (char **to, char *op_arg)
1419 {
1420   if (*to == NULL)
1421     *to = xstrdup (op_arg);
1422   else
1423     {
1424       size_t to_len = strlen (*to);
1425       size_t op_arg_len = strlen (op_arg);
1426       char *buf;
1427       char *cp = *to;
1428
1429       /* First see whether OPTARG is already in the path.  */
1430       do
1431         {
1432           if (strncmp (op_arg, cp, op_arg_len) == 0
1433               && (cp[op_arg_len] == 0
1434                   || cp[op_arg_len] == config.rpath_separator))
1435             /* We found it.  */
1436             break;
1437
1438           /* Not yet found.  */
1439           cp = strchr (cp, config.rpath_separator);
1440           if (cp != NULL)
1441             ++cp;
1442         }
1443       while (cp != NULL);
1444
1445       if (cp == NULL)
1446         {
1447           buf = xmalloc (to_len + op_arg_len + 2);
1448           sprintf (buf, "%s%c%s", *to,
1449                    config.rpath_separator, op_arg);
1450           free (*to);
1451           *to = buf;
1452         }
1453     }
1454 }
1455
1456 #if defined(__GNUC__) && GCC_VERSION < 4006
1457   /* Work around a GCC uninitialized warning bug fixed in GCC 4.6.  */
1458 static struct bfd_link_hash_entry ehdr_start_empty;
1459 #endif
1460
1461 /* This is called after the sections have been attached to output
1462    sections, but before any sizes or addresses have been set.  */
1463
1464 static void
1465 gld${EMULATION_NAME}_before_allocation (void)
1466 {
1467   const char *rpath;
1468   asection *sinterp;
1469   bfd *abfd;
1470   struct elf_link_hash_entry *ehdr_start = NULL;
1471 #if defined(__GNUC__) && GCC_VERSION < 4006
1472   /* Work around a GCC uninitialized warning bug fixed in GCC 4.6.  */
1473   struct bfd_link_hash_entry ehdr_start_save = ehdr_start_empty;
1474 #else
1475   struct bfd_link_hash_entry ehdr_start_save;
1476 #endif
1477
1478   if (is_elf_hash_table (link_info.hash))
1479     {
1480       _bfd_elf_tls_setup (link_info.output_bfd, &link_info);
1481
1482       /* Make __ehdr_start hidden if it has been referenced, to
1483          prevent the symbol from being dynamic.  */
1484       if (!bfd_link_relocatable (&link_info))
1485        {
1486          struct elf_link_hash_entry *h
1487            = elf_link_hash_lookup (elf_hash_table (&link_info), "__ehdr_start",
1488                                    FALSE, FALSE, TRUE);
1489
1490          /* Only adjust the export class if the symbol was referenced
1491             and not defined, otherwise leave it alone.  */
1492          if (h != NULL
1493              && (h->root.type == bfd_link_hash_new
1494                  || h->root.type == bfd_link_hash_undefined
1495                  || h->root.type == bfd_link_hash_undefweak
1496                  || h->root.type == bfd_link_hash_common))
1497            {
1498              _bfd_elf_link_hash_hide_symbol (&link_info, h, TRUE);
1499              if (ELF_ST_VISIBILITY (h->other) != STV_INTERNAL)
1500                h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN;
1501              /* Don't leave the symbol undefined.  Undefined hidden
1502                 symbols typically won't have dynamic relocations, but
1503                 we most likely will need dynamic relocations for
1504                 __ehdr_start if we are building a PIE or shared
1505                 library.  */
1506              ehdr_start = h;
1507              ehdr_start_save = h->root;
1508              h->root.type = bfd_link_hash_defined;
1509              h->root.u.def.section = bfd_abs_section_ptr;
1510              h->root.u.def.value = 0;
1511            }
1512        }
1513
1514       /* If we are going to make any variable assignments, we need to
1515          let the ELF backend know about them in case the variables are
1516          referred to by dynamic objects.  */
1517       lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
1518     }
1519
1520   /* Let the ELF backend work out the sizes of any sections required
1521      by dynamic linking.  */
1522   rpath = command_line.rpath;
1523   if (rpath == NULL)
1524     rpath = (const char *) getenv ("LD_RUN_PATH");
1525
1526   for (abfd = link_info.input_bfds; abfd; abfd = abfd->link.next)
1527     if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1528       {
1529         const char *audit_libs = elf_dt_audit (abfd);
1530
1531         /* If the input bfd contains an audit entry, we need to add it as
1532            a dep audit entry.  */
1533         if (audit_libs && *audit_libs != '\0')
1534           {
1535             char *cp = xstrdup (audit_libs);
1536             do
1537               {
1538                 int more = 0;
1539                 char *cp2 = strchr (cp, config.rpath_separator);
1540
1541                 if (cp2)
1542                   {
1543                     *cp2 = '\0';
1544                     more = 1;
1545                   }
1546
1547                 if (cp != NULL && *cp != '\0')
1548                   gld${EMULATION_NAME}_append_to_separated_string (&depaudit, cp);
1549
1550                 cp = more ? ++cp2 : NULL;
1551               }
1552             while (cp != NULL);
1553           }
1554       }
1555
1556   if (! (bfd_elf_size_dynamic_sections
1557          (link_info.output_bfd, command_line.soname, rpath,
1558           command_line.filter_shlib, audit, depaudit,
1559           (const char * const *) command_line.auxiliary_filters,
1560           &link_info, &sinterp)))
1561     einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1562
1563 ${ELF_INTERPRETER_SET_DEFAULT}
1564   /* Let the user override the dynamic linker we are using.  */
1565   if (command_line.interpreter != NULL
1566       && sinterp != NULL)
1567     {
1568       sinterp->contents = (bfd_byte *) command_line.interpreter;
1569       sinterp->size = strlen (command_line.interpreter) + 1;
1570     }
1571
1572   /* Look for any sections named .gnu.warning.  As a GNU extensions,
1573      we treat such sections as containing warning messages.  We print
1574      out the warning message, and then zero out the section size so
1575      that it does not get copied into the output file.  */
1576
1577   {
1578     LANG_FOR_EACH_INPUT_STATEMENT (is)
1579       {
1580         asection *s;
1581         bfd_size_type sz;
1582         char *msg;
1583         bfd_boolean ret;
1584
1585         if (is->flags.just_syms)
1586           continue;
1587
1588         s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
1589         if (s == NULL)
1590           continue;
1591
1592         sz = s->size;
1593         msg = (char *) xmalloc ((size_t) (sz + 1));
1594         if (! bfd_get_section_contents (is->the_bfd, s, msg,
1595                                         (file_ptr) 0, sz))
1596           einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
1597                  is->the_bfd);
1598         msg[sz] = '\0';
1599         ret = link_info.callbacks->warning (&link_info, msg,
1600                                             (const char *) NULL,
1601                                             is->the_bfd, (asection *) NULL,
1602                                             (bfd_vma) 0);
1603         ASSERT (ret);
1604         free (msg);
1605
1606         /* Clobber the section size, so that we don't waste space
1607            copying the warning into the output file.  If we've already
1608            sized the output section, adjust its size.  The adjustment
1609            is on rawsize because targets that size sections early will
1610            have called lang_reset_memory_regions after sizing.  */
1611         if (s->output_section != NULL
1612             && s->output_section->rawsize >= s->size)
1613           s->output_section->rawsize -= s->size;
1614
1615         s->size = 0;
1616
1617         /* Also set SEC_EXCLUDE, so that local symbols defined in the
1618            warning section don't get copied to the output.  */
1619         s->flags |= SEC_EXCLUDE | SEC_KEEP;
1620       }
1621   }
1622
1623   before_allocation_default ();
1624
1625   if (!bfd_elf_size_dynsym_hash_dynstr (link_info.output_bfd, &link_info))
1626     einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1627
1628   if (ehdr_start != NULL)
1629     {
1630       /* If we twiddled __ehdr_start to defined earlier, put it back
1631          as it was.  */
1632       ehdr_start->root.type = ehdr_start_save.type;
1633       ehdr_start->root.u = ehdr_start_save.u;
1634     }
1635 }
1636
1637 EOF
1638 fi
1639
1640 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
1641 fragment <<EOF
1642
1643 /* Try to open a dynamic archive.  This is where we know that ELF
1644    dynamic libraries have an extension of .so (or .sl on oddball systems
1645    like hpux).  */
1646
1647 static bfd_boolean
1648 gld${EMULATION_NAME}_open_dynamic_archive
1649   (const char *arch, search_dirs_type *search, lang_input_statement_type *entry)
1650 {
1651   const char *filename;
1652   char *string;
1653   size_t len;
1654   bfd_boolean opened = FALSE;
1655
1656   if (! entry->flags.maybe_archive)
1657     return FALSE;
1658
1659   filename = entry->filename;
1660   len = strlen (search->name) + strlen (filename);
1661   if (entry->flags.full_name_provided)
1662     {
1663       len += sizeof "/";
1664       string = (char *) xmalloc (len);
1665       sprintf (string, "%s/%s", search->name, filename);
1666     }
1667   else
1668     {
1669       size_t xlen = 0;
1670
1671       len += strlen (arch) + sizeof "/lib.so";
1672 #ifdef EXTRA_SHLIB_EXTENSION
1673       xlen = (strlen (EXTRA_SHLIB_EXTENSION) > 3
1674               ? strlen (EXTRA_SHLIB_EXTENSION) - 3
1675               : 0);
1676 #endif
1677       string = (char *) xmalloc (len + xlen);
1678       sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
1679 #ifdef EXTRA_SHLIB_EXTENSION
1680       /* Try the .so extension first.  If that fails build a new filename
1681          using EXTRA_SHLIB_EXTENSION.  */
1682       opened = ldfile_try_open_bfd (string, entry);
1683       if (!opened)
1684         strcpy (string + len - 4, EXTRA_SHLIB_EXTENSION);
1685 #endif
1686     }
1687
1688   if (!opened && !ldfile_try_open_bfd (string, entry))
1689     {
1690       free (string);
1691       return FALSE;
1692     }
1693
1694   entry->filename = string;
1695
1696   /* We have found a dynamic object to include in the link.  The ELF
1697      backend linker will create a DT_NEEDED entry in the .dynamic
1698      section naming this file.  If this file includes a DT_SONAME
1699      entry, it will be used.  Otherwise, the ELF linker will just use
1700      the name of the file.  For an archive found by searching, like
1701      this one, the DT_NEEDED entry should consist of just the name of
1702      the file, without the path information used to find it.  Note
1703      that we only need to do this if we have a dynamic object; an
1704      archive will never be referenced by a DT_NEEDED entry.
1705
1706      FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
1707      very pretty.  I haven't been able to think of anything that is
1708      pretty, though.  */
1709   if (bfd_check_format (entry->the_bfd, bfd_object)
1710       && (entry->the_bfd->flags & DYNAMIC) != 0)
1711     {
1712       ASSERT (entry->flags.maybe_archive && entry->flags.search_dirs);
1713
1714       /* Rather than duplicating the logic above.  Just use the
1715          filename we recorded earlier.  */
1716
1717       if (!entry->flags.full_name_provided)
1718         filename = lbasename (entry->filename);
1719       bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
1720     }
1721
1722   return TRUE;
1723 }
1724
1725 EOF
1726 fi
1727
1728 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
1729 fragment <<EOF
1730
1731 /* A variant of lang_output_section_find used by place_orphan.  */
1732
1733 static lang_output_section_statement_type *
1734 output_rel_find (asection *sec, int isdyn)
1735 {
1736   lang_output_section_statement_type *lookup;
1737   lang_output_section_statement_type *last = NULL;
1738   lang_output_section_statement_type *last_alloc = NULL;
1739   lang_output_section_statement_type *last_ro_alloc = NULL;
1740   lang_output_section_statement_type *last_rel = NULL;
1741   lang_output_section_statement_type *last_rel_alloc = NULL;
1742   int rela = sec->name[4] == 'a';
1743
1744   for (lookup = &lang_output_section_statement.head->output_section_statement;
1745        lookup != NULL;
1746        lookup = lookup->next)
1747     {
1748       if (lookup->constraint >= 0
1749           && CONST_STRNEQ (lookup->name, ".rel"))
1750         {
1751           int lookrela = lookup->name[4] == 'a';
1752
1753           /* .rel.dyn must come before all other reloc sections, to suit
1754              GNU ld.so.  */
1755           if (isdyn)
1756             break;
1757
1758           /* Don't place after .rel.plt as doing so results in wrong
1759              dynamic tags.  */
1760           if (strcmp (".plt", lookup->name + 4 + lookrela) == 0)
1761             break;
1762
1763           if (rela == lookrela || last_rel == NULL)
1764             last_rel = lookup;
1765           if ((rela == lookrela || last_rel_alloc == NULL)
1766               && lookup->bfd_section != NULL
1767               && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1768             last_rel_alloc = lookup;
1769         }
1770
1771       last = lookup;
1772       if (lookup->bfd_section != NULL
1773           && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1774         {
1775           last_alloc = lookup;
1776           if ((lookup->bfd_section->flags & SEC_READONLY) != 0)
1777             last_ro_alloc = lookup;
1778         }
1779     }
1780
1781   if (last_rel_alloc)
1782     return last_rel_alloc;
1783
1784   if (last_rel)
1785     return last_rel;
1786
1787   if (last_ro_alloc)
1788     return last_ro_alloc;
1789
1790   if (last_alloc)
1791     return last_alloc;
1792
1793   return last;
1794 }
1795
1796 /* Place an orphan section.  We use this to put random SHF_ALLOC
1797    sections in the right segment.  */
1798
1799 static lang_output_section_statement_type *
1800 gld${EMULATION_NAME}_place_orphan (asection *s,
1801                                    const char *secname,
1802                                    int constraint)
1803 {
1804   static struct orphan_save hold[] =
1805     {
1806       { ".text",
1807         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1808         0, 0, 0, 0 },
1809       { ".rodata",
1810         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1811         0, 0, 0, 0 },
1812       { ".tdata",
1813         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_THREAD_LOCAL,
1814         0, 0, 0, 0 },
1815       { ".data",
1816         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1817         0, 0, 0, 0 },
1818       { ".bss",
1819         SEC_ALLOC,
1820         0, 0, 0, 0 },
1821       { 0,
1822         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1823         0, 0, 0, 0 },
1824       { ".interp",
1825         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1826         0, 0, 0, 0 },
1827       { ".sdata",
1828         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_SMALL_DATA,
1829         0, 0, 0, 0 },
1830       { ".comment",
1831         SEC_HAS_CONTENTS,
1832         0, 0, 0, 0 },
1833     };
1834   enum orphan_save_index
1835     {
1836       orphan_text = 0,
1837       orphan_rodata,
1838       orphan_tdata,
1839       orphan_data,
1840       orphan_bss,
1841       orphan_rel,
1842       orphan_interp,
1843       orphan_sdata,
1844       orphan_nonalloc
1845     };
1846   static int orphan_init_done = 0;
1847   struct orphan_save *place;
1848   lang_output_section_statement_type *after;
1849   lang_output_section_statement_type *os;
1850   lang_output_section_statement_type *match_by_name = NULL;
1851   int isdyn = 0;
1852   int iself = s->owner->xvec->flavour == bfd_target_elf_flavour;
1853   unsigned int sh_type = iself ? elf_section_type (s) : SHT_NULL;
1854
1855   if (!bfd_link_relocatable (&link_info)
1856       && link_info.combreloc
1857       && (s->flags & SEC_ALLOC))
1858     {
1859       if (iself)
1860         switch (sh_type)
1861           {
1862           case SHT_RELA:
1863             secname = ".rela.dyn";
1864             isdyn = 1;
1865             break;
1866           case SHT_REL:
1867             secname = ".rel.dyn";
1868             isdyn = 1;
1869             break;
1870           default:
1871             break;
1872           }
1873       else if (CONST_STRNEQ (secname, ".rel"))
1874         {
1875           secname = secname[4] == 'a' ? ".rela.dyn" : ".rel.dyn";
1876           isdyn = 1;
1877         }
1878     }
1879
1880   /* Look through the script to see where to place this section.  */
1881   if (constraint == 0)
1882     for (os = lang_output_section_find (secname);
1883          os != NULL;
1884          os = next_matching_output_section_statement (os, 0))
1885       {
1886         /* If we don't match an existing output section, tell
1887            lang_insert_orphan to create a new output section.  */
1888         constraint = SPECIAL;
1889
1890         if (os->bfd_section != NULL
1891             && (os->bfd_section->flags == 0
1892                 || (_bfd_elf_match_sections_by_type (link_info.output_bfd,
1893                                                      os->bfd_section,
1894                                                      s->owner, s)
1895                     && ((s->flags ^ os->bfd_section->flags)
1896                         & (SEC_LOAD | SEC_ALLOC)) == 0)))
1897           {
1898             /* We already have an output section statement with this
1899                name, and its bfd section has compatible flags.
1900                If the section already exists but does not have any flags
1901                set, then it has been created by the linker, probably as a
1902                result of a --section-start command line switch.  */
1903             lang_add_section (&os->children, s, NULL, os);
1904             return os;
1905           }
1906
1907         /* Save unused output sections in case we can match them
1908            against orphans later.  */
1909         if (os->bfd_section == NULL)
1910           match_by_name = os;
1911       }
1912
1913   /* If we didn't match an active output section, see if we matched an
1914      unused one and use that.  */
1915   if (match_by_name)
1916     {
1917       lang_add_section (&match_by_name->children, s, NULL, match_by_name);
1918       return match_by_name;
1919     }
1920
1921   if (!orphan_init_done)
1922     {
1923       struct orphan_save *ho;
1924
1925       for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
1926         if (ho->name != NULL)
1927           {
1928             ho->os = lang_output_section_find (ho->name);
1929             if (ho->os != NULL && ho->os->flags == 0)
1930               ho->os->flags = ho->flags;
1931           }
1932       orphan_init_done = 1;
1933     }
1934
1935   /* If this is a final link, then always put .gnu.warning.SYMBOL
1936      sections into the .text section to get them out of the way.  */
1937   if (bfd_link_executable (&link_info)
1938       && CONST_STRNEQ (s->name, ".gnu.warning.")
1939       && hold[orphan_text].os != NULL)
1940     {
1941       os = hold[orphan_text].os;
1942       lang_add_section (&os->children, s, NULL, os);
1943       return os;
1944     }
1945
1946   /* Decide which segment the section should go in based on the
1947      section name and section flags.  We put loadable .note sections
1948      right after the .interp section, so that the PT_NOTE segment is
1949      stored right after the program headers where the OS can read it
1950      in the first page.  */
1951
1952   place = NULL;
1953   if ((s->flags & (SEC_ALLOC | SEC_DEBUGGING)) == 0)
1954     place = &hold[orphan_nonalloc];
1955   else if ((s->flags & SEC_ALLOC) == 0)
1956     ;
1957   else if ((s->flags & SEC_LOAD) != 0
1958            && ((iself && sh_type == SHT_NOTE)
1959                || (!iself && CONST_STRNEQ (secname, ".note"))))
1960     place = &hold[orphan_interp];
1961   else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS | SEC_THREAD_LOCAL)) == 0)
1962     place = &hold[orphan_bss];
1963   else if ((s->flags & SEC_SMALL_DATA) != 0)
1964     place = &hold[orphan_sdata];
1965   else if ((s->flags & SEC_THREAD_LOCAL) != 0)
1966     place = &hold[orphan_tdata];
1967   else if ((s->flags & SEC_READONLY) == 0)
1968     place = &hold[orphan_data];
1969   else if (((iself && (sh_type == SHT_RELA || sh_type == SHT_REL))
1970             || (!iself && CONST_STRNEQ (secname, ".rel")))
1971            && (s->flags & SEC_LOAD) != 0)
1972     place = &hold[orphan_rel];
1973   else if ((s->flags & SEC_CODE) == 0)
1974     place = &hold[orphan_rodata];
1975   else
1976     place = &hold[orphan_text];
1977
1978   after = NULL;
1979   if (place != NULL)
1980     {
1981       if (place->os == NULL)
1982         {
1983           if (place->name != NULL)
1984             place->os = lang_output_section_find (place->name);
1985           else
1986             place->os = output_rel_find (s, isdyn);
1987         }
1988       after = place->os;
1989       if (after == NULL)
1990         after = lang_output_section_find_by_flags
1991           (s, &place->os, _bfd_elf_match_sections_by_type);
1992       if (after == NULL)
1993         /* *ABS* is always the first output section statement.  */
1994         after = &lang_output_section_statement.head->output_section_statement;
1995     }
1996
1997   return lang_insert_orphan (s, secname, constraint, after, place, NULL, NULL);
1998 }
1999 EOF
2000 fi
2001
2002 if test x"$LDEMUL_AFTER_ALLOCATION" != xgld"$EMULATION_NAME"_after_allocation; then
2003 fragment <<EOF
2004
2005 static void
2006 gld${EMULATION_NAME}_after_allocation (void)
2007 {
2008   int need_layout = bfd_elf_discard_info (link_info.output_bfd, &link_info);
2009
2010   if (need_layout < 0)
2011     einfo ("%X%P: .eh_frame/.stab edit: %E\n");
2012   else
2013     gld${EMULATION_NAME}_map_segments (need_layout);
2014 }
2015 EOF
2016 fi
2017
2018 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
2019 fragment <<EOF
2020
2021 static char *
2022 gld${EMULATION_NAME}_get_script (int *isfile)
2023 EOF
2024
2025 if test x"$COMPILE_IN" = xyes
2026 then
2027 # Scripts compiled in.
2028
2029 # sed commands to quote an ld script as a C string.
2030 sc="-f stringify.sed"
2031
2032 fragment <<EOF
2033 {
2034   *isfile = 0;
2035
2036   if (bfd_link_relocatable (&link_info) && config.build_constructors)
2037     return
2038 EOF
2039 sed $sc ldscripts/${EMULATION_NAME}.xu                  >> e${EMULATION_NAME}.c
2040 echo '  ; else if (bfd_link_relocatable (&link_info)) return' >> e${EMULATION_NAME}.c
2041 sed $sc ldscripts/${EMULATION_NAME}.xr                  >> e${EMULATION_NAME}.c
2042 echo '  ; else if (!config.text_read_only) return'      >> e${EMULATION_NAME}.c
2043 sed $sc ldscripts/${EMULATION_NAME}.xbn                 >> e${EMULATION_NAME}.c
2044 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
2045 echo '  ; else if (!config.magic_demand_paged) return'  >> e${EMULATION_NAME}.c
2046 sed $sc ldscripts/${EMULATION_NAME}.xn                  >> e${EMULATION_NAME}.c
2047 fi
2048 if test -n "$GENERATE_PIE_SCRIPT" ; then
2049 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2050 echo '  ; else if (bfd_link_pie (&link_info)'           >> e${EMULATION_NAME}.c
2051 echo '             && link_info.combreloc'              >> e${EMULATION_NAME}.c
2052 echo '             && link_info.relro'                  >> e${EMULATION_NAME}.c
2053 echo '             && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
2054 sed $sc ldscripts/${EMULATION_NAME}.xdw                 >> e${EMULATION_NAME}.c
2055 echo '  ; else if (bfd_link_pie (&link_info)'           >> e${EMULATION_NAME}.c
2056 echo '             && link_info.combreloc) return'      >> e${EMULATION_NAME}.c
2057 sed $sc ldscripts/${EMULATION_NAME}.xdc                 >> e${EMULATION_NAME}.c
2058 fi
2059 echo '  ; else if (bfd_link_pie (&link_info)) return'   >> e${EMULATION_NAME}.c
2060 sed $sc ldscripts/${EMULATION_NAME}.xd                  >> e${EMULATION_NAME}.c
2061 fi
2062 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
2063 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2064 echo '  ; else if (bfd_link_dll (&link_info) && link_info.combreloc' >> e${EMULATION_NAME}.c
2065 echo '             && link_info.relro' >> e${EMULATION_NAME}.c
2066 echo '             && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
2067 sed $sc ldscripts/${EMULATION_NAME}.xsw                 >> e${EMULATION_NAME}.c
2068 echo '  ; else if (bfd_link_dll (&link_info) && link_info.combreloc) return' >> e${EMULATION_NAME}.c
2069 sed $sc ldscripts/${EMULATION_NAME}.xsc                 >> e${EMULATION_NAME}.c
2070 fi
2071 echo '  ; else if (bfd_link_dll (&link_info)) return'   >> e${EMULATION_NAME}.c
2072 sed $sc ldscripts/${EMULATION_NAME}.xs                  >> e${EMULATION_NAME}.c
2073 fi
2074 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2075 echo '  ; else if (link_info.combreloc && link_info.relro' >> e${EMULATION_NAME}.c
2076 echo '             && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
2077 sed $sc ldscripts/${EMULATION_NAME}.xw                  >> e${EMULATION_NAME}.c
2078 echo '  ; else if (link_info.combreloc) return'         >> e${EMULATION_NAME}.c
2079 sed $sc ldscripts/${EMULATION_NAME}.xc                  >> e${EMULATION_NAME}.c
2080 fi
2081 echo '  ; else return'                                  >> e${EMULATION_NAME}.c
2082 sed $sc ldscripts/${EMULATION_NAME}.x                   >> e${EMULATION_NAME}.c
2083 echo '; }'                                              >> e${EMULATION_NAME}.c
2084
2085 else
2086 # Scripts read from the filesystem.
2087
2088 fragment <<EOF
2089 {
2090   *isfile = 1;
2091
2092   if (bfd_link_relocatable (&link_info) && config.build_constructors)
2093     return "ldscripts/${EMULATION_NAME}.xu";
2094   else if (bfd_link_relocatable (&link_info))
2095     return "ldscripts/${EMULATION_NAME}.xr";
2096   else if (!config.text_read_only)
2097     return "ldscripts/${EMULATION_NAME}.xbn";
2098 EOF
2099 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
2100 else
2101 fragment <<EOF
2102   else if (!config.magic_demand_paged)
2103     return "ldscripts/${EMULATION_NAME}.xn";
2104 EOF
2105 fi
2106 if test -n "$GENERATE_PIE_SCRIPT" ; then
2107 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2108 fragment <<EOF
2109   else if (bfd_link_pie (&link_info)
2110            && link_info.combreloc
2111            && link_info.relro
2112            && (link_info.flags & DF_BIND_NOW))
2113     return "ldscripts/${EMULATION_NAME}.xdw";
2114   else if (bfd_link_pie (&link_info)
2115            && link_info.combreloc)
2116     return "ldscripts/${EMULATION_NAME}.xdc";
2117 EOF
2118 fi
2119 fragment <<EOF
2120   else if (bfd_link_pie (&link_info))
2121     return "ldscripts/${EMULATION_NAME}.xd";
2122 EOF
2123 fi
2124 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
2125 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2126 fragment <<EOF
2127   else if (bfd_link_dll (&link_info) && link_info.combreloc
2128            && link_info.relro && (link_info.flags & DF_BIND_NOW))
2129     return "ldscripts/${EMULATION_NAME}.xsw";
2130   else if (bfd_link_dll (&link_info) && link_info.combreloc)
2131     return "ldscripts/${EMULATION_NAME}.xsc";
2132 EOF
2133 fi
2134 fragment <<EOF
2135   else if (bfd_link_dll (&link_info))
2136     return "ldscripts/${EMULATION_NAME}.xs";
2137 EOF
2138 fi
2139 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2140 fragment <<EOF
2141   else if (link_info.combreloc && link_info.relro
2142            && (link_info.flags & DF_BIND_NOW))
2143     return "ldscripts/${EMULATION_NAME}.xw";
2144   else if (link_info.combreloc)
2145     return "ldscripts/${EMULATION_NAME}.xc";
2146 EOF
2147 fi
2148 fragment <<EOF
2149   else
2150     return "ldscripts/${EMULATION_NAME}.x";
2151 }
2152
2153 EOF
2154 fi
2155 fi
2156
2157 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
2158 fragment <<EOF
2159  $PARSE_AND_LIST_PROLOGUE
2160 EOF
2161 fi
2162
2163 fragment <<EOF
2164
2165 #define OPTION_DISABLE_NEW_DTAGS        (400)
2166 #define OPTION_ENABLE_NEW_DTAGS         (OPTION_DISABLE_NEW_DTAGS + 1)
2167 #define OPTION_GROUP                    (OPTION_ENABLE_NEW_DTAGS + 1)
2168 #define OPTION_EH_FRAME_HDR             (OPTION_GROUP + 1)
2169 #define OPTION_EXCLUDE_LIBS             (OPTION_EH_FRAME_HDR + 1)
2170 #define OPTION_HASH_STYLE               (OPTION_EXCLUDE_LIBS + 1)
2171 #define OPTION_BUILD_ID                 (OPTION_HASH_STYLE + 1)
2172 #define OPTION_AUDIT                    (OPTION_BUILD_ID + 1)
2173 #define OPTION_COMPRESS_DEBUG           (OPTION_AUDIT + 1)
2174
2175 static void
2176 gld${EMULATION_NAME}_add_options
2177   (int ns, char **shortopts, int nl, struct option **longopts,
2178    int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
2179 {
2180 EOF
2181 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2182 fragment <<EOF
2183   static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:P:";
2184 EOF
2185 else
2186 fragment <<EOF
2187   static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:";
2188 EOF
2189 fi
2190 fragment <<EOF
2191   static const struct option xtra_long[] = {
2192 EOF
2193 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2194 fragment <<EOF
2195     {"audit", required_argument, NULL, OPTION_AUDIT},
2196     {"Bgroup", no_argument, NULL, OPTION_GROUP},
2197 EOF
2198 fi
2199 fragment <<EOF
2200     {"build-id", optional_argument, NULL, OPTION_BUILD_ID},
2201     {"compress-debug-sections", required_argument, NULL, OPTION_COMPRESS_DEBUG},
2202 EOF
2203 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2204 fragment <<EOF
2205     {"depaudit", required_argument, NULL, 'P'},
2206     {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
2207     {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
2208     {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
2209     {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
2210     {"hash-style", required_argument, NULL, OPTION_HASH_STYLE},
2211 EOF
2212 fi
2213 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
2214 fragment <<EOF
2215     $PARSE_AND_LIST_LONGOPTS
2216 EOF
2217 fi
2218 fragment <<EOF
2219     {NULL, no_argument, NULL, 0}
2220   };
2221
2222   *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
2223   memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
2224   *longopts = (struct option *)
2225     xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
2226   memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
2227 }
2228
2229 #define DEFAULT_BUILD_ID_STYLE  "sha1"
2230
2231 static bfd_boolean
2232 gld${EMULATION_NAME}_handle_option (int optc)
2233 {
2234   switch (optc)
2235     {
2236     default:
2237       return FALSE;
2238
2239     case OPTION_BUILD_ID:
2240       if (emit_note_gnu_build_id != NULL)
2241         {
2242           free ((char *) emit_note_gnu_build_id);
2243           emit_note_gnu_build_id = NULL;
2244         }
2245       if (optarg == NULL)
2246         optarg = DEFAULT_BUILD_ID_STYLE;
2247       if (strcmp (optarg, "none"))
2248         emit_note_gnu_build_id = xstrdup (optarg);
2249       break;
2250
2251     case OPTION_COMPRESS_DEBUG:
2252       if (strcasecmp (optarg, "none") == 0)
2253         link_info.compress_debug = COMPRESS_DEBUG_NONE;
2254       else if (strcasecmp (optarg, "zlib") == 0)
2255         link_info.compress_debug = COMPRESS_DEBUG_GABI_ZLIB;
2256       else if (strcasecmp (optarg, "zlib-gnu") == 0)
2257         link_info.compress_debug = COMPRESS_DEBUG_GNU_ZLIB;
2258       else if (strcasecmp (optarg, "zlib-gabi") == 0)
2259         link_info.compress_debug = COMPRESS_DEBUG_GABI_ZLIB;
2260       else
2261         einfo (_("%P%F: invalid --compress-debug-sections option: \`%s'\n"),
2262                optarg);
2263       break;
2264 EOF
2265
2266 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2267 fragment <<EOF
2268     case OPTION_AUDIT:
2269         gld${EMULATION_NAME}_append_to_separated_string (&audit, optarg);
2270         break;
2271
2272     case 'P':
2273         gld${EMULATION_NAME}_append_to_separated_string (&depaudit, optarg);
2274         break;
2275
2276     case OPTION_DISABLE_NEW_DTAGS:
2277       link_info.new_dtags = FALSE;
2278       break;
2279
2280     case OPTION_ENABLE_NEW_DTAGS:
2281       link_info.new_dtags = TRUE;
2282       break;
2283
2284     case OPTION_EH_FRAME_HDR:
2285       link_info.eh_frame_hdr_type = DWARF2_EH_HDR;
2286       break;
2287
2288     case OPTION_GROUP:
2289       link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
2290       /* Groups must be self-contained.  */
2291       link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2292       link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
2293       break;
2294
2295     case OPTION_EXCLUDE_LIBS:
2296       add_excluded_libs (optarg);
2297       break;
2298
2299     case OPTION_HASH_STYLE:
2300       link_info.emit_hash = FALSE;
2301       link_info.emit_gnu_hash = FALSE;
2302       if (strcmp (optarg, "sysv") == 0)
2303         link_info.emit_hash = TRUE;
2304       else if (strcmp (optarg, "gnu") == 0)
2305         link_info.emit_gnu_hash = TRUE;
2306       else if (strcmp (optarg, "both") == 0)
2307         {
2308           link_info.emit_hash = TRUE;
2309           link_info.emit_gnu_hash = TRUE;
2310         }
2311       else
2312         einfo (_("%P%F: invalid hash style \`%s'\n"), optarg);
2313       break;
2314
2315 EOF
2316 fi
2317 fragment <<EOF
2318     case 'z':
2319       if (strcmp (optarg, "defs") == 0)
2320         link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2321       else if (strcmp (optarg, "muldefs") == 0)
2322         link_info.allow_multiple_definition = TRUE;
2323       else if (CONST_STRNEQ (optarg, "max-page-size="))
2324         {
2325           char *end;
2326
2327           config.maxpagesize = strtoul (optarg + 14, &end, 0);
2328           if (*end || (config.maxpagesize & (config.maxpagesize - 1)) != 0)
2329             einfo (_("%P%F: invalid maxium page size \`%s'\n"),
2330                    optarg + 14);
2331         }
2332       else if (CONST_STRNEQ (optarg, "common-page-size="))
2333         {
2334           char *end;
2335           config.commonpagesize = strtoul (optarg + 17, &end, 0);
2336           if (*end
2337               || (config.commonpagesize & (config.commonpagesize - 1)) != 0)
2338             einfo (_("%P%F: invalid common page size \`%s'\n"),
2339                    optarg + 17);
2340         }
2341       else if (CONST_STRNEQ (optarg, "stack-size="))
2342         {
2343           char *end;
2344           link_info.stacksize = strtoul (optarg + 11, &end, 0);
2345           if (*end || link_info.stacksize < 0)
2346             einfo (_("%P%F: invalid stack size \`%s'\n"), optarg + 11);
2347           if (!link_info.stacksize)
2348             /* Use -1 for explicit no-stack, because zero means
2349                'default'.   */
2350             link_info.stacksize = -1;
2351         }
2352       else if (strcmp (optarg, "execstack") == 0)
2353         {
2354           link_info.execstack = TRUE;
2355           link_info.noexecstack = FALSE;
2356         }
2357       else if (strcmp (optarg, "noexecstack") == 0)
2358         {
2359           link_info.noexecstack = TRUE;
2360           link_info.execstack = FALSE;
2361         }
2362 EOF
2363
2364 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2365 fragment <<EOF
2366       else if (strcmp (optarg, "global") == 0)
2367         link_info.flags_1 |= (bfd_vma) DF_1_GLOBAL;
2368       else if (strcmp (optarg, "initfirst") == 0)
2369         link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
2370       else if (strcmp (optarg, "interpose") == 0)
2371         link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
2372       else if (strcmp (optarg, "loadfltr") == 0)
2373         link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
2374       else if (strcmp (optarg, "nodefaultlib") == 0)
2375         link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
2376       else if (strcmp (optarg, "nodelete") == 0)
2377         link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
2378       else if (strcmp (optarg, "nodlopen") == 0)
2379         link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
2380       else if (strcmp (optarg, "nodump") == 0)
2381         link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
2382       else if (strcmp (optarg, "now") == 0)
2383         {
2384           link_info.flags |= (bfd_vma) DF_BIND_NOW;
2385           link_info.flags_1 |= (bfd_vma) DF_1_NOW;
2386         }
2387       else if (strcmp (optarg, "lazy") == 0)
2388         {
2389           link_info.flags &= ~(bfd_vma) DF_BIND_NOW;
2390           link_info.flags_1 &= ~(bfd_vma) DF_1_NOW;
2391         }
2392       else if (strcmp (optarg, "origin") == 0)
2393         {
2394           link_info.flags |= (bfd_vma) DF_ORIGIN;
2395           link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
2396         }
2397       else if (strcmp (optarg, "combreloc") == 0)
2398         link_info.combreloc = TRUE;
2399       else if (strcmp (optarg, "nocombreloc") == 0)
2400         link_info.combreloc = FALSE;
2401       else if (strcmp (optarg, "nocopyreloc") == 0)
2402         link_info.nocopyreloc = TRUE;
2403       else if (strcmp (optarg, "relro") == 0)
2404         link_info.relro = TRUE;
2405       else if (strcmp (optarg, "norelro") == 0)
2406         link_info.relro = FALSE;
2407       else if (strcmp (optarg, "text") == 0)
2408         link_info.error_textrel = TRUE;
2409       else if (strcmp (optarg, "notext") == 0)
2410         link_info.error_textrel = FALSE;
2411       else if (strcmp (optarg, "textoff") == 0)
2412         link_info.error_textrel = FALSE;
2413 EOF
2414 fi
2415
2416 if test -n "$PARSE_AND_LIST_ARGS_CASE_Z" ; then
2417 fragment <<EOF
2418  $PARSE_AND_LIST_ARGS_CASE_Z
2419 EOF
2420 fi
2421
2422 fragment <<EOF
2423       else
2424         einfo (_("%P: warning: -z %s ignored.\n"), optarg);
2425       break;
2426 EOF
2427
2428 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
2429 fragment <<EOF
2430  $PARSE_AND_LIST_ARGS_CASES
2431 EOF
2432 fi
2433
2434 fragment <<EOF
2435     }
2436
2437   return TRUE;
2438 }
2439
2440 EOF
2441
2442 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
2443 gld_list_options="gld${EMULATION_NAME}_list_options"
2444 if test -n "$PARSE_AND_LIST_OPTIONS"; then
2445 fragment <<EOF
2446
2447 static void
2448 gld${EMULATION_NAME}_list_options (FILE * file)
2449 {
2450 EOF
2451
2452 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
2453 fragment <<EOF
2454  $PARSE_AND_LIST_OPTIONS
2455 EOF
2456 fi
2457
2458 fragment <<EOF
2459 }
2460 EOF
2461 else
2462   gld_list_options="NULL"
2463 fi
2464
2465 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
2466 fragment <<EOF
2467  $PARSE_AND_LIST_EPILOGUE
2468 EOF
2469 fi
2470 fi
2471
2472 fragment <<EOF
2473
2474 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
2475 {
2476   ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
2477   ${LDEMUL_SYSLIB-syslib_default},
2478   ${LDEMUL_HLL-hll_default},
2479   ${LDEMUL_AFTER_PARSE-gld${EMULATION_NAME}_after_parse},
2480   ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
2481   ${LDEMUL_AFTER_ALLOCATION-gld${EMULATION_NAME}_after_allocation},
2482   ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
2483   ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
2484   ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
2485   ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
2486   "${EMULATION_NAME}",
2487   "${OUTPUT_FORMAT}",
2488   ${LDEMUL_FINISH-finish_default},
2489   ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
2490   ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
2491   ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
2492   ${LDEMUL_SET_SYMBOLS-NULL},
2493   ${LDEMUL_PARSE_ARGS-NULL},
2494   gld${EMULATION_NAME}_add_options,
2495   gld${EMULATION_NAME}_handle_option,
2496   ${LDEMUL_UNRECOGNIZED_FILE-NULL},
2497   ${LDEMUL_LIST_OPTIONS-${gld_list_options}},
2498   ${LDEMUL_RECOGNIZED_FILE-gld${EMULATION_NAME}_load_symbols},
2499   ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
2500   ${LDEMUL_NEW_VERS_PATTERN-NULL},
2501   ${LDEMUL_EXTRA_MAP_FILE_TEXT-NULL}
2502 };
2503 EOF