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