* Makefile.am (eelf32iq10.c): Fix tab/whitespace mixup.
[binutils.git] / ld / emultempl / elf32.em
bloba776d58d2acf4944cb29b6082ccdb05bf0d4f591
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}
11 cat >e${EMULATION_NAME}.c <<EOF
12 /* This file is is generated by a shell script.  DO NOT EDIT! */
14 /* ${ELFSIZE} bit ELF emulation code for ${EMULATION_NAME}
15    Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
16    2002, 2003 Free Software Foundation, Inc.
17    Written by Steve Chamberlain <sac@cygnus.com>
18    ELF support by Ian Lance Taylor <ian@cygnus.com>
20 This file is part of GLD, the Gnu Linker.
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 2 of the License, or
25 (at your option) any later version.
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.
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
36 #define TARGET_IS_${EMULATION_NAME}
38 #include "bfd.h"
39 #include "sysdep.h"
40 #include "libiberty.h"
41 #include "safe-ctype.h"
43 #include "bfdlink.h"
45 #include "ld.h"
46 #include "ldmain.h"
47 #include "ldmisc.h"
48 #include "ldexp.h"
49 #include "ldlang.h"
50 #include "ldfile.h"
51 #include "ldemul.h"
52 #include <ldgram.h>
53 #include "elf/common.h"
55 static void gld${EMULATION_NAME}_before_parse
56   PARAMS ((void));
57 static void gld${EMULATION_NAME}_vercheck
58   PARAMS ((lang_input_statement_type *));
59 static void gld${EMULATION_NAME}_stat_needed
60   PARAMS ((lang_input_statement_type *));
61 static bfd_boolean gld${EMULATION_NAME}_try_needed
62   PARAMS ((const char *, int));
63 static bfd_boolean gld${EMULATION_NAME}_search_needed
64   PARAMS ((const char *, const char *, int));
65 static void gld${EMULATION_NAME}_check_needed
66   PARAMS ((lang_input_statement_type *));
67 static void gld${EMULATION_NAME}_after_open
68   PARAMS ((void));
69 static void gld${EMULATION_NAME}_find_exp_assignment
70   PARAMS ((etree_type *));
71 static void gld${EMULATION_NAME}_find_statement_assignment
72   PARAMS ((lang_statement_union_type *));
73 static void gld${EMULATION_NAME}_before_allocation
74   PARAMS ((void));
75 static bfd_boolean gld${EMULATION_NAME}_open_dynamic_archive
76   PARAMS ((const char *, search_dirs_type *, lang_input_statement_type *));
77 static lang_output_section_statement_type *output_rel_find
78   PARAMS ((asection *));
79 static asection *output_prev_sec_find
80   PARAMS ((lang_output_section_statement_type *));
81 static bfd_boolean gld${EMULATION_NAME}_place_orphan
82   PARAMS ((lang_input_statement_type *, asection *));
83 static void gld${EMULATION_NAME}_finish
84   PARAMS ((void));
85 static char *gld${EMULATION_NAME}_get_script
86   PARAMS ((int *isfile));
88 EOF
90 # Import any needed special functions and/or overrides.
92 if test -n "$EXTRA_EM_FILE" ; then
93 . ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
96 # Functions in this file can be overridden by setting the LDEMUL_* shell
97 # variables.  If the name of the overriding function is the same as is
98 # defined in this file, then don't output this file's version.
99 # If a different overriding name is given then output the standard function
100 # as presumably it is called from the overriding function.
102 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
103 cat >>e${EMULATION_NAME}.c <<EOF
105 static void
106 gld${EMULATION_NAME}_before_parse ()
108   const bfd_arch_info_type *arch = bfd_scan_arch ("${OUTPUT_ARCH}");
109   if (arch)
110     {
111       ldfile_output_architecture = arch->arch;
112       ldfile_output_machine = arch->mach;
113       ldfile_output_machine_name = arch->printable_name;
114     }
115   else
116     ldfile_output_architecture = bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`;
117   config.dynamic_link = ${DYNAMIC_LINK-TRUE};
118   config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
124 cat >>e${EMULATION_NAME}.c <<EOF
126 /* These variables are required to pass information back and forth
127    between after_open and check_needed and stat_needed and vercheck.  */
129 static struct bfd_link_needed_list *global_needed;
130 static struct stat global_stat;
131 static bfd_boolean global_found;
132 static struct bfd_link_needed_list *global_vercheck_needed;
133 static bfd_boolean global_vercheck_failed;
136 /* On Linux, it's possible to have different versions of the same
137    shared library linked against different versions of libc.  The
138    dynamic linker somehow tags which libc version to use in
139    /etc/ld.so.cache, and, based on the libc that it sees in the
140    executable, chooses which version of the shared library to use.
142    We try to do a similar check here by checking whether this shared
143    library needs any other shared libraries which may conflict with
144    libraries we have already included in the link.  If it does, we
145    skip it, and try to find another shared library farther on down the
146    link path.
148    This is called via lang_for_each_input_file.
149    GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
150    which we are checking.  This sets GLOBAL_VERCHECK_FAILED if we find
151    a conflicting version.  */
153 static void
154 gld${EMULATION_NAME}_vercheck (s)
155      lang_input_statement_type *s;
157   const char *soname;
158   struct bfd_link_needed_list *l;
160   if (global_vercheck_failed)
161     return;
162   if (s->the_bfd == NULL
163       || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
164     return;
166   soname = bfd_elf_get_dt_soname (s->the_bfd);
167   if (soname == NULL)
168     soname = lbasename (bfd_get_filename (s->the_bfd));
170   for (l = global_vercheck_needed; l != NULL; l = l->next)
171     {
172       const char *suffix;
174       if (strcmp (soname, l->name) == 0)
175         {
176           /* Probably can't happen, but it's an easy check.  */
177           continue;
178         }
180       if (strchr (l->name, '/') != NULL)
181         continue;
183       suffix = strstr (l->name, ".so.");
184       if (suffix == NULL)
185         continue;
187       suffix += sizeof ".so." - 1;
189       if (strncmp (soname, l->name, suffix - l->name) == 0)
190         {
191           /* Here we know that S is a dynamic object FOO.SO.VER1, and
192              the object we are considering needs a dynamic object
193              FOO.SO.VER2, and VER1 and VER2 are different.  This
194              appears to be a version mismatch, so we tell the caller
195              to try a different version of this library.  */
196           global_vercheck_failed = TRUE;
197           return;
198         }
199     }
203 /* See if an input file matches a DT_NEEDED entry by running stat on
204    the file.  */
206 static void
207 gld${EMULATION_NAME}_stat_needed (s)
208      lang_input_statement_type *s;
210   struct stat st;
211   const char *suffix;
212   const char *soname;
214   if (global_found)
215     return;
216   if (s->the_bfd == NULL)
217     return;
219   if (bfd_stat (s->the_bfd, &st) != 0)
220     {
221       einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
222       return;
223     }
225   if (st.st_dev == global_stat.st_dev
226       && st.st_ino == global_stat.st_ino)
227     {
228       global_found = TRUE;
229       return;
230     }
232   /* We issue a warning if it looks like we are including two
233      different versions of the same shared library.  For example,
234      there may be a problem if -lc picks up libc.so.6 but some other
235      shared library has a DT_NEEDED entry of libc.so.5.  This is a
236      heuristic test, and it will only work if the name looks like
237      NAME.so.VERSION.  FIXME: Depending on file names is error-prone.
238      If we really want to issue warnings about mixing version numbers
239      of shared libraries, we need to find a better way.  */
241   if (strchr (global_needed->name, '/') != NULL)
242     return;
243   suffix = strstr (global_needed->name, ".so.");
244   if (suffix == NULL)
245     return;
246   suffix += sizeof ".so." - 1;
248   soname = bfd_elf_get_dt_soname (s->the_bfd);
249   if (soname == NULL)
250     soname = lbasename (s->filename);
252   if (strncmp (soname, global_needed->name, suffix - global_needed->name) == 0)
253     einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
254            global_needed->name, global_needed->by, soname);
258 /* This function is called for each possible name for a dynamic object
259    named by a DT_NEEDED entry.  The FORCE parameter indicates whether
260    to skip the check for a conflicting version.  */
262 static bfd_boolean
263 gld${EMULATION_NAME}_try_needed (name, force)
264      const char *name;
265      int force;
267   bfd *abfd;
268   const char *soname;
270   abfd = bfd_openr (name, bfd_get_target (output_bfd));
271   if (abfd == NULL)
272     return FALSE;
273   if (! bfd_check_format (abfd, bfd_object))
274     {
275       bfd_close (abfd);
276       return FALSE;
277     }
278   if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
279     {
280       bfd_close (abfd);
281       return FALSE;
282     }
284   /* For DT_NEEDED, they have to match.  */
285   if (abfd->xvec != output_bfd->xvec)
286     {
287       bfd_close (abfd);
288       return FALSE;
289     }
291   /* Check whether this object would include any conflicting library
292      versions.  If FORCE is set, then we skip this check; we use this
293      the second time around, if we couldn't find any compatible
294      instance of the shared library.  */
296   if (! force)
297     {
298       struct bfd_link_needed_list *needed;
300       if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
301         einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
303       if (needed != NULL)
304         {
305           global_vercheck_needed = needed;
306           global_vercheck_failed = FALSE;
307           lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
308           if (global_vercheck_failed)
309             {
310               bfd_close (abfd);
311               /* Return FALSE to force the caller to move on to try
312                  another file on the search path.  */
313               return FALSE;
314             }
316           /* But wait!  It gets much worse.  On Linux, if a shared
317              library does not use libc at all, we are supposed to skip
318              it the first time around in case we encounter a shared
319              library later on with the same name which does use the
320              version of libc that we want.  This is much too horrible
321              to use on any system other than Linux.  */
324 case ${target} in
325   *-*-linux-gnu*)
326     cat >>e${EMULATION_NAME}.c <<EOF
327           {
328             struct bfd_link_needed_list *l;
330             for (l = needed; l != NULL; l = l->next)
331               if (strncmp (l->name, "libc.so", 7) == 0)
332                 break;
333             if (l == NULL)
334               {
335                 bfd_close (abfd);
336                 return FALSE;
337               }
338           }
341     ;;
342 esac
343 cat >>e${EMULATION_NAME}.c <<EOF
344         }
345     }
347   /* We've found a dynamic object matching the DT_NEEDED entry.  */
349   /* We have already checked that there is no other input file of the
350      same name.  We must now check again that we are not including the
351      same file twice.  We need to do this because on many systems
352      libc.so is a symlink to, e.g., libc.so.1.  The SONAME entry will
353      reference libc.so.1.  If we have already included libc.so, we
354      don't want to include libc.so.1 if they are the same file, and we
355      can only check that using stat.  */
357   if (bfd_stat (abfd, &global_stat) != 0)
358     einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
360   /* First strip off everything before the last '/'.  */
361   soname = lbasename (abfd->filename);
363   if (trace_file_tries)
364     info_msg (_("found %s at %s\n"), soname, name);
366   global_found = FALSE;
367   lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
368   if (global_found)
369     {
370       /* Return TRUE to indicate that we found the file, even though
371          we aren't going to do anything with it.  */
372       return TRUE;
373     }
375   /* Tell the ELF backend that we don't want the output file to have a
376      DT_NEEDED entry for this file.  */
377   bfd_elf_set_dt_needed_name (abfd, "");
379   /* Tell the ELF backend that the output file needs a DT_NEEDED
380      entry for this file if it is used to resolve the reference in
381      a regular object.  */
382   bfd_elf_set_dt_needed_soname (abfd, soname);
384   /* Add this file into the symbol table.  */
385   if (! bfd_link_add_symbols (abfd, &link_info))
386     einfo ("%F%B: could not read symbols: %E\n", abfd);
388   return TRUE;
392 /* Search for a needed file in a path.  */
394 static bfd_boolean
395 gld${EMULATION_NAME}_search_needed (path, name, force)
396      const char *path;
397      const char *name;
398      int force;
400   const char *s;
401   size_t len;
403   if (name[0] == '/')
404     return gld${EMULATION_NAME}_try_needed (name, force);
406   if (path == NULL || *path == '\0')
407     return FALSE;
408   len = strlen (name);
409   while (1)
410     {
411       char *filename, *sset;
413       s = strchr (path, ':');
414       if (s == NULL)
415         s = path + strlen (path);
417       filename = (char *) xmalloc (s - path + len + 2);
418       if (s == path)
419         sset = filename;
420       else
421         {
422           memcpy (filename, path, s - path);
423           filename[s - path] = '/';
424           sset = filename + (s - path) + 1;
425         }
426       strcpy (sset, name);
428       if (gld${EMULATION_NAME}_try_needed (filename, force))
429         return TRUE;
431       free (filename);
433       if (*s == '\0')
434         break;
435       path = s + 1;
436     }
438   return FALSE;
442 if [ "x${USE_LIBPATH}" = xyes ] ; then
443   case ${target} in
444     *-*-linux-gnu*)
445       cat >>e${EMULATION_NAME}.c <<EOF
447 /* Add the sysroot to every entry in a colon-separated path.  */
449 static char *
450 gld${EMULATION_NAME}_add_sysroot (path)
451      const char *path;
453   int len, colons, i;
454   char *ret, *p;
456   len = strlen (path);
457   colons = 0;
458   i = 0;
459   while (path[i])
460     if (path[i++] == ':')
461       colons++;
463   if (path[i])
464     colons++;
466   len = len + colons * strlen (ld_sysroot);
467   ret = xmalloc (len + 1);
468   strcpy (ret, ld_sysroot);
469   p = ret + strlen (ret);
470   i = 0;
471   while (path[i])
472     if (path[i] == ':')
473       {
474         strcpy (p, ld_sysroot);
475         p = p + strlen (p);
476         i++;
477       }
478     else
479       *p++ = path[i++];
481   *p = 0;
482   return ret;
485 /* For a native linker, check the file /etc/ld.so.conf for directories
486    in which we may find shared libraries.  /etc/ld.so.conf is really
487    only meaningful on Linux.  */
489 static bfd_boolean gld${EMULATION_NAME}_check_ld_so_conf
490   PARAMS ((const char *, int));
492 static bfd_boolean
493 gld${EMULATION_NAME}_check_ld_so_conf (name, force)
494      const char *name;
495      int force;
497   static bfd_boolean initialized;
498   static char *ld_so_conf;
500   if (! initialized)
501     {
502       FILE *f;
503       char *tmppath;
505       tmppath = concat (ld_sysroot, "/etc/ld.so.conf", NULL);
506       f = fopen (tmppath, FOPEN_RT);
507       free (tmppath);
508       if (f != NULL)
509         {
510           char *b;
511           size_t len, alloc;
512           int c;
514           len = 0;
515           alloc = 100;
516           b = (char *) xmalloc (alloc);
518           while ((c = getc (f)) != EOF)
519             {
520               if (len + 1 >= alloc)
521                 {
522                   alloc *= 2;
523                   b = (char *) xrealloc (b, alloc);
524                 }
525               if (c != ':'
526                   && c != ' '
527                   && c != '\t'
528                   && c != '\n'
529                   && c != ',')
530                 {
531                   b[len] = c;
532                   ++len;
533                 }
534               else
535                 {
536                   if (len > 0 && b[len - 1] != ':')
537                     {
538                       b[len] = ':';
539                       ++len;
540                     }
541                 }
542             }
544           if (len > 0 && b[len - 1] == ':')
545             --len;
547           if (len > 0)
548             b[len] = '\0';
549           else
550             {
551               free (b);
552               b = NULL;
553             }
555           fclose (f);
557           if (b)
558             {
559               char *d = gld${EMULATION_NAME}_add_sysroot (b);
560               free (b);
561               b = d;
562             }
564           ld_so_conf = b;
565         }
567       initialized = TRUE;
568     }
570   if (ld_so_conf == NULL)
571     return FALSE;
573   return gld${EMULATION_NAME}_search_needed (ld_so_conf, name, force);
577     # Linux
578     ;;
579   esac
581 cat >>e${EMULATION_NAME}.c <<EOF
583 /* See if an input file matches a DT_NEEDED entry by name.  */
585 static void
586 gld${EMULATION_NAME}_check_needed (s)
587      lang_input_statement_type *s;
589   if (global_found)
590     return;
592   if (s->filename != NULL)
593     {
594       const char *f;
596       if (strcmp (s->filename, global_needed->name) == 0)
597         {
598           global_found = TRUE;
599           return;
600         }
602       if (s->search_dirs_flag)
603         {
604           f = strrchr (s->filename, '/');
605           if (f != NULL
606               && strcmp (f + 1, global_needed->name) == 0)
607             {
608               global_found = TRUE;
609               return;
610             }
611         }
612     }
614   if (s->the_bfd != NULL)
615     {
616       const char *soname;
618       soname = bfd_elf_get_dt_soname (s->the_bfd);
619       if (soname != NULL
620           && strcmp (soname, global_needed->name) == 0)
621         {
622           global_found = TRUE;
623           return;
624         }
625     }
630 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
631 cat >>e${EMULATION_NAME}.c <<EOF
633 /* This is called after all the input files have been opened.  */
635 static void
636 gld${EMULATION_NAME}_after_open ()
638   struct bfd_link_needed_list *needed, *l;
640   /* We only need to worry about this when doing a final link.  */
641   if (link_info.relocateable || link_info.shared)
642     return;
644   /* Get the list of files which appear in DT_NEEDED entries in
645      dynamic objects included in the link (often there will be none).
646      For each such file, we want to track down the corresponding
647      library, and include the symbol table in the link.  This is what
648      the runtime dynamic linker will do.  Tracking the files down here
649      permits one dynamic object to include another without requiring
650      special action by the person doing the link.  Note that the
651      needed list can actually grow while we are stepping through this
652      loop.  */
653   needed = bfd_elf_get_needed_list (output_bfd, &link_info);
654   for (l = needed; l != NULL; l = l->next)
655     {
656       struct bfd_link_needed_list *ll;
657       int force;
659       /* If we've already seen this file, skip it.  */
660       for (ll = needed; ll != l; ll = ll->next)
661         if (strcmp (ll->name, l->name) == 0)
662           break;
663       if (ll != l)
664         continue;
666       /* See if this file was included in the link explicitly.  */
667       global_needed = l;
668       global_found = FALSE;
669       lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
670       if (global_found)
671         continue;
673       if (trace_file_tries)
674         info_msg (_("%s needed by %B\n"), l->name, l->by);
676       /* We need to find this file and include the symbol table.  We
677          want to search for the file in the same way that the dynamic
678          linker will search.  That means that we want to use
679          rpath_link, rpath, then the environment variable
680          LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
681          entries (native only), then the linker script LIB_SEARCH_DIRS.
682          We do not search using the -L arguments.
684          We search twice.  The first time, we skip objects which may
685          introduce version mismatches.  The second time, we force
686          their use.  See gld${EMULATION_NAME}_vercheck comment.  */
687       for (force = 0; force < 2; force++)
688         {
689           size_t len;
690           search_dirs_type *search;
692 if [ "x${USE_LIBPATH}" = xyes ] ; then
693 cat >>e${EMULATION_NAME}.c <<EOF
694           const char *lib_path;
695           struct bfd_link_needed_list *rp;
696           int found;
699 cat >>e${EMULATION_NAME}.c <<EOF
701           if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
702                                                   l->name, force))
703             break;
705 if [ "x${USE_LIBPATH}" = xyes ] ; then
706 cat >>e${EMULATION_NAME}.c <<EOF
707           if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
708                                                   l->name, force))
709             break;
712 if [ "x${NATIVE}" = xyes ] ; then
713 cat >>e${EMULATION_NAME}.c <<EOF
714           if (command_line.rpath_link == NULL
715               && command_line.rpath == NULL)
716             {
717               lib_path = (const char *) getenv ("LD_RUN_PATH");
718               if (gld${EMULATION_NAME}_search_needed (lib_path, l->name,
719                                                       force))
720                 break;
721             }
722           lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
723           if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, force))
724             break;
727 if [ "x${USE_LIBPATH}" = xyes ] ; then
728 cat >>e${EMULATION_NAME}.c <<EOF
729           found = 0;
730           rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
731           for (; !found && rp != NULL; rp = rp->next)
732             {
733               char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
734               found = (rp->by == l->by
735                        && gld${EMULATION_NAME}_search_needed (tmpname,
736                                                               l->name,
737                                                               force));
738               free (tmpname);
739             }
740           if (found)
741             break;
745 cat >>e${EMULATION_NAME}.c <<EOF
746           len = strlen (l->name);
747           for (search = search_head; search != NULL; search = search->next)
748             {
749               char *filename;
751               if (search->cmdline)
752                 continue;
753               filename = (char *) xmalloc (strlen (search->name) + len + 2);
754               sprintf (filename, "%s/%s", search->name, l->name);
755               if (gld${EMULATION_NAME}_try_needed (filename, force))
756                 break;
757               free (filename);
758             }
759           if (search != NULL)
760             break;
762 if [ "x${USE_LIBPATH}" = xyes ] ; then
763   case ${target} in
764     *-*-linux-gnu*)
765       cat >>e${EMULATION_NAME}.c <<EOF
766           if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
767             break;
769     # Linux
770     ;;
771   esac
773 cat >>e${EMULATION_NAME}.c <<EOF
774         }
776       if (force < 2)
777         continue;
779       einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
780              l->name, l->by);
781     }
787 cat >>e${EMULATION_NAME}.c <<EOF
789 /* Look through an expression for an assignment statement.  */
791 static void
792 gld${EMULATION_NAME}_find_exp_assignment (exp)
793      etree_type *exp;
795   struct bfd_link_hash_entry *h;
797   switch (exp->type.node_class)
798     {
799     case etree_provide:
800       h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
801                                 FALSE, FALSE, FALSE);
802       if (h == NULL)
803         break;
805       /* We call record_link_assignment even if the symbol is defined.
806          This is because if it is defined by a dynamic object, we
807          actually want to use the value defined by the linker script,
808          not the value from the dynamic object (because we are setting
809          symbols like etext).  If the symbol is defined by a regular
810          object, then, as it happens, calling record_link_assignment
811          will do no harm.  */
813       /* Fall through.  */
814     case etree_assign:
815       if (strcmp (exp->assign.dst, ".") != 0)
816         {
817           if (! (bfd_elf${ELFSIZE}_record_link_assignment
818                  (output_bfd, &link_info, exp->assign.dst,
819                   exp->type.node_class == etree_provide ? TRUE : FALSE)))
820             einfo ("%P%F: failed to record assignment to %s: %E\n",
821                    exp->assign.dst);
822         }
823       gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
824       break;
826     case etree_binary:
827       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
828       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
829       break;
831     case etree_trinary:
832       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
833       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
834       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
835       break;
837     case etree_unary:
838       gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
839       break;
841     default:
842       break;
843     }
847 /* This is called by the before_allocation routine via
848    lang_for_each_statement.  It locates any assignment statements, and
849    tells the ELF backend about them, in case they are assignments to
850    symbols which are referred to by dynamic objects.  */
852 static void
853 gld${EMULATION_NAME}_find_statement_assignment (s)
854      lang_statement_union_type *s;
856   if (s->header.type == lang_assignment_statement_enum)
857     gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
862 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
863   if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
864     ELF_INTERPRETER_SET_DEFAULT="
865   if (sinterp != NULL)
866     {
867       sinterp->contents = ${ELF_INTERPRETER_NAME};
868       sinterp->_raw_size = strlen (sinterp->contents) + 1;
869     }
872   else
873     ELF_INTERPRETER_SET_DEFAULT=
874   fi
875 cat >>e${EMULATION_NAME}.c <<EOF
877 /* This is called after the sections have been attached to output
878    sections, but before any sizes or addresses have been set.  */
880 static void
881 gld${EMULATION_NAME}_before_allocation ()
883   const char *rpath;
884   asection *sinterp;
886   /* If we are going to make any variable assignments, we need to let
887      the ELF backend know about them in case the variables are
888      referred to by dynamic objects.  */
889   lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
891   /* Let the ELF backend work out the sizes of any sections required
892      by dynamic linking.  */
893   rpath = command_line.rpath;
894   if (rpath == NULL)
895     rpath = (const char *) getenv ("LD_RUN_PATH");
896   if (! (bfd_elf${ELFSIZE}_size_dynamic_sections
897          (output_bfd, command_line.soname, rpath,
898           command_line.filter_shlib,
899           (const char * const *) command_line.auxiliary_filters,
900           &link_info, &sinterp, lang_elf_version_info)))
901     einfo ("%P%F: failed to set dynamic section sizes: %E\n");
902 ${ELF_INTERPRETER_SET_DEFAULT}
903   /* Let the user override the dynamic linker we are using.  */
904   if (command_line.interpreter != NULL
905       && sinterp != NULL)
906     {
907       sinterp->contents = (bfd_byte *) command_line.interpreter;
908       sinterp->_raw_size = strlen (command_line.interpreter) + 1;
909     }
911   /* Look for any sections named .gnu.warning.  As a GNU extensions,
912      we treat such sections as containing warning messages.  We print
913      out the warning message, and then zero out the section size so
914      that it does not get copied into the output file.  */
916   {
917     LANG_FOR_EACH_INPUT_STATEMENT (is)
918       {
919         asection *s;
920         bfd_size_type sz;
921         char *msg;
922         bfd_boolean ret;
924         if (is->just_syms_flag)
925           continue;
927         s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
928         if (s == NULL)
929           continue;
931         sz = bfd_section_size (is->the_bfd, s);
932         msg = xmalloc ((size_t) sz + 1);
933         if (! bfd_get_section_contents (is->the_bfd, s, msg, (file_ptr) 0, sz))
934           einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
935                  is->the_bfd);
936         msg[sz] = '\0';
937         ret = link_info.callbacks->warning (&link_info, msg,
938                                             (const char *) NULL,
939                                             is->the_bfd, (asection *) NULL,
940                                             (bfd_vma) 0);
941         ASSERT (ret);
942         free (msg);
944         /* Clobber the section size, so that we don't waste copying the
945            warning into the output file.  */
946         s->_raw_size = 0;
947       }
948   }
954 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
955 cat >>e${EMULATION_NAME}.c <<EOF
957 /* Try to open a dynamic archive.  This is where we know that ELF
958    dynamic libraries have an extension of .so (or .sl on oddball systems
959    like hpux).  */
961 static bfd_boolean
962 gld${EMULATION_NAME}_open_dynamic_archive (arch, search, entry)
963      const char *arch;
964      search_dirs_type *search;
965      lang_input_statement_type *entry;
967   const char *filename;
968   char *string;
970   if (! entry->is_archive)
971     return FALSE;
973   filename = entry->filename;
975   /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
976      is defined, but it does not seem worth the headache to optimize
977      away those two bytes of space.  */
978   string = (char *) xmalloc (strlen (search->name)
979                              + strlen (filename)
980                              + strlen (arch)
981 #ifdef EXTRA_SHLIB_EXTENSION
982                              + strlen (EXTRA_SHLIB_EXTENSION)
983 #endif
984                              + sizeof "/lib.so");
986   sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
988 #ifdef EXTRA_SHLIB_EXTENSION
989   /* Try the .so extension first.  If that fails build a new filename
990      using EXTRA_SHLIB_EXTENSION.  */
991   if (! ldfile_try_open_bfd (string, entry))
992     sprintf (string, "%s/lib%s%s%s", search->name,
993              filename, arch, EXTRA_SHLIB_EXTENSION);
994 #endif
996   if (! ldfile_try_open_bfd (string, entry))
997     {
998       free (string);
999       return FALSE;
1000     }
1002   entry->filename = string;
1004   /* We have found a dynamic object to include in the link.  The ELF
1005      backend linker will create a DT_NEEDED entry in the .dynamic
1006      section naming this file.  If this file includes a DT_SONAME
1007      entry, it will be used.  Otherwise, the ELF linker will just use
1008      the name of the file.  For an archive found by searching, like
1009      this one, the DT_NEEDED entry should consist of just the name of
1010      the file, without the path information used to find it.  Note
1011      that we only need to do this if we have a dynamic object; an
1012      archive will never be referenced by a DT_NEEDED entry.
1014      FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
1015      very pretty.  I haven't been able to think of anything that is
1016      pretty, though.  */
1017   if (bfd_check_format (entry->the_bfd, bfd_object)
1018       && (entry->the_bfd->flags & DYNAMIC) != 0)
1019     {
1020       ASSERT (entry->is_archive && entry->search_dirs_flag);
1022       /* Rather than duplicating the logic above.  Just use the
1023          filename we recorded earlier.  */
1025       filename = lbasename (entry->filename);
1026       bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
1027     }
1029   return TRUE;
1035 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
1036 cat >>e${EMULATION_NAME}.c <<EOF
1038 /* A variant of lang_output_section_find.  Used by place_orphan.  */
1040 static lang_output_section_statement_type *
1041 output_rel_find (sec)
1042      asection *sec;
1044   lang_statement_union_type *u;
1045   lang_output_section_statement_type *lookup;
1046   lang_output_section_statement_type *last = NULL;
1047   lang_output_section_statement_type *last_rel = NULL;
1048   lang_output_section_statement_type *last_rel_alloc = NULL;
1049   int rela = sec->name[4] == 'a';
1051   for (u = lang_output_section_statement.head; u; u = lookup->next)
1052     {
1053       lookup = &u->output_section_statement;
1054       if (strncmp (".rel", lookup->name, 4) == 0)
1055         {
1056           /* Don't place after .rel.plt as doing so results in wrong
1057              dynamic tags.  Also, place allocated reloc sections before
1058              non-allocated.  */
1059           int lookrela = lookup->name[4] == 'a';
1061           if (strcmp (".plt", lookup->name + 4 + lookrela) == 0
1062               || (lookup->bfd_section != NULL
1063                   && (lookup->bfd_section->flags & SEC_ALLOC) == 0))
1064             break;
1065           last = lookup;
1066           if (rela == lookrela)
1067             last_rel = lookup;
1068           if (lookup->bfd_section != NULL
1069               && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1070             last_rel_alloc = lookup;
1071         }
1072     }
1074   if (last_rel_alloc)
1075     return last_rel_alloc;
1077   if (last_rel)
1078     return last_rel;
1080   return last;
1083 /* Find the last output section before given output statement.
1084    Used by place_orphan.  */
1086 static asection *
1087 output_prev_sec_find (os)
1088      lang_output_section_statement_type *os;
1090   asection *s = (asection *) NULL;
1091   lang_statement_union_type *u;
1092   lang_output_section_statement_type *lookup;
1094   for (u = lang_output_section_statement.head;
1095        u != (lang_statement_union_type *) NULL;
1096        u = lookup->next)
1097     {
1098       lookup = &u->output_section_statement;
1099       if (lookup == os)
1100         return s;
1102       if (lookup->bfd_section != NULL && lookup->bfd_section->owner != NULL)
1103         s = lookup->bfd_section;
1104     }
1106   return NULL;
1109 /* Place an orphan section.  We use this to put random SHF_ALLOC
1110    sections in the right segment.  */
1112 struct orphan_save {
1113   lang_output_section_statement_type *os;
1114   asection **section;
1115   lang_statement_union_type **stmt;
1116   lang_statement_union_type **os_tail;
1119 static bfd_boolean
1120 gld${EMULATION_NAME}_place_orphan (file, s)
1121      lang_input_statement_type *file;
1122      asection *s;
1124   static struct orphan_save hold_text;
1125   static struct orphan_save hold_rodata;
1126   static struct orphan_save hold_data;
1127   static struct orphan_save hold_bss;
1128   static struct orphan_save hold_rel;
1129   static struct orphan_save hold_interp;
1130   static struct orphan_save hold_sdata;
1131   static int count = 1;
1132   struct orphan_save *place;
1133   lang_statement_list_type *old;
1134   lang_statement_list_type add;
1135   etree_type *address;
1136   const char *secname;
1137   const char *ps = NULL;
1138   lang_output_section_statement_type *os;
1139   lang_statement_union_type **os_tail;
1140   etree_type *load_base;
1141   int isdyn = 0;
1143   secname = bfd_get_section_name (s->owner, s);
1144   if (! link_info.relocateable
1145       && link_info.combreloc
1146       && (s->flags & SEC_ALLOC)
1147       && strncmp (secname, ".rel", 4) == 0)
1148     {
1149       if (secname[4] == 'a')
1150         secname = ".rela.dyn";
1151       else
1152         secname = ".rel.dyn";
1153       isdyn = 1;
1154     }
1156   if (isdyn || (!config.unique_orphan_sections && !unique_section_p (secname)))
1157     {
1158       /* Look through the script to see where to place this section.  */
1159       os = lang_output_section_find (secname);
1161       if (os != NULL
1162           && (os->bfd_section == NULL
1163               || ((s->flags ^ os->bfd_section->flags)
1164                   & (SEC_LOAD | SEC_ALLOC)) == 0))
1165         {
1166           /* We already have an output section statement with this
1167              name, and its bfd section, if any, has compatible flags.  */
1168           lang_add_section (&os->children, s, os, file);
1169           return TRUE;
1170         }
1171     }
1173   if (hold_text.os == NULL)
1174     hold_text.os = lang_output_section_find (".text");
1176   /* If this is a final link, then always put .gnu.warning.SYMBOL
1177      sections into the .text section to get them out of the way.  */
1178   if (! link_info.shared
1179       && ! link_info.relocateable
1180       && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
1181       && hold_text.os != NULL)
1182     {
1183       lang_add_section (&hold_text.os->children, s, hold_text.os, file);
1184       return TRUE;
1185     }
1187   /* Decide which segment the section should go in based on the
1188      section name and section flags.  We put loadable .note sections
1189      right after the .interp section, so that the PT_NOTE segment is
1190      stored right after the program headers where the OS can read it
1191      in the first page.  */
1192 #define HAVE_SECTION(hold, name) \
1193 (hold.os != NULL || (hold.os = lang_output_section_find (name)) != NULL)
1195   if ((s->flags & SEC_EXCLUDE) != 0 && !link_info.relocateable)
1196     {
1197       if (s->output_section == NULL)
1198         s->output_section = bfd_abs_section_ptr;
1199       return TRUE;
1200     }
1202   place = NULL;
1203   if ((s->flags & SEC_ALLOC) == 0)
1204     ;
1205   else if ((s->flags & SEC_LOAD) != 0
1206            && strncmp (secname, ".note", 5) == 0
1207            && HAVE_SECTION (hold_interp, ".interp"))
1208     place = &hold_interp;
1209   else if ((s->flags & SEC_HAS_CONTENTS) == 0
1210            && HAVE_SECTION (hold_bss, ".bss"))
1211     place = &hold_bss;
1212   else if ((s->flags & SEC_SMALL_DATA) != 0
1213            && HAVE_SECTION (hold_sdata, ".sdata"))
1214     place = &hold_sdata;
1215   else if ((s->flags & SEC_READONLY) == 0
1216            && HAVE_SECTION (hold_data, ".data"))
1217     place = &hold_data;
1218   else if (strncmp (secname, ".rel", 4) == 0
1219            && (s->flags & SEC_LOAD) != 0
1220            && (hold_rel.os != NULL
1221                || (hold_rel.os = output_rel_find (s)) != NULL))
1222     place = &hold_rel;
1223   else if ((s->flags & (SEC_CODE | SEC_READONLY)) == SEC_READONLY
1224            && HAVE_SECTION (hold_rodata, ".rodata"))
1225     place = &hold_rodata;
1226   else if ((s->flags & (SEC_CODE | SEC_READONLY)) == (SEC_CODE | SEC_READONLY)
1227            && hold_text.os != NULL)
1228     place = &hold_text;
1230 #undef HAVE_SECTION
1232   /* Choose a unique name for the section.  This will be needed if the
1233      same section name appears in the input file with different
1234      loadable or allocatable characteristics.  */
1235   if (bfd_get_section_by_name (output_bfd, secname) != NULL)
1236     {
1237       secname = bfd_get_unique_section_name (output_bfd, secname, &count);
1238       if (secname == NULL)
1239         einfo ("%F%P: place_orphan failed: %E\n");
1240     }
1242   /* Start building a list of statements for this section.
1243      First save the current statement pointer.  */
1244   old = stat_ptr;
1246   /* If we have found an appropriate place for the output section
1247      statements for this orphan, add them to our own private list,
1248      inserting them later into the global statement list.  */
1249   if (place != NULL)
1250     {
1251       stat_ptr = &add;
1252       lang_list_init (stat_ptr);
1253     }
1255   if (config.build_constructors)
1256     {
1257       /* If the name of the section is representable in C, then create
1258          symbols to mark the start and the end of the section.  */
1259       for (ps = secname; *ps != '\0'; ps++)
1260         if (! ISALNUM (*ps) && *ps != '_')
1261           break;
1262       if (*ps == '\0')
1263         {
1264           char *symname;
1265           etree_type *e_align;
1267           symname = (char *) xmalloc (ps - secname + sizeof "__start_");
1268           sprintf (symname, "__start_%s", secname);
1269           e_align = exp_unop (ALIGN_K,
1270                               exp_intop ((bfd_vma) 1 << s->alignment_power));
1271           lang_add_assignment (exp_assop ('=', symname, e_align));
1272         }
1273     }
1275   address = NULL;
1276   if (link_info.relocateable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
1277     address = exp_intop ((bfd_vma) 0);
1279   load_base = NULL;
1280   if (place != NULL && place->os->load_base != NULL)
1281     {
1282       etree_type *lma_from_vma;
1283       lma_from_vma = exp_binop ('-', place->os->load_base,
1284                                 exp_nameop (ADDR, place->os->name));
1285       load_base = exp_binop ('+', lma_from_vma,
1286                              exp_nameop (ADDR, secname));
1287     }
1289   os_tail = lang_output_section_statement.tail;
1290   os = lang_enter_output_section_statement (secname, address, 0,
1291                                             (bfd_vma) 0,
1292                                             (etree_type *) NULL,
1293                                             (etree_type *) NULL,
1294                                             load_base);
1296   lang_add_section (&os->children, s, os, file);
1298   lang_leave_output_section_statement
1299     ((bfd_vma) 0, "*default*",
1300      (struct lang_output_section_phdr_list *) NULL, NULL);
1302   if (config.build_constructors && *ps == '\0')
1303     {
1304       char *symname;
1306       /* lang_leave_ouput_section_statement resets stat_ptr.  Put
1307          stat_ptr back where we want it.  */
1308       if (place != NULL)
1309         stat_ptr = &add;
1311       symname = (char *) xmalloc (ps - secname + sizeof "__stop_");
1312       sprintf (symname, "__stop_%s", secname);
1313       lang_add_assignment (exp_assop ('=', symname,
1314                                       exp_nameop (NAME, ".")));
1315     }
1317   /* Restore the global list pointer.  */
1318   stat_ptr = old;
1320   if (place != NULL && os->bfd_section != NULL)
1321     {
1322       asection *snew, **pps;
1324       snew = os->bfd_section;
1326       /* Shuffle the bfd section list to make the output file look
1327          neater.  This is really only cosmetic.  */
1328       if (place->section == NULL)
1329         {
1330           asection *bfd_section = place->os->bfd_section;
1332           /* If the output statement hasn't been used to place
1333              any input sections (and thus doesn't have an output
1334              bfd_section), look for the closest prior output statement
1335              having an output section.  */
1336           if (bfd_section == NULL)
1337             bfd_section = output_prev_sec_find (place->os);
1339           if (bfd_section != NULL && bfd_section != snew)
1340             place->section = &bfd_section->next;
1341         }
1343       if (place->section != NULL)
1344         {
1345           /* Unlink the section.  */
1346           for (pps = &output_bfd->sections; *pps != snew; pps = &(*pps)->next)
1347             ;
1348           bfd_section_list_remove (output_bfd, pps);
1350           /* Now tack it on to the "place->os" section list.  */
1351           bfd_section_list_insert (output_bfd, place->section, snew);
1352         }
1354       /* Save the end of this list.  Further ophans of this type will
1355          follow the one we've just added.  */
1356       place->section = &snew->next;
1358       /* The following is non-cosmetic.  We try to put the output
1359          statements in some sort of reasonable order here, because
1360          they determine the final load addresses of the orphan
1361          sections.  In addition, placing output statements in the
1362          wrong order may require extra segments.  For instance,
1363          given a typical situation of all read-only sections placed
1364          in one segment and following that a segment containing all
1365          the read-write sections, we wouldn't want to place an orphan
1366          read/write section before or amongst the read-only ones.  */
1367       if (add.head != NULL)
1368         {
1369           lang_statement_union_type *newly_added_os;
1371           if (place->stmt == NULL)
1372             {
1373               /* Put the new statement list right at the head.  */
1374               *add.tail = place->os->header.next;
1375               place->os->header.next = add.head;
1377               place->os_tail = &place->os->next;
1378             }
1379           else
1380             {
1381               /* Put it after the last orphan statement we added.  */
1382               *add.tail = *place->stmt;
1383               *place->stmt = add.head;
1384             }
1386           /* Fix the global list pointer if we happened to tack our
1387              new list at the tail.  */
1388           if (*old->tail == add.head)
1389             old->tail = add.tail;
1391           /* Save the end of this list.  */
1392           place->stmt = add.tail;
1394           /* Do the same for the list of output section statements.  */
1395           newly_added_os = *os_tail;
1396           *os_tail = NULL;
1397           newly_added_os->output_section_statement.next = *place->os_tail;
1398           *place->os_tail = newly_added_os;
1399           place->os_tail = &newly_added_os->output_section_statement.next;
1401           /* Fixing the global list pointer here is a little different.
1402              We added to the list in lang_enter_output_section_statement,
1403              trimmed off the new output_section_statment above when
1404              assigning *os_tail = NULL, but possibly added it back in
1405              the same place when assigning *place->os_tail.  */
1406           if (*os_tail == NULL)
1407             lang_output_section_statement.tail = os_tail;
1408         }
1409     }
1411   return TRUE;
1416 if test x"$LDEMUL_FINISH" != xgld"$EMULATION_NAME"_finish; then
1417 cat >>e${EMULATION_NAME}.c <<EOF
1419 static void
1420 gld${EMULATION_NAME}_finish ()
1422   if (bfd_elf${ELFSIZE}_discard_info (output_bfd, &link_info))
1423     {
1424       lang_reset_memory_regions ();
1426       /* Resize the sections.  */
1427       lang_size_sections (stat_ptr->head, abs_output_section,
1428                           &stat_ptr->head, 0, (bfd_vma) 0, NULL);
1430       /* Redo special stuff.  */
1431       ldemul_after_allocation ();
1433       /* Do the assignments again.  */
1434       lang_do_assignments (stat_ptr->head, abs_output_section,
1435                            (fill_type *) 0, (bfd_vma) 0);
1436     }
1441 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1442 cat >>e${EMULATION_NAME}.c <<EOF
1444 static char *
1445 gld${EMULATION_NAME}_get_script (isfile)
1446      int *isfile;
1449 if test -n "$COMPILE_IN"
1450 then
1451 # Scripts compiled in.
1453 # sed commands to quote an ld script as a C string.
1454 sc="-f stringify.sed"
1456 cat >>e${EMULATION_NAME}.c <<EOF
1458   *isfile = 0;
1460   if (link_info.relocateable && config.build_constructors)
1461     return
1463 sed $sc ldscripts/${EMULATION_NAME}.xu                 >> e${EMULATION_NAME}.c
1464 echo '  ; else if (link_info.relocateable) return'     >> e${EMULATION_NAME}.c
1465 sed $sc ldscripts/${EMULATION_NAME}.xr                 >> e${EMULATION_NAME}.c
1466 echo '  ; else if (!config.text_read_only) return'     >> e${EMULATION_NAME}.c
1467 sed $sc ldscripts/${EMULATION_NAME}.xbn                >> e${EMULATION_NAME}.c
1468 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
1469 echo '  ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1470 sed $sc ldscripts/${EMULATION_NAME}.xn                 >> e${EMULATION_NAME}.c
1472 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1473 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1474 echo '  ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1475 sed $sc ldscripts/${EMULATION_NAME}.xsc                >> e${EMULATION_NAME}.c
1477 echo '  ; else if (link_info.shared) return'           >> e${EMULATION_NAME}.c
1478 sed $sc ldscripts/${EMULATION_NAME}.xs                 >> e${EMULATION_NAME}.c
1480 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1481 echo '  ; else if (link_info.combreloc) return'        >> e${EMULATION_NAME}.c
1482 sed $sc ldscripts/${EMULATION_NAME}.xc                 >> e${EMULATION_NAME}.c
1484 echo '  ; else return'                                 >> e${EMULATION_NAME}.c
1485 sed $sc ldscripts/${EMULATION_NAME}.x                  >> e${EMULATION_NAME}.c
1486 echo '; }'                                             >> e${EMULATION_NAME}.c
1488 else
1489 # Scripts read from the filesystem.
1491 cat >>e${EMULATION_NAME}.c <<EOF
1493   *isfile = 1;
1495   if (link_info.relocateable && config.build_constructors)
1496     return "ldscripts/${EMULATION_NAME}.xu";
1497   else if (link_info.relocateable)
1498     return "ldscripts/${EMULATION_NAME}.xr";
1499   else if (!config.text_read_only)
1500     return "ldscripts/${EMULATION_NAME}.xbn";
1501   else if (!config.magic_demand_paged)
1502     return "ldscripts/${EMULATION_NAME}.xn";
1503   else if (link_info.shared)
1504     return "ldscripts/${EMULATION_NAME}.xs";
1505   else
1506     return "ldscripts/${EMULATION_NAME}.x";
1513 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1515 if test x"$LDEMUL_PARSE_ARGS" != xgld"$EMULATION_NAME"_parse_args; then
1517 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1518 cat >>e${EMULATION_NAME}.c <<EOF
1519  $PARSE_AND_LIST_PROLOGUE
1523 cat >>e${EMULATION_NAME}.c <<EOF
1525 #include "getopt.h"
1527 #define OPTION_DISABLE_NEW_DTAGS        (400)
1528 #define OPTION_ENABLE_NEW_DTAGS         (OPTION_DISABLE_NEW_DTAGS + 1)
1529 #define OPTION_GROUP                    (OPTION_ENABLE_NEW_DTAGS + 1)
1530 #define OPTION_EH_FRAME_HDR             (OPTION_GROUP + 1)
1532 static struct option longopts[] =
1536 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1537 cat >>e${EMULATION_NAME}.c <<EOF
1538   /* getopt allows abbreviations, so we do this to stop it from
1539      treating -d/-e as abbreviations for these options. */
1540   {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1541   {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1542   {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1543   {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1544   {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
1545   {"Bgroup", no_argument, NULL, OPTION_GROUP},
1546   {"Bgroup", no_argument, NULL, OPTION_GROUP},
1550 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
1551 cat >>e${EMULATION_NAME}.c <<EOF
1552  $PARSE_AND_LIST_LONGOPTS
1556 cat >>e${EMULATION_NAME}.c <<EOF
1557   {NULL, no_argument, NULL, 0}
1561 static int gld${EMULATION_NAME}_parse_args PARAMS ((int, char **));
1563 static int
1564 gld${EMULATION_NAME}_parse_args (argc, argv)
1565      int argc;
1566      char ** argv;
1568   int longind;
1569   int optc;
1570   static int prevoptind = -1;
1571   int prevopterr = opterr;
1572   int wanterror;
1574   if (prevoptind != optind)
1575     opterr = 0;
1577   wanterror = opterr;
1578   prevoptind = optind;
1580   optc = getopt_long_only (argc, argv,
1581                            "-${PARSE_AND_LIST_SHORTOPTS}z:", longopts,
1582                            &longind);
1583   opterr = prevopterr;
1585   switch (optc)
1586     {
1587     default:
1588       if (wanterror)
1589         xexit (1);
1590       optind = prevoptind;
1591       return 0;
1595 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1596 cat >>e${EMULATION_NAME}.c <<EOF
1597     case OPTION_DISABLE_NEW_DTAGS:
1598       link_info.new_dtags = FALSE;
1599       break;
1601     case OPTION_ENABLE_NEW_DTAGS:
1602       link_info.new_dtags = TRUE;
1603       break;
1605     case OPTION_EH_FRAME_HDR:
1606       link_info.eh_frame_hdr = TRUE;
1607       break;
1609     case OPTION_GROUP:
1610       link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
1611       /* Groups must be self-contained.  */
1612       link_info.no_undefined = TRUE;
1613       break;
1615     case 'z':
1616       if (strcmp (optarg, "initfirst") == 0)
1617         link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
1618       else if (strcmp (optarg, "interpose") == 0)
1619         link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
1620       else if (strcmp (optarg, "loadfltr") == 0)
1621         link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
1622       else if (strcmp (optarg, "nodefaultlib") == 0)
1623         link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
1624       else if (strcmp (optarg, "nodelete") == 0)
1625         link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
1626       else if (strcmp (optarg, "nodlopen") == 0)
1627         link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
1628       else if (strcmp (optarg, "nodump") == 0)
1629         link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
1630       else if (strcmp (optarg, "now") == 0)
1631         {
1632           link_info.flags |= (bfd_vma) DF_BIND_NOW;
1633           link_info.flags_1 |= (bfd_vma) DF_1_NOW;
1634         }
1635       else if (strcmp (optarg, "origin") == 0)
1636         {
1637           link_info.flags |= (bfd_vma) DF_ORIGIN;
1638           link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
1639         }
1640       else if (strcmp (optarg, "defs") == 0)
1641         link_info.no_undefined = TRUE;
1642       else if (strcmp (optarg, "muldefs") == 0)
1643         link_info.allow_multiple_definition = TRUE;
1644       else if (strcmp (optarg, "combreloc") == 0)
1645         link_info.combreloc = TRUE;
1646       else if (strcmp (optarg, "nocombreloc") == 0)
1647         link_info.combreloc = FALSE;
1648       else if (strcmp (optarg, "nocopyreloc") == 0)
1649         link_info.nocopyreloc = TRUE;
1650       /* What about the other Solaris -z options? FIXME.  */
1651       break;
1655 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
1656 cat >>e${EMULATION_NAME}.c <<EOF
1657  $PARSE_AND_LIST_ARGS_CASES
1661 cat >>e${EMULATION_NAME}.c <<EOF
1662     }
1664   return 1;
1670 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1671 cat >>e${EMULATION_NAME}.c <<EOF
1673 static void gld${EMULATION_NAME}_list_options PARAMS ((FILE * file));
1675 static void
1676 gld${EMULATION_NAME}_list_options (file)
1677      FILE * file;
1681 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1682 cat >>e${EMULATION_NAME}.c <<EOF
1683   fprintf (file, _("  -Bgroup\t\tSelects group name lookup rules for DSO\n"));
1684   fprintf (file, _("  --disable-new-dtags\tDisable new dynamic tags\n"));
1685   fprintf (file, _("  --enable-new-dtags\tEnable new dynamic tags\n"));
1686   fprintf (file, _("  --eh-frame-hdr\tCreate .eh_frame_hdr section\n"));
1687   fprintf (file, _("  -z combreloc\t\tMerge dynamic relocs into one section and sort\n"));
1688   fprintf (file, _("  -z defs\t\tDisallows undefined symbols\n"));
1689   fprintf (file, _("  -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
1690   fprintf (file, _("  -z interpose\t\tMark object to interpose all DSOs but executable\n"));
1691   fprintf (file, _("  -z loadfltr\t\tMark object requiring immediate process\n"));
1692   fprintf (file, _("  -z muldefs\t\tAllow multiple definitions\n"));
1693   fprintf (file, _("  -z nocombreloc\tDon't merge dynamic relocs into one section\n"));
1694   fprintf (file, _("  -z nocopyreloc\tDon't create copy relocs\n"));
1695   fprintf (file, _("  -z nodefaultlib\tMark object not to use default search paths\n"));
1696   fprintf (file, _("  -z nodelete\t\tMark DSO non-deletable at runtime\n"));
1697   fprintf (file, _("  -z nodlopen\t\tMark DSO not available to dlopen\n"));
1698   fprintf (file, _("  -z nodump\t\tMark DSO not available to dldump\n"));
1699   fprintf (file, _("  -z now\t\tMark object non-lazy runtime binding\n"));
1700   fprintf (file, _("  -z origin\t\tMark object requiring immediate \$ORIGIN processing\n\t\t\t  at runtime\n"));
1701   fprintf (file, _("  -z KEYWORD\t\tIgnored for Solaris compatibility\n"));
1705 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
1706 cat >>e${EMULATION_NAME}.c <<EOF
1707  $PARSE_AND_LIST_OPTIONS
1711 cat >>e${EMULATION_NAME}.c <<EOF
1715 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
1716 cat >>e${EMULATION_NAME}.c <<EOF
1717  $PARSE_AND_LIST_EPILOGUE
1721 else
1722 if test x"$LDEMUL_PARSE_ARGS" != xgld"$EMULATION_NAME"_parse_args; then
1723 cat >>e${EMULATION_NAME}.c <<EOF
1724 #define gld${EMULATION_NAME}_parse_args   NULL
1727 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1728 cat >>e${EMULATION_NAME}.c <<EOF
1729 #define gld${EMULATION_NAME}_list_options NULL
1734 cat >>e${EMULATION_NAME}.c <<EOF
1736 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1738   ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
1739   ${LDEMUL_SYSLIB-syslib_default},
1740   ${LDEMUL_HLL-hll_default},
1741   ${LDEMUL_AFTER_PARSE-after_parse_default},
1742   ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
1743   ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
1744   ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
1745   ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
1746   ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
1747   ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
1748   "${EMULATION_NAME}",
1749   "${OUTPUT_FORMAT}",
1750   ${LDEMUL_FINISH-gld${EMULATION_NAME}_finish},
1751   ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
1752   ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
1753   ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
1754   ${LDEMUL_SET_SYMBOLS-NULL},
1755   ${LDEMUL_PARSE_ARGS-gld${EMULATION_NAME}_parse_args},
1756   ${LDEMUL_UNRECOGNIZED_FILE-NULL},
1757   ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
1758   ${LDEMUL_RECOGNIZED_FILE-NULL},
1759   ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
1760   ${LDEMUL_NEW_VERS_PATTERN-NULL}