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