* emultempl/aix.em: Convert to C90, remove unnecessary prototypes
[binutils.git] / ld / emultempl / elf32.em
blobdd9c15b9259249fe771b93c5eb62eaff49b05c08
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"
42 #include "getopt.h"
44 #include "bfdlink.h"
46 #include "ld.h"
47 #include "ldmain.h"
48 #include "ldmisc.h"
49 #include "ldexp.h"
50 #include "ldlang.h"
51 #include "ldfile.h"
52 #include "ldemul.h"
53 #include <ldgram.h>
54 #include "elf/common.h"
56 /* Declare functions used by various EXTRA_EM_FILEs.  */
57 static void gld${EMULATION_NAME}_before_parse (void);
58 static void gld${EMULATION_NAME}_after_open (void);
59 static void gld${EMULATION_NAME}_before_allocation (void);
60 static bfd_boolean gld${EMULATION_NAME}_place_orphan
61   (lang_input_statement_type *file, asection *s);
62 static void gld${EMULATION_NAME}_finish (void);
64 EOF
66 # Import any needed special functions and/or overrides.
68 if test -n "$EXTRA_EM_FILE" ; then
69 . ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
72 # Functions in this file can be overridden by setting the LDEMUL_* shell
73 # variables.  If the name of the overriding function is the same as is
74 # defined in this file, then don't output this file's version.
75 # If a different overriding name is given then output the standard function
76 # as presumably it is called from the overriding function.
78 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
79 cat >>e${EMULATION_NAME}.c <<EOF
81 static void
82 gld${EMULATION_NAME}_before_parse (void)
84   const bfd_arch_info_type *arch = bfd_scan_arch ("${OUTPUT_ARCH}");
85   if (arch)
86     {
87       ldfile_output_architecture = arch->arch;
88       ldfile_output_machine = arch->mach;
89       ldfile_output_machine_name = arch->printable_name;
90     }
91   else
92     ldfile_output_architecture = bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`;
93   config.dynamic_link = ${DYNAMIC_LINK-TRUE};
94   config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
97 EOF
100 cat >>e${EMULATION_NAME}.c <<EOF
102 /* These variables are required to pass information back and forth
103    between after_open and check_needed and stat_needed and vercheck.  */
105 static struct bfd_link_needed_list *global_needed;
106 static struct stat global_stat;
107 static bfd_boolean global_found;
108 static struct bfd_link_needed_list *global_vercheck_needed;
109 static bfd_boolean global_vercheck_failed;
112 /* On Linux, it's possible to have different versions of the same
113    shared library linked against different versions of libc.  The
114    dynamic linker somehow tags which libc version to use in
115    /etc/ld.so.cache, and, based on the libc that it sees in the
116    executable, chooses which version of the shared library to use.
118    We try to do a similar check here by checking whether this shared
119    library needs any other shared libraries which may conflict with
120    libraries we have already included in the link.  If it does, we
121    skip it, and try to find another shared library farther on down the
122    link path.
124    This is called via lang_for_each_input_file.
125    GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
126    which we are checking.  This sets GLOBAL_VERCHECK_FAILED if we find
127    a conflicting version.  */
129 static void
130 gld${EMULATION_NAME}_vercheck (lang_input_statement_type *s)
132   const char *soname;
133   struct bfd_link_needed_list *l;
135   if (global_vercheck_failed)
136     return;
137   if (s->the_bfd == NULL
138       || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
139     return;
141   soname = bfd_elf_get_dt_soname (s->the_bfd);
142   if (soname == NULL)
143     soname = lbasename (bfd_get_filename (s->the_bfd));
145   for (l = global_vercheck_needed; l != NULL; l = l->next)
146     {
147       const char *suffix;
149       if (strcmp (soname, l->name) == 0)
150         {
151           /* Probably can't happen, but it's an easy check.  */
152           continue;
153         }
155       if (strchr (l->name, '/') != NULL)
156         continue;
158       suffix = strstr (l->name, ".so.");
159       if (suffix == NULL)
160         continue;
162       suffix += sizeof ".so." - 1;
164       if (strncmp (soname, l->name, suffix - l->name) == 0)
165         {
166           /* Here we know that S is a dynamic object FOO.SO.VER1, and
167              the object we are considering needs a dynamic object
168              FOO.SO.VER2, and VER1 and VER2 are different.  This
169              appears to be a version mismatch, so we tell the caller
170              to try a different version of this library.  */
171           global_vercheck_failed = TRUE;
172           return;
173         }
174     }
178 /* See if an input file matches a DT_NEEDED entry by running stat on
179    the file.  */
181 static void
182 gld${EMULATION_NAME}_stat_needed (lang_input_statement_type *s)
184   struct stat st;
185   const char *suffix;
186   const char *soname;
188   if (global_found)
189     return;
190   if (s->the_bfd == NULL)
191     return;
193   if (bfd_stat (s->the_bfd, &st) != 0)
194     {
195       einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
196       return;
197     }
199   if (st.st_dev == global_stat.st_dev
200       && st.st_ino == global_stat.st_ino)
201     {
202       global_found = TRUE;
203       return;
204     }
206   /* We issue a warning if it looks like we are including two
207      different versions of the same shared library.  For example,
208      there may be a problem if -lc picks up libc.so.6 but some other
209      shared library has a DT_NEEDED entry of libc.so.5.  This is a
210      heuristic test, and it will only work if the name looks like
211      NAME.so.VERSION.  FIXME: Depending on file names is error-prone.
212      If we really want to issue warnings about mixing version numbers
213      of shared libraries, we need to find a better way.  */
215   if (strchr (global_needed->name, '/') != NULL)
216     return;
217   suffix = strstr (global_needed->name, ".so.");
218   if (suffix == NULL)
219     return;
220   suffix += sizeof ".so." - 1;
222   soname = bfd_elf_get_dt_soname (s->the_bfd);
223   if (soname == NULL)
224     soname = lbasename (s->filename);
226   if (strncmp (soname, global_needed->name, suffix - global_needed->name) == 0)
227     einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
228            global_needed->name, global_needed->by, soname);
232 /* This function is called for each possible name for a dynamic object
233    named by a DT_NEEDED entry.  The FORCE parameter indicates whether
234    to skip the check for a conflicting version.  */
236 static bfd_boolean
237 gld${EMULATION_NAME}_try_needed (const char *name, int force)
239   bfd *abfd;
240   const char *soname;
242   abfd = bfd_openr (name, bfd_get_target (output_bfd));
243   if (abfd == NULL)
244     return FALSE;
245   if (! bfd_check_format (abfd, bfd_object))
246     {
247       bfd_close (abfd);
248       return FALSE;
249     }
250   if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
251     {
252       bfd_close (abfd);
253       return FALSE;
254     }
256   /* For DT_NEEDED, they have to match.  */
257   if (abfd->xvec != output_bfd->xvec)
258     {
259       bfd_close (abfd);
260       return FALSE;
261     }
263   /* Check whether this object would include any conflicting library
264      versions.  If FORCE is set, then we skip this check; we use this
265      the second time around, if we couldn't find any compatible
266      instance of the shared library.  */
268   if (! force)
269     {
270       struct bfd_link_needed_list *needed;
272       if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
273         einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
275       if (needed != NULL)
276         {
277           global_vercheck_needed = needed;
278           global_vercheck_failed = FALSE;
279           lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
280           if (global_vercheck_failed)
281             {
282               bfd_close (abfd);
283               /* Return FALSE to force the caller to move on to try
284                  another file on the search path.  */
285               return FALSE;
286             }
288           /* But wait!  It gets much worse.  On Linux, if a shared
289              library does not use libc at all, we are supposed to skip
290              it the first time around in case we encounter a shared
291              library later on with the same name which does use the
292              version of libc that we want.  This is much too horrible
293              to use on any system other than Linux.  */
296 case ${target} in
297   *-*-linux-gnu*)
298     cat >>e${EMULATION_NAME}.c <<EOF
299           {
300             struct bfd_link_needed_list *l;
302             for (l = needed; l != NULL; l = l->next)
303               if (strncmp (l->name, "libc.so", 7) == 0)
304                 break;
305             if (l == NULL)
306               {
307                 bfd_close (abfd);
308                 return FALSE;
309               }
310           }
313     ;;
314 esac
315 cat >>e${EMULATION_NAME}.c <<EOF
316         }
317     }
319   /* We've found a dynamic object matching the DT_NEEDED entry.  */
321   /* We have already checked that there is no other input file of the
322      same name.  We must now check again that we are not including the
323      same file twice.  We need to do this because on many systems
324      libc.so is a symlink to, e.g., libc.so.1.  The SONAME entry will
325      reference libc.so.1.  If we have already included libc.so, we
326      don't want to include libc.so.1 if they are the same file, and we
327      can only check that using stat.  */
329   if (bfd_stat (abfd, &global_stat) != 0)
330     einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
332   /* First strip off everything before the last '/'.  */
333   soname = lbasename (abfd->filename);
335   if (trace_file_tries)
336     info_msg (_("found %s at %s\n"), soname, name);
338   global_found = FALSE;
339   lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
340   if (global_found)
341     {
342       /* Return TRUE to indicate that we found the file, even though
343          we aren't going to do anything with it.  */
344       return TRUE;
345     }
347   /* Tell the ELF backend that we don't want the output file to have a
348      DT_NEEDED entry for this file.  */
349   bfd_elf_set_dt_needed_name (abfd, "");
351   /* Tell the ELF backend that the output file needs a DT_NEEDED
352      entry for this file if it is used to resolve the reference in
353      a regular object.  */
354   bfd_elf_set_dt_needed_soname (abfd, soname);
356   /* Add this file into the symbol table.  */
357   if (! bfd_link_add_symbols (abfd, &link_info))
358     einfo ("%F%B: could not read symbols: %E\n", abfd);
360   return TRUE;
364 /* Search for a needed file in a path.  */
366 static bfd_boolean
367 gld${EMULATION_NAME}_search_needed (const char *path, const char *name, int force)
369   const char *s;
370   size_t len;
372   if (name[0] == '/')
373     return gld${EMULATION_NAME}_try_needed (name, force);
375   if (path == NULL || *path == '\0')
376     return FALSE;
377   len = strlen (name);
378   while (1)
379     {
380       char *filename, *sset;
382       s = strchr (path, ':');
383       if (s == NULL)
384         s = path + strlen (path);
386       filename = (char *) xmalloc (s - path + len + 2);
387       if (s == path)
388         sset = filename;
389       else
390         {
391           memcpy (filename, path, s - path);
392           filename[s - path] = '/';
393           sset = filename + (s - path) + 1;
394         }
395       strcpy (sset, name);
397       if (gld${EMULATION_NAME}_try_needed (filename, force))
398         return TRUE;
400       free (filename);
402       if (*s == '\0')
403         break;
404       path = s + 1;
405     }
407   return FALSE;
411 if [ "x${USE_LIBPATH}" = xyes ] ; then
412   cat >>e${EMULATION_NAME}.c <<EOF
414 /* Add the sysroot to every entry in a colon-separated path.  */
416 static char *
417 gld${EMULATION_NAME}_add_sysroot (const char *path)
419   int len, colons, i;
420   char *ret, *p;
422   len = strlen (path);
423   colons = 0;
424   i = 0;
425   while (path[i])
426     if (path[i++] == ':')
427       colons++;
429   if (path[i])
430     colons++;
432   len = len + (colons + 1) * strlen (ld_sysroot);
433   ret = xmalloc (len + 1);
434   strcpy (ret, ld_sysroot);
435   p = ret + strlen (ret);
436   i = 0;
437   while (path[i])
438     if (path[i] == ':')
439       {
440         *p++ = path[i++];
441         strcpy (p, ld_sysroot);
442         p = p + strlen (p);
443       }
444     else
445       *p++ = path[i++];
447   *p = 0;
448   return ret;
452   case ${target} in
453     *-*-linux-gnu*)
454       cat >>e${EMULATION_NAME}.c <<EOF
455 /* For a native linker, check the file /etc/ld.so.conf for directories
456    in which we may find shared libraries.  /etc/ld.so.conf is really
457    only meaningful on Linux.  */
459 static bfd_boolean
460 gld${EMULATION_NAME}_check_ld_so_conf (const char *name, int force)
462   static bfd_boolean initialized;
463   static char *ld_so_conf;
465   if (! initialized)
466     {
467       FILE *f;
468       char *tmppath;
470       tmppath = concat (ld_sysroot, "/etc/ld.so.conf", NULL);
471       f = fopen (tmppath, FOPEN_RT);
472       free (tmppath);
473       if (f != NULL)
474         {
475           char *b;
476           size_t len, alloc;
477           int c;
479           len = 0;
480           alloc = 100;
481           b = (char *) xmalloc (alloc);
483           while ((c = getc (f)) != EOF)
484             {
485               if (len + 1 >= alloc)
486                 {
487                   alloc *= 2;
488                   b = (char *) xrealloc (b, alloc);
489                 }
490               if (c != ':'
491                   && c != ' '
492                   && c != '\t'
493                   && c != '\n'
494                   && c != ',')
495                 {
496                   b[len] = c;
497                   ++len;
498                 }
499               else
500                 {
501                   if (len > 0 && b[len - 1] != ':')
502                     {
503                       b[len] = ':';
504                       ++len;
505                     }
506                 }
507             }
509           if (len > 0 && b[len - 1] == ':')
510             --len;
512           if (len > 0)
513             b[len] = '\0';
514           else
515             {
516               free (b);
517               b = NULL;
518             }
520           fclose (f);
522           if (b)
523             {
524               char *d = gld${EMULATION_NAME}_add_sysroot (b);
525               free (b);
526               b = d;
527             }
529           ld_so_conf = b;
530         }
532       initialized = TRUE;
533     }
535   if (ld_so_conf == NULL)
536     return FALSE;
538   return gld${EMULATION_NAME}_search_needed (ld_so_conf, name, force);
542     # Linux
543     ;;
544   esac
546 cat >>e${EMULATION_NAME}.c <<EOF
548 /* See if an input file matches a DT_NEEDED entry by name.  */
550 static void
551 gld${EMULATION_NAME}_check_needed (lang_input_statement_type *s)
553   if (global_found)
554     return;
556   if (s->filename != NULL)
557     {
558       const char *f;
560       if (strcmp (s->filename, global_needed->name) == 0)
561         {
562           global_found = TRUE;
563           return;
564         }
566       if (s->search_dirs_flag)
567         {
568           f = strrchr (s->filename, '/');
569           if (f != NULL
570               && strcmp (f + 1, global_needed->name) == 0)
571             {
572               global_found = TRUE;
573               return;
574             }
575         }
576     }
578   if (s->the_bfd != NULL)
579     {
580       const char *soname;
582       soname = bfd_elf_get_dt_soname (s->the_bfd);
583       if (soname != NULL
584           && strcmp (soname, global_needed->name) == 0)
585         {
586           global_found = TRUE;
587           return;
588         }
589     }
594 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
595 cat >>e${EMULATION_NAME}.c <<EOF
597 /* This is called after all the input files have been opened.  */
599 static void
600 gld${EMULATION_NAME}_after_open (void)
602   struct bfd_link_needed_list *needed, *l;
604   /* We only need to worry about this when doing a final link.  */
605   if (link_info.relocatable || !link_info.executable)
606     return;
608   /* Get the list of files which appear in DT_NEEDED entries in
609      dynamic objects included in the link (often there will be none).
610      For each such file, we want to track down the corresponding
611      library, and include the symbol table in the link.  This is what
612      the runtime dynamic linker will do.  Tracking the files down here
613      permits one dynamic object to include another without requiring
614      special action by the person doing the link.  Note that the
615      needed list can actually grow while we are stepping through this
616      loop.  */
617   needed = bfd_elf_get_needed_list (output_bfd, &link_info);
618   for (l = needed; l != NULL; l = l->next)
619     {
620       struct bfd_link_needed_list *ll;
621       int force;
623       /* If we've already seen this file, skip it.  */
624       for (ll = needed; ll != l; ll = ll->next)
625         if (strcmp (ll->name, l->name) == 0)
626           break;
627       if (ll != l)
628         continue;
630       /* See if this file was included in the link explicitly.  */
631       global_needed = l;
632       global_found = FALSE;
633       lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
634       if (global_found)
635         continue;
637       if (trace_file_tries)
638         info_msg (_("%s needed by %B\n"), l->name, l->by);
640       /* We need to find this file and include the symbol table.  We
641          want to search for the file in the same way that the dynamic
642          linker will search.  That means that we want to use
643          rpath_link, rpath, then the environment variable
644          LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
645          entries (native only), then the linker script LIB_SEARCH_DIRS.
646          We do not search using the -L arguments.
648          We search twice.  The first time, we skip objects which may
649          introduce version mismatches.  The second time, we force
650          their use.  See gld${EMULATION_NAME}_vercheck comment.  */
651       for (force = 0; force < 2; force++)
652         {
653           size_t len;
654           search_dirs_type *search;
656 if [ "x${USE_LIBPATH}" = xyes ] ; then
657 cat >>e${EMULATION_NAME}.c <<EOF
658           const char *lib_path;
659           struct bfd_link_needed_list *rp;
660           int found;
663 cat >>e${EMULATION_NAME}.c <<EOF
665           if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
666                                                   l->name, force))
667             break;
669 if [ "x${USE_LIBPATH}" = xyes ] ; then
670 cat >>e${EMULATION_NAME}.c <<EOF
671           if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
672                                                   l->name, force))
673             break;
676 if [ "x${NATIVE}" = xyes ] ; then
677 cat >>e${EMULATION_NAME}.c <<EOF
678           if (command_line.rpath_link == NULL
679               && command_line.rpath == NULL)
680             {
681               lib_path = (const char *) getenv ("LD_RUN_PATH");
682               if (gld${EMULATION_NAME}_search_needed (lib_path, l->name,
683                                                       force))
684                 break;
685             }
686           lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
687           if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, force))
688             break;
691 if [ "x${USE_LIBPATH}" = xyes ] ; then
692 cat >>e${EMULATION_NAME}.c <<EOF
693           found = 0;
694           rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
695           for (; !found && rp != NULL; rp = rp->next)
696             {
697               char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
698               found = (rp->by == l->by
699                        && gld${EMULATION_NAME}_search_needed (tmpname,
700                                                               l->name,
701                                                               force));
702               free (tmpname);
703             }
704           if (found)
705             break;
709 cat >>e${EMULATION_NAME}.c <<EOF
710           len = strlen (l->name);
711           for (search = search_head; search != NULL; search = search->next)
712             {
713               char *filename;
715               if (search->cmdline)
716                 continue;
717               filename = (char *) xmalloc (strlen (search->name) + len + 2);
718               sprintf (filename, "%s/%s", search->name, l->name);
719               if (gld${EMULATION_NAME}_try_needed (filename, force))
720                 break;
721               free (filename);
722             }
723           if (search != NULL)
724             break;
726 if [ "x${USE_LIBPATH}" = xyes ] ; then
727   case ${target} in
728     *-*-linux-gnu*)
729       cat >>e${EMULATION_NAME}.c <<EOF
730           if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
731             break;
733     # Linux
734     ;;
735   esac
737 cat >>e${EMULATION_NAME}.c <<EOF
738         }
740       if (force < 2)
741         continue;
743       einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
744              l->name, l->by);
745     }
751 cat >>e${EMULATION_NAME}.c <<EOF
753 /* Look through an expression for an assignment statement.  */
755 static void
756 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
758   struct bfd_link_hash_entry *h;
760   switch (exp->type.node_class)
761     {
762     case etree_provide:
763       h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
764                                 FALSE, FALSE, FALSE);
765       if (h == NULL)
766         break;
768       /* We call record_link_assignment even if the symbol is defined.
769          This is because if it is defined by a dynamic object, we
770          actually want to use the value defined by the linker script,
771          not the value from the dynamic object (because we are setting
772          symbols like etext).  If the symbol is defined by a regular
773          object, then, as it happens, calling record_link_assignment
774          will do no harm.  */
776       /* Fall through.  */
777     case etree_assign:
778       if (strcmp (exp->assign.dst, ".") != 0)
779         {
780           if (! (bfd_elf_record_link_assignment
781                  (output_bfd, &link_info, exp->assign.dst,
782                   exp->type.node_class == etree_provide ? TRUE : FALSE)))
783             einfo ("%P%F: failed to record assignment to %s: %E\n",
784                    exp->assign.dst);
785         }
786       gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
787       break;
789     case etree_binary:
790       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
791       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
792       break;
794     case etree_trinary:
795       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
796       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
797       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
798       break;
800     case etree_unary:
801       gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
802       break;
804     default:
805       break;
806     }
810 /* This is called by the before_allocation routine via
811    lang_for_each_statement.  It locates any assignment statements, and
812    tells the ELF backend about them, in case they are assignments to
813    symbols which are referred to by dynamic objects.  */
815 static void
816 gld${EMULATION_NAME}_find_statement_assignment (lang_statement_union_type *s)
818   if (s->header.type == lang_assignment_statement_enum)
819     gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
824 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
825   if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
826     ELF_INTERPRETER_SET_DEFAULT="
827   if (sinterp != NULL)
828     {
829       sinterp->contents = ${ELF_INTERPRETER_NAME};
830       sinterp->_raw_size = strlen (sinterp->contents) + 1;
831     }
834   else
835     ELF_INTERPRETER_SET_DEFAULT=
836   fi
837 cat >>e${EMULATION_NAME}.c <<EOF
839 /* This is called after the sections have been attached to output
840    sections, but before any sizes or addresses have been set.  */
842 static void
843 gld${EMULATION_NAME}_before_allocation (void)
845   const char *rpath;
846   asection *sinterp;
848   /* If we are going to make any variable assignments, we need to let
849      the ELF backend know about them in case the variables are
850      referred to by dynamic objects.  */
851   lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
853   /* Let the ELF backend work out the sizes of any sections required
854      by dynamic linking.  */
855   rpath = command_line.rpath;
856   if (rpath == NULL)
857     rpath = (const char *) getenv ("LD_RUN_PATH");
858   if (! (bfd_elf${ELFSIZE}_size_dynamic_sections
859          (output_bfd, command_line.soname, rpath,
860           command_line.filter_shlib,
861           (const char * const *) command_line.auxiliary_filters,
862           &link_info, &sinterp, lang_elf_version_info)))
863     einfo ("%P%F: failed to set dynamic section sizes: %E\n");
864 ${ELF_INTERPRETER_SET_DEFAULT}
865   /* Let the user override the dynamic linker we are using.  */
866   if (command_line.interpreter != NULL
867       && sinterp != NULL)
868     {
869       sinterp->contents = (bfd_byte *) command_line.interpreter;
870       sinterp->_raw_size = strlen (command_line.interpreter) + 1;
871     }
873   /* Look for any sections named .gnu.warning.  As a GNU extensions,
874      we treat such sections as containing warning messages.  We print
875      out the warning message, and then zero out the section size so
876      that it does not get copied into the output file.  */
878   {
879     LANG_FOR_EACH_INPUT_STATEMENT (is)
880       {
881         asection *s;
882         bfd_size_type sz;
883         char *msg;
884         bfd_boolean ret;
886         if (is->just_syms_flag)
887           continue;
889         s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
890         if (s == NULL)
891           continue;
893         sz = bfd_section_size (is->the_bfd, s);
894         msg = xmalloc ((size_t) sz + 1);
895         if (! bfd_get_section_contents (is->the_bfd, s, msg, (file_ptr) 0, sz))
896           einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
897                  is->the_bfd);
898         msg[sz] = '\0';
899         ret = link_info.callbacks->warning (&link_info, msg,
900                                             (const char *) NULL,
901                                             is->the_bfd, (asection *) NULL,
902                                             (bfd_vma) 0);
903         ASSERT (ret);
904         free (msg);
906         /* Clobber the section size, so that we don't waste copying the
907            warning into the output file.  */
908         s->_raw_size = 0;
909       }
910   }
916 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
917 cat >>e${EMULATION_NAME}.c <<EOF
919 /* Try to open a dynamic archive.  This is where we know that ELF
920    dynamic libraries have an extension of .so (or .sl on oddball systems
921    like hpux).  */
923 static bfd_boolean
924 gld${EMULATION_NAME}_open_dynamic_archive
925   (const char *arch, search_dirs_type *search, lang_input_statement_type *entry)
927   const char *filename;
928   char *string;
930   if (! entry->is_archive)
931     return FALSE;
933   filename = entry->filename;
935   /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
936      is defined, but it does not seem worth the headache to optimize
937      away those two bytes of space.  */
938   string = (char *) xmalloc (strlen (search->name)
939                              + strlen (filename)
940                              + strlen (arch)
941 #ifdef EXTRA_SHLIB_EXTENSION
942                              + strlen (EXTRA_SHLIB_EXTENSION)
943 #endif
944                              + sizeof "/lib.so");
946   sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
948 #ifdef EXTRA_SHLIB_EXTENSION
949   /* Try the .so extension first.  If that fails build a new filename
950      using EXTRA_SHLIB_EXTENSION.  */
951   if (! ldfile_try_open_bfd (string, entry))
952     sprintf (string, "%s/lib%s%s%s", search->name,
953              filename, arch, EXTRA_SHLIB_EXTENSION);
954 #endif
956   if (! ldfile_try_open_bfd (string, entry))
957     {
958       free (string);
959       return FALSE;
960     }
962   entry->filename = string;
964   /* We have found a dynamic object to include in the link.  The ELF
965      backend linker will create a DT_NEEDED entry in the .dynamic
966      section naming this file.  If this file includes a DT_SONAME
967      entry, it will be used.  Otherwise, the ELF linker will just use
968      the name of the file.  For an archive found by searching, like
969      this one, the DT_NEEDED entry should consist of just the name of
970      the file, without the path information used to find it.  Note
971      that we only need to do this if we have a dynamic object; an
972      archive will never be referenced by a DT_NEEDED entry.
974      FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
975      very pretty.  I haven't been able to think of anything that is
976      pretty, though.  */
977   if (bfd_check_format (entry->the_bfd, bfd_object)
978       && (entry->the_bfd->flags & DYNAMIC) != 0)
979     {
980       ASSERT (entry->is_archive && entry->search_dirs_flag);
982       /* Rather than duplicating the logic above.  Just use the
983          filename we recorded earlier.  */
985       filename = lbasename (entry->filename);
986       bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
987     }
989   return TRUE;
995 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
996 cat >>e${EMULATION_NAME}.c <<EOF
998 /* A variant of lang_output_section_find.  Used by place_orphan.  */
1000 static lang_output_section_statement_type *
1001 output_rel_find (asection *sec)
1003   lang_statement_union_type *u;
1004   lang_output_section_statement_type *lookup;
1005   lang_output_section_statement_type *last = NULL;
1006   lang_output_section_statement_type *last_rel = NULL;
1007   lang_output_section_statement_type *last_rel_alloc = NULL;
1008   int rela = sec->name[4] == 'a';
1010   for (u = lang_output_section_statement.head; u; u = lookup->next)
1011     {
1012       lookup = &u->output_section_statement;
1013       if (strncmp (".rel", lookup->name, 4) == 0)
1014         {
1015           /* Don't place after .rel.plt as doing so results in wrong
1016              dynamic tags.  Also, place allocated reloc sections before
1017              non-allocated.  */
1018           int lookrela = lookup->name[4] == 'a';
1020           if (strcmp (".plt", lookup->name + 4 + lookrela) == 0
1021               || (lookup->bfd_section != NULL
1022                   && (lookup->bfd_section->flags & SEC_ALLOC) == 0))
1023             break;
1024           last = lookup;
1025           if (rela == lookrela)
1026             last_rel = lookup;
1027           if (lookup->bfd_section != NULL
1028               && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1029             last_rel_alloc = lookup;
1030         }
1031     }
1033   if (last_rel_alloc)
1034     return last_rel_alloc;
1036   if (last_rel)
1037     return last_rel;
1039   return last;
1042 /* Find the last output section before given output statement.
1043    Used by place_orphan.  */
1045 static asection *
1046 output_prev_sec_find (lang_output_section_statement_type *os)
1048   asection *s = (asection *) NULL;
1049   lang_statement_union_type *u;
1050   lang_output_section_statement_type *lookup;
1052   for (u = lang_output_section_statement.head;
1053        u != (lang_statement_union_type *) NULL;
1054        u = lookup->next)
1055     {
1056       lookup = &u->output_section_statement;
1057       if (lookup == os)
1058         return s;
1060       if (lookup->bfd_section != NULL && lookup->bfd_section->owner != NULL)
1061         s = lookup->bfd_section;
1062     }
1064   return NULL;
1067 /* Place an orphan section.  We use this to put random SHF_ALLOC
1068    sections in the right segment.  */
1070 struct orphan_save {
1071   lang_output_section_statement_type *os;
1072   asection **section;
1073   lang_statement_union_type **stmt;
1074   lang_statement_union_type **os_tail;
1077 static bfd_boolean
1078 gld${EMULATION_NAME}_place_orphan (lang_input_statement_type *file, asection *s)
1080   static struct orphan_save hold_text;
1081   static struct orphan_save hold_rodata;
1082   static struct orphan_save hold_data;
1083   static struct orphan_save hold_bss;
1084   static struct orphan_save hold_rel;
1085   static struct orphan_save hold_interp;
1086   static struct orphan_save hold_sdata;
1087   static int count = 1;
1088   struct orphan_save *place;
1089   lang_statement_list_type *old;
1090   lang_statement_list_type add;
1091   etree_type *address;
1092   const char *secname;
1093   const char *ps = NULL;
1094   lang_output_section_statement_type *os;
1095   lang_statement_union_type **os_tail;
1096   etree_type *load_base;
1097   int isdyn = 0;
1099   secname = bfd_get_section_name (s->owner, s);
1100   if (! link_info.relocatable
1101       && link_info.combreloc
1102       && (s->flags & SEC_ALLOC)
1103       && strncmp (secname, ".rel", 4) == 0)
1104     {
1105       if (secname[4] == 'a')
1106         secname = ".rela.dyn";
1107       else
1108         secname = ".rel.dyn";
1109       isdyn = 1;
1110     }
1112   if (isdyn || (!config.unique_orphan_sections && !unique_section_p (secname)))
1113     {
1114       /* Look through the script to see where to place this section.  */
1115       os = lang_output_section_find (secname);
1117       if (os != NULL
1118           && (os->bfd_section == NULL
1119               || ((s->flags ^ os->bfd_section->flags)
1120                   & (SEC_LOAD | SEC_ALLOC)) == 0))
1121         {
1122           /* We already have an output section statement with this
1123              name, and its bfd section, if any, has compatible flags.  */
1124           lang_add_section (&os->children, s, os, file);
1125           return TRUE;
1126         }
1127     }
1129   if (hold_text.os == NULL)
1130     hold_text.os = lang_output_section_find (".text");
1132   /* If this is a final link, then always put .gnu.warning.SYMBOL
1133      sections into the .text section to get them out of the way.  */
1134   if (link_info.executable
1135       && ! link_info.relocatable
1136       && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
1137       && hold_text.os != NULL)
1138     {
1139       lang_add_section (&hold_text.os->children, s, hold_text.os, file);
1140       return TRUE;
1141     }
1143   /* Decide which segment the section should go in based on the
1144      section name and section flags.  We put loadable .note sections
1145      right after the .interp section, so that the PT_NOTE segment is
1146      stored right after the program headers where the OS can read it
1147      in the first page.  */
1148 #define HAVE_SECTION(hold, name) \
1149 (hold.os != NULL || (hold.os = lang_output_section_find (name)) != NULL)
1151   if ((s->flags & SEC_EXCLUDE) != 0 && !link_info.relocatable)
1152     {
1153       if (s->output_section == NULL)
1154         s->output_section = bfd_abs_section_ptr;
1155       return TRUE;
1156     }
1158   place = NULL;
1159   if ((s->flags & SEC_ALLOC) == 0)
1160     ;
1161   else if ((s->flags & SEC_LOAD) != 0
1162            && strncmp (secname, ".note", 5) == 0
1163            && HAVE_SECTION (hold_interp, ".interp"))
1164     place = &hold_interp;
1165   else if ((s->flags & SEC_HAS_CONTENTS) == 0
1166            && HAVE_SECTION (hold_bss, ".bss"))
1167     place = &hold_bss;
1168   else if ((s->flags & SEC_SMALL_DATA) != 0
1169            && HAVE_SECTION (hold_sdata, ".sdata"))
1170     place = &hold_sdata;
1171   else if ((s->flags & SEC_READONLY) == 0
1172            && HAVE_SECTION (hold_data, ".data"))
1173     place = &hold_data;
1174   else if (strncmp (secname, ".rel", 4) == 0
1175            && (s->flags & SEC_LOAD) != 0
1176            && (hold_rel.os != NULL
1177                || (hold_rel.os = output_rel_find (s)) != NULL))
1178     place = &hold_rel;
1179   else if ((s->flags & (SEC_CODE | SEC_READONLY)) == SEC_READONLY
1180            && HAVE_SECTION (hold_rodata, ".rodata"))
1181     place = &hold_rodata;
1182   else if ((s->flags & (SEC_CODE | SEC_READONLY)) == (SEC_CODE | SEC_READONLY)
1183            && hold_text.os != NULL)
1184     place = &hold_text;
1186 #undef HAVE_SECTION
1188   /* Choose a unique name for the section.  This will be needed if the
1189      same section name appears in the input file with different
1190      loadable or allocatable characteristics.  */
1191   if (bfd_get_section_by_name (output_bfd, secname) != NULL)
1192     {
1193       secname = bfd_get_unique_section_name (output_bfd, secname, &count);
1194       if (secname == NULL)
1195         einfo ("%F%P: place_orphan failed: %E\n");
1196     }
1198   /* Start building a list of statements for this section.
1199      First save the current statement pointer.  */
1200   old = stat_ptr;
1202   /* If we have found an appropriate place for the output section
1203      statements for this orphan, add them to our own private list,
1204      inserting them later into the global statement list.  */
1205   if (place != NULL)
1206     {
1207       stat_ptr = &add;
1208       lang_list_init (stat_ptr);
1209     }
1211   if (config.build_constructors)
1212     {
1213       /* If the name of the section is representable in C, then create
1214          symbols to mark the start and the end of the section.  */
1215       for (ps = secname; *ps != '\0'; ps++)
1216         if (! ISALNUM (*ps) && *ps != '_')
1217           break;
1218       if (*ps == '\0')
1219         {
1220           char *symname;
1221           etree_type *e_align;
1223           symname = (char *) xmalloc (ps - secname + sizeof "__start_");
1224           sprintf (symname, "__start_%s", secname);
1225           e_align = exp_unop (ALIGN_K,
1226                               exp_intop ((bfd_vma) 1 << s->alignment_power));
1227           lang_add_assignment (exp_assop ('=', symname, e_align));
1228         }
1229     }
1231   address = NULL;
1232   if (link_info.relocatable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
1233     address = exp_intop ((bfd_vma) 0);
1235   load_base = NULL;
1236   if (place != NULL && place->os->load_base != NULL)
1237     {
1238       etree_type *lma_from_vma;
1239       lma_from_vma = exp_binop ('-', place->os->load_base,
1240                                 exp_nameop (ADDR, place->os->name));
1241       load_base = exp_binop ('+', lma_from_vma,
1242                              exp_nameop (ADDR, secname));
1243     }
1245   os_tail = lang_output_section_statement.tail;
1246   os = lang_enter_output_section_statement (secname, address, 0,
1247                                             (bfd_vma) 0,
1248                                             (etree_type *) NULL,
1249                                             (etree_type *) NULL,
1250                                             load_base);
1252   lang_add_section (&os->children, s, os, file);
1254   lang_leave_output_section_statement
1255     ((bfd_vma) 0, "*default*",
1256      (struct lang_output_section_phdr_list *) NULL, NULL);
1258   if (config.build_constructors && *ps == '\0')
1259     {
1260       char *symname;
1262       /* lang_leave_ouput_section_statement resets stat_ptr.  Put
1263          stat_ptr back where we want it.  */
1264       if (place != NULL)
1265         stat_ptr = &add;
1267       symname = (char *) xmalloc (ps - secname + sizeof "__stop_");
1268       sprintf (symname, "__stop_%s", secname);
1269       lang_add_assignment (exp_assop ('=', symname,
1270                                       exp_nameop (NAME, ".")));
1271     }
1273   /* Restore the global list pointer.  */
1274   stat_ptr = old;
1276   if (place != NULL && os->bfd_section != NULL)
1277     {
1278       asection *snew, **pps;
1280       snew = os->bfd_section;
1282       /* Shuffle the bfd section list to make the output file look
1283          neater.  This is really only cosmetic.  */
1284       if (place->section == NULL)
1285         {
1286           asection *bfd_section = place->os->bfd_section;
1288           /* If the output statement hasn't been used to place
1289              any input sections (and thus doesn't have an output
1290              bfd_section), look for the closest prior output statement
1291              having an output section.  */
1292           if (bfd_section == NULL)
1293             bfd_section = output_prev_sec_find (place->os);
1295           if (bfd_section != NULL && bfd_section != snew)
1296             place->section = &bfd_section->next;
1297         }
1299       if (place->section != NULL)
1300         {
1301           /* Unlink the section.  */
1302           for (pps = &output_bfd->sections; *pps != snew; pps = &(*pps)->next)
1303             ;
1304           bfd_section_list_remove (output_bfd, pps);
1306           /* Now tack it on to the "place->os" section list.  */
1307           bfd_section_list_insert (output_bfd, place->section, snew);
1308         }
1310       /* Save the end of this list.  Further ophans of this type will
1311          follow the one we've just added.  */
1312       place->section = &snew->next;
1314       /* The following is non-cosmetic.  We try to put the output
1315          statements in some sort of reasonable order here, because
1316          they determine the final load addresses of the orphan
1317          sections.  In addition, placing output statements in the
1318          wrong order may require extra segments.  For instance,
1319          given a typical situation of all read-only sections placed
1320          in one segment and following that a segment containing all
1321          the read-write sections, we wouldn't want to place an orphan
1322          read/write section before or amongst the read-only ones.  */
1323       if (add.head != NULL)
1324         {
1325           lang_statement_union_type *newly_added_os;
1327           if (place->stmt == NULL)
1328             {
1329               /* Put the new statement list right at the head.  */
1330               *add.tail = place->os->header.next;
1331               place->os->header.next = add.head;
1333               place->os_tail = &place->os->next;
1334             }
1335           else
1336             {
1337               /* Put it after the last orphan statement we added.  */
1338               *add.tail = *place->stmt;
1339               *place->stmt = add.head;
1340             }
1342           /* Fix the global list pointer if we happened to tack our
1343              new list at the tail.  */
1344           if (*old->tail == add.head)
1345             old->tail = add.tail;
1347           /* Save the end of this list.  */
1348           place->stmt = add.tail;
1350           /* Do the same for the list of output section statements.  */
1351           newly_added_os = *os_tail;
1352           *os_tail = NULL;
1353           newly_added_os->output_section_statement.next = *place->os_tail;
1354           *place->os_tail = newly_added_os;
1355           place->os_tail = &newly_added_os->output_section_statement.next;
1357           /* Fixing the global list pointer here is a little different.
1358              We added to the list in lang_enter_output_section_statement,
1359              trimmed off the new output_section_statment above when
1360              assigning *os_tail = NULL, but possibly added it back in
1361              the same place when assigning *place->os_tail.  */
1362           if (*os_tail == NULL)
1363             lang_output_section_statement.tail = os_tail;
1364         }
1365     }
1367   return TRUE;
1372 if test x"$LDEMUL_FINISH" != xgld"$EMULATION_NAME"_finish; then
1373 cat >>e${EMULATION_NAME}.c <<EOF
1375 static void
1376 gld${EMULATION_NAME}_finish (void)
1378   if (bfd_elf${ELFSIZE}_discard_info (output_bfd, &link_info))
1379     {
1380       lang_reset_memory_regions ();
1382       /* Resize the sections.  */
1383       lang_size_sections (stat_ptr->head, abs_output_section,
1384                           &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE);
1386       /* Redo special stuff.  */
1387       ldemul_after_allocation ();
1389       /* Do the assignments again.  */
1390       lang_do_assignments (stat_ptr->head, abs_output_section,
1391                            (fill_type *) 0, (bfd_vma) 0);
1392     }
1397 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1398 cat >>e${EMULATION_NAME}.c <<EOF
1400 static char *
1401 gld${EMULATION_NAME}_get_script (int *isfile)
1404 if test -n "$COMPILE_IN"
1405 then
1406 # Scripts compiled in.
1408 # sed commands to quote an ld script as a C string.
1409 sc="-f stringify.sed"
1411 cat >>e${EMULATION_NAME}.c <<EOF
1413   *isfile = 0;
1415   if (link_info.relocatable && config.build_constructors)
1416     return
1418 sed $sc ldscripts/${EMULATION_NAME}.xu                 >> e${EMULATION_NAME}.c
1419 echo '  ; else if (link_info.relocatable) return'     >> e${EMULATION_NAME}.c
1420 sed $sc ldscripts/${EMULATION_NAME}.xr                 >> e${EMULATION_NAME}.c
1421 echo '  ; else if (!config.text_read_only) return'     >> e${EMULATION_NAME}.c
1422 sed $sc ldscripts/${EMULATION_NAME}.xbn                >> e${EMULATION_NAME}.c
1423 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
1424 echo '  ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1425 sed $sc ldscripts/${EMULATION_NAME}.xn                 >> e${EMULATION_NAME}.c
1427 if test -n "$GENERATE_PIE_SCRIPT" ; then
1428 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1429 echo '  ; else if (link_info.pie && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1430 sed $sc ldscripts/${EMULATION_NAME}.xdc                >> e${EMULATION_NAME}.c
1432 echo '  ; else if (link_info.pie) return'              >> e${EMULATION_NAME}.c
1433 sed $sc ldscripts/${EMULATION_NAME}.xd                 >> e${EMULATION_NAME}.c
1435 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1436 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1437 echo '  ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1438 sed $sc ldscripts/${EMULATION_NAME}.xsc                >> e${EMULATION_NAME}.c
1440 echo '  ; else if (link_info.shared) return'           >> e${EMULATION_NAME}.c
1441 sed $sc ldscripts/${EMULATION_NAME}.xs                 >> e${EMULATION_NAME}.c
1443 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1444 echo '  ; else if (link_info.combreloc) return'        >> e${EMULATION_NAME}.c
1445 sed $sc ldscripts/${EMULATION_NAME}.xc                 >> e${EMULATION_NAME}.c
1447 echo '  ; else return'                                 >> e${EMULATION_NAME}.c
1448 sed $sc ldscripts/${EMULATION_NAME}.x                  >> e${EMULATION_NAME}.c
1449 echo '; }'                                             >> e${EMULATION_NAME}.c
1451 else
1452 # Scripts read from the filesystem.
1454 cat >>e${EMULATION_NAME}.c <<EOF
1456   *isfile = 1;
1458   if (link_info.relocatable && config.build_constructors)
1459     return "ldscripts/${EMULATION_NAME}.xu";
1460   else if (link_info.relocatable)
1461     return "ldscripts/${EMULATION_NAME}.xr";
1462   else if (!config.text_read_only)
1463     return "ldscripts/${EMULATION_NAME}.xbn";
1465 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
1466 else
1467 cat >>e${EMULATION_NAME}.c <<EOF
1468   else if (!config.magic_demand_paged)
1469     return "ldscripts/${EMULATION_NAME}.xn";
1472 if test -n "$GENERATE_PIE_SCRIPT" ; then
1473 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1474 cat >>e${EMULATION_NAME}.c <<EOF
1475   else if (link_info.pie && link_info.combreloc)
1476     return "ldscripts/${EMULATION_NAME}.xdc";
1479 cat >>e${EMULATION_NAME}.c <<EOF
1480   else if (link_info.pie)
1481     return "ldscripts/${EMULATION_NAME}.xd";
1484 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1485 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1486 cat >>e${EMULATION_NAME}.c <<EOF
1487   else if (link_info.shared && link_info.combreloc)
1488     return "ldscripts/${EMULATION_NAME}.xsc";
1491 cat >>e${EMULATION_NAME}.c <<EOF
1492   else if (link_info.shared)
1493     return "ldscripts/${EMULATION_NAME}.xs";
1496 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1497 cat >>e${EMULATION_NAME}.c <<EOF
1498   else if (link_info.combreloc)
1499     return "ldscripts/${EMULATION_NAME}.xc";
1502 cat >>e${EMULATION_NAME}.c <<EOF
1503   else
1504     return "ldscripts/${EMULATION_NAME}.x";
1511 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1513 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1514 cat >>e${EMULATION_NAME}.c <<EOF
1515  $PARSE_AND_LIST_PROLOGUE
1519 cat >>e${EMULATION_NAME}.c <<EOF
1521 #define OPTION_DISABLE_NEW_DTAGS        (400)
1522 #define OPTION_ENABLE_NEW_DTAGS         (OPTION_DISABLE_NEW_DTAGS + 1)
1523 #define OPTION_GROUP                    (OPTION_ENABLE_NEW_DTAGS + 1)
1524 #define OPTION_EH_FRAME_HDR             (OPTION_GROUP + 1)
1526 static void
1527 gld${EMULATION_NAME}_add_options
1528   (int ns, char **shortopts, int nl, struct option **longopts,
1529    int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
1531   static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:";
1532   static const struct option xtra_long[] = {
1535 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1536 cat >>e${EMULATION_NAME}.c <<EOF
1537     {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1538     {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1539     {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
1540     {"Bgroup", no_argument, NULL, OPTION_GROUP},
1544 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
1545 cat >>e${EMULATION_NAME}.c <<EOF
1546     $PARSE_AND_LIST_LONGOPTS
1550 cat >>e${EMULATION_NAME}.c <<EOF
1551     {NULL, no_argument, NULL, 0}
1552   };
1554   *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
1555   memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
1556   *longopts = (struct option *)
1557     xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
1558   memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
1561 static bfd_boolean
1562 gld${EMULATION_NAME}_handle_option (int optc)
1564   switch (optc)
1565     {
1566     default:
1567       return FALSE;
1571 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1572 cat >>e${EMULATION_NAME}.c <<EOF
1573     case OPTION_DISABLE_NEW_DTAGS:
1574       link_info.new_dtags = FALSE;
1575       break;
1577     case OPTION_ENABLE_NEW_DTAGS:
1578       link_info.new_dtags = TRUE;
1579       break;
1581     case OPTION_EH_FRAME_HDR:
1582       link_info.eh_frame_hdr = TRUE;
1583       break;
1585     case OPTION_GROUP:
1586       link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
1587       /* Groups must be self-contained.  */
1588       link_info.no_undefined = TRUE;
1589       break;
1591     case 'z':
1592       if (strcmp (optarg, "initfirst") == 0)
1593         link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
1594       else if (strcmp (optarg, "interpose") == 0)
1595         link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
1596       else if (strcmp (optarg, "loadfltr") == 0)
1597         link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
1598       else if (strcmp (optarg, "nodefaultlib") == 0)
1599         link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
1600       else if (strcmp (optarg, "nodelete") == 0)
1601         link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
1602       else if (strcmp (optarg, "nodlopen") == 0)
1603         link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
1604       else if (strcmp (optarg, "nodump") == 0)
1605         link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
1606       else if (strcmp (optarg, "now") == 0)
1607         {
1608           link_info.flags |= (bfd_vma) DF_BIND_NOW;
1609           link_info.flags_1 |= (bfd_vma) DF_1_NOW;
1610         }
1611       else if (strcmp (optarg, "origin") == 0)
1612         {
1613           link_info.flags |= (bfd_vma) DF_ORIGIN;
1614           link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
1615         }
1616       else if (strcmp (optarg, "defs") == 0)
1617         link_info.no_undefined = TRUE;
1618       else if (strcmp (optarg, "muldefs") == 0)
1619         link_info.allow_multiple_definition = TRUE;
1620       else if (strcmp (optarg, "combreloc") == 0)
1621         link_info.combreloc = TRUE;
1622       else if (strcmp (optarg, "nocombreloc") == 0)
1623         link_info.combreloc = FALSE;
1624       else if (strcmp (optarg, "nocopyreloc") == 0)
1625         link_info.nocopyreloc = TRUE;
1626       else if (strcmp (optarg, "execstack") == 0)
1627         {
1628           link_info.execstack = TRUE;
1629           link_info.noexecstack = FALSE;
1630         }
1631       else if (strcmp (optarg, "noexecstack") == 0)
1632         {
1633           link_info.noexecstack = TRUE;
1634           link_info.execstack = FALSE;
1635         }
1636       /* What about the other Solaris -z options? FIXME.  */
1637       break;
1641 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
1642 cat >>e${EMULATION_NAME}.c <<EOF
1643  $PARSE_AND_LIST_ARGS_CASES
1647 cat >>e${EMULATION_NAME}.c <<EOF
1648     }
1650   return TRUE;
1655 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1656 cat >>e${EMULATION_NAME}.c <<EOF
1658 static void
1659 gld${EMULATION_NAME}_list_options (FILE * file)
1663 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1664 cat >>e${EMULATION_NAME}.c <<EOF
1665   fprintf (file, _("  -Bgroup\t\tSelects group name lookup rules for DSO\n"));
1666   fprintf (file, _("  --disable-new-dtags\tDisable new dynamic tags\n"));
1667   fprintf (file, _("  --enable-new-dtags\tEnable new dynamic tags\n"));
1668   fprintf (file, _("  --eh-frame-hdr\tCreate .eh_frame_hdr section\n"));
1669   fprintf (file, _("  -z combreloc\t\tMerge dynamic relocs into one section and sort\n"));
1670   fprintf (file, _("  -z defs\t\tDisallows undefined symbols\n"));
1671   fprintf (file, _("  -z execstack\t\tMark executable as requiring executable stack\n"));
1672   fprintf (file, _("  -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
1673   fprintf (file, _("  -z interpose\t\tMark object to interpose all DSOs but executable\n"));
1674   fprintf (file, _("  -z loadfltr\t\tMark object requiring immediate process\n"));
1675   fprintf (file, _("  -z muldefs\t\tAllow multiple definitions\n"));
1676   fprintf (file, _("  -z nocombreloc\tDon't merge dynamic relocs into one section\n"));
1677   fprintf (file, _("  -z nocopyreloc\tDon't create copy relocs\n"));
1678   fprintf (file, _("  -z nodefaultlib\tMark object not to use default search paths\n"));
1679   fprintf (file, _("  -z nodelete\t\tMark DSO non-deletable at runtime\n"));
1680   fprintf (file, _("  -z nodlopen\t\tMark DSO not available to dlopen\n"));
1681   fprintf (file, _("  -z nodump\t\tMark DSO not available to dldump\n"));
1682   fprintf (file, _("  -z noexecstack\tMark executable as not requiring executable stack\n"));
1683   fprintf (file, _("  -z now\t\tMark object non-lazy runtime binding\n"));
1684   fprintf (file, _("  -z origin\t\tMark object requiring immediate \$ORIGIN processing\n\t\t\t  at runtime\n"));
1685   fprintf (file, _("  -z KEYWORD\t\tIgnored for Solaris compatibility\n"));
1689 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
1690 cat >>e${EMULATION_NAME}.c <<EOF
1691  $PARSE_AND_LIST_OPTIONS
1695 cat >>e${EMULATION_NAME}.c <<EOF
1699 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
1700 cat >>e${EMULATION_NAME}.c <<EOF
1701  $PARSE_AND_LIST_EPILOGUE
1705 else
1706 cat >>e${EMULATION_NAME}.c <<EOF
1707 #define gld${EMULATION_NAME}_add_options NULL
1708 #define gld${EMULATION_NAME}_handle_option NULL
1710 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1711 cat >>e${EMULATION_NAME}.c <<EOF
1712 #define gld${EMULATION_NAME}_list_options NULL
1717 cat >>e${EMULATION_NAME}.c <<EOF
1719 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1721   ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
1722   ${LDEMUL_SYSLIB-syslib_default},
1723   ${LDEMUL_HLL-hll_default},
1724   ${LDEMUL_AFTER_PARSE-after_parse_default},
1725   ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
1726   ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
1727   ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
1728   ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
1729   ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
1730   ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
1731   "${EMULATION_NAME}",
1732   "${OUTPUT_FORMAT}",
1733   ${LDEMUL_FINISH-gld${EMULATION_NAME}_finish},
1734   ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
1735   ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
1736   ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
1737   ${LDEMUL_SET_SYMBOLS-NULL},
1738   ${LDEMUL_PARSE_ARGS-NULL},
1739   gld${EMULATION_NAME}_add_options,
1740   gld${EMULATION_NAME}_handle_option,
1741   ${LDEMUL_UNRECOGNIZED_FILE-NULL},
1742   ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
1743   ${LDEMUL_RECOGNIZED_FILE-NULL},
1744   ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
1745   ${LDEMUL_NEW_VERS_PATTERN-NULL}