OSDN Git Service

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