c62727d7e0cb1de6ab1de841a646c13ad6a7a4ee
[platform/upstream/binutils.git] / ld / emultempl / elf32.em
1 # This shell script emits a C file. -*- C -*-
2 # It does some substitutions.
3 # This file is now misnamed, because it supports both 32 bit and 64 bit
4 # ELF emulations.
5 test -z "${ELFSIZE}" && ELFSIZE=32
6 if [ -z "$MACHINE" ]; then
7   OUTPUT_ARCH=${ARCH}
8 else
9   OUTPUT_ARCH=${ARCH}:${MACHINE}
10 fi
11 cat >e${EMULATION_NAME}.c <<EOF
12 /* This file is is generated by a shell script.  DO NOT EDIT! */
13
14 /* ${ELFSIZE} bit ELF emulation code for ${EMULATION_NAME}
15    Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
16    2002 Free Software Foundation, Inc.
17    Written by Steve Chamberlain <sac@cygnus.com>
18    ELF support by Ian Lance Taylor <ian@cygnus.com>
19
20 This file is part of GLD, the Gnu Linker.
21
22 This program is free software; you can redistribute it and/or modify
23 it under the terms of the GNU General Public License as published by
24 the Free Software Foundation; either version 2 of the License, or
25 (at your option) any later version.
26
27 This program is distributed in the hope that it will be useful,
28 but WITHOUT ANY WARRANTY; without even the implied warranty of
29 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
30 GNU General Public License for more details.
31
32 You should have received a copy of the GNU General Public License
33 along with this program; if not, write to the Free Software
34 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
35
36 #define TARGET_IS_${EMULATION_NAME}
37
38 #include "bfd.h"
39 #include "sysdep.h"
40 #include "libiberty.h"
41 #include "safe-ctype.h"
42
43 #include "bfdlink.h"
44
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"
54
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));
87
88 EOF
89
90 # Import any needed special functions and/or overrides.
91 #
92 if test -n "$EXTRA_EM_FILE" ; then
93 . ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
94 fi
95
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.
101 #
102 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
103 cat >>e${EMULATION_NAME}.c <<EOF
104
105 static void
106 gld${EMULATION_NAME}_before_parse ()
107 {
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`;
119 }
120
121 EOF
122 fi
123
124 cat >>e${EMULATION_NAME}.c <<EOF
125
126 /* These variables are required to pass information back and forth
127    between after_open and check_needed and stat_needed and vercheck.  */
128
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;
134
135
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.
141
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.
147
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.  */
152
153 static void
154 gld${EMULATION_NAME}_vercheck (s)
155      lang_input_statement_type *s;
156 {
157   const char *soname;
158   struct bfd_link_needed_list *l;
159
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;
165
166   soname = bfd_elf_get_dt_soname (s->the_bfd);
167   if (soname == NULL)
168     soname = basename (bfd_get_filename (s->the_bfd));
169
170   for (l = global_vercheck_needed; l != NULL; l = l->next)
171     {
172       const char *suffix;
173
174       if (strcmp (soname, l->name) == 0)
175         {
176           /* Probably can't happen, but it's an easy check.  */
177           continue;
178         }
179
180       if (strchr (l->name, '/') != NULL)
181         continue;
182
183       suffix = strstr (l->name, ".so.");
184       if (suffix == NULL)
185         continue;
186
187       suffix += sizeof ".so." - 1;
188
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     }
200 }
201
202
203 /* See if an input file matches a DT_NEEDED entry by running stat on
204    the file.  */
205
206 static void
207 gld${EMULATION_NAME}_stat_needed (s)
208      lang_input_statement_type *s;
209 {
210   struct stat st;
211   const char *suffix;
212   const char *soname;
213
214   if (global_found)
215     return;
216   if (s->the_bfd == NULL)
217     return;
218
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     }
224
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     }
231
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.  */
240
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;
247
248   soname = bfd_elf_get_dt_soname (s->the_bfd);
249   if (soname == NULL)
250     soname = basename (s->filename);
251
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);
255 }
256
257
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.  */
261
262 static boolean
263 gld${EMULATION_NAME}_try_needed (name, force)
264      const char *name;
265      int force;
266 {
267   bfd *abfd;
268   const char *soname;
269
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     }
283
284   /* Check whether this object would include any conflicting library
285      versions.  If FORCE is set, then we skip this check; we use this
286      the second time around, if we couldn't find any compatible
287      instance of the shared library.  */
288
289   if (! force)
290     {
291       struct bfd_link_needed_list *needed;
292
293       if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
294         einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
295
296       if (needed != NULL)
297         {
298           global_vercheck_needed = needed;
299           global_vercheck_failed = false;
300           lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
301           if (global_vercheck_failed)
302             {
303               bfd_close (abfd);
304               /* Return false to force the caller to move on to try
305                  another file on the search path.  */
306               return false;
307             }
308
309           /* But wait!  It gets much worse.  On Linux, if a shared
310              library does not use libc at all, we are supposed to skip
311              it the first time around in case we encounter a shared
312              library later on with the same name which does use the
313              version of libc that we want.  This is much too horrible
314              to use on any system other than Linux.  */
315
316 EOF
317 case ${target} in
318   *-*-linux-gnu*)
319     cat >>e${EMULATION_NAME}.c <<EOF
320           {
321             struct bfd_link_needed_list *l;
322
323             for (l = needed; l != NULL; l = l->next)
324               if (strncmp (l->name, "libc.so", 7) == 0)
325                 break;
326             if (l == NULL)
327               {
328                 bfd_close (abfd);
329                 return false;
330               }
331           }
332
333 EOF
334     ;;
335 esac
336 cat >>e${EMULATION_NAME}.c <<EOF
337         }
338     }
339
340   /* We've found a dynamic object matching the DT_NEEDED entry.  */
341
342   /* We have already checked that there is no other input file of the
343      same name.  We must now check again that we are not including the
344      same file twice.  We need to do this because on many systems
345      libc.so is a symlink to, e.g., libc.so.1.  The SONAME entry will
346      reference libc.so.1.  If we have already included libc.so, we
347      don't want to include libc.so.1 if they are the same file, and we
348      can only check that using stat.  */
349
350   if (bfd_stat (abfd, &global_stat) != 0)
351     einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
352
353   /* First strip off everything before the last '/'.  */
354   soname = basename (abfd->filename);
355
356   if (trace_file_tries)
357     info_msg (_("found %s at %s\n"), soname, name);
358
359   global_found = false;
360   lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
361   if (global_found)
362     {
363       /* Return true to indicate that we found the file, even though
364          we aren't going to do anything with it.  */
365       return true;
366     }
367
368   /* Tell the ELF backend that we don't want the output file to have a
369      DT_NEEDED entry for this file.  */
370   bfd_elf_set_dt_needed_name (abfd, "");
371
372   /* Previos basename call was clobbered in lang_for_each_input_file.  */
373   soname = basename (abfd->filename);
374
375   /* Tell the ELF backend that the output file needs a DT_NEEDED
376      entry for this file if it is used to resolve the reference in
377      a regular object.  */
378   bfd_elf_set_dt_needed_soname (abfd, soname);
379
380   /* Add this file into the symbol table.  */
381   if (! bfd_link_add_symbols (abfd, &link_info))
382     einfo ("%F%B: could not read symbols: %E\n", abfd);
383
384   return true;
385 }
386
387
388 /* Search for a needed file in a path.  */
389
390 static boolean
391 gld${EMULATION_NAME}_search_needed (path, name, force)
392      const char *path;
393      const char *name;
394      int force;
395 {
396   const char *s;
397   size_t len;
398
399   if (name[0] == '/')
400     return gld${EMULATION_NAME}_try_needed (name, force);
401
402   if (path == NULL || *path == '\0')
403     return false;
404   len = strlen (name);
405   while (1)
406     {
407       char *filename, *sset;
408
409       s = strchr (path, ':');
410       if (s == NULL)
411         s = path + strlen (path);
412
413       filename = (char *) xmalloc (s - path + len + 2);
414       if (s == path)
415         sset = filename;
416       else
417         {
418           memcpy (filename, path, s - path);
419           filename[s - path] = '/';
420           sset = filename + (s - path) + 1;
421         }
422       strcpy (sset, name);
423
424       if (gld${EMULATION_NAME}_try_needed (filename, force))
425         return true;
426
427       free (filename);
428
429       if (*s == '\0')
430         break;
431       path = s + 1;
432     }
433
434   return false;
435 }
436
437 EOF
438 if [ "x${host}" = "x${target}" ] ; then
439   case " ${EMULATION_LIBPATH} " in
440   *" ${EMULATION_NAME} "*)
441     case ${target} in
442       *-*-linux-gnu*)
443         cat >>e${EMULATION_NAME}.c <<EOF
444
445 /* For a native linker, check the file /etc/ld.so.conf for directories
446    in which we may find shared libraries.  /etc/ld.so.conf is really
447    only meaningful on Linux.  */
448
449 static boolean gld${EMULATION_NAME}_check_ld_so_conf
450   PARAMS ((const char *, int));
451
452 static boolean
453 gld${EMULATION_NAME}_check_ld_so_conf (name, force)
454      const char *name;
455      int force;
456 {
457   static boolean initialized;
458   static char *ld_so_conf;
459
460   if (! initialized)
461     {
462       FILE *f;
463
464       f = fopen ("/etc/ld.so.conf", FOPEN_RT);
465       if (f != NULL)
466         {
467           char *b;
468           size_t len, alloc;
469           int c;
470
471           len = 0;
472           alloc = 100;
473           b = (char *) xmalloc (alloc);
474
475           while ((c = getc (f)) != EOF)
476             {
477               if (len + 1 >= alloc)
478                 {
479                   alloc *= 2;
480                   b = (char *) xrealloc (b, alloc);
481                 }
482               if (c != ':'
483                   && c != ' '
484                   && c != '\t'
485                   && c != '\n'
486                   && c != ',')
487                 {
488                   b[len] = c;
489                   ++len;
490                 }
491               else
492                 {
493                   if (len > 0 && b[len - 1] != ':')
494                     {
495                       b[len] = ':';
496                       ++len;
497                     }
498                 }
499             }
500
501           if (len > 0 && b[len - 1] == ':')
502             --len;
503
504           if (len > 0)
505             b[len] = '\0';
506           else
507             {
508               free (b);
509               b = NULL;
510             }
511
512           fclose (f);
513
514           ld_so_conf = b;
515         }
516
517       initialized = true;
518     }
519
520   if (ld_so_conf == NULL)
521     return false;
522
523   return gld${EMULATION_NAME}_search_needed (ld_so_conf, name, force);
524 }
525
526 EOF
527         # Linux
528         ;;
529     esac
530   esac
531 fi
532 cat >>e${EMULATION_NAME}.c <<EOF
533
534 /* See if an input file matches a DT_NEEDED entry by name.  */
535
536 static void
537 gld${EMULATION_NAME}_check_needed (s)
538      lang_input_statement_type *s;
539 {
540   if (global_found)
541     return;
542
543   if (s->filename != NULL)
544     {
545       const char *f;
546
547       if (strcmp (s->filename, global_needed->name) == 0)
548         {
549           global_found = true;
550           return;
551         }
552
553       if (s->search_dirs_flag)
554         {
555           f = strrchr (s->filename, '/');
556           if (f != NULL
557               && strcmp (f + 1, global_needed->name) == 0)
558             {
559               global_found = true;
560               return;
561             }
562         }
563     }
564
565   if (s->the_bfd != NULL)
566     {
567       const char *soname;
568
569       soname = bfd_elf_get_dt_soname (s->the_bfd);
570       if (soname != NULL
571           && strcmp (soname, global_needed->name) == 0)
572         {
573           global_found = true;
574           return;
575         }
576     }
577 }
578
579 EOF
580
581 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
582 cat >>e${EMULATION_NAME}.c <<EOF
583
584 /* This is called after all the input files have been opened.  */
585
586 static void
587 gld${EMULATION_NAME}_after_open ()
588 {
589   struct bfd_link_needed_list *needed, *l;
590
591   /* We only need to worry about this when doing a final link.  */
592   if (link_info.relocateable || link_info.shared)
593     return;
594
595   /* Get the list of files which appear in DT_NEEDED entries in
596      dynamic objects included in the link (often there will be none).
597      For each such file, we want to track down the corresponding
598      library, and include the symbol table in the link.  This is what
599      the runtime dynamic linker will do.  Tracking the files down here
600      permits one dynamic object to include another without requiring
601      special action by the person doing the link.  Note that the
602      needed list can actually grow while we are stepping through this
603      loop.  */
604   needed = bfd_elf_get_needed_list (output_bfd, &link_info);
605   for (l = needed; l != NULL; l = l->next)
606     {
607       struct bfd_link_needed_list *ll;
608       int force;
609
610       /* If we've already seen this file, skip it.  */
611       for (ll = needed; ll != l; ll = ll->next)
612         if (strcmp (ll->name, l->name) == 0)
613           break;
614       if (ll != l)
615         continue;
616
617       /* See if this file was included in the link explicitly.  */
618       global_needed = l;
619       global_found = false;
620       lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
621       if (global_found)
622         continue;
623
624       if (trace_file_tries)
625         info_msg (_("%s needed by %B\n"), l->name, l->by);
626
627       /* We need to find this file and include the symbol table.  We
628          want to search for the file in the same way that the dynamic
629          linker will search.  That means that we want to use
630          rpath_link, rpath, then the environment variable
631          LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
632          entries (native only), then the linker script LIB_SEARCH_DIRS.
633          We do not search using the -L arguments.
634
635          We search twice.  The first time, we skip objects which may
636          introduce version mismatches.  The second time, we force
637          their use.  See gld${EMULATION_NAME}_vercheck comment.  */
638       for (force = 0; force < 2; force++)
639         {
640           size_t len;
641           search_dirs_type *search;
642 EOF
643 if [ "x${host}" = "x${target}" ] ; then
644   case " ${EMULATION_LIBPATH} " in
645   *" ${EMULATION_NAME} "*)
646 cat >>e${EMULATION_NAME}.c <<EOF
647           const char *lib_path;
648           struct bfd_link_needed_list *rp;
649           int found;
650 EOF
651   ;;
652   esac
653 fi
654 cat >>e${EMULATION_NAME}.c <<EOF
655
656           if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
657                                                   l->name, force))
658             break;
659 EOF
660 if [ "x${host}" = "x${target}" ] ; then
661   case " ${EMULATION_LIBPATH} " in
662   *" ${EMULATION_NAME} "*)
663 cat >>e${EMULATION_NAME}.c <<EOF
664           if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
665                                                   l->name, force))
666             break;
667           if (command_line.rpath_link == NULL
668               && command_line.rpath == NULL)
669             {
670               lib_path = (const char *) getenv ("LD_RUN_PATH");
671               if (gld${EMULATION_NAME}_search_needed (lib_path, l->name,
672                                                       force))
673                 break;
674             }
675           lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
676           if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, force))
677             break;
678
679           found = 0;
680           rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
681           for (; !found && rp != NULL; rp = rp->next)
682             {
683               found = (rp->by == l->by
684                        && gld${EMULATION_NAME}_search_needed (rp->name,
685                                                               l->name,
686                                                               force));
687             }
688           if (found)
689             break;
690
691 EOF
692   ;;
693   esac
694 fi
695 cat >>e${EMULATION_NAME}.c <<EOF
696           len = strlen (l->name);
697           for (search = search_head; search != NULL; search = search->next)
698             {
699               char *filename;
700
701               if (search->cmdline)
702                 continue;
703               filename = (char *) xmalloc (strlen (search->name) + len + 2);
704               sprintf (filename, "%s/%s", search->name, l->name);
705               if (gld${EMULATION_NAME}_try_needed (filename, force))
706                 break;
707               free (filename);
708             }
709           if (search != NULL)
710             break;
711 EOF
712 if [ "x${host}" = "x${target}" ] ; then
713   case " ${EMULATION_LIBPATH} " in
714   *" ${EMULATION_NAME} "*)
715     case ${target} in
716       *-*-linux-gnu*)
717         cat >>e${EMULATION_NAME}.c <<EOF
718           if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
719             break;
720 EOF
721         # Linux
722         ;;
723     esac
724   ;;
725   esac
726 fi
727 cat >>e${EMULATION_NAME}.c <<EOF
728         }
729
730       if (force < 2)
731         continue;
732
733       einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
734              l->name, l->by);
735     }
736 }
737
738 EOF
739 fi
740
741 cat >>e${EMULATION_NAME}.c <<EOF
742
743 /* Look through an expression for an assignment statement.  */
744
745 static void
746 gld${EMULATION_NAME}_find_exp_assignment (exp)
747      etree_type *exp;
748 {
749   struct bfd_link_hash_entry *h;
750
751   switch (exp->type.node_class)
752     {
753     case etree_provide:
754       h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
755                                 false, false, false);
756       if (h == NULL)
757         break;
758
759       /* We call record_link_assignment even if the symbol is defined.
760          This is because if it is defined by a dynamic object, we
761          actually want to use the value defined by the linker script,
762          not the value from the dynamic object (because we are setting
763          symbols like etext).  If the symbol is defined by a regular
764          object, then, as it happens, calling record_link_assignment
765          will do no harm.  */
766
767       /* Fall through.  */
768     case etree_assign:
769       if (strcmp (exp->assign.dst, ".") != 0)
770         {
771           if (! (bfd_elf${ELFSIZE}_record_link_assignment
772                  (output_bfd, &link_info, exp->assign.dst,
773                   exp->type.node_class == etree_provide ? true : false)))
774             einfo ("%P%F: failed to record assignment to %s: %E\n",
775                    exp->assign.dst);
776         }
777       gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
778       break;
779
780     case etree_binary:
781       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
782       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
783       break;
784
785     case etree_trinary:
786       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
787       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
788       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
789       break;
790
791     case etree_unary:
792       gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
793       break;
794
795     default:
796       break;
797     }
798 }
799
800
801 /* This is called by the before_allocation routine via
802    lang_for_each_statement.  It locates any assignment statements, and
803    tells the ELF backend about them, in case they are assignments to
804    symbols which are referred to by dynamic objects.  */
805
806 static void
807 gld${EMULATION_NAME}_find_statement_assignment (s)
808      lang_statement_union_type *s;
809 {
810   if (s->header.type == lang_assignment_statement_enum)
811     gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
812 }
813
814 EOF
815
816 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
817   if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
818     ELF_INTERPRETER_SET_DEFAULT="
819   if (sinterp != NULL)
820     {
821       sinterp->contents = ${ELF_INTERPRETER_NAME};
822       sinterp->_raw_size = strlen (sinterp->contents) + 1;
823     }
824
825 "
826   else
827     ELF_INTERPRETER_SET_DEFAULT=
828   fi
829 cat >>e${EMULATION_NAME}.c <<EOF
830
831 /* This is called after the sections have been attached to output
832    sections, but before any sizes or addresses have been set.  */
833
834 static void
835 gld${EMULATION_NAME}_before_allocation ()
836 {
837   const char *rpath;
838   asection *sinterp;
839
840   /* If we are going to make any variable assignments, we need to let
841      the ELF backend know about them in case the variables are
842      referred to by dynamic objects.  */
843   lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
844
845   /* Let the ELF backend work out the sizes of any sections required
846      by dynamic linking.  */
847   rpath = command_line.rpath;
848   if (rpath == NULL)
849     rpath = (const char *) getenv ("LD_RUN_PATH");
850   if (! (bfd_elf${ELFSIZE}_size_dynamic_sections
851          (output_bfd, command_line.soname, rpath,
852           command_line.filter_shlib,
853           (const char * const *) command_line.auxiliary_filters,
854           &link_info, &sinterp, lang_elf_version_info)))
855     einfo ("%P%F: failed to set dynamic section sizes: %E\n");
856 ${ELF_INTERPRETER_SET_DEFAULT}
857   /* Let the user override the dynamic linker we are using.  */
858   if (command_line.interpreter != NULL
859       && sinterp != NULL)
860     {
861       sinterp->contents = (bfd_byte *) command_line.interpreter;
862       sinterp->_raw_size = strlen (command_line.interpreter) + 1;
863     }
864
865   /* Look for any sections named .gnu.warning.  As a GNU extensions,
866      we treat such sections as containing warning messages.  We print
867      out the warning message, and then zero out the section size so
868      that it does not get copied into the output file.  */
869
870   {
871     LANG_FOR_EACH_INPUT_STATEMENT (is)
872       {
873         asection *s;
874         bfd_size_type sz;
875         char *msg;
876         boolean ret;
877
878         if (is->just_syms_flag)
879           continue;
880
881         s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
882         if (s == NULL)
883           continue;
884
885         sz = bfd_section_size (is->the_bfd, s);
886         msg = xmalloc ((size_t) sz + 1);
887         if (! bfd_get_section_contents (is->the_bfd, s, msg, (file_ptr) 0, sz))
888           einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
889                  is->the_bfd);
890         msg[sz] = '\0';
891         ret = link_info.callbacks->warning (&link_info, msg,
892                                             (const char *) NULL,
893                                             is->the_bfd, (asection *) NULL,
894                                             (bfd_vma) 0);
895         ASSERT (ret);
896         free (msg);
897
898         /* Clobber the section size, so that we don't waste copying the
899            warning into the output file.  */
900         s->_raw_size = 0;
901       }
902   }
903 }
904
905 EOF
906 fi
907
908 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
909 cat >>e${EMULATION_NAME}.c <<EOF
910
911 /* Try to open a dynamic archive.  This is where we know that ELF
912    dynamic libraries have an extension of .so (or .sl on oddball systems
913    like hpux).  */
914
915 static boolean
916 gld${EMULATION_NAME}_open_dynamic_archive (arch, search, entry)
917      const char *arch;
918      search_dirs_type *search;
919      lang_input_statement_type *entry;
920 {
921   const char *filename;
922   char *string;
923
924   if (! entry->is_archive)
925     return false;
926
927   filename = entry->filename;
928
929   /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
930      is defined, but it does not seem worth the headache to optimize
931      away those two bytes of space.  */
932   string = (char *) xmalloc (strlen (search->name)
933                              + strlen (filename)
934                              + strlen (arch)
935 #ifdef EXTRA_SHLIB_EXTENSION
936                              + strlen (EXTRA_SHLIB_EXTENSION)
937 #endif
938                              + sizeof "/lib.so");
939
940   sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
941
942 #ifdef EXTRA_SHLIB_EXTENSION
943   /* Try the .so extension first.  If that fails build a new filename
944      using EXTRA_SHLIB_EXTENSION.  */
945   if (! ldfile_try_open_bfd (string, entry))
946     sprintf (string, "%s/lib%s%s%s", search->name,
947              filename, arch, EXTRA_SHLIB_EXTENSION);
948 #endif
949
950   if (! ldfile_try_open_bfd (string, entry))
951     {
952       free (string);
953       return false;
954     }
955
956   entry->filename = string;
957
958   /* We have found a dynamic object to include in the link.  The ELF
959      backend linker will create a DT_NEEDED entry in the .dynamic
960      section naming this file.  If this file includes a DT_SONAME
961      entry, it will be used.  Otherwise, the ELF linker will just use
962      the name of the file.  For an archive found by searching, like
963      this one, the DT_NEEDED entry should consist of just the name of
964      the file, without the path information used to find it.  Note
965      that we only need to do this if we have a dynamic object; an
966      archive will never be referenced by a DT_NEEDED entry.
967
968      FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
969      very pretty.  I haven't been able to think of anything that is
970      pretty, though.  */
971   if (bfd_check_format (entry->the_bfd, bfd_object)
972       && (entry->the_bfd->flags & DYNAMIC) != 0)
973     {
974       ASSERT (entry->is_archive && entry->search_dirs_flag);
975
976       /* Rather than duplicating the logic above.  Just use the
977          filename we recorded earlier.  */
978
979       filename = xstrdup (basename (entry->filename));
980       bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
981     }
982
983   return true;
984 }
985
986 EOF
987 fi
988
989 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
990 cat >>e${EMULATION_NAME}.c <<EOF
991
992 /* A variant of lang_output_section_find.  Used by place_orphan.  */
993
994 static lang_output_section_statement_type *
995 output_rel_find ()
996 {
997   lang_statement_union_type *u;
998   lang_output_section_statement_type *lookup;
999
1000   for (u = lang_output_section_statement.head;
1001        u != (lang_statement_union_type *) NULL;
1002        u = lookup->next)
1003     {
1004       lookup = &u->output_section_statement;
1005       if (strncmp (".rel", lookup->name, 4) == 0
1006           && lookup->bfd_section != NULL
1007           && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1008         {
1009           return lookup;
1010         }
1011     }
1012   return (lang_output_section_statement_type *) NULL;
1013 }
1014
1015 /* Find the last output section before given output statement.
1016    Used by place_orphan.  */
1017
1018 static asection *
1019 output_prev_sec_find (os)
1020      lang_output_section_statement_type *os;
1021 {
1022   asection *s = (asection *) NULL;
1023   lang_statement_union_type *u;
1024   lang_output_section_statement_type *lookup;
1025
1026   for (u = lang_output_section_statement.head;
1027        u != (lang_statement_union_type *) NULL;
1028        u = lookup->next)
1029     {
1030       lookup = &u->output_section_statement;
1031       if (lookup == os)
1032         return s;
1033
1034       if (lookup->bfd_section != NULL && lookup->bfd_section->owner != NULL)
1035         s = lookup->bfd_section;
1036     }
1037
1038   return NULL;
1039 }
1040
1041 /* Place an orphan section.  We use this to put random SHF_ALLOC
1042    sections in the right segment.  */
1043
1044 struct orphan_save {
1045   lang_output_section_statement_type *os;
1046   asection **section;
1047   lang_statement_union_type **stmt;
1048 };
1049
1050 static boolean
1051 gld${EMULATION_NAME}_place_orphan (file, s)
1052      lang_input_statement_type *file;
1053      asection *s;
1054 {
1055   static struct orphan_save hold_text;
1056   static struct orphan_save hold_rodata;
1057   static struct orphan_save hold_data;
1058   static struct orphan_save hold_bss;
1059   static struct orphan_save hold_rel;
1060   static struct orphan_save hold_interp;
1061   static struct orphan_save hold_sdata;
1062   static int count = 1;
1063   struct orphan_save *place;
1064   lang_statement_list_type *old;
1065   lang_statement_list_type add;
1066   etree_type *address;
1067   const char *secname;
1068   const char *outsecname;
1069   const char *ps = NULL;
1070   lang_output_section_statement_type *os;
1071
1072   secname = bfd_get_section_name (s->owner, s);
1073
1074   if (! config.unique_orphan_sections && ! unique_section_p (secname))
1075     {
1076       /* Look through the script to see where to place this section.  */
1077       os = lang_output_section_find (secname);
1078
1079       if (os != NULL
1080           && (os->bfd_section == NULL
1081               || ((s->flags ^ os->bfd_section->flags)
1082                   & (SEC_LOAD | SEC_ALLOC)) == 0))
1083         {
1084           /* We already have an output section statement with this
1085              name, and its bfd section, if any, has compatible flags.  */
1086           lang_add_section (&os->children, s, os, file);
1087           return true;
1088         }
1089     }
1090
1091   if (hold_text.os == NULL)
1092     hold_text.os = lang_output_section_find (".text");
1093
1094   /* If this is a final link, then always put .gnu.warning.SYMBOL
1095      sections into the .text section to get them out of the way.  */
1096   if (! link_info.shared
1097       && ! link_info.relocateable
1098       && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
1099       && hold_text.os != NULL)
1100     {
1101       lang_add_section (&hold_text.os->children, s, hold_text.os, file);
1102       return true;
1103     }
1104
1105   /* Decide which segment the section should go in based on the
1106      section name and section flags.  We put loadable .note sections
1107      right after the .interp section, so that the PT_NOTE segment is
1108      stored right after the program headers where the OS can read it
1109      in the first page.  */
1110 #define HAVE_SECTION(hold, name) \
1111 (hold.os != NULL || (hold.os = lang_output_section_find (name)) != NULL)
1112
1113   if (s->flags & SEC_EXCLUDE)
1114     {
1115       if (s->output_section == NULL)
1116         s->output_section = bfd_abs_section_ptr;
1117       return true;
1118     }
1119
1120   place = NULL;
1121   if ((s->flags & SEC_ALLOC) == 0)
1122     ;
1123   else if ((s->flags & SEC_LOAD) != 0
1124            && strncmp (secname, ".note", 5) == 0
1125            && HAVE_SECTION (hold_interp, ".interp"))
1126     place = &hold_interp;
1127   else if ((s->flags & SEC_HAS_CONTENTS) == 0
1128            && HAVE_SECTION (hold_bss, ".bss"))
1129     place = &hold_bss;
1130   else if ((s->flags & SEC_SMALL_DATA) != 0
1131            && HAVE_SECTION (hold_sdata, ".sdata"))
1132     place = &hold_sdata;
1133   else if ((s->flags & SEC_READONLY) == 0
1134            && HAVE_SECTION (hold_data, ".data"))
1135     place = &hold_data;
1136   else if (strncmp (secname, ".rel", 4) == 0
1137            && (hold_rel.os != NULL
1138                || (hold_rel.os = output_rel_find ()) != NULL))
1139     {
1140       if (! link_info.relocateable && link_info.combreloc)
1141         {
1142           if (strncmp (secname, ".rela", 5) == 0)
1143             os = lang_output_section_find (".rela.dyn");
1144           else
1145             os = lang_output_section_find (".rel.dyn");
1146
1147           if (os != NULL
1148               && os->bfd_section != NULL
1149               && ((s->flags ^ os->bfd_section->flags)
1150                   & (SEC_LOAD | SEC_ALLOC)) == 0)
1151             {
1152               lang_add_section (&os->children, s, os, file);
1153               return true;
1154             }
1155         }
1156       place = &hold_rel;
1157     }
1158   else if ((s->flags & (SEC_CODE | SEC_READONLY)) == SEC_READONLY
1159            && HAVE_SECTION (hold_rodata, ".rodata"))
1160     place = &hold_rodata;
1161   else if ((s->flags & (SEC_CODE | SEC_READONLY)) == (SEC_CODE | SEC_READONLY)
1162            && hold_text.os != NULL)
1163     place = &hold_text;
1164
1165 #undef HAVE_SECTION
1166
1167   /* Choose a unique name for the section.  This will be needed if the
1168      same section name appears in the input file with different
1169      loadable or allocatable characteristics.  */
1170   outsecname = secname;
1171   if (bfd_get_section_by_name (output_bfd, outsecname) != NULL)
1172     {
1173       outsecname = bfd_get_unique_section_name (output_bfd,
1174                                                 outsecname,
1175                                                 &count);
1176       if (outsecname == NULL)
1177         einfo ("%F%P: place_orphan failed: %E\n");
1178     }
1179
1180   /* Start building a list of statements for this section.
1181      First save the current statement pointer.  */
1182   old = stat_ptr;
1183
1184   /* If we have found an appropriate place for the output section
1185      statements for this orphan, add them to our own private list,
1186      inserting them later into the global statement list.  */
1187   if (place != NULL)
1188     {
1189       stat_ptr = &add;
1190       lang_list_init (stat_ptr);
1191     }
1192
1193   if (config.build_constructors)
1194     {
1195       /* If the name of the section is representable in C, then create
1196          symbols to mark the start and the end of the section.  */
1197       for (ps = outsecname; *ps != '\0'; ps++)
1198         if (! ISALNUM (*ps) && *ps != '_')
1199           break;
1200       if (*ps == '\0')
1201         {
1202           char *symname;
1203           etree_type *e_align;
1204
1205           symname = (char *) xmalloc (ps - outsecname + sizeof "__start_");
1206           sprintf (symname, "__start_%s", outsecname);
1207           e_align = exp_unop (ALIGN_K,
1208                               exp_intop ((bfd_vma) 1 << s->alignment_power));
1209           lang_add_assignment (exp_assop ('=', symname, e_align));
1210         }
1211     }
1212
1213   if (link_info.relocateable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
1214     address = exp_intop ((bfd_vma) 0);
1215   else
1216     address = NULL;
1217
1218   os = lang_enter_output_section_statement (outsecname, address, 0,
1219                                             (bfd_vma) 0,
1220                                             (etree_type *) NULL,
1221                                             (etree_type *) NULL,
1222                                             (etree_type *) NULL);
1223
1224   lang_add_section (&os->children, s, os, file);
1225
1226   lang_leave_output_section_statement
1227     ((bfd_vma) 0, "*default*",
1228      (struct lang_output_section_phdr_list *) NULL, "*default*");
1229
1230   if (config.build_constructors && *ps == '\0')
1231     {
1232       char *symname;
1233
1234       /* lang_leave_ouput_section_statement resets stat_ptr.  Put
1235          stat_ptr back where we want it.  */
1236       if (place != NULL)
1237         stat_ptr = &add;
1238
1239       symname = (char *) xmalloc (ps - outsecname + sizeof "__stop_");
1240       sprintf (symname, "__stop_%s", outsecname);
1241       lang_add_assignment (exp_assop ('=', symname,
1242                                       exp_nameop (NAME, ".")));
1243     }
1244
1245   /* Restore the global list pointer.  */
1246   stat_ptr = old;
1247
1248   if (place != NULL)
1249     {
1250       asection *snew, **pps;
1251
1252       snew = os->bfd_section;
1253
1254       /* Shuffle the bfd section list to make the output file look
1255          neater.  This is really only cosmetic.  */
1256       if (place->section == NULL)
1257         {
1258           asection *bfd_section = place->os->bfd_section;
1259
1260           /* If the output statement hasn't been used to place
1261              any input sections (and thus doesn't have an output
1262              bfd_section), look for the closest prior output statement
1263              having an output section.  */
1264           if (bfd_section == NULL)
1265             bfd_section = output_prev_sec_find (place->os);
1266
1267           if (bfd_section != NULL && bfd_section != snew)
1268             place->section = &bfd_section->next;
1269         }
1270
1271       if (place->section != NULL)
1272         {
1273           /* Unlink the section.  */
1274           for (pps = &output_bfd->sections; *pps != snew; pps = &(*pps)->next)
1275             ;
1276           bfd_section_list_remove (output_bfd, pps);
1277
1278           /* Now tack it on to the "place->os" section list.  */
1279           bfd_section_list_insert (output_bfd, place->section, snew);
1280         }
1281
1282       /* Save the end of this list.  Further ophans of this type will
1283          follow the one we've just added.  */
1284       place->section = &snew->next;
1285
1286       /* The following is non-cosmetic.  We try to put the output
1287          statements in some sort of reasonable order here, because
1288          they determine the final load addresses of the orphan
1289          sections.  In addition, placing output statements in the
1290          wrong order may require extra segments.  For instance,
1291          given a typical situation of all read-only sections placed
1292          in one segment and following that a segment containing all
1293          the read-write sections, we wouldn't want to place an orphan
1294          read/write section before or amongst the read-only ones.  */
1295       if (add.head != NULL)
1296         {
1297           if (place->stmt == NULL)
1298             {
1299               /* Put the new statement list right at the head.  */
1300               *add.tail = place->os->header.next;
1301               place->os->header.next = add.head;
1302             }
1303           else
1304             {
1305               /* Put it after the last orphan statement we added.  */
1306               *add.tail = *place->stmt;
1307               *place->stmt = add.head;
1308             }
1309
1310           /* Fix the global list pointer if we happened to tack our
1311              new list at the tail.  */
1312           if (*old->tail == add.head)
1313             old->tail = add.tail;
1314
1315           /* Save the end of this list.  */
1316           place->stmt = add.tail;
1317         }
1318     }
1319
1320   return true;
1321 }
1322 EOF
1323 fi
1324
1325 if test x"$LDEMUL_FINISH" != xgld"$EMULATION_NAME"_finish; then
1326 cat >>e${EMULATION_NAME}.c <<EOF
1327
1328 static void
1329 gld${EMULATION_NAME}_finish ()
1330 {
1331   if (bfd_elf${ELFSIZE}_discard_info (output_bfd, &link_info))
1332     {
1333       lang_reset_memory_regions ();
1334
1335       /* Resize the sections.  */
1336       lang_size_sections (stat_ptr->head, abs_output_section,
1337                           &stat_ptr->head, 0, (bfd_vma) 0, NULL);
1338
1339       /* Redo special stuff.  */
1340       ldemul_after_allocation ();
1341
1342       /* Do the assignments again.  */
1343       lang_do_assignments (stat_ptr->head, abs_output_section,
1344                            (fill_type) 0, (bfd_vma) 0);
1345     }
1346 }
1347 EOF
1348 fi
1349
1350 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1351 cat >>e${EMULATION_NAME}.c <<EOF
1352
1353 static char *
1354 gld${EMULATION_NAME}_get_script (isfile)
1355      int *isfile;
1356 EOF
1357
1358 if test -n "$COMPILE_IN"
1359 then
1360 # Scripts compiled in.
1361
1362 # sed commands to quote an ld script as a C string.
1363 sc="-f stringify.sed"
1364
1365 cat >>e${EMULATION_NAME}.c <<EOF
1366 {
1367   *isfile = 0;
1368
1369   if (link_info.relocateable == true && config.build_constructors == true)
1370     return
1371 EOF
1372 sed $sc ldscripts/${EMULATION_NAME}.xu                     >> e${EMULATION_NAME}.c
1373 echo '  ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c
1374 sed $sc ldscripts/${EMULATION_NAME}.xr                     >> e${EMULATION_NAME}.c
1375 echo '  ; else if (!config.text_read_only) return'         >> e${EMULATION_NAME}.c
1376 sed $sc ldscripts/${EMULATION_NAME}.xbn                    >> e${EMULATION_NAME}.c
1377 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
1378 echo '  ; else if (!config.magic_demand_paged) return'     >> e${EMULATION_NAME}.c
1379 sed $sc ldscripts/${EMULATION_NAME}.xn                     >> e${EMULATION_NAME}.c
1380 fi
1381 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1382 echo '  ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1383 sed $sc ldscripts/${EMULATION_NAME}.xsc                    >> e${EMULATION_NAME}.c
1384 echo '  ; else if (link_info.shared) return'               >> e${EMULATION_NAME}.c
1385 sed $sc ldscripts/${EMULATION_NAME}.xs                     >> e${EMULATION_NAME}.c
1386 fi
1387 echo '  ; else if (link_info.combreloc) return'            >> e${EMULATION_NAME}.c
1388 sed $sc ldscripts/${EMULATION_NAME}.xc                     >> e${EMULATION_NAME}.c
1389 echo '  ; else return'                                     >> e${EMULATION_NAME}.c
1390 sed $sc ldscripts/${EMULATION_NAME}.x                      >> e${EMULATION_NAME}.c
1391 echo '; }'                                                 >> e${EMULATION_NAME}.c
1392
1393 else
1394 # Scripts read from the filesystem.
1395
1396 cat >>e${EMULATION_NAME}.c <<EOF
1397 {
1398   *isfile = 1;
1399
1400   if (link_info.relocateable == true && config.build_constructors == true)
1401     return "ldscripts/${EMULATION_NAME}.xu";
1402   else if (link_info.relocateable == true)
1403     return "ldscripts/${EMULATION_NAME}.xr";
1404   else if (!config.text_read_only)
1405     return "ldscripts/${EMULATION_NAME}.xbn";
1406   else if (!config.magic_demand_paged)
1407     return "ldscripts/${EMULATION_NAME}.xn";
1408   else if (link_info.shared)
1409     return "ldscripts/${EMULATION_NAME}.xs";
1410   else
1411     return "ldscripts/${EMULATION_NAME}.x";
1412 }
1413
1414 EOF
1415 fi
1416 fi
1417
1418 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1419
1420 if test x"$LDEMUL_PARSE_ARGS" != xgld"$EMULATION_NAME"_parse_args; then
1421
1422 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1423 cat >>e${EMULATION_NAME}.c <<EOF
1424  $PARSE_AND_LIST_PROLOGUE
1425 EOF
1426 fi
1427
1428 cat >>e${EMULATION_NAME}.c <<EOF
1429
1430 #include "getopt.h"
1431
1432 #define OPTION_DISABLE_NEW_DTAGS        (400)
1433 #define OPTION_ENABLE_NEW_DTAGS         (OPTION_DISABLE_NEW_DTAGS + 1)
1434 #define OPTION_GROUP                    (OPTION_ENABLE_NEW_DTAGS + 1)
1435 #define OPTION_EH_FRAME_HDR             (OPTION_GROUP + 1)
1436
1437 static struct option longopts[] =
1438 {
1439 EOF
1440
1441 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1442 cat >>e${EMULATION_NAME}.c <<EOF
1443   /* getopt allows abbreviations, so we do this to stop it from
1444      treating -d/-e as abbreviations for these options. */
1445   {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1446   {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1447   {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1448   {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1449   {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
1450   {"Bgroup", no_argument, NULL, OPTION_GROUP},
1451   {"Bgroup", no_argument, NULL, OPTION_GROUP},
1452 EOF
1453 fi
1454
1455 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
1456 cat >>e${EMULATION_NAME}.c <<EOF
1457  $PARSE_AND_LIST_LONGOPTS
1458 EOF
1459 fi
1460
1461 cat >>e${EMULATION_NAME}.c <<EOF
1462   {NULL, no_argument, NULL, 0}
1463 };
1464
1465
1466 static int gld${EMULATION_NAME}_parse_args PARAMS ((int, char **));
1467
1468 static int
1469 gld${EMULATION_NAME}_parse_args (argc, argv)
1470      int argc;
1471      char ** argv;
1472 {
1473   int longind;
1474   int optc;
1475   static int prevoptind = -1;
1476   int prevopterr = opterr;
1477   int wanterror;
1478
1479   if (prevoptind != optind)
1480     opterr = 0;
1481
1482   wanterror = opterr;
1483   prevoptind = optind;
1484
1485   optc = getopt_long_only (argc, argv,
1486                            "-${PARSE_AND_LIST_SHORTOPTS}z:", longopts,
1487                            &longind);
1488   opterr = prevopterr;
1489
1490   switch (optc)
1491     {
1492     default:
1493       if (wanterror)
1494         xexit (1);
1495       optind = prevoptind;
1496       return 0;
1497
1498 EOF
1499
1500 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1501 cat >>e${EMULATION_NAME}.c <<EOF
1502     case OPTION_DISABLE_NEW_DTAGS:
1503       link_info.new_dtags = false;
1504       break;
1505
1506     case OPTION_ENABLE_NEW_DTAGS:
1507       link_info.new_dtags = true;
1508       break;
1509
1510     case OPTION_EH_FRAME_HDR:
1511       link_info.eh_frame_hdr = true;
1512       break;
1513
1514     case OPTION_GROUP:
1515       link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
1516       /* Groups must be self-contained.  */
1517       link_info.no_undefined = true;
1518       break;
1519
1520     case 'z':
1521       if (strcmp (optarg, "initfirst") == 0)
1522         link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
1523       else if (strcmp (optarg, "interpose") == 0)
1524         link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
1525       else if (strcmp (optarg, "loadfltr") == 0)
1526         link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
1527       else if (strcmp (optarg, "nodefaultlib") == 0)
1528         link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
1529       else if (strcmp (optarg, "nodelete") == 0)
1530         link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
1531       else if (strcmp (optarg, "nodlopen") == 0)
1532         link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
1533       else if (strcmp (optarg, "nodump") == 0)
1534         link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
1535       else if (strcmp (optarg, "now") == 0)
1536         {
1537           link_info.flags |= (bfd_vma) DF_BIND_NOW;
1538           link_info.flags_1 |= (bfd_vma) DF_1_NOW;
1539         }
1540       else if (strcmp (optarg, "origin") == 0)
1541         {
1542           link_info.flags |= (bfd_vma) DF_ORIGIN;
1543           link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
1544         }
1545       else if (strcmp (optarg, "defs") == 0)
1546         link_info.no_undefined = true;
1547       else if (strcmp (optarg, "combreloc") == 0)
1548         link_info.combreloc = true;
1549       else if (strcmp (optarg, "nocombreloc") == 0)
1550         link_info.combreloc = false;
1551       else if (strcmp (optarg, "nocopyreloc") == 0)
1552         link_info.nocopyreloc = true;
1553       /* What about the other Solaris -z options? FIXME.  */
1554       break;
1555 EOF
1556 fi
1557
1558 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
1559 cat >>e${EMULATION_NAME}.c <<EOF
1560  $PARSE_AND_LIST_ARGS_CASES
1561 EOF
1562 fi
1563
1564 cat >>e${EMULATION_NAME}.c <<EOF
1565     }
1566
1567   return 1;
1568 }
1569
1570 EOF
1571 fi
1572
1573 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1574 cat >>e${EMULATION_NAME}.c <<EOF
1575
1576 static void gld${EMULATION_NAME}_list_options PARAMS ((FILE * file));
1577
1578 static void
1579 gld${EMULATION_NAME}_list_options (file)
1580      FILE * file;
1581 {
1582 EOF
1583
1584 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1585 cat >>e${EMULATION_NAME}.c <<EOF
1586   fprintf (file, _("  -Bgroup\t\tSelects group name lookup rules for DSO\n"));
1587   fprintf (file, _("  --disable-new-dtags\tDisable new dynamic tags\n"));
1588   fprintf (file, _("  --enable-new-dtags\tEnable new dynamic tags\n"));
1589   fprintf (file, _("  --eh-frame-hdr\tCreate .eh_frame_hdr section\n"));
1590   fprintf (file, _("  -z combreloc\t\tMerge dynamic relocs into one section and sort\n"));
1591   fprintf (file, _("  -z defs\t\tDisallows undefined symbols\n"));
1592   fprintf (file, _("  -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
1593   fprintf (file, _("  -z interpose\t\tMark object to interpose all DSOs but executable\n"));
1594   fprintf (file, _("  -z loadfltr\t\tMark object requiring immediate process\n"));
1595   fprintf (file, _("  -z nocombreloc\tDon't merge dynamic relocs into one section\n"));
1596   fprintf (file, _("  -z nocopyreloc\tDon't create copy relocs\n"));
1597   fprintf (file, _("  -z nodefaultlib\tMark object not to use default search paths\n"));
1598   fprintf (file, _("  -z nodelete\t\tMark DSO non-deletable at runtime\n"));
1599   fprintf (file, _("  -z nodlopen\t\tMark DSO not available to dlopen\n"));
1600   fprintf (file, _("  -z nodump\t\tMark DSO not available to dldump\n"));
1601   fprintf (file, _("  -z now\t\tMark object non-lazy runtime binding\n"));
1602   fprintf (file, _("  -z origin\t\tMark object requiring immediate \$ORIGIN processing\n\t\t\t  at runtime\n"));
1603   fprintf (file, _("  -z KEYWORD\t\tIgnored for Solaris compatibility\n"));
1604 EOF
1605 fi
1606
1607 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
1608 cat >>e${EMULATION_NAME}.c <<EOF
1609  $PARSE_AND_LIST_OPTIONS
1610 EOF
1611 fi
1612
1613 cat >>e${EMULATION_NAME}.c <<EOF
1614 }
1615 EOF
1616
1617 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
1618 cat >>e${EMULATION_NAME}.c <<EOF
1619  $PARSE_AND_LIST_EPILOGUE
1620 EOF
1621 fi
1622 fi
1623 else
1624 if test x"$LDEMUL_PARSE_ARGS" != xgld"$EMULATION_NAME"_parse_args; then
1625 cat >>e${EMULATION_NAME}.c <<EOF
1626 #define gld${EMULATION_NAME}_parse_args   NULL
1627 EOF
1628 fi
1629 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1630 cat >>e${EMULATION_NAME}.c <<EOF
1631 #define gld${EMULATION_NAME}_list_options NULL
1632 EOF
1633 fi
1634 fi
1635
1636 cat >>e${EMULATION_NAME}.c <<EOF
1637
1638 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1639 {
1640   ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
1641   ${LDEMUL_SYSLIB-syslib_default},
1642   ${LDEMUL_HLL-hll_default},
1643   ${LDEMUL_AFTER_PARSE-after_parse_default},
1644   ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
1645   ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
1646   ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
1647   ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
1648   ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
1649   ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
1650   "${EMULATION_NAME}",
1651   "${OUTPUT_FORMAT}",
1652   ${LDEMUL_FINISH-gld${EMULATION_NAME}_finish},
1653   ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
1654   ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
1655   ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
1656   ${LDEMUL_SET_SYMBOLS-NULL},
1657   ${LDEMUL_PARSE_ARGS-gld${EMULATION_NAME}_parse_args},
1658   ${LDEMUL_UNRECOGNIZED_FILE-NULL},
1659   ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
1660   ${LDEMUL_RECOGNIZED_FILE-NULL},
1661   ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
1662 };
1663 EOF