OSDN Git Service

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