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