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