* emultempl/alphaelf.em: Format option help.
[platform/upstream/binutils.git] / ld / emultempl / elf32.em
1 # This shell script emits a C file. -*- C -*-
2 # It does some substitutions.
3 # This file is now misnamed, because it supports both 32 bit and 64 bit
4 # ELF emulations.
5 test -z "${ELFSIZE}" && ELFSIZE=32
6 if [ -z "$MACHINE" ]; then
7   OUTPUT_ARCH=${ARCH}
8 else
9   OUTPUT_ARCH=${ARCH}:${MACHINE}
10 fi
11 fragment <<EOF
12 /* This file is is generated by a shell script.  DO NOT EDIT! */
13
14 /* ${ELFSIZE} bit ELF emulation code for ${EMULATION_NAME}
15    Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
16    2002, 2003, 2004, 2005, 2006, 2007 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 (asec->output_section == NULL)
940     {
941       einfo (_("%P: .note.gnu.build-id section missing"));
942       return FALSE;
943     }
944   i_shdr = &elf_section_data (asec->output_section)->this_hdr;
945
946   if (i_shdr->contents == NULL)
947     {
948       if (asec->contents == NULL)
949         asec->contents = xmalloc (asec->size);
950       contents = asec->contents;
951     }
952   else
953     contents = i_shdr->contents + asec->output_offset;
954
955   e_note = (void *) contents;
956   size = offsetof (Elf_External_Note, name[sizeof "GNU"]);
957   size = (size + 3) & -(bfd_size_type) 4;
958   id_bits = contents + size;
959   size = asec->size - size;
960
961   bfd_h_put_32 (abfd, sizeof "GNU", &e_note->namesz);
962   bfd_h_put_32 (abfd, size, &e_note->descsz);
963   bfd_h_put_32 (abfd, NT_GNU_BUILD_ID, &e_note->type);
964   memcpy (e_note->name, "GNU", sizeof "GNU");
965
966   if (!strcmp (info->style, "md5"))
967     {
968       struct md5_ctx ctx;
969       md5_init_ctx (&ctx);
970       if (bed->s->checksum_contents (abfd,
971                                      (void (*) (const void *, size_t, void *))
972                                      &md5_process_bytes,
973                                      &ctx))
974         md5_finish_ctx (&ctx, id_bits);
975       else
976         return FALSE;
977     }
978   else if (!strcmp (info->style, "sha1"))
979     {
980       struct sha1_ctx ctx;
981       sha1_init_ctx (&ctx);
982       if (bed->s->checksum_contents (abfd,
983                                      (void (*) (const void *, size_t, void *))
984                                      &sha1_process_bytes,
985                                      &ctx))
986         sha1_finish_ctx (&ctx, id_bits);
987       else
988         return FALSE;
989     }
990   else if (!strcmp (info->style, "uuid"))
991     {
992       int n;
993       int fd = open ("/dev/urandom", O_RDONLY);
994       if (fd < 0)
995         return FALSE;
996       n = read (fd, id_bits, size);
997       close (fd);
998       if (n < (int) size)
999         return FALSE;
1000     }
1001   else if (!strncmp (info->style, "0x", 2))
1002     {
1003       /* ID is in string form (hex).  Convert to bits.  */
1004       const char *id = info->style + 2;
1005       size_t n = 0;
1006       do
1007         {
1008           if (ISXDIGIT (id[0]) && ISXDIGIT (id[1]))
1009             {
1010               id_bits[n] = read_hex (*id++) << 4;
1011               id_bits[n++] |= read_hex (*id++);
1012             }
1013           else if (*id == '-' || *id == ':')
1014             ++id;
1015           else
1016             abort ();           /* Should have been validated earlier.  */
1017         } while (*id != '\0');
1018     }
1019   else
1020     abort ();                   /* Should have been validated earlier.  */
1021
1022   size = asec->size;
1023   return (bfd_seek (abfd,
1024                     i_shdr->sh_offset + asec->output_offset, SEEK_SET) == 0
1025           && bfd_bwrite (contents, size, abfd) == size);
1026 }
1027
1028
1029 /* This is called after all the input files have been opened.  */
1030
1031 static void
1032 gld${EMULATION_NAME}_after_open (void)
1033 {
1034   struct bfd_link_needed_list *needed, *l;
1035   struct elf_link_hash_table *htab;
1036
1037   htab = elf_hash_table (&link_info);
1038   if (!is_elf_hash_table (htab))
1039     return;
1040
1041   if (link_info.emit_note_gnu_build_id)
1042     {
1043       bfd *abfd;
1044       asection *s;
1045       bfd_size_type size;
1046
1047       abfd = link_info.input_bfds;
1048
1049       size = gld${EMULATION_NAME}_id_note_section_size (abfd, &link_info);
1050       if (size == 0)
1051         {
1052           einfo ("%P: warning: unrecognized --build-id style ignored.\n");
1053           free (link_info.emit_note_gnu_build_id);
1054           link_info.emit_note_gnu_build_id = NULL;
1055         }
1056       else
1057         {
1058           s = bfd_make_section_with_flags (abfd, ".note.gnu.build-id",
1059                                            SEC_ALLOC | SEC_LOAD
1060                                            | SEC_IN_MEMORY | SEC_LINKER_CREATED
1061                                            | SEC_READONLY | SEC_DATA);
1062           if (s != NULL && bfd_set_section_alignment (abfd, s, 2))
1063             {
1064               struct elf_obj_tdata *t = elf_tdata (output_bfd);
1065               struct build_id_info *b = xmalloc (sizeof *b);
1066               b->style = link_info.emit_note_gnu_build_id;
1067               b->sec = s;
1068               elf_section_type (s) = SHT_NOTE;
1069               s->size = size;
1070               t->after_write_object_contents
1071                 = &gld${EMULATION_NAME}_write_build_id_section;
1072               t->after_write_object_contents_info = b;
1073             }
1074           else
1075             {
1076               einfo ("%P: warning: Cannot create .note.gnu.build-id section,"
1077                      " --build-id ignored.\n");
1078               free (link_info.emit_note_gnu_build_id);
1079               link_info.emit_note_gnu_build_id = NULL;
1080             }
1081         }
1082     }
1083
1084   if (link_info.relocatable)
1085     return;
1086
1087   if (link_info.eh_frame_hdr
1088       && !link_info.traditional_format)
1089     {
1090       bfd *abfd;
1091       asection *s;
1092
1093       for (abfd = link_info.input_bfds; abfd; abfd = abfd->link_next)
1094         {
1095           s = bfd_get_section_by_name (abfd, ".eh_frame");
1096           if (s && s->size > 8 && !bfd_is_abs_section (s->output_section))
1097             break;
1098         }
1099       if (abfd)
1100         {
1101           const struct elf_backend_data *bed;
1102
1103           bed = get_elf_backend_data (abfd);
1104           s = bfd_make_section_with_flags (abfd, ".eh_frame_hdr",
1105                                            bed->dynamic_sec_flags
1106                                            | SEC_READONLY);
1107           if (s != NULL
1108               && bfd_set_section_alignment (abfd, s, 2))
1109             htab->eh_info.hdr_sec = s;
1110           else
1111             einfo ("%P: warning: Cannot create .eh_frame_hdr section,"
1112                    " --eh-frame-hdr ignored.\n");
1113         }
1114     }
1115
1116   /* Get the list of files which appear in DT_NEEDED entries in
1117      dynamic objects included in the link (often there will be none).
1118      For each such file, we want to track down the corresponding
1119      library, and include the symbol table in the link.  This is what
1120      the runtime dynamic linker will do.  Tracking the files down here
1121      permits one dynamic object to include another without requiring
1122      special action by the person doing the link.  Note that the
1123      needed list can actually grow while we are stepping through this
1124      loop.  */
1125   if (!link_info.executable)
1126     return;
1127   needed = bfd_elf_get_needed_list (output_bfd, &link_info);
1128   for (l = needed; l != NULL; l = l->next)
1129     {
1130       struct bfd_link_needed_list *ll;
1131       struct dt_needed n, nn;
1132       int force;
1133
1134       /* If the lib that needs this one was --as-needed and wasn't
1135          found to be needed, then this lib isn't needed either.  */
1136       if (l->by != NULL
1137           && (bfd_elf_get_dyn_lib_class (l->by) & DYN_AS_NEEDED) != 0)
1138         continue;
1139
1140       /* If we've already seen this file, skip it.  */
1141       for (ll = needed; ll != l; ll = ll->next)
1142         if ((ll->by == NULL
1143              || (bfd_elf_get_dyn_lib_class (ll->by) & DYN_AS_NEEDED) == 0)
1144             && strcmp (ll->name, l->name) == 0)
1145           break;
1146       if (ll != l)
1147         continue;
1148
1149       /* See if this file was included in the link explicitly.  */
1150       global_needed = l;
1151       global_found = NULL;
1152       lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
1153       if (global_found != NULL
1154           && (bfd_elf_get_dyn_lib_class (global_found->the_bfd)
1155               & DYN_AS_NEEDED) == 0)
1156         continue;
1157
1158       n.by = l->by;
1159       n.name = l->name;
1160       nn.by = l->by;
1161       if (trace_file_tries)
1162         info_msg (_("%s needed by %B\n"), l->name, l->by);
1163
1164       /* As-needed libs specified on the command line (or linker script)
1165          take priority over libs found in search dirs.  */
1166       if (global_found != NULL)
1167         {
1168           nn.name = global_found->filename;
1169           if (gld${EMULATION_NAME}_try_needed (&nn, TRUE))
1170             continue;
1171         }
1172
1173       /* We need to find this file and include the symbol table.  We
1174          want to search for the file in the same way that the dynamic
1175          linker will search.  That means that we want to use
1176          rpath_link, rpath, then the environment variable
1177          LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
1178          entries (native only), then the linker script LIB_SEARCH_DIRS.
1179          We do not search using the -L arguments.
1180
1181          We search twice.  The first time, we skip objects which may
1182          introduce version mismatches.  The second time, we force
1183          their use.  See gld${EMULATION_NAME}_vercheck comment.  */
1184       for (force = 0; force < 2; force++)
1185         {
1186           size_t len;
1187           search_dirs_type *search;
1188 EOF
1189 if [ "x${NATIVE}" = xyes ] ; then
1190 fragment <<EOF
1191           const char *lib_path;
1192 EOF
1193 fi
1194 if [ "x${USE_LIBPATH}" = xyes ] ; then
1195 fragment <<EOF
1196           struct bfd_link_needed_list *rp;
1197           int found;
1198 EOF
1199 fi
1200 fragment <<EOF
1201
1202           if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
1203                                                   &n, force))
1204             break;
1205 EOF
1206 if [ "x${USE_LIBPATH}" = xyes ] ; then
1207 fragment <<EOF
1208           if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
1209                                                   &n, force))
1210             break;
1211 EOF
1212 fi
1213 if [ "x${NATIVE}" = xyes ] ; then
1214 fragment <<EOF
1215           if (command_line.rpath_link == NULL
1216               && command_line.rpath == NULL)
1217             {
1218               lib_path = (const char *) getenv ("LD_RUN_PATH");
1219               if (gld${EMULATION_NAME}_search_needed (lib_path, &n,
1220                                                       force))
1221                 break;
1222             }
1223           lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
1224           if (gld${EMULATION_NAME}_search_needed (lib_path, &n, force))
1225             break;
1226 EOF
1227 fi
1228 if [ "x${USE_LIBPATH}" = xyes ] ; then
1229 fragment <<EOF
1230           found = 0;
1231           rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
1232           for (; !found && rp != NULL; rp = rp->next)
1233             {
1234               char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
1235               found = (rp->by == l->by
1236                        && gld${EMULATION_NAME}_search_needed (tmpname,
1237                                                               &n,
1238                                                               force));
1239               free (tmpname);
1240             }
1241           if (found)
1242             break;
1243
1244 EOF
1245 fi
1246 if [ "x${USE_LIBPATH}" = xyes ] ; then
1247   case ${target} in
1248     *-*-freebsd* | *-*-dragonfly*)
1249       fragment <<EOF
1250           if (gld${EMULATION_NAME}_check_ld_elf_hints (l->name, force))
1251             break;
1252 EOF
1253     # FreeBSD
1254     ;;
1255
1256     *-*-linux-* | *-*-k*bsd*-*)
1257     # Linux
1258       fragment <<EOF
1259           if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
1260             break;
1261
1262 EOF
1263     ;;
1264   esac
1265 fi
1266 fragment <<EOF
1267           len = strlen (l->name);
1268           for (search = search_head; search != NULL; search = search->next)
1269             {
1270               char *filename;
1271
1272               if (search->cmdline)
1273                 continue;
1274               filename = (char *) xmalloc (strlen (search->name) + len + 2);
1275               sprintf (filename, "%s/%s", search->name, l->name);
1276               nn.name = filename;
1277               if (gld${EMULATION_NAME}_try_needed (&nn, force))
1278                 break;
1279               free (filename);
1280             }
1281           if (search != NULL)
1282             break;
1283 EOF
1284 fragment <<EOF
1285         }
1286
1287       if (force < 2)
1288         continue;
1289
1290       einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
1291              l->name, l->by);
1292     }
1293 }
1294
1295 EOF
1296 fi
1297
1298 fragment <<EOF
1299
1300 /* Look through an expression for an assignment statement.  */
1301
1302 static void
1303 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
1304 {
1305   bfd_boolean provide = FALSE;
1306
1307   switch (exp->type.node_class)
1308     {
1309     case etree_provide:
1310       provide = TRUE;
1311       /* Fall thru */
1312     case etree_assign:
1313       /* We call record_link_assignment even if the symbol is defined.
1314          This is because if it is defined by a dynamic object, we
1315          actually want to use the value defined by the linker script,
1316          not the value from the dynamic object (because we are setting
1317          symbols like etext).  If the symbol is defined by a regular
1318          object, then, as it happens, calling record_link_assignment
1319          will do no harm.  */
1320       if (strcmp (exp->assign.dst, ".") != 0)
1321         {
1322           if (!bfd_elf_record_link_assignment (output_bfd, &link_info,
1323                                                exp->assign.dst, provide,
1324                                                exp->assign.hidden))
1325             einfo ("%P%F: failed to record assignment to %s: %E\n",
1326                    exp->assign.dst);
1327         }
1328       gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1329       break;
1330
1331     case etree_binary:
1332       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1333       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1334       break;
1335
1336     case etree_trinary:
1337       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1338       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1339       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1340       break;
1341
1342     case etree_unary:
1343       gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1344       break;
1345
1346     default:
1347       break;
1348     }
1349 }
1350
1351
1352 /* This is called by the before_allocation routine via
1353    lang_for_each_statement.  It locates any assignment statements, and
1354    tells the ELF backend about them, in case they are assignments to
1355    symbols which are referred to by dynamic objects.  */
1356
1357 static void
1358 gld${EMULATION_NAME}_find_statement_assignment (lang_statement_union_type *s)
1359 {
1360   if (s->header.type == lang_assignment_statement_enum)
1361     gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1362 }
1363
1364 EOF
1365
1366 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
1367   if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
1368     ELF_INTERPRETER_SET_DEFAULT="
1369   if (sinterp != NULL)
1370     {
1371       sinterp->contents = (unsigned char *) ${ELF_INTERPRETER_NAME};
1372       sinterp->size = strlen ((char *) sinterp->contents) + 1;
1373     }
1374
1375 "
1376   else
1377     ELF_INTERPRETER_SET_DEFAULT=
1378   fi
1379 fragment <<EOF
1380
1381 /* This is called after the sections have been attached to output
1382    sections, but before any sizes or addresses have been set.  */
1383
1384 static void
1385 gld${EMULATION_NAME}_before_allocation (void)
1386 {
1387   const char *rpath;
1388   asection *sinterp;
1389
1390   if (link_info.hash->type == bfd_link_elf_hash_table)
1391     _bfd_elf_tls_setup (output_bfd, &link_info);
1392
1393   /* If we are going to make any variable assignments, we need to let
1394      the ELF backend know about them in case the variables are
1395      referred to by dynamic objects.  */
1396   lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
1397
1398   /* Let the ELF backend work out the sizes of any sections required
1399      by dynamic linking.  */
1400   rpath = command_line.rpath;
1401   if (rpath == NULL)
1402     rpath = (const char *) getenv ("LD_RUN_PATH");
1403   if (! (bfd_elf_size_dynamic_sections
1404          (output_bfd, command_line.soname, rpath,
1405           command_line.filter_shlib,
1406           (const char * const *) command_line.auxiliary_filters,
1407           &link_info, &sinterp, lang_elf_version_info)))
1408     einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1409
1410 ${ELF_INTERPRETER_SET_DEFAULT}
1411   /* Let the user override the dynamic linker we are using.  */
1412   if (command_line.interpreter != NULL
1413       && sinterp != NULL)
1414     {
1415       sinterp->contents = (bfd_byte *) command_line.interpreter;
1416       sinterp->size = strlen (command_line.interpreter) + 1;
1417     }
1418
1419   /* Look for any sections named .gnu.warning.  As a GNU extensions,
1420      we treat such sections as containing warning messages.  We print
1421      out the warning message, and then zero out the section size so
1422      that it does not get copied into the output file.  */
1423
1424   {
1425     LANG_FOR_EACH_INPUT_STATEMENT (is)
1426       {
1427         asection *s;
1428         bfd_size_type sz;
1429         char *msg;
1430         bfd_boolean ret;
1431
1432         if (is->just_syms_flag)
1433           continue;
1434
1435         s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
1436         if (s == NULL)
1437           continue;
1438
1439         sz = s->size;
1440         msg = xmalloc ((size_t) (sz + 1));
1441         if (! bfd_get_section_contents (is->the_bfd, s, msg,
1442                                         (file_ptr) 0, sz))
1443           einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
1444                  is->the_bfd);
1445         msg[sz] = '\0';
1446         ret = link_info.callbacks->warning (&link_info, msg,
1447                                             (const char *) NULL,
1448                                             is->the_bfd, (asection *) NULL,
1449                                             (bfd_vma) 0);
1450         ASSERT (ret);
1451         free (msg);
1452
1453         /* Clobber the section size, so that we don't waste space
1454            copying the warning into the output file.  If we've already
1455            sized the output section, adjust its size.  The adjustment
1456            is on rawsize because targets that size sections early will
1457            have called lang_reset_memory_regions after sizing.  */
1458         if (s->output_section != NULL
1459             && s->output_section->rawsize >= s->size)
1460           s->output_section->rawsize -= s->size;
1461
1462         s->size = 0;
1463
1464         /* Also set SEC_EXCLUDE, so that local symbols defined in the
1465            warning section don't get copied to the output.  */
1466         s->flags |= SEC_EXCLUDE | SEC_KEEP;
1467       }
1468   }
1469
1470   before_allocation_default ();
1471
1472   if (!bfd_elf_size_dynsym_hash_dynstr (output_bfd, &link_info))
1473     einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1474 }
1475
1476 EOF
1477 fi
1478
1479 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
1480 fragment <<EOF
1481
1482 /* Try to open a dynamic archive.  This is where we know that ELF
1483    dynamic libraries have an extension of .so (or .sl on oddball systems
1484    like hpux).  */
1485
1486 static bfd_boolean
1487 gld${EMULATION_NAME}_open_dynamic_archive
1488   (const char *arch, search_dirs_type *search, lang_input_statement_type *entry)
1489 {
1490   const char *filename;
1491   char *string;
1492
1493   if (! entry->is_archive)
1494     return FALSE;
1495
1496   filename = entry->filename;
1497
1498   /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
1499      is defined, but it does not seem worth the headache to optimize
1500      away those two bytes of space.  */
1501   string = (char *) xmalloc (strlen (search->name)
1502                              + strlen (filename)
1503                              + strlen (arch)
1504 #ifdef EXTRA_SHLIB_EXTENSION
1505                              + strlen (EXTRA_SHLIB_EXTENSION)
1506 #endif
1507                              + sizeof "/lib.so");
1508
1509   sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
1510
1511 #ifdef EXTRA_SHLIB_EXTENSION
1512   /* Try the .so extension first.  If that fails build a new filename
1513      using EXTRA_SHLIB_EXTENSION.  */
1514   if (! ldfile_try_open_bfd (string, entry))
1515     sprintf (string, "%s/lib%s%s%s", search->name,
1516              filename, arch, EXTRA_SHLIB_EXTENSION);
1517 #endif
1518
1519   if (! ldfile_try_open_bfd (string, entry))
1520     {
1521       free (string);
1522       return FALSE;
1523     }
1524
1525   entry->filename = string;
1526
1527   /* We have found a dynamic object to include in the link.  The ELF
1528      backend linker will create a DT_NEEDED entry in the .dynamic
1529      section naming this file.  If this file includes a DT_SONAME
1530      entry, it will be used.  Otherwise, the ELF linker will just use
1531      the name of the file.  For an archive found by searching, like
1532      this one, the DT_NEEDED entry should consist of just the name of
1533      the file, without the path information used to find it.  Note
1534      that we only need to do this if we have a dynamic object; an
1535      archive will never be referenced by a DT_NEEDED entry.
1536
1537      FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
1538      very pretty.  I haven't been able to think of anything that is
1539      pretty, though.  */
1540   if (bfd_check_format (entry->the_bfd, bfd_object)
1541       && (entry->the_bfd->flags & DYNAMIC) != 0)
1542     {
1543       ASSERT (entry->is_archive && entry->search_dirs_flag);
1544
1545       /* Rather than duplicating the logic above.  Just use the
1546          filename we recorded earlier.  */
1547
1548       filename = lbasename (entry->filename);
1549       bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
1550     }
1551
1552   return TRUE;
1553 }
1554
1555 EOF
1556 fi
1557
1558 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
1559 fragment <<EOF
1560
1561 /* A variant of lang_output_section_find used by place_orphan.  */
1562
1563 static lang_output_section_statement_type *
1564 output_rel_find (asection *sec, int isdyn)
1565 {
1566   lang_output_section_statement_type *lookup;
1567   lang_output_section_statement_type *last = NULL;
1568   lang_output_section_statement_type *last_alloc = NULL;
1569   lang_output_section_statement_type *last_ro_alloc = NULL;
1570   lang_output_section_statement_type *last_rel = NULL;
1571   lang_output_section_statement_type *last_rel_alloc = NULL;
1572   int rela = sec->name[4] == 'a';
1573
1574   for (lookup = &lang_output_section_statement.head->output_section_statement;
1575        lookup != NULL;
1576        lookup = lookup->next)
1577     {
1578       if (lookup->constraint != -1
1579           && CONST_STRNEQ (lookup->name, ".rel"))
1580         {
1581           int lookrela = lookup->name[4] == 'a';
1582
1583           /* .rel.dyn must come before all other reloc sections, to suit
1584              GNU ld.so.  */
1585           if (isdyn)
1586             break;
1587
1588           /* Don't place after .rel.plt as doing so results in wrong
1589              dynamic tags.  */
1590           if (strcmp (".plt", lookup->name + 4 + lookrela) == 0)
1591             break;
1592
1593           if (rela == lookrela || last_rel == NULL)
1594             last_rel = lookup;
1595           if ((rela == lookrela || last_rel_alloc == NULL)
1596               && lookup->bfd_section != NULL
1597               && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1598             last_rel_alloc = lookup;
1599         }
1600
1601       last = lookup;
1602       if (lookup->bfd_section != NULL
1603           && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1604         {
1605           last_alloc = lookup;
1606           if ((lookup->bfd_section->flags & SEC_READONLY) != 0)
1607             last_ro_alloc = lookup;
1608         }
1609     }
1610
1611   if (last_rel_alloc)
1612     return last_rel_alloc;
1613
1614   if (last_rel)
1615     return last_rel;
1616
1617   if (last_ro_alloc)
1618     return last_ro_alloc;
1619
1620   if (last_alloc)
1621     return last_alloc;
1622
1623   return last;
1624 }
1625
1626 /* Place an orphan section.  We use this to put random SHF_ALLOC
1627    sections in the right segment.  */
1628
1629 static bfd_boolean
1630 gld${EMULATION_NAME}_place_orphan (asection *s)
1631 {
1632   static struct orphan_save hold[] =
1633     {
1634       { ".text",
1635         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1636         0, 0, 0, 0 },
1637       { ".rodata",
1638         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1639         0, 0, 0, 0 },
1640       { ".data",
1641         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1642         0, 0, 0, 0 },
1643       { ".bss",
1644         SEC_ALLOC,
1645         0, 0, 0, 0 },
1646       { 0,
1647         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1648         0, 0, 0, 0 },
1649       { ".interp",
1650         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1651         0, 0, 0, 0 },
1652       { ".sdata",
1653         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_SMALL_DATA,
1654         0, 0, 0, 0 }
1655     };
1656   enum orphan_save_index
1657     {
1658       orphan_text = 0,
1659       orphan_rodata,
1660       orphan_data,
1661       orphan_bss,
1662       orphan_rel,
1663       orphan_interp,
1664       orphan_sdata
1665     };
1666   static int orphan_init_done = 0;
1667   struct orphan_save *place;
1668   const char *secname;
1669   lang_output_section_statement_type *after;
1670   lang_output_section_statement_type *os;
1671   int isdyn = 0;
1672   int iself = s->owner->xvec->flavour == bfd_target_elf_flavour;
1673   unsigned int sh_type = iself ? elf_section_type (s) : SHT_NULL;
1674
1675   secname = bfd_get_section_name (s->owner, s);
1676
1677   if (! link_info.relocatable
1678       && link_info.combreloc
1679       && (s->flags & SEC_ALLOC))
1680     {
1681       if (iself)
1682         switch (sh_type)
1683           {
1684           case SHT_RELA:
1685             secname = ".rela.dyn";
1686             isdyn = 1;
1687             break;
1688           case SHT_REL:
1689             secname = ".rel.dyn";
1690             isdyn = 1;
1691             break;
1692           default:
1693             break;
1694           }
1695       else if (CONST_STRNEQ (secname, ".rel"))
1696         {
1697           secname = secname[4] == 'a' ? ".rela.dyn" : ".rel.dyn";
1698           isdyn = 1;
1699         }
1700     }
1701
1702   if (isdyn || (!config.unique_orphan_sections && !unique_section_p (s)))
1703     {
1704       /* Look through the script to see where to place this section.  */
1705       os = lang_output_section_find (secname);
1706
1707       if (os != NULL
1708           && (os->bfd_section == NULL
1709               || os->bfd_section->flags == 0
1710               || (_bfd_elf_match_sections_by_type (output_bfd,
1711                                                    os->bfd_section,
1712                                                    s->owner, s)
1713                   && ((s->flags ^ os->bfd_section->flags)
1714                       & (SEC_LOAD | SEC_ALLOC)) == 0)))
1715         {
1716           /* We already have an output section statement with this
1717              name, and its bfd section, if any, has compatible flags.
1718              If the section already exists but does not have any flags
1719              set, then it has been created by the linker, probably as a
1720              result of a --section-start command line switch.  */
1721           lang_add_section (&os->children, s, os);
1722           return TRUE;
1723         }
1724     }
1725
1726   if (!orphan_init_done)
1727     {
1728       struct orphan_save *ho;
1729       for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
1730         if (ho->name != NULL)
1731           {
1732             ho->os = lang_output_section_find (ho->name);
1733             if (ho->os != NULL && ho->os->flags == 0)
1734               ho->os->flags = ho->flags;
1735           }
1736       orphan_init_done = 1;
1737     }
1738
1739   /* If this is a final link, then always put .gnu.warning.SYMBOL
1740      sections into the .text section to get them out of the way.  */
1741   if (link_info.executable
1742       && ! link_info.relocatable
1743       && CONST_STRNEQ (secname, ".gnu.warning.")
1744       && hold[orphan_text].os != NULL)
1745     {
1746       lang_add_section (&hold[orphan_text].os->children, s,
1747                         hold[orphan_text].os);
1748       return TRUE;
1749     }
1750
1751   /* Decide which segment the section should go in based on the
1752      section name and section flags.  We put loadable .note sections
1753      right after the .interp section, so that the PT_NOTE segment is
1754      stored right after the program headers where the OS can read it
1755      in the first page.  */
1756
1757   place = NULL;
1758   if ((s->flags & SEC_ALLOC) == 0)
1759     ;
1760   else if ((s->flags & SEC_LOAD) != 0
1761            && ((iself && sh_type == SHT_NOTE)
1762                || (!iself && CONST_STRNEQ (secname, ".note"))))
1763     place = &hold[orphan_interp];
1764   else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
1765     place = &hold[orphan_bss];
1766   else if ((s->flags & SEC_SMALL_DATA) != 0)
1767     place = &hold[orphan_sdata];
1768   else if ((s->flags & SEC_READONLY) == 0)
1769     place = &hold[orphan_data];
1770   else if (((iself && (sh_type == SHT_RELA || sh_type == SHT_REL))
1771             || (!iself && CONST_STRNEQ (secname, ".rel")))
1772            && (s->flags & SEC_LOAD) != 0)
1773     place = &hold[orphan_rel];
1774   else if ((s->flags & SEC_CODE) == 0)
1775     place = &hold[orphan_rodata];
1776   else
1777     place = &hold[orphan_text];
1778
1779   after = NULL;
1780   if (place != NULL)
1781     {
1782       if (place->os == NULL)
1783         {
1784           if (place->name != NULL)
1785             place->os = lang_output_section_find (place->name);
1786           else
1787             place->os = output_rel_find (s, isdyn);
1788         }
1789       after = place->os;
1790       if (after == NULL)
1791         after = lang_output_section_find_by_flags
1792           (s, &place->os, _bfd_elf_match_sections_by_type);
1793       if (after == NULL)
1794         /* *ABS* is always the first output section statement.  */
1795         after = &lang_output_section_statement.head->output_section_statement;
1796     }
1797
1798   /* Choose a unique name for the section.  This will be needed if the
1799      same section name appears in the input file with different
1800      loadable or allocatable characteristics.  */
1801   if (bfd_get_section_by_name (output_bfd, secname) != NULL)
1802     {
1803       static int count = 1;
1804       secname = bfd_get_unique_section_name (output_bfd, secname, &count);
1805       if (secname == NULL)
1806         einfo ("%F%P: place_orphan failed: %E\n");
1807     }
1808
1809   lang_insert_orphan (s, secname, after, place, NULL, NULL);
1810
1811   return TRUE;
1812 }
1813 EOF
1814 fi
1815
1816 if test x"$LDEMUL_FINISH" != xgld"$EMULATION_NAME"_finish; then
1817 fragment <<EOF
1818
1819 static void
1820 gld${EMULATION_NAME}_finish (void)
1821 {
1822   bfd_boolean need_layout = bfd_elf_discard_info (output_bfd, &link_info);
1823
1824   gld${EMULATION_NAME}_map_segments (need_layout);
1825   finish_default ();
1826 }
1827 EOF
1828 fi
1829
1830 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1831 fragment <<EOF
1832
1833 static char *
1834 gld${EMULATION_NAME}_get_script (int *isfile)
1835 EOF
1836
1837 if test -n "$COMPILE_IN"
1838 then
1839 # Scripts compiled in.
1840
1841 # sed commands to quote an ld script as a C string.
1842 sc="-f stringify.sed"
1843
1844 fragment <<EOF
1845 {
1846   *isfile = 0;
1847
1848   if (link_info.relocatable && config.build_constructors)
1849     return
1850 EOF
1851 sed $sc ldscripts/${EMULATION_NAME}.xu                  >> e${EMULATION_NAME}.c
1852 echo '  ; else if (link_info.relocatable) return'       >> e${EMULATION_NAME}.c
1853 sed $sc ldscripts/${EMULATION_NAME}.xr                  >> e${EMULATION_NAME}.c
1854 echo '  ; else if (!config.text_read_only) return'      >> e${EMULATION_NAME}.c
1855 sed $sc ldscripts/${EMULATION_NAME}.xbn                 >> e${EMULATION_NAME}.c
1856 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
1857 echo '  ; else if (!config.magic_demand_paged) return'  >> e${EMULATION_NAME}.c
1858 sed $sc ldscripts/${EMULATION_NAME}.xn                  >> e${EMULATION_NAME}.c
1859 fi
1860 if test -n "$GENERATE_PIE_SCRIPT" ; then
1861 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1862 echo '  ; else if (link_info.pie && link_info.combreloc' >> e${EMULATION_NAME}.c
1863 echo '             && link_info.relro' >> e${EMULATION_NAME}.c
1864 echo '             && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1865 sed $sc ldscripts/${EMULATION_NAME}.xdw                 >> e${EMULATION_NAME}.c
1866 echo '  ; else if (link_info.pie && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1867 sed $sc ldscripts/${EMULATION_NAME}.xdc                 >> e${EMULATION_NAME}.c
1868 fi
1869 echo '  ; else if (link_info.pie) return'               >> e${EMULATION_NAME}.c
1870 sed $sc ldscripts/${EMULATION_NAME}.xd                  >> e${EMULATION_NAME}.c
1871 fi
1872 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1873 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1874 echo '  ; else if (link_info.shared && link_info.combreloc' >> e${EMULATION_NAME}.c
1875 echo '             && link_info.relro' >> e${EMULATION_NAME}.c
1876 echo '             && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1877 sed $sc ldscripts/${EMULATION_NAME}.xsw                 >> e${EMULATION_NAME}.c
1878 echo '  ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1879 sed $sc ldscripts/${EMULATION_NAME}.xsc                 >> e${EMULATION_NAME}.c
1880 fi
1881 echo '  ; else if (link_info.shared) return'            >> e${EMULATION_NAME}.c
1882 sed $sc ldscripts/${EMULATION_NAME}.xs                  >> e${EMULATION_NAME}.c
1883 fi
1884 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1885 echo '  ; else if (link_info.combreloc && link_info.relro' >> e${EMULATION_NAME}.c
1886 echo '             && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1887 sed $sc ldscripts/${EMULATION_NAME}.xw                  >> e${EMULATION_NAME}.c
1888 echo '  ; else if (link_info.combreloc) return'         >> e${EMULATION_NAME}.c
1889 sed $sc ldscripts/${EMULATION_NAME}.xc                  >> e${EMULATION_NAME}.c
1890 fi
1891 echo '  ; else return'                                  >> e${EMULATION_NAME}.c
1892 sed $sc ldscripts/${EMULATION_NAME}.x                   >> e${EMULATION_NAME}.c
1893 echo '; }'                                              >> e${EMULATION_NAME}.c
1894
1895 else
1896 # Scripts read from the filesystem.
1897
1898 fragment <<EOF
1899 {
1900   *isfile = 1;
1901
1902   if (link_info.relocatable && config.build_constructors)
1903     return "ldscripts/${EMULATION_NAME}.xu";
1904   else if (link_info.relocatable)
1905     return "ldscripts/${EMULATION_NAME}.xr";
1906   else if (!config.text_read_only)
1907     return "ldscripts/${EMULATION_NAME}.xbn";
1908 EOF
1909 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
1910 else
1911 fragment <<EOF
1912   else if (!config.magic_demand_paged)
1913     return "ldscripts/${EMULATION_NAME}.xn";
1914 EOF
1915 fi
1916 if test -n "$GENERATE_PIE_SCRIPT" ; then
1917 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1918 fragment <<EOF
1919   else if (link_info.pie && link_info.combreloc
1920            && link_info.relro && (link_info.flags & DT_BIND_NOW))
1921     return "ldscripts/${EMULATION_NAME}.xdw";
1922   else if (link_info.pie && link_info.combreloc)
1923     return "ldscripts/${EMULATION_NAME}.xdc";
1924 EOF
1925 fi
1926 fragment <<EOF
1927   else if (link_info.pie)
1928     return "ldscripts/${EMULATION_NAME}.xd";
1929 EOF
1930 fi
1931 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1932 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1933 fragment <<EOF
1934   else if (link_info.shared && link_info.combreloc
1935            && link_info.relro && (link_info.flags & DT_BIND_NOW))
1936     return "ldscripts/${EMULATION_NAME}.xsw";
1937   else if (link_info.shared && link_info.combreloc)
1938     return "ldscripts/${EMULATION_NAME}.xsc";
1939 EOF
1940 fi
1941 fragment <<EOF
1942   else if (link_info.shared)
1943     return "ldscripts/${EMULATION_NAME}.xs";
1944 EOF
1945 fi
1946 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1947 fragment <<EOF
1948   else if (link_info.combreloc && link_info.relro
1949            && (link_info.flags & DT_BIND_NOW))
1950     return "ldscripts/${EMULATION_NAME}.xw";
1951   else if (link_info.combreloc)
1952     return "ldscripts/${EMULATION_NAME}.xc";
1953 EOF
1954 fi
1955 fragment <<EOF
1956   else
1957     return "ldscripts/${EMULATION_NAME}.x";
1958 }
1959
1960 EOF
1961 fi
1962 fi
1963
1964 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1965
1966 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1967 fragment <<EOF
1968  $PARSE_AND_LIST_PROLOGUE
1969 EOF
1970 fi
1971
1972 fragment <<EOF
1973
1974 #define OPTION_DISABLE_NEW_DTAGS        (400)
1975 #define OPTION_ENABLE_NEW_DTAGS         (OPTION_DISABLE_NEW_DTAGS + 1)
1976 #define OPTION_GROUP                    (OPTION_ENABLE_NEW_DTAGS + 1)
1977 #define OPTION_EH_FRAME_HDR             (OPTION_GROUP + 1)
1978 #define OPTION_EXCLUDE_LIBS             (OPTION_EH_FRAME_HDR + 1)
1979 #define OPTION_HASH_STYLE               (OPTION_EXCLUDE_LIBS + 1)
1980 #define OPTION_BUILD_ID                 (OPTION_HASH_STYLE + 1)
1981
1982 static void
1983 gld${EMULATION_NAME}_add_options
1984   (int ns, char **shortopts, int nl, struct option **longopts,
1985    int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
1986 {
1987   static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:";
1988   static const struct option xtra_long[] = {
1989     {"build-id", optional_argument, NULL, OPTION_BUILD_ID},
1990 EOF
1991
1992 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1993 fragment <<EOF
1994     {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1995     {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1996     {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
1997     {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
1998     {"hash-style", required_argument, NULL, OPTION_HASH_STYLE},
1999     {"Bgroup", no_argument, NULL, OPTION_GROUP},
2000 EOF
2001 fi
2002
2003 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
2004 fragment <<EOF
2005     $PARSE_AND_LIST_LONGOPTS
2006 EOF
2007 fi
2008
2009 fragment <<EOF
2010     {NULL, no_argument, NULL, 0}
2011   };
2012
2013   *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
2014   memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
2015   *longopts = (struct option *)
2016     xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
2017   memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
2018 }
2019
2020 #define DEFAULT_BUILD_ID_STYLE  "sha1"
2021
2022 static bfd_boolean
2023 gld${EMULATION_NAME}_handle_option (int optc)
2024 {
2025   switch (optc)
2026     {
2027     default:
2028       return FALSE;
2029
2030     case OPTION_BUILD_ID:
2031       if (link_info.emit_note_gnu_build_id != NULL)
2032         {
2033           free (link_info.emit_note_gnu_build_id);
2034           link_info.emit_note_gnu_build_id = NULL;
2035         }
2036       if (optarg == NULL)
2037         optarg = DEFAULT_BUILD_ID_STYLE;
2038       if (strcmp (optarg, "none"))
2039         link_info.emit_note_gnu_build_id = xstrdup (optarg);
2040       break;
2041
2042 EOF
2043
2044 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2045 fragment <<EOF
2046     case OPTION_DISABLE_NEW_DTAGS:
2047       link_info.new_dtags = FALSE;
2048       break;
2049
2050     case OPTION_ENABLE_NEW_DTAGS:
2051       link_info.new_dtags = TRUE;
2052       break;
2053
2054     case OPTION_EH_FRAME_HDR:
2055       link_info.eh_frame_hdr = TRUE;
2056       break;
2057
2058     case OPTION_GROUP:
2059       link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
2060       /* Groups must be self-contained.  */
2061       link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2062       link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
2063       break;
2064
2065     case OPTION_EXCLUDE_LIBS:
2066       add_excluded_libs (optarg);
2067       break;
2068
2069     case OPTION_HASH_STYLE:
2070       link_info.emit_hash = FALSE;
2071       link_info.emit_gnu_hash = FALSE;
2072       if (strcmp (optarg, "sysv") == 0)
2073         link_info.emit_hash = TRUE;
2074       else if (strcmp (optarg, "gnu") == 0)
2075         link_info.emit_gnu_hash = TRUE;
2076       else if (strcmp (optarg, "both") == 0)
2077         {
2078           link_info.emit_hash = TRUE;
2079           link_info.emit_gnu_hash = TRUE;
2080         }
2081       else
2082         einfo (_("%P%F: invalid hash style \`%s'\n"), optarg);
2083       break;
2084
2085     case 'z':
2086       if (strcmp (optarg, "initfirst") == 0)
2087         link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
2088       else if (strcmp (optarg, "interpose") == 0)
2089         link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
2090       else if (strcmp (optarg, "loadfltr") == 0)
2091         link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
2092       else if (strcmp (optarg, "nodefaultlib") == 0)
2093         link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
2094       else if (strcmp (optarg, "nodelete") == 0)
2095         link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
2096       else if (strcmp (optarg, "nodlopen") == 0)
2097         link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
2098       else if (strcmp (optarg, "nodump") == 0)
2099         link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
2100       else if (strcmp (optarg, "now") == 0)
2101         {
2102           link_info.flags |= (bfd_vma) DF_BIND_NOW;
2103           link_info.flags_1 |= (bfd_vma) DF_1_NOW;
2104         }
2105       else if (strcmp (optarg, "lazy") == 0)
2106         {
2107           link_info.flags &= ~(bfd_vma) DF_BIND_NOW;
2108           link_info.flags_1 &= ~(bfd_vma) DF_1_NOW;
2109         }
2110       else if (strcmp (optarg, "origin") == 0)
2111         {
2112           link_info.flags |= (bfd_vma) DF_ORIGIN;
2113           link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
2114         }
2115       else if (strcmp (optarg, "defs") == 0)
2116         link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2117       else if (strcmp (optarg, "muldefs") == 0)
2118         link_info.allow_multiple_definition = TRUE;
2119       else if (strcmp (optarg, "combreloc") == 0)
2120         link_info.combreloc = TRUE;
2121       else if (strcmp (optarg, "nocombreloc") == 0)
2122         link_info.combreloc = FALSE;
2123       else if (strcmp (optarg, "nocopyreloc") == 0)
2124         link_info.nocopyreloc = TRUE;
2125       else if (strcmp (optarg, "execstack") == 0)
2126         {
2127           link_info.execstack = TRUE;
2128           link_info.noexecstack = FALSE;
2129         }
2130       else if (strcmp (optarg, "noexecstack") == 0)
2131         {
2132           link_info.noexecstack = TRUE;
2133           link_info.execstack = FALSE;
2134         }
2135 EOF
2136
2137   if test -n "$COMMONPAGESIZE"; then
2138 fragment <<EOF
2139       else if (strcmp (optarg, "relro") == 0)
2140         link_info.relro = TRUE;
2141       else if (strcmp (optarg, "norelro") == 0)
2142         link_info.relro = FALSE;
2143 EOF
2144   fi
2145
2146 fragment <<EOF
2147       else if (CONST_STRNEQ (optarg, "max-page-size="))
2148         {
2149           char *end;
2150
2151           config.maxpagesize = strtoul (optarg + 14, &end, 0);
2152           if (*end || (config.maxpagesize & (config.maxpagesize - 1)) != 0)
2153             einfo (_("%P%F: invalid maxium page size \`%s'\n"),
2154                    optarg + 14);
2155           ASSERT (default_target != NULL);
2156           bfd_emul_set_maxpagesize (default_target, config.maxpagesize);
2157         }
2158       else if (CONST_STRNEQ (optarg, "common-page-size="))
2159         {
2160           char *end;
2161           config.commonpagesize = strtoul (optarg + 17, &end, 0);
2162           if (*end
2163               || (config.commonpagesize & (config.commonpagesize - 1)) != 0)
2164             einfo (_("%P%F: invalid common page size \`%s'\n"),
2165                    optarg + 17);
2166           ASSERT (default_target != NULL);
2167           bfd_emul_set_commonpagesize (default_target,
2168                                        config.commonpagesize);
2169         }
2170       /* What about the other Solaris -z options? FIXME.  */
2171       break;
2172 EOF
2173 fi
2174
2175 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
2176 fragment <<EOF
2177  $PARSE_AND_LIST_ARGS_CASES
2178 EOF
2179 fi
2180
2181 fragment <<EOF
2182     }
2183
2184   return TRUE;
2185 }
2186
2187 EOF
2188
2189 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
2190 fragment <<EOF
2191
2192 static void
2193 gld${EMULATION_NAME}_list_options (FILE * file)
2194 {
2195   fprintf (file, _("\
2196   --build-id[=STYLE]          Generate build ID note\n"));
2197 EOF
2198
2199 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2200 fragment <<EOF
2201   fprintf (file, _("\
2202   -Bgroup                     Selects group name lookup rules for DSO\n"));
2203   fprintf (file, _("\
2204   --disable-new-dtags         Disable new dynamic tags\n"));
2205   fprintf (file, _("\
2206   --enable-new-dtags          Enable new dynamic tags\n"));
2207   fprintf (file, _("\
2208   --eh-frame-hdr              Create .eh_frame_hdr section\n"));
2209   fprintf (file, _("\
2210   --hash-style=STYLE          Set hash style to sysv, gnu or both\n"));
2211   fprintf (file, _("\
2212   -z combreloc                Merge dynamic relocs into one section and sort\n"));
2213   fprintf (file, _("\
2214   -z defs                     Report unresolved symbols in object files.\n"));
2215   fprintf (file, _("\
2216   -z execstack                Mark executable as requiring executable stack\n"));
2217   fprintf (file, _("\
2218   -z initfirst                Mark DSO to be initialized first at runtime\n"));
2219   fprintf (file, _("\
2220   -z interpose                Mark object to interpose all DSOs but executable\n"));
2221   fprintf (file, _("\
2222   -z lazy                     Mark object lazy runtime binding (default)\n"));
2223   fprintf (file, _("\
2224   -z loadfltr                 Mark object requiring immediate process\n"));
2225   fprintf (file, _("\
2226   -z muldefs                  Allow multiple definitions\n"));
2227   fprintf (file, _("\
2228   -z nocombreloc              Don't merge dynamic relocs into one section\n"));
2229   fprintf (file, _("\
2230   -z nocopyreloc              Don't create copy relocs\n"));
2231   fprintf (file, _("\
2232   -z nodefaultlib             Mark object not to use default search paths\n"));
2233   fprintf (file, _("\
2234   -z nodelete                 Mark DSO non-deletable at runtime\n"));
2235   fprintf (file, _("\
2236   -z nodlopen                 Mark DSO not available to dlopen\n"));
2237   fprintf (file, _("\
2238   -z nodump                   Mark DSO not available to dldump\n"));
2239   fprintf (file, _("\
2240   -z noexecstack              Mark executable as not requiring executable stack\n"));
2241 EOF
2242
2243   if test -n "$COMMONPAGESIZE"; then
2244 fragment <<EOF
2245   fprintf (file, _("\
2246   -z norelro                  Don't create RELRO program header\n"));
2247 EOF
2248   fi
2249
2250 fragment <<EOF
2251   fprintf (file, _("\
2252   -z now                      Mark object non-lazy runtime binding\n"));
2253   fprintf (file, _("\
2254   -z origin                   Mark object requiring immediate \$ORIGIN\n\
2255                                 processing at runtime\n"));
2256 EOF
2257
2258   if test -n "$COMMONPAGESIZE"; then
2259 fragment <<EOF
2260   fprintf (file, _("\
2261   -z relro                    Create RELRO program header\n"));
2262 EOF
2263   fi
2264
2265 fragment <<EOF
2266   fprintf (file, _("\
2267   -z max-page-size=SIZE       Set maximum page size to SIZE\n"));
2268   fprintf (file, _("\
2269   -z common-page-size=SIZE    Set common page size to SIZE\n"));
2270   fprintf (file, _("\
2271   -z KEYWORD                  Ignored for Solaris compatibility\n"));
2272 EOF
2273 fi
2274
2275 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
2276 fragment <<EOF
2277  $PARSE_AND_LIST_OPTIONS
2278 EOF
2279 fi
2280
2281 fragment <<EOF
2282 }
2283 EOF
2284
2285 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
2286 fragment <<EOF
2287  $PARSE_AND_LIST_EPILOGUE
2288 EOF
2289 fi
2290 fi
2291 else
2292 fragment <<EOF
2293 #define gld${EMULATION_NAME}_add_options NULL
2294 #define gld${EMULATION_NAME}_handle_option NULL
2295 EOF
2296 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
2297 fragment <<EOF
2298 #define gld${EMULATION_NAME}_list_options NULL
2299 EOF
2300 fi
2301 fi
2302
2303 fragment <<EOF
2304
2305 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
2306 {
2307   ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
2308   ${LDEMUL_SYSLIB-syslib_default},
2309   ${LDEMUL_HLL-hll_default},
2310   ${LDEMUL_AFTER_PARSE-after_parse_default},
2311   ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
2312   ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
2313   ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
2314   ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
2315   ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
2316   ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
2317   "${EMULATION_NAME}",
2318   "${OUTPUT_FORMAT}",
2319   ${LDEMUL_FINISH-gld${EMULATION_NAME}_finish},
2320   ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
2321   ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
2322   ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
2323   ${LDEMUL_SET_SYMBOLS-NULL},
2324   ${LDEMUL_PARSE_ARGS-NULL},
2325   gld${EMULATION_NAME}_add_options,
2326   gld${EMULATION_NAME}_handle_option,
2327   ${LDEMUL_UNRECOGNIZED_FILE-NULL},
2328   ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
2329   ${LDEMUL_RECOGNIZED_FILE-gld${EMULATION_NAME}_load_symbols},
2330   ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
2331   ${LDEMUL_NEW_VERS_PATTERN-NULL}
2332 };
2333 EOF