2002-06-12 H.J. Lu <hjl@gnu.org>
[binutils.git] / ld / emultempl / elf32.em
blobcfd0409befe070af7292aa269016db764b31d49c
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 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 boolean gld${EMULATION_NAME}_try_needed
62   PARAMS ((const char *, int));
63 static 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 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 ((void));
79 static asection *output_prev_sec_find
80   PARAMS ((lang_output_section_statement_type *));
81 static 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 boolean global_found;
132 static struct bfd_link_needed_list *global_vercheck_needed;
133 static 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 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 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${host}" = "x${target}" ] ; then
443   case " ${EMULATION_LIBPATH} " in
444   *" ${EMULATION_NAME} "*)
445     case ${target} in
446       *-*-linux-gnu*)
447         cat >>e${EMULATION_NAME}.c <<EOF
449 /* For a native linker, check the file /etc/ld.so.conf for directories
450    in which we may find shared libraries.  /etc/ld.so.conf is really
451    only meaningful on Linux.  */
453 static boolean gld${EMULATION_NAME}_check_ld_so_conf
454   PARAMS ((const char *, int));
456 static boolean
457 gld${EMULATION_NAME}_check_ld_so_conf (name, force)
458      const char *name;
459      int force;
461   static boolean initialized;
462   static char *ld_so_conf;
464   if (! initialized)
465     {
466       FILE *f;
468       f = fopen ("/etc/ld.so.conf", FOPEN_RT);
469       if (f != NULL)
470         {
471           char *b;
472           size_t len, alloc;
473           int c;
475           len = 0;
476           alloc = 100;
477           b = (char *) xmalloc (alloc);
479           while ((c = getc (f)) != EOF)
480             {
481               if (len + 1 >= alloc)
482                 {
483                   alloc *= 2;
484                   b = (char *) xrealloc (b, alloc);
485                 }
486               if (c != ':'
487                   && c != ' '
488                   && c != '\t'
489                   && c != '\n'
490                   && c != ',')
491                 {
492                   b[len] = c;
493                   ++len;
494                 }
495               else
496                 {
497                   if (len > 0 && b[len - 1] != ':')
498                     {
499                       b[len] = ':';
500                       ++len;
501                     }
502                 }
503             }
505           if (len > 0 && b[len - 1] == ':')
506             --len;
508           if (len > 0)
509             b[len] = '\0';
510           else
511             {
512               free (b);
513               b = NULL;
514             }
516           fclose (f);
518           ld_so_conf = b;
519         }
521       initialized = true;
522     }
524   if (ld_so_conf == NULL)
525     return false;
527   return gld${EMULATION_NAME}_search_needed (ld_so_conf, name, force);
531         # Linux
532         ;;
533     esac
534   esac
536 cat >>e${EMULATION_NAME}.c <<EOF
538 /* See if an input file matches a DT_NEEDED entry by name.  */
540 static void
541 gld${EMULATION_NAME}_check_needed (s)
542      lang_input_statement_type *s;
544   if (global_found)
545     return;
547   if (s->filename != NULL)
548     {
549       const char *f;
551       if (strcmp (s->filename, global_needed->name) == 0)
552         {
553           global_found = true;
554           return;
555         }
557       if (s->search_dirs_flag)
558         {
559           f = strrchr (s->filename, '/');
560           if (f != NULL
561               && strcmp (f + 1, global_needed->name) == 0)
562             {
563               global_found = true;
564               return;
565             }
566         }
567     }
569   if (s->the_bfd != NULL)
570     {
571       const char *soname;
573       soname = bfd_elf_get_dt_soname (s->the_bfd);
574       if (soname != NULL
575           && strcmp (soname, global_needed->name) == 0)
576         {
577           global_found = true;
578           return;
579         }
580     }
585 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
586 cat >>e${EMULATION_NAME}.c <<EOF
588 /* This is called after all the input files have been opened.  */
590 static void
591 gld${EMULATION_NAME}_after_open ()
593   struct bfd_link_needed_list *needed, *l;
595   /* We only need to worry about this when doing a final link.  */
596   if (link_info.relocateable || link_info.shared)
597     return;
599   /* Get the list of files which appear in DT_NEEDED entries in
600      dynamic objects included in the link (often there will be none).
601      For each such file, we want to track down the corresponding
602      library, and include the symbol table in the link.  This is what
603      the runtime dynamic linker will do.  Tracking the files down here
604      permits one dynamic object to include another without requiring
605      special action by the person doing the link.  Note that the
606      needed list can actually grow while we are stepping through this
607      loop.  */
608   needed = bfd_elf_get_needed_list (output_bfd, &link_info);
609   for (l = needed; l != NULL; l = l->next)
610     {
611       struct bfd_link_needed_list *ll;
612       int force;
614       /* If we've already seen this file, skip it.  */
615       for (ll = needed; ll != l; ll = ll->next)
616         if (strcmp (ll->name, l->name) == 0)
617           break;
618       if (ll != l)
619         continue;
621       /* See if this file was included in the link explicitly.  */
622       global_needed = l;
623       global_found = false;
624       lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
625       if (global_found)
626         continue;
628       if (trace_file_tries)
629         info_msg (_("%s needed by %B\n"), l->name, l->by);
631       /* We need to find this file and include the symbol table.  We
632          want to search for the file in the same way that the dynamic
633          linker will search.  That means that we want to use
634          rpath_link, rpath, then the environment variable
635          LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
636          entries (native only), then the linker script LIB_SEARCH_DIRS.
637          We do not search using the -L arguments.
639          We search twice.  The first time, we skip objects which may
640          introduce version mismatches.  The second time, we force
641          their use.  See gld${EMULATION_NAME}_vercheck comment.  */
642       for (force = 0; force < 2; force++)
643         {
644           size_t len;
645           search_dirs_type *search;
647 if [ "x${host}" = "x${target}" ] ; then
648   case " ${EMULATION_LIBPATH} " in
649   *" ${EMULATION_NAME} "*)
650 cat >>e${EMULATION_NAME}.c <<EOF
651           const char *lib_path;
652           struct bfd_link_needed_list *rp;
653           int found;
655   ;;
656   esac
658 cat >>e${EMULATION_NAME}.c <<EOF
660           if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
661                                                   l->name, force))
662             break;
664 if [ "x${host}" = "x${target}" ] ; then
665   case " ${EMULATION_LIBPATH} " in
666   *" ${EMULATION_NAME} "*)
667 cat >>e${EMULATION_NAME}.c <<EOF
668           if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
669                                                   l->name, force))
670             break;
671           if (command_line.rpath_link == NULL
672               && command_line.rpath == NULL)
673             {
674               lib_path = (const char *) getenv ("LD_RUN_PATH");
675               if (gld${EMULATION_NAME}_search_needed (lib_path, l->name,
676                                                       force))
677                 break;
678             }
679           lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
680           if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, force))
681             break;
683           found = 0;
684           rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
685           for (; !found && rp != NULL; rp = rp->next)
686             {
687               found = (rp->by == l->by
688                        && gld${EMULATION_NAME}_search_needed (rp->name,
689                                                               l->name,
690                                                               force));
691             }
692           if (found)
693             break;
696   ;;
697   esac
699 cat >>e${EMULATION_NAME}.c <<EOF
700           len = strlen (l->name);
701           for (search = search_head; search != NULL; search = search->next)
702             {
703               char *filename;
705               if (search->cmdline)
706                 continue;
707               filename = (char *) xmalloc (strlen (search->name) + len + 2);
708               sprintf (filename, "%s/%s", search->name, l->name);
709               if (gld${EMULATION_NAME}_try_needed (filename, force))
710                 break;
711               free (filename);
712             }
713           if (search != NULL)
714             break;
716 if [ "x${host}" = "x${target}" ] ; then
717   case " ${EMULATION_LIBPATH} " in
718   *" ${EMULATION_NAME} "*)
719     case ${target} in
720       *-*-linux-gnu*)
721         cat >>e${EMULATION_NAME}.c <<EOF
722           if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
723             break;
725         # Linux
726         ;;
727     esac
728   ;;
729   esac
731 cat >>e${EMULATION_NAME}.c <<EOF
732         }
734       if (force < 2)
735         continue;
737       einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
738              l->name, l->by);
739     }
745 cat >>e${EMULATION_NAME}.c <<EOF
747 /* Look through an expression for an assignment statement.  */
749 static void
750 gld${EMULATION_NAME}_find_exp_assignment (exp)
751      etree_type *exp;
753   struct bfd_link_hash_entry *h;
755   switch (exp->type.node_class)
756     {
757     case etree_provide:
758       h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
759                                 false, false, false);
760       if (h == NULL)
761         break;
763       /* We call record_link_assignment even if the symbol is defined.
764          This is because if it is defined by a dynamic object, we
765          actually want to use the value defined by the linker script,
766          not the value from the dynamic object (because we are setting
767          symbols like etext).  If the symbol is defined by a regular
768          object, then, as it happens, calling record_link_assignment
769          will do no harm.  */
771       /* Fall through.  */
772     case etree_assign:
773       if (strcmp (exp->assign.dst, ".") != 0)
774         {
775           if (! (bfd_elf${ELFSIZE}_record_link_assignment
776                  (output_bfd, &link_info, exp->assign.dst,
777                   exp->type.node_class == etree_provide ? true : false)))
778             einfo ("%P%F: failed to record assignment to %s: %E\n",
779                    exp->assign.dst);
780         }
781       gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
782       break;
784     case etree_binary:
785       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
786       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
787       break;
789     case etree_trinary:
790       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
791       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
792       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
793       break;
795     case etree_unary:
796       gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
797       break;
799     default:
800       break;
801     }
805 /* This is called by the before_allocation routine via
806    lang_for_each_statement.  It locates any assignment statements, and
807    tells the ELF backend about them, in case they are assignments to
808    symbols which are referred to by dynamic objects.  */
810 static void
811 gld${EMULATION_NAME}_find_statement_assignment (s)
812      lang_statement_union_type *s;
814   if (s->header.type == lang_assignment_statement_enum)
815     gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
820 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
821   if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
822     ELF_INTERPRETER_SET_DEFAULT="
823   if (sinterp != NULL)
824     {
825       sinterp->contents = ${ELF_INTERPRETER_NAME};
826       sinterp->_raw_size = strlen (sinterp->contents) + 1;
827     }
830   else
831     ELF_INTERPRETER_SET_DEFAULT=
832   fi
833 cat >>e${EMULATION_NAME}.c <<EOF
835 /* This is called after the sections have been attached to output
836    sections, but before any sizes or addresses have been set.  */
838 static void
839 gld${EMULATION_NAME}_before_allocation ()
841   const char *rpath;
842   asection *sinterp;
844   /* If we are going to make any variable assignments, we need to let
845      the ELF backend know about them in case the variables are
846      referred to by dynamic objects.  */
847   lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
849   /* Let the ELF backend work out the sizes of any sections required
850      by dynamic linking.  */
851   rpath = command_line.rpath;
852   if (rpath == NULL)
853     rpath = (const char *) getenv ("LD_RUN_PATH");
854   if (! (bfd_elf${ELFSIZE}_size_dynamic_sections
855          (output_bfd, command_line.soname, rpath,
856           command_line.filter_shlib,
857           (const char * const *) command_line.auxiliary_filters,
858           &link_info, &sinterp, lang_elf_version_info)))
859     einfo ("%P%F: failed to set dynamic section sizes: %E\n");
860 ${ELF_INTERPRETER_SET_DEFAULT}
861   /* Let the user override the dynamic linker we are using.  */
862   if (command_line.interpreter != NULL
863       && sinterp != NULL)
864     {
865       sinterp->contents = (bfd_byte *) command_line.interpreter;
866       sinterp->_raw_size = strlen (command_line.interpreter) + 1;
867     }
869   /* Look for any sections named .gnu.warning.  As a GNU extensions,
870      we treat such sections as containing warning messages.  We print
871      out the warning message, and then zero out the section size so
872      that it does not get copied into the output file.  */
874   {
875     LANG_FOR_EACH_INPUT_STATEMENT (is)
876       {
877         asection *s;
878         bfd_size_type sz;
879         char *msg;
880         boolean ret;
882         if (is->just_syms_flag)
883           continue;
885         s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
886         if (s == NULL)
887           continue;
889         sz = bfd_section_size (is->the_bfd, s);
890         msg = xmalloc ((size_t) sz + 1);
891         if (! bfd_get_section_contents (is->the_bfd, s, msg, (file_ptr) 0, sz))
892           einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
893                  is->the_bfd);
894         msg[sz] = '\0';
895         ret = link_info.callbacks->warning (&link_info, msg,
896                                             (const char *) NULL,
897                                             is->the_bfd, (asection *) NULL,
898                                             (bfd_vma) 0);
899         ASSERT (ret);
900         free (msg);
902         /* Clobber the section size, so that we don't waste copying the
903            warning into the output file.  */
904         s->_raw_size = 0;
905       }
906   }
912 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
913 cat >>e${EMULATION_NAME}.c <<EOF
915 /* Try to open a dynamic archive.  This is where we know that ELF
916    dynamic libraries have an extension of .so (or .sl on oddball systems
917    like hpux).  */
919 static boolean
920 gld${EMULATION_NAME}_open_dynamic_archive (arch, search, entry)
921      const char *arch;
922      search_dirs_type *search;
923      lang_input_statement_type *entry;
925   const char *filename;
926   char *string;
928   if (! entry->is_archive)
929     return false;
931   filename = entry->filename;
933   /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
934      is defined, but it does not seem worth the headache to optimize
935      away those two bytes of space.  */
936   string = (char *) xmalloc (strlen (search->name)
937                              + strlen (filename)
938                              + strlen (arch)
939 #ifdef EXTRA_SHLIB_EXTENSION
940                              + strlen (EXTRA_SHLIB_EXTENSION)
941 #endif
942                              + sizeof "/lib.so");
944   sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
946 #ifdef EXTRA_SHLIB_EXTENSION
947   /* Try the .so extension first.  If that fails build a new filename
948      using EXTRA_SHLIB_EXTENSION.  */
949   if (! ldfile_try_open_bfd (string, entry))
950     sprintf (string, "%s/lib%s%s%s", search->name,
951              filename, arch, EXTRA_SHLIB_EXTENSION);
952 #endif
954   if (! ldfile_try_open_bfd (string, entry))
955     {
956       free (string);
957       return false;
958     }
960   entry->filename = string;
962   /* We have found a dynamic object to include in the link.  The ELF
963      backend linker will create a DT_NEEDED entry in the .dynamic
964      section naming this file.  If this file includes a DT_SONAME
965      entry, it will be used.  Otherwise, the ELF linker will just use
966      the name of the file.  For an archive found by searching, like
967      this one, the DT_NEEDED entry should consist of just the name of
968      the file, without the path information used to find it.  Note
969      that we only need to do this if we have a dynamic object; an
970      archive will never be referenced by a DT_NEEDED entry.
972      FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
973      very pretty.  I haven't been able to think of anything that is
974      pretty, though.  */
975   if (bfd_check_format (entry->the_bfd, bfd_object)
976       && (entry->the_bfd->flags & DYNAMIC) != 0)
977     {
978       ASSERT (entry->is_archive && entry->search_dirs_flag);
980       /* Rather than duplicating the logic above.  Just use the
981          filename we recorded earlier.  */
983       filename = lbasename (entry->filename);
984       bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
985     }
987   return true;
993 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
994 cat >>e${EMULATION_NAME}.c <<EOF
996 /* A variant of lang_output_section_find.  Used by place_orphan.  */
998 static lang_output_section_statement_type *
999 output_rel_find ()
1001   lang_statement_union_type *u;
1002   lang_output_section_statement_type *lookup;
1004   for (u = lang_output_section_statement.head;
1005        u != (lang_statement_union_type *) NULL;
1006        u = lookup->next)
1007     {
1008       lookup = &u->output_section_statement;
1009       if (strncmp (".rel", lookup->name, 4) == 0
1010           && lookup->bfd_section != NULL
1011           && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1012         {
1013           return lookup;
1014         }
1015     }
1016   return (lang_output_section_statement_type *) NULL;
1019 /* Find the last output section before given output statement.
1020    Used by place_orphan.  */
1022 static asection *
1023 output_prev_sec_find (os)
1024      lang_output_section_statement_type *os;
1026   asection *s = (asection *) NULL;
1027   lang_statement_union_type *u;
1028   lang_output_section_statement_type *lookup;
1030   for (u = lang_output_section_statement.head;
1031        u != (lang_statement_union_type *) NULL;
1032        u = lookup->next)
1033     {
1034       lookup = &u->output_section_statement;
1035       if (lookup == os)
1036         return s;
1038       if (lookup->bfd_section != NULL && lookup->bfd_section->owner != NULL)
1039         s = lookup->bfd_section;
1040     }
1042   return NULL;
1045 /* Place an orphan section.  We use this to put random SHF_ALLOC
1046    sections in the right segment.  */
1048 struct orphan_save {
1049   lang_output_section_statement_type *os;
1050   asection **section;
1051   lang_statement_union_type **stmt;
1054 static boolean
1055 gld${EMULATION_NAME}_place_orphan (file, s)
1056      lang_input_statement_type *file;
1057      asection *s;
1059   static struct orphan_save hold_text;
1060   static struct orphan_save hold_rodata;
1061   static struct orphan_save hold_data;
1062   static struct orphan_save hold_bss;
1063   static struct orphan_save hold_rel;
1064   static struct orphan_save hold_interp;
1065   static struct orphan_save hold_sdata;
1066   static int count = 1;
1067   struct orphan_save *place;
1068   lang_statement_list_type *old;
1069   lang_statement_list_type add;
1070   etree_type *address;
1071   const char *secname;
1072   const char *outsecname;
1073   const char *ps = NULL;
1074   lang_output_section_statement_type *os;
1076   secname = bfd_get_section_name (s->owner, s);
1078   if (! config.unique_orphan_sections && ! unique_section_p (secname))
1079     {
1080       /* Look through the script to see where to place this section.  */
1081       os = lang_output_section_find (secname);
1083       if (os != NULL
1084           && (os->bfd_section == NULL
1085               || ((s->flags ^ os->bfd_section->flags)
1086                   & (SEC_LOAD | SEC_ALLOC)) == 0))
1087         {
1088           /* We already have an output section statement with this
1089              name, and its bfd section, if any, has compatible flags.  */
1090           lang_add_section (&os->children, s, os, file);
1091           return true;
1092         }
1093     }
1095   if (hold_text.os == NULL)
1096     hold_text.os = lang_output_section_find (".text");
1098   /* If this is a final link, then always put .gnu.warning.SYMBOL
1099      sections into the .text section to get them out of the way.  */
1100   if (! link_info.shared
1101       && ! link_info.relocateable
1102       && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
1103       && hold_text.os != NULL)
1104     {
1105       lang_add_section (&hold_text.os->children, s, hold_text.os, file);
1106       return true;
1107     }
1109   /* Decide which segment the section should go in based on the
1110      section name and section flags.  We put loadable .note sections
1111      right after the .interp section, so that the PT_NOTE segment is
1112      stored right after the program headers where the OS can read it
1113      in the first page.  */
1114 #define HAVE_SECTION(hold, name) \
1115 (hold.os != NULL || (hold.os = lang_output_section_find (name)) != NULL)
1117   if ((s->flags & SEC_EXCLUDE) != 0 && !link_info.relocateable)
1118     {
1119       if (s->output_section == NULL)
1120         s->output_section = bfd_abs_section_ptr;
1121       return true;
1122     }
1124   place = NULL;
1125   if ((s->flags & SEC_ALLOC) == 0)
1126     ;
1127   else if ((s->flags & SEC_LOAD) != 0
1128            && strncmp (secname, ".note", 5) == 0
1129            && HAVE_SECTION (hold_interp, ".interp"))
1130     place = &hold_interp;
1131   else if ((s->flags & SEC_HAS_CONTENTS) == 0
1132            && HAVE_SECTION (hold_bss, ".bss"))
1133     place = &hold_bss;
1134   else if ((s->flags & SEC_SMALL_DATA) != 0
1135            && HAVE_SECTION (hold_sdata, ".sdata"))
1136     place = &hold_sdata;
1137   else if ((s->flags & SEC_READONLY) == 0
1138            && HAVE_SECTION (hold_data, ".data"))
1139     place = &hold_data;
1140   else if (strncmp (secname, ".rel", 4) == 0
1141            && (hold_rel.os != NULL
1142                || (hold_rel.os = output_rel_find ()) != NULL))
1143     {
1144       if (! link_info.relocateable && link_info.combreloc)
1145         {
1146           if (strncmp (secname, ".rela", 5) == 0)
1147             os = lang_output_section_find (".rela.dyn");
1148           else
1149             os = lang_output_section_find (".rel.dyn");
1151           if (os != NULL
1152               && os->bfd_section != NULL
1153               && ((s->flags ^ os->bfd_section->flags)
1154                   & (SEC_LOAD | SEC_ALLOC)) == 0)
1155             {
1156               lang_add_section (&os->children, s, os, file);
1157               return true;
1158             }
1159         }
1160       place = &hold_rel;
1161     }
1162   else if ((s->flags & (SEC_CODE | SEC_READONLY)) == SEC_READONLY
1163            && HAVE_SECTION (hold_rodata, ".rodata"))
1164     place = &hold_rodata;
1165   else if ((s->flags & (SEC_CODE | SEC_READONLY)) == (SEC_CODE | SEC_READONLY)
1166            && hold_text.os != NULL)
1167     place = &hold_text;
1169 #undef HAVE_SECTION
1171   /* Choose a unique name for the section.  This will be needed if the
1172      same section name appears in the input file with different
1173      loadable or allocatable characteristics.  */
1174   outsecname = secname;
1175   if (bfd_get_section_by_name (output_bfd, outsecname) != NULL)
1176     {
1177       outsecname = bfd_get_unique_section_name (output_bfd,
1178                                                 outsecname,
1179                                                 &count);
1180       if (outsecname == NULL)
1181         einfo ("%F%P: place_orphan failed: %E\n");
1182     }
1184   /* Start building a list of statements for this section.
1185      First save the current statement pointer.  */
1186   old = stat_ptr;
1188   /* If we have found an appropriate place for the output section
1189      statements for this orphan, add them to our own private list,
1190      inserting them later into the global statement list.  */
1191   if (place != NULL)
1192     {
1193       stat_ptr = &add;
1194       lang_list_init (stat_ptr);
1195     }
1197   if (config.build_constructors)
1198     {
1199       /* If the name of the section is representable in C, then create
1200          symbols to mark the start and the end of the section.  */
1201       for (ps = outsecname; *ps != '\0'; ps++)
1202         if (! ISALNUM (*ps) && *ps != '_')
1203           break;
1204       if (*ps == '\0')
1205         {
1206           char *symname;
1207           etree_type *e_align;
1209           symname = (char *) xmalloc (ps - outsecname + sizeof "__start_");
1210           sprintf (symname, "__start_%s", outsecname);
1211           e_align = exp_unop (ALIGN_K,
1212                               exp_intop ((bfd_vma) 1 << s->alignment_power));
1213           lang_add_assignment (exp_assop ('=', symname, e_align));
1214         }
1215     }
1217   if (link_info.relocateable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
1218     address = exp_intop ((bfd_vma) 0);
1219   else
1220     address = NULL;
1222   os = lang_enter_output_section_statement (outsecname, address, 0,
1223                                             (bfd_vma) 0,
1224                                             (etree_type *) NULL,
1225                                             (etree_type *) NULL,
1226                                             (etree_type *) NULL);
1228   lang_add_section (&os->children, s, os, file);
1230   lang_leave_output_section_statement
1231     ((bfd_vma) 0, "*default*",
1232      (struct lang_output_section_phdr_list *) NULL, NULL);
1234   if (config.build_constructors && *ps == '\0')
1235     {
1236       char *symname;
1238       /* lang_leave_ouput_section_statement resets stat_ptr.  Put
1239          stat_ptr back where we want it.  */
1240       if (place != NULL)
1241         stat_ptr = &add;
1243       symname = (char *) xmalloc (ps - outsecname + sizeof "__stop_");
1244       sprintf (symname, "__stop_%s", outsecname);
1245       lang_add_assignment (exp_assop ('=', symname,
1246                                       exp_nameop (NAME, ".")));
1247     }
1249   /* Restore the global list pointer.  */
1250   stat_ptr = old;
1252   if (place != NULL)
1253     {
1254       asection *snew, **pps;
1256       snew = os->bfd_section;
1258       /* Shuffle the bfd section list to make the output file look
1259          neater.  This is really only cosmetic.  */
1260       if (place->section == NULL)
1261         {
1262           asection *bfd_section = place->os->bfd_section;
1264           /* If the output statement hasn't been used to place
1265              any input sections (and thus doesn't have an output
1266              bfd_section), look for the closest prior output statement
1267              having an output section.  */
1268           if (bfd_section == NULL)
1269             bfd_section = output_prev_sec_find (place->os);
1271           if (bfd_section != NULL && bfd_section != snew)
1272             place->section = &bfd_section->next;
1273         }
1275       if (place->section != NULL)
1276         {
1277           /* Unlink the section.  */
1278           for (pps = &output_bfd->sections; *pps != snew; pps = &(*pps)->next)
1279             ;
1280           bfd_section_list_remove (output_bfd, pps);
1282           /* Now tack it on to the "place->os" section list.  */
1283           bfd_section_list_insert (output_bfd, place->section, snew);
1284         }
1286       /* Save the end of this list.  Further ophans of this type will
1287          follow the one we've just added.  */
1288       place->section = &snew->next;
1290       /* The following is non-cosmetic.  We try to put the output
1291          statements in some sort of reasonable order here, because
1292          they determine the final load addresses of the orphan
1293          sections.  In addition, placing output statements in the
1294          wrong order may require extra segments.  For instance,
1295          given a typical situation of all read-only sections placed
1296          in one segment and following that a segment containing all
1297          the read-write sections, we wouldn't want to place an orphan
1298          read/write section before or amongst the read-only ones.  */
1299       if (add.head != NULL)
1300         {
1301           if (place->stmt == NULL)
1302             {
1303               /* Put the new statement list right at the head.  */
1304               *add.tail = place->os->header.next;
1305               place->os->header.next = add.head;
1306             }
1307           else
1308             {
1309               /* Put it after the last orphan statement we added.  */
1310               *add.tail = *place->stmt;
1311               *place->stmt = add.head;
1312             }
1314           /* Fix the global list pointer if we happened to tack our
1315              new list at the tail.  */
1316           if (*old->tail == add.head)
1317             old->tail = add.tail;
1319           /* Save the end of this list.  */
1320           place->stmt = add.tail;
1321         }
1322     }
1324   return true;
1329 if test x"$LDEMUL_FINISH" != xgld"$EMULATION_NAME"_finish; then
1330 cat >>e${EMULATION_NAME}.c <<EOF
1332 static void
1333 gld${EMULATION_NAME}_finish ()
1335   if (bfd_elf${ELFSIZE}_discard_info (output_bfd, &link_info))
1336     {
1337       lang_reset_memory_regions ();
1339       /* Resize the sections.  */
1340       lang_size_sections (stat_ptr->head, abs_output_section,
1341                           &stat_ptr->head, 0, (bfd_vma) 0, NULL);
1343       /* Redo special stuff.  */
1344       ldemul_after_allocation ();
1346       /* Do the assignments again.  */
1347       lang_do_assignments (stat_ptr->head, abs_output_section,
1348                            (fill_type *) 0, (bfd_vma) 0);
1349     }
1354 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1355 cat >>e${EMULATION_NAME}.c <<EOF
1357 static char *
1358 gld${EMULATION_NAME}_get_script (isfile)
1359      int *isfile;
1362 if test -n "$COMPILE_IN"
1363 then
1364 # Scripts compiled in.
1366 # sed commands to quote an ld script as a C string.
1367 sc="-f stringify.sed"
1369 cat >>e${EMULATION_NAME}.c <<EOF
1371   *isfile = 0;
1373   if (link_info.relocateable == true && config.build_constructors == true)
1374     return
1376 sed $sc ldscripts/${EMULATION_NAME}.xu                     >> e${EMULATION_NAME}.c
1377 echo '  ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c
1378 sed $sc ldscripts/${EMULATION_NAME}.xr                     >> e${EMULATION_NAME}.c
1379 echo '  ; else if (!config.text_read_only) return'         >> e${EMULATION_NAME}.c
1380 sed $sc ldscripts/${EMULATION_NAME}.xbn                    >> e${EMULATION_NAME}.c
1381 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
1382 echo '  ; else if (!config.magic_demand_paged) return'     >> e${EMULATION_NAME}.c
1383 sed $sc ldscripts/${EMULATION_NAME}.xn                     >> e${EMULATION_NAME}.c
1385 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1386 echo '  ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1387 sed $sc ldscripts/${EMULATION_NAME}.xsc                    >> e${EMULATION_NAME}.c
1388 echo '  ; else if (link_info.shared) return'               >> e${EMULATION_NAME}.c
1389 sed $sc ldscripts/${EMULATION_NAME}.xs                     >> e${EMULATION_NAME}.c
1391 echo '  ; else if (link_info.combreloc) return'            >> e${EMULATION_NAME}.c
1392 sed $sc ldscripts/${EMULATION_NAME}.xc                     >> e${EMULATION_NAME}.c
1393 echo '  ; else return'                                     >> e${EMULATION_NAME}.c
1394 sed $sc ldscripts/${EMULATION_NAME}.x                      >> e${EMULATION_NAME}.c
1395 echo '; }'                                                 >> e${EMULATION_NAME}.c
1397 else
1398 # Scripts read from the filesystem.
1400 cat >>e${EMULATION_NAME}.c <<EOF
1402   *isfile = 1;
1404   if (link_info.relocateable == true && config.build_constructors == true)
1405     return "ldscripts/${EMULATION_NAME}.xu";
1406   else if (link_info.relocateable == true)
1407     return "ldscripts/${EMULATION_NAME}.xr";
1408   else if (!config.text_read_only)
1409     return "ldscripts/${EMULATION_NAME}.xbn";
1410   else if (!config.magic_demand_paged)
1411     return "ldscripts/${EMULATION_NAME}.xn";
1412   else if (link_info.shared)
1413     return "ldscripts/${EMULATION_NAME}.xs";
1414   else
1415     return "ldscripts/${EMULATION_NAME}.x";
1422 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1424 if test x"$LDEMUL_PARSE_ARGS" != xgld"$EMULATION_NAME"_parse_args; then
1426 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1427 cat >>e${EMULATION_NAME}.c <<EOF
1428  $PARSE_AND_LIST_PROLOGUE
1432 cat >>e${EMULATION_NAME}.c <<EOF
1434 #include "getopt.h"
1436 #define OPTION_DISABLE_NEW_DTAGS        (400)
1437 #define OPTION_ENABLE_NEW_DTAGS         (OPTION_DISABLE_NEW_DTAGS + 1)
1438 #define OPTION_GROUP                    (OPTION_ENABLE_NEW_DTAGS + 1)
1439 #define OPTION_EH_FRAME_HDR             (OPTION_GROUP + 1)
1441 static struct option longopts[] =
1445 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1446 cat >>e${EMULATION_NAME}.c <<EOF
1447   /* getopt allows abbreviations, so we do this to stop it from
1448      treating -d/-e as abbreviations for these options. */
1449   {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1450   {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1451   {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1452   {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1453   {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
1454   {"Bgroup", no_argument, NULL, OPTION_GROUP},
1455   {"Bgroup", no_argument, NULL, OPTION_GROUP},
1459 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
1460 cat >>e${EMULATION_NAME}.c <<EOF
1461  $PARSE_AND_LIST_LONGOPTS
1465 cat >>e${EMULATION_NAME}.c <<EOF
1466   {NULL, no_argument, NULL, 0}
1470 static int gld${EMULATION_NAME}_parse_args PARAMS ((int, char **));
1472 static int
1473 gld${EMULATION_NAME}_parse_args (argc, argv)
1474      int argc;
1475      char ** argv;
1477   int longind;
1478   int optc;
1479   static int prevoptind = -1;
1480   int prevopterr = opterr;
1481   int wanterror;
1483   if (prevoptind != optind)
1484     opterr = 0;
1486   wanterror = opterr;
1487   prevoptind = optind;
1489   optc = getopt_long_only (argc, argv,
1490                            "-${PARSE_AND_LIST_SHORTOPTS}z:", longopts,
1491                            &longind);
1492   opterr = prevopterr;
1494   switch (optc)
1495     {
1496     default:
1497       if (wanterror)
1498         xexit (1);
1499       optind = prevoptind;
1500       return 0;
1504 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1505 cat >>e${EMULATION_NAME}.c <<EOF
1506     case OPTION_DISABLE_NEW_DTAGS:
1507       link_info.new_dtags = false;
1508       break;
1510     case OPTION_ENABLE_NEW_DTAGS:
1511       link_info.new_dtags = true;
1512       break;
1514     case OPTION_EH_FRAME_HDR:
1515       link_info.eh_frame_hdr = true;
1516       break;
1518     case OPTION_GROUP:
1519       link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
1520       /* Groups must be self-contained.  */
1521       link_info.no_undefined = true;
1522       break;
1524     case 'z':
1525       if (strcmp (optarg, "initfirst") == 0)
1526         link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
1527       else if (strcmp (optarg, "interpose") == 0)
1528         link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
1529       else if (strcmp (optarg, "loadfltr") == 0)
1530         link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
1531       else if (strcmp (optarg, "nodefaultlib") == 0)
1532         link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
1533       else if (strcmp (optarg, "nodelete") == 0)
1534         link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
1535       else if (strcmp (optarg, "nodlopen") == 0)
1536         link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
1537       else if (strcmp (optarg, "nodump") == 0)
1538         link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
1539       else if (strcmp (optarg, "now") == 0)
1540         {
1541           link_info.flags |= (bfd_vma) DF_BIND_NOW;
1542           link_info.flags_1 |= (bfd_vma) DF_1_NOW;
1543         }
1544       else if (strcmp (optarg, "origin") == 0)
1545         {
1546           link_info.flags |= (bfd_vma) DF_ORIGIN;
1547           link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
1548         }
1549       else if (strcmp (optarg, "defs") == 0)
1550         link_info.no_undefined = true;
1551       else if (strcmp (optarg, "muldefs") == 0)
1552         link_info.allow_multiple_definition = true;
1553       else if (strcmp (optarg, "combreloc") == 0)
1554         link_info.combreloc = true;
1555       else if (strcmp (optarg, "nocombreloc") == 0)
1556         link_info.combreloc = false;
1557       else if (strcmp (optarg, "nocopyreloc") == 0)
1558         link_info.nocopyreloc = true;
1559       /* What about the other Solaris -z options? FIXME.  */
1560       break;
1564 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
1565 cat >>e${EMULATION_NAME}.c <<EOF
1566  $PARSE_AND_LIST_ARGS_CASES
1570 cat >>e${EMULATION_NAME}.c <<EOF
1571     }
1573   return 1;
1579 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1580 cat >>e${EMULATION_NAME}.c <<EOF
1582 static void gld${EMULATION_NAME}_list_options PARAMS ((FILE * file));
1584 static void
1585 gld${EMULATION_NAME}_list_options (file)
1586      FILE * file;
1590 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1591 cat >>e${EMULATION_NAME}.c <<EOF
1592   fprintf (file, _("  -Bgroup\t\tSelects group name lookup rules for DSO\n"));
1593   fprintf (file, _("  --disable-new-dtags\tDisable new dynamic tags\n"));
1594   fprintf (file, _("  --enable-new-dtags\tEnable new dynamic tags\n"));
1595   fprintf (file, _("  --eh-frame-hdr\tCreate .eh_frame_hdr section\n"));
1596   fprintf (file, _("  -z combreloc\t\tMerge dynamic relocs into one section and sort\n"));
1597   fprintf (file, _("  -z defs\t\tDisallows undefined symbols\n"));
1598   fprintf (file, _("  -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
1599   fprintf (file, _("  -z interpose\t\tMark object to interpose all DSOs but executable\n"));
1600   fprintf (file, _("  -z loadfltr\t\tMark object requiring immediate process\n"));
1601   fprintf (file, _("  -z muldefs\t\tAllow multiple definitions\n"));
1602   fprintf (file, _("  -z nocombreloc\tDon't merge dynamic relocs into one section\n"));
1603   fprintf (file, _("  -z nocopyreloc\tDon't create copy relocs\n"));
1604   fprintf (file, _("  -z nodefaultlib\tMark object not to use default search paths\n"));
1605   fprintf (file, _("  -z nodelete\t\tMark DSO non-deletable at runtime\n"));
1606   fprintf (file, _("  -z nodlopen\t\tMark DSO not available to dlopen\n"));
1607   fprintf (file, _("  -z nodump\t\tMark DSO not available to dldump\n"));
1608   fprintf (file, _("  -z now\t\tMark object non-lazy runtime binding\n"));
1609   fprintf (file, _("  -z origin\t\tMark object requiring immediate \$ORIGIN processing\n\t\t\t  at runtime\n"));
1610   fprintf (file, _("  -z KEYWORD\t\tIgnored for Solaris compatibility\n"));
1614 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
1615 cat >>e${EMULATION_NAME}.c <<EOF
1616  $PARSE_AND_LIST_OPTIONS
1620 cat >>e${EMULATION_NAME}.c <<EOF
1624 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
1625 cat >>e${EMULATION_NAME}.c <<EOF
1626  $PARSE_AND_LIST_EPILOGUE
1630 else
1631 if test x"$LDEMUL_PARSE_ARGS" != xgld"$EMULATION_NAME"_parse_args; then
1632 cat >>e${EMULATION_NAME}.c <<EOF
1633 #define gld${EMULATION_NAME}_parse_args   NULL
1636 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1637 cat >>e${EMULATION_NAME}.c <<EOF
1638 #define gld${EMULATION_NAME}_list_options NULL
1643 cat >>e${EMULATION_NAME}.c <<EOF
1645 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1647   ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
1648   ${LDEMUL_SYSLIB-syslib_default},
1649   ${LDEMUL_HLL-hll_default},
1650   ${LDEMUL_AFTER_PARSE-after_parse_default},
1651   ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
1652   ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
1653   ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
1654   ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
1655   ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
1656   ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
1657   "${EMULATION_NAME}",
1658   "${OUTPUT_FORMAT}",
1659   ${LDEMUL_FINISH-gld${EMULATION_NAME}_finish},
1660   ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
1661   ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
1662   ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
1663   ${LDEMUL_SET_SYMBOLS-NULL},
1664   ${LDEMUL_PARSE_ARGS-gld${EMULATION_NAME}_parse_args},
1665   ${LDEMUL_UNRECOGNIZED_FILE-NULL},
1666   ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
1667   ${LDEMUL_RECOGNIZED_FILE-NULL},
1668   ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
1669   ${LDEMUL_NEW_VERS_PATTERN-NULL}