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