bfd/
[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, 2003, 2004, 2005 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 #include "getopt.h"
43
44 #include "bfdlink.h"
45
46 #include "ld.h"
47 #include "ldmain.h"
48 #include "ldmisc.h"
49 #include "ldexp.h"
50 #include "ldlang.h"
51 #include "ldfile.h"
52 #include "ldemul.h"
53 #include <ldgram.h>
54 #include "elf/common.h"
55
56 /* Declare functions used by various EXTRA_EM_FILEs.  */
57 static void gld${EMULATION_NAME}_before_parse (void);
58 static void gld${EMULATION_NAME}_after_open (void);
59 static void gld${EMULATION_NAME}_before_allocation (void);
60 static bfd_boolean gld${EMULATION_NAME}_place_orphan
61   (lang_input_statement_type *file, asection *s);
62 static void gld${EMULATION_NAME}_finish (void);
63
64 EOF
65
66 if [ "x${USE_LIBPATH}" = xyes ] ; then
67   case ${target} in
68     *-*-linux-gnu*)
69   cat >>e${EMULATION_NAME}.c <<EOF
70 #ifdef HAVE_GLOB
71 #include <glob.h>
72 #endif
73 EOF
74     ;;
75   esac
76 fi
77
78 # Import any needed special functions and/or overrides.
79 #
80 if test -n "$EXTRA_EM_FILE" ; then
81 . ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
82 fi
83
84 # Functions in this file can be overridden by setting the LDEMUL_* shell
85 # variables.  If the name of the overriding function is the same as is
86 # defined in this file, then don't output this file's version.
87 # If a different overriding name is given then output the standard function
88 # as presumably it is called from the overriding function.
89 #
90 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
91 cat >>e${EMULATION_NAME}.c <<EOF
92
93 static void
94 gld${EMULATION_NAME}_before_parse (void)
95 {
96   ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
97   config.dynamic_link = ${DYNAMIC_LINK-TRUE};
98   config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
99 }
100
101 EOF
102 fi
103
104 if test x"$LDEMUL_RECOGNIZED_FILE" != xgld"${EMULATION_NAME}"_load_symbols; then
105 cat >>e${EMULATION_NAME}.c <<EOF
106 /* Handle as_needed DT_NEEDED.  */
107
108 static bfd_boolean
109 gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *entry)
110 {
111   int class = 0;
112
113   /* Tell the ELF linker that we don't want the output file to have a
114      DT_NEEDED entry for this file, unless it is used to resolve
115      references in a regular object.  */
116   if (entry->as_needed)
117     class = DYN_AS_NEEDED;
118
119   /* Tell the ELF linker that we don't want the output file to have a
120      DT_NEEDED entry for any dynamic library in DT_NEEDED tags from
121      this file at all.  */
122   if (!entry->add_needed)
123     class |= DYN_NO_ADD_NEEDED;
124
125   if (!class
126       || (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) == 0)
127     return FALSE;
128
129   bfd_elf_set_dyn_lib_class (entry->the_bfd, class);
130
131   /* Continue on with normal load_symbols processing.  */
132   return FALSE;
133 }
134 EOF
135 fi
136
137 cat >>e${EMULATION_NAME}.c <<EOF
138
139 /* These variables are required to pass information back and forth
140    between after_open and check_needed and stat_needed and vercheck.  */
141
142 static struct bfd_link_needed_list *global_needed;
143 static struct stat global_stat;
144 static bfd_boolean global_found;
145 static struct bfd_link_needed_list *global_vercheck_needed;
146 static bfd_boolean global_vercheck_failed;
147
148
149 /* On Linux, it's possible to have different versions of the same
150    shared library linked against different versions of libc.  The
151    dynamic linker somehow tags which libc version to use in
152    /etc/ld.so.cache, and, based on the libc that it sees in the
153    executable, chooses which version of the shared library to use.
154
155    We try to do a similar check here by checking whether this shared
156    library needs any other shared libraries which may conflict with
157    libraries we have already included in the link.  If it does, we
158    skip it, and try to find another shared library farther on down the
159    link path.
160
161    This is called via lang_for_each_input_file.
162    GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
163    which we are checking.  This sets GLOBAL_VERCHECK_FAILED if we find
164    a conflicting version.  */
165
166 static void
167 gld${EMULATION_NAME}_vercheck (lang_input_statement_type *s)
168 {
169   const char *soname;
170   struct bfd_link_needed_list *l;
171
172   if (global_vercheck_failed)
173     return;
174   if (s->the_bfd == NULL
175       || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
176     return;
177
178   soname = bfd_elf_get_dt_soname (s->the_bfd);
179   if (soname == NULL)
180     soname = lbasename (bfd_get_filename (s->the_bfd));
181
182   for (l = global_vercheck_needed; l != NULL; l = l->next)
183     {
184       const char *suffix;
185
186       if (strcmp (soname, l->name) == 0)
187         {
188           /* Probably can't happen, but it's an easy check.  */
189           continue;
190         }
191
192       if (strchr (l->name, '/') != NULL)
193         continue;
194
195       suffix = strstr (l->name, ".so.");
196       if (suffix == NULL)
197         continue;
198
199       suffix += sizeof ".so." - 1;
200
201       if (strncmp (soname, l->name, suffix - l->name) == 0)
202         {
203           /* Here we know that S is a dynamic object FOO.SO.VER1, and
204              the object we are considering needs a dynamic object
205              FOO.SO.VER2, and VER1 and VER2 are different.  This
206              appears to be a version mismatch, so we tell the caller
207              to try a different version of this library.  */
208           global_vercheck_failed = TRUE;
209           return;
210         }
211     }
212 }
213
214
215 /* See if an input file matches a DT_NEEDED entry by running stat on
216    the file.  */
217
218 static void
219 gld${EMULATION_NAME}_stat_needed (lang_input_statement_type *s)
220 {
221   struct stat st;
222   const char *suffix;
223   const char *soname;
224
225   if (global_found)
226     return;
227   if (s->the_bfd == NULL)
228     return;
229
230   if (bfd_stat (s->the_bfd, &st) != 0)
231     {
232       einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
233       return;
234     }
235
236   /* Some operating systems, e.g. Windows, do not provide a meaningful
237      st_ino; they always set it to zero.  (Windows does provide a
238      meaningful st_dev.)  Do not indicate a duplicate library in that
239      case.  While there is no guarantee that a system that provides
240      meaningful inode numbers will never set st_ino to zero, this is
241      merely an optimization, so we do not need to worry about false
242      negatives.  */
243   if (st.st_dev == global_stat.st_dev
244       && st.st_ino == global_stat.st_ino
245       && st.st_ino != 0)
246     {
247       global_found = TRUE;
248       return;
249     }
250
251   /* We issue a warning if it looks like we are including two
252      different versions of the same shared library.  For example,
253      there may be a problem if -lc picks up libc.so.6 but some other
254      shared library has a DT_NEEDED entry of libc.so.5.  This is a
255      heuristic test, and it will only work if the name looks like
256      NAME.so.VERSION.  FIXME: Depending on file names is error-prone.
257      If we really want to issue warnings about mixing version numbers
258      of shared libraries, we need to find a better way.  */
259
260   if (strchr (global_needed->name, '/') != NULL)
261     return;
262   suffix = strstr (global_needed->name, ".so.");
263   if (suffix == NULL)
264     return;
265   suffix += sizeof ".so." - 1;
266
267   soname = bfd_elf_get_dt_soname (s->the_bfd);
268   if (soname == NULL)
269     soname = lbasename (s->filename);
270
271   if (strncmp (soname, global_needed->name, suffix - global_needed->name) == 0)
272     einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
273            global_needed->name, global_needed->by, soname);
274 }
275
276 struct dt_needed
277 {
278   bfd *by;
279   const char *name;
280 };
281
282 /* This function is called for each possible name for a dynamic object
283    named by a DT_NEEDED entry.  The FORCE parameter indicates whether
284    to skip the check for a conflicting version.  */
285
286 static bfd_boolean
287 gld${EMULATION_NAME}_try_needed (struct dt_needed *needed,
288                                  int force)
289 {
290   bfd *abfd;
291   const char *name = needed->name;
292   const char *soname;
293   int class;
294
295   abfd = bfd_openr (name, bfd_get_target (output_bfd));
296   if (abfd == NULL)
297     return FALSE;
298   if (! bfd_check_format (abfd, bfd_object))
299     {
300       bfd_close (abfd);
301       return FALSE;
302     }
303   if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
304     {
305       bfd_close (abfd);
306       return FALSE;
307     }
308
309   /* For DT_NEEDED, they have to match.  */
310   if (abfd->xvec != output_bfd->xvec)
311     {
312       bfd_close (abfd);
313       return FALSE;
314     }
315
316   /* Check whether this object would include any conflicting library
317      versions.  If FORCE is set, then we skip this check; we use this
318      the second time around, if we couldn't find any compatible
319      instance of the shared library.  */
320
321   if (! force)
322     {
323       struct bfd_link_needed_list *needed;
324
325       if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
326         einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
327
328       if (needed != NULL)
329         {
330           global_vercheck_needed = needed;
331           global_vercheck_failed = FALSE;
332           lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
333           if (global_vercheck_failed)
334             {
335               bfd_close (abfd);
336               /* Return FALSE to force the caller to move on to try
337                  another file on the search path.  */
338               return FALSE;
339             }
340
341           /* But wait!  It gets much worse.  On Linux, if a shared
342              library does not use libc at all, we are supposed to skip
343              it the first time around in case we encounter a shared
344              library later on with the same name which does use the
345              version of libc that we want.  This is much too horrible
346              to use on any system other than Linux.  */
347
348 EOF
349 case ${target} in
350   *-*-linux-gnu*)
351     cat >>e${EMULATION_NAME}.c <<EOF
352           {
353             struct bfd_link_needed_list *l;
354
355             for (l = needed; l != NULL; l = l->next)
356               if (strncmp (l->name, "libc.so", 7) == 0)
357                 break;
358             if (l == NULL)
359               {
360                 bfd_close (abfd);
361                 return FALSE;
362               }
363           }
364
365 EOF
366     ;;
367 esac
368 cat >>e${EMULATION_NAME}.c <<EOF
369         }
370     }
371
372   /* We've found a dynamic object matching the DT_NEEDED entry.  */
373
374   /* We have already checked that there is no other input file of the
375      same name.  We must now check again that we are not including the
376      same file twice.  We need to do this because on many systems
377      libc.so is a symlink to, e.g., libc.so.1.  The SONAME entry will
378      reference libc.so.1.  If we have already included libc.so, we
379      don't want to include libc.so.1 if they are the same file, and we
380      can only check that using stat.  */
381
382   if (bfd_stat (abfd, &global_stat) != 0)
383     einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
384
385   /* First strip off everything before the last '/'.  */
386   soname = lbasename (abfd->filename);
387
388   if (trace_file_tries)
389     info_msg (_("found %s at %s\n"), soname, name);
390
391   global_found = FALSE;
392   lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
393   if (global_found)
394     {
395       /* Return TRUE to indicate that we found the file, even though
396          we aren't going to do anything with it.  */
397       return TRUE;
398     }
399
400   /* Specify the soname to use.  */
401   bfd_elf_set_dt_needed_name (abfd, soname);
402
403   /* Tell the ELF linker that we don't want the output file to have a
404      DT_NEEDED entry for this file, unless it is used to resolve
405      references in a regular object.  */
406   class = DYN_DT_NEEDED;
407
408   /* Tell the ELF linker that we don't want the output file to have a
409      DT_NEEDED entry for this file at all if the entry is from a file
410      with DYN_NO_ADD_NEEDED.  */
411   if (needed->by != NULL
412       && (bfd_elf_get_dyn_lib_class (needed->by) & DYN_NO_ADD_NEEDED) != 0)
413     class |= DYN_NO_NEEDED | DYN_NO_ADD_NEEDED;
414
415   bfd_elf_set_dyn_lib_class (abfd, class);
416
417   /* Add this file into the symbol table.  */
418   if (! bfd_link_add_symbols (abfd, &link_info))
419     einfo ("%F%B: could not read symbols: %E\n", abfd);
420
421   return TRUE;
422 }
423
424
425 /* Search for a needed file in a path.  */
426
427 static bfd_boolean
428 gld${EMULATION_NAME}_search_needed (const char *path,
429                                     struct dt_needed *n, int force)
430 {
431   const char *s;
432   const char *name = n->name;
433   size_t len;
434   struct dt_needed needed;
435
436   if (name[0] == '/')
437     return gld${EMULATION_NAME}_try_needed (n, force);
438
439   if (path == NULL || *path == '\0')
440     return FALSE;
441
442   needed.by = n->by;
443   needed.name = n->name;
444
445   len = strlen (name);
446   while (1)
447     {
448       char *filename, *sset;
449
450       s = strchr (path, ':');
451       if (s == NULL)
452         s = path + strlen (path);
453
454       filename = (char *) xmalloc (s - path + len + 2);
455       if (s == path)
456         sset = filename;
457       else
458         {
459           memcpy (filename, path, s - path);
460           filename[s - path] = '/';
461           sset = filename + (s - path) + 1;
462         }
463       strcpy (sset, name);
464
465       needed.name = filename;
466       if (gld${EMULATION_NAME}_try_needed (&needed, force))
467         return TRUE;
468
469       free (filename);
470
471       if (*s == '\0')
472         break;
473       path = s + 1;
474     }
475
476   return FALSE;
477 }
478
479 EOF
480 if [ "x${USE_LIBPATH}" = xyes ] ; then
481   cat >>e${EMULATION_NAME}.c <<EOF
482
483 /* Add the sysroot to every entry in a colon-separated path.  */
484
485 static char *
486 gld${EMULATION_NAME}_add_sysroot (const char *path)
487 {
488   int len, colons, i;
489   char *ret, *p;
490
491   len = strlen (path);
492   colons = 0;
493   i = 0;
494   while (path[i])
495     if (path[i++] == ':')
496       colons++;
497
498   if (path[i])
499     colons++;
500
501   len = len + (colons + 1) * strlen (ld_sysroot);
502   ret = xmalloc (len + 1);
503   strcpy (ret, ld_sysroot);
504   p = ret + strlen (ret);
505   i = 0;
506   while (path[i])
507     if (path[i] == ':')
508       {
509         *p++ = path[i++];
510         strcpy (p, ld_sysroot);
511         p = p + strlen (p);
512       }
513     else
514       *p++ = path[i++];
515
516   *p = 0;
517   return ret;
518 }
519
520 EOF
521   case ${target} in
522     *-*-linux-gnu*)
523       cat >>e${EMULATION_NAME}.c <<EOF
524 /* For a native linker, check the file /etc/ld.so.conf for directories
525    in which we may find shared libraries.  /etc/ld.so.conf is really
526    only meaningful on Linux.  */
527
528 struct gld${EMULATION_NAME}_ld_so_conf
529 {
530   char *path;
531   size_t len, alloc;
532 };
533
534 static void
535 gld${EMULATION_NAME}_parse_ld_so_conf
536      (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename);
537
538 static void
539 gld${EMULATION_NAME}_parse_ld_so_conf_include
540      (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename,
541       const char *pattern)
542 {
543   char *newp = NULL;
544 #ifdef HAVE_GLOB
545   glob_t gl;
546 #endif
547
548   if (pattern[0] != '/')
549     {
550       char *p = strrchr (filename, '/');
551       size_t patlen = strlen (pattern) + 1;
552
553       newp = xmalloc (p - filename + 1 + patlen);
554       memcpy (newp, filename, p - filename + 1);
555       memcpy (newp + (p - filename + 1), pattern, patlen);
556       pattern = newp;
557     }
558
559 #ifdef HAVE_GLOB
560   if (glob (pattern, 0, NULL, &gl) == 0)
561     {
562       size_t i;
563
564       for (i = 0; i < gl.gl_pathc; ++i)
565         gld${EMULATION_NAME}_parse_ld_so_conf (info, gl.gl_pathv[i]);
566       globfree (&gl);
567     }
568 #else
569   /* If we do not have glob, treat the pattern as a literal filename.  */
570   gld${EMULATION_NAME}_parse_ld_so_conf (info, pattern);
571 #endif
572
573   if (newp)
574     free (newp);
575 }
576
577 static void
578 gld${EMULATION_NAME}_parse_ld_so_conf
579      (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename)
580 {
581   FILE *f = fopen (filename, FOPEN_RT);
582   char *line;
583   size_t linelen;
584
585   if (f == NULL)
586     return;
587
588   linelen = 256;
589   line = xmalloc (linelen);
590   do
591     {
592       char *p = line, *q;
593
594       /* Normally this would use getline(3), but we need to be portable.  */
595       while ((q = fgets (p, linelen - (p - line), f)) != NULL
596              && strlen (q) == linelen - (p - line) - 1
597              && line[linelen - 2] != '\n')
598         {
599           line = xrealloc (line, 2 * linelen);
600           p = line + linelen - 1;
601           linelen += linelen;
602         }
603
604       if (q == NULL && p == line)
605         break;
606
607       p = strchr (line, '\n');
608       if (p)
609         *p = '\0';
610
611       /* Because the file format does not know any form of quoting we
612          can search forward for the next '#' character and if found
613          make it terminating the line.  */
614       p = strchr (line, '#');
615       if (p)
616         *p = '\0';
617
618       /* Remove leading whitespace.  NUL is no whitespace character.  */
619       p = line;
620       while (*p == ' ' || *p == '\f' || *p == '\r' || *p == '\t' || *p == '\v')
621         ++p;
622
623       /* If the line is blank it is ignored.  */
624       if (p[0] == '\0')
625         continue;
626
627       if (!strncmp (p, "include", 7) && (p[7] == ' ' || p[7] == '\t'))
628         {
629           char *dir, c;
630           p += 8;
631           do
632             {
633               while (*p == ' ' || *p == '\t')
634                 ++p;
635
636               if (*p == '\0')
637                 break;
638
639               dir = p;
640
641               while (*p != ' ' && *p != '\t' && *p)
642                 ++p;
643
644               c = *p;
645               *p++ = '\0';
646               if (dir[0] != '\0')
647                 gld${EMULATION_NAME}_parse_ld_so_conf_include (info, filename,
648                                                                dir);
649             }
650           while (c != '\0');
651         }
652       else
653         {
654           char *dir = p;
655           while (*p && *p != '=' && *p != ' ' && *p != '\t' && *p != '\f'
656                  && *p != '\r' && *p != '\v')
657             ++p;
658
659           while (p != dir && p[-1] == '/')
660             --p;
661           if (info->path == NULL)
662             {
663               info->alloc = p - dir + 1 + 256;
664               info->path = xmalloc (info->alloc);
665               info->len = 0;
666             }
667           else
668             {
669               if (info->len + 1 + (p - dir) >= info->alloc)
670                 {
671                   info->alloc += p - dir + 256;
672                   info->path = xrealloc (info->path, info->alloc);
673                 }
674               info->path[info->len++] = ':';
675             }
676           memcpy (info->path + info->len, dir, p - dir);
677           info->len += p - dir;
678           info->path[info->len] = '\0';
679         }
680     }
681   while (! feof (f));
682   free (line);
683   fclose (f);
684 }
685
686 static bfd_boolean
687 gld${EMULATION_NAME}_check_ld_so_conf (const char *name, int force)
688 {
689   static bfd_boolean initialized;
690   static char *ld_so_conf;
691   struct dt_needed needed;
692
693   if (! initialized)
694     {
695       char *tmppath;
696       struct gld${EMULATION_NAME}_ld_so_conf info;
697
698       tmppath = concat (ld_sysroot, "/etc/ld.so.conf", NULL);
699       info.path = NULL;
700       info.len = info.alloc = 0;
701       gld${EMULATION_NAME}_parse_ld_so_conf (&info, tmppath);
702       free (tmppath);
703       if (info.path)
704         {
705           char *d = gld${EMULATION_NAME}_add_sysroot (info.path);
706           free (info.path);
707           ld_so_conf = d;
708         }
709       initialized = TRUE;
710     }
711
712   if (ld_so_conf == NULL)
713     return FALSE;
714
715
716   needed.by = NULL;
717   needed.name = name;
718   return gld${EMULATION_NAME}_search_needed (ld_so_conf, &needed, force);
719 }
720
721 EOF
722     # Linux
723     ;;
724   esac
725 fi
726 cat >>e${EMULATION_NAME}.c <<EOF
727
728 /* See if an input file matches a DT_NEEDED entry by name.  */
729
730 static void
731 gld${EMULATION_NAME}_check_needed (lang_input_statement_type *s)
732 {
733   if (global_found)
734     return;
735
736   if (s->filename != NULL)
737     {
738       const char *f;
739
740       if (strcmp (s->filename, global_needed->name) == 0)
741         {
742           global_found = TRUE;
743           return;
744         }
745
746       if (s->search_dirs_flag)
747         {
748           f = strrchr (s->filename, '/');
749           if (f != NULL
750               && strcmp (f + 1, global_needed->name) == 0)
751             {
752               global_found = TRUE;
753               return;
754             }
755         }
756     }
757
758   if (s->the_bfd != NULL)
759     {
760       const char *soname;
761
762       soname = bfd_elf_get_dt_soname (s->the_bfd);
763       if (soname != NULL
764           && strcmp (soname, global_needed->name) == 0)
765         {
766           global_found = TRUE;
767           return;
768         }
769     }
770 }
771
772 EOF
773
774 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
775 cat >>e${EMULATION_NAME}.c <<EOF
776
777 /* This is called after all the input files have been opened.  */
778
779 static void
780 gld${EMULATION_NAME}_after_open (void)
781 {
782   struct bfd_link_needed_list *needed, *l;
783
784   /* We only need to worry about this when doing a final link.  */
785   if (link_info.relocatable || !link_info.executable)
786     return;
787
788   /* Get the list of files which appear in DT_NEEDED entries in
789      dynamic objects included in the link (often there will be none).
790      For each such file, we want to track down the corresponding
791      library, and include the symbol table in the link.  This is what
792      the runtime dynamic linker will do.  Tracking the files down here
793      permits one dynamic object to include another without requiring
794      special action by the person doing the link.  Note that the
795      needed list can actually grow while we are stepping through this
796      loop.  */
797   needed = bfd_elf_get_needed_list (output_bfd, &link_info);
798   for (l = needed; l != NULL; l = l->next)
799     {
800       struct bfd_link_needed_list *ll;
801       struct dt_needed n, nn;
802       int force;
803
804       /* If the lib that needs this one was --as-needed and wasn't
805          found to be needed, then this lib isn't needed either.  */
806       if (l->by != NULL
807           && (bfd_elf_get_dyn_lib_class (l->by) & DYN_AS_NEEDED) != 0)
808         continue;
809
810       /* If we've already seen this file, skip it.  */
811       for (ll = needed; ll != l; ll = ll->next)
812         if ((ll->by == NULL
813              || (bfd_elf_get_dyn_lib_class (ll->by) & DYN_AS_NEEDED) == 0)
814             && strcmp (ll->name, l->name) == 0)
815           break;
816       if (ll != l)
817         continue;
818
819       /* See if this file was included in the link explicitly.  */
820       global_needed = l;
821       global_found = FALSE;
822       lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
823       if (global_found)
824         continue;
825
826       n.by = l->by;
827       n.name = l->name;
828       nn.by = l->by;
829       if (trace_file_tries)
830         info_msg (_("%s needed by %B\n"), l->name, l->by);
831
832       /* We need to find this file and include the symbol table.  We
833          want to search for the file in the same way that the dynamic
834          linker will search.  That means that we want to use
835          rpath_link, rpath, then the environment variable
836          LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
837          entries (native only), then the linker script LIB_SEARCH_DIRS.
838          We do not search using the -L arguments.
839
840          We search twice.  The first time, we skip objects which may
841          introduce version mismatches.  The second time, we force
842          their use.  See gld${EMULATION_NAME}_vercheck comment.  */
843       for (force = 0; force < 2; force++)
844         {
845           size_t len;
846           search_dirs_type *search;
847 EOF
848 if [ "x${NATIVE}" = xyes ] ; then
849 cat >>e${EMULATION_NAME}.c <<EOF
850           const char *lib_path;
851 EOF
852 fi
853 if [ "x${USE_LIBPATH}" = xyes ] ; then
854 cat >>e${EMULATION_NAME}.c <<EOF
855           struct bfd_link_needed_list *rp;
856           int found;
857 EOF
858 fi
859 cat >>e${EMULATION_NAME}.c <<EOF
860
861           if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
862                                                   &n, force))
863             break;
864 EOF
865 if [ "x${USE_LIBPATH}" = xyes ] ; then
866 cat >>e${EMULATION_NAME}.c <<EOF
867           if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
868                                                   &n, force))
869             break;
870 EOF
871 fi
872 if [ "x${NATIVE}" = xyes ] ; then
873 cat >>e${EMULATION_NAME}.c <<EOF
874           if (command_line.rpath_link == NULL
875               && command_line.rpath == NULL)
876             {
877               lib_path = (const char *) getenv ("LD_RUN_PATH");
878               if (gld${EMULATION_NAME}_search_needed (lib_path, &n,
879                                                       force))
880                 break;
881             }
882           lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
883           if (gld${EMULATION_NAME}_search_needed (lib_path, &n, force))
884             break;
885 EOF
886 fi
887 if [ "x${USE_LIBPATH}" = xyes ] ; then
888 cat >>e${EMULATION_NAME}.c <<EOF
889           found = 0;
890           rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
891           for (; !found && rp != NULL; rp = rp->next)
892             {
893               char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
894               found = (rp->by == l->by
895                        && gld${EMULATION_NAME}_search_needed (tmpname,
896                                                               &n,
897                                                               force));
898               free (tmpname);
899             }
900           if (found)
901             break;
902
903 EOF
904 fi
905 cat >>e${EMULATION_NAME}.c <<EOF
906           len = strlen (l->name);
907           for (search = search_head; search != NULL; search = search->next)
908             {
909               char *filename;
910
911               if (search->cmdline)
912                 continue;
913               filename = (char *) xmalloc (strlen (search->name) + len + 2);
914               sprintf (filename, "%s/%s", search->name, l->name);
915               nn.name = filename;
916               if (gld${EMULATION_NAME}_try_needed (&nn, force))
917                 break;
918               free (filename);
919             }
920           if (search != NULL)
921             break;
922 EOF
923 if [ "x${USE_LIBPATH}" = xyes ] ; then
924   case ${target} in
925     *-*-linux-gnu*)
926       cat >>e${EMULATION_NAME}.c <<EOF
927           if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
928             break;
929 EOF
930     # Linux
931     ;;
932   esac
933 fi
934 cat >>e${EMULATION_NAME}.c <<EOF
935         }
936
937       if (force < 2)
938         continue;
939
940       einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
941              l->name, l->by);
942     }
943 }
944
945 EOF
946 fi
947
948 cat >>e${EMULATION_NAME}.c <<EOF
949
950 /* Look through an expression for an assignment statement.  */
951
952 static void
953 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
954 {
955   bfd_boolean provide = FALSE;
956
957   switch (exp->type.node_class)
958     {
959     case etree_provide:
960       provide = TRUE;
961       /* Fall thru */
962     case etree_assign:
963       /* We call record_link_assignment even if the symbol is defined.
964          This is because if it is defined by a dynamic object, we
965          actually want to use the value defined by the linker script,
966          not the value from the dynamic object (because we are setting
967          symbols like etext).  If the symbol is defined by a regular
968          object, then, as it happens, calling record_link_assignment
969          will do no harm.  */
970       if (strcmp (exp->assign.dst, ".") != 0)
971         {
972           if (!bfd_elf_record_link_assignment (output_bfd, &link_info,
973                                                exp->assign.dst, provide))
974             einfo ("%P%F: failed to record assignment to %s: %E\n",
975                    exp->assign.dst);
976         }
977       gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
978       break;
979
980     case etree_binary:
981       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
982       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
983       break;
984
985     case etree_trinary:
986       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
987       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
988       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
989       break;
990
991     case etree_unary:
992       gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
993       break;
994
995     default:
996       break;
997     }
998 }
999
1000
1001 /* This is called by the before_allocation routine via
1002    lang_for_each_statement.  It locates any assignment statements, and
1003    tells the ELF backend about them, in case they are assignments to
1004    symbols which are referred to by dynamic objects.  */
1005
1006 static void
1007 gld${EMULATION_NAME}_find_statement_assignment (lang_statement_union_type *s)
1008 {
1009   if (s->header.type == lang_assignment_statement_enum)
1010     gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1011 }
1012
1013 EOF
1014
1015 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
1016   if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
1017     ELF_INTERPRETER_SET_DEFAULT="
1018   if (sinterp != NULL)
1019     {
1020       sinterp->contents = (unsigned char *) ${ELF_INTERPRETER_NAME};
1021       sinterp->size = strlen ((char *) sinterp->contents) + 1;
1022     }
1023
1024 "
1025   else
1026     ELF_INTERPRETER_SET_DEFAULT=
1027   fi
1028 cat >>e${EMULATION_NAME}.c <<EOF
1029
1030 /* This is called after the sections have been attached to output
1031    sections, but before any sizes or addresses have been set.  */
1032
1033 static void
1034 gld${EMULATION_NAME}_before_allocation (void)
1035 {
1036   const char *rpath;
1037   asection *sinterp;
1038
1039   if (link_info.hash->type == bfd_link_elf_hash_table)
1040     _bfd_elf_tls_setup (output_bfd, &link_info);
1041
1042   /* If we are going to make any variable assignments, we need to let
1043      the ELF backend know about them in case the variables are
1044      referred to by dynamic objects.  */
1045   lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
1046
1047   /* Let the ELF backend work out the sizes of any sections required
1048      by dynamic linking.  */
1049   rpath = command_line.rpath;
1050   if (rpath == NULL)
1051     rpath = (const char *) getenv ("LD_RUN_PATH");
1052   if (! (bfd_elf_size_dynamic_sections
1053          (output_bfd, command_line.soname, rpath,
1054           command_line.filter_shlib,
1055           (const char * const *) command_line.auxiliary_filters,
1056           &link_info, &sinterp, lang_elf_version_info)))
1057     einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1058 ${ELF_INTERPRETER_SET_DEFAULT}
1059   /* Let the user override the dynamic linker we are using.  */
1060   if (command_line.interpreter != NULL
1061       && sinterp != NULL)
1062     {
1063       sinterp->contents = (bfd_byte *) command_line.interpreter;
1064       sinterp->size = strlen (command_line.interpreter) + 1;
1065     }
1066
1067   /* Look for any sections named .gnu.warning.  As a GNU extensions,
1068      we treat such sections as containing warning messages.  We print
1069      out the warning message, and then zero out the section size so
1070      that it does not get copied into the output file.  */
1071
1072   {
1073     LANG_FOR_EACH_INPUT_STATEMENT (is)
1074       {
1075         asection *s;
1076         bfd_size_type sz;
1077         bfd_size_type prefix_len;
1078         char *msg;
1079         bfd_boolean ret;
1080         const char * gnu_warning_prefix = _("warning: ");
1081
1082         if (is->just_syms_flag)
1083           continue;
1084
1085         s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
1086         if (s == NULL)
1087           continue;
1088
1089         sz = s->size;
1090         prefix_len = strlen (gnu_warning_prefix);
1091         msg = xmalloc ((size_t) (prefix_len + sz + 1));
1092         strcpy (msg, gnu_warning_prefix);
1093         if (! bfd_get_section_contents (is->the_bfd, s, msg + prefix_len,
1094                                         (file_ptr) 0, sz))
1095           einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
1096                  is->the_bfd);
1097         msg[prefix_len + sz] = '\0';
1098         ret = link_info.callbacks->warning (&link_info, msg,
1099                                             (const char *) NULL,
1100                                             is->the_bfd, (asection *) NULL,
1101                                             (bfd_vma) 0);
1102         ASSERT (ret);
1103         free (msg);
1104
1105         /* Clobber the section size, so that we don't waste copying the
1106            warning into the output file.  */
1107         s->size = 0;
1108
1109         /* Also set SEC_EXCLUDE, so that symbols defined in the warning
1110            section don't get copied to the output.  */
1111         s->flags |= SEC_EXCLUDE;
1112       }
1113   }
1114 }
1115
1116 EOF
1117 fi
1118
1119 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
1120 cat >>e${EMULATION_NAME}.c <<EOF
1121
1122 /* Try to open a dynamic archive.  This is where we know that ELF
1123    dynamic libraries have an extension of .so (or .sl on oddball systems
1124    like hpux).  */
1125
1126 static bfd_boolean
1127 gld${EMULATION_NAME}_open_dynamic_archive
1128   (const char *arch, search_dirs_type *search, lang_input_statement_type *entry)
1129 {
1130   const char *filename;
1131   char *string;
1132
1133   if (! entry->is_archive)
1134     return FALSE;
1135
1136   filename = entry->filename;
1137
1138   /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
1139      is defined, but it does not seem worth the headache to optimize
1140      away those two bytes of space.  */
1141   string = (char *) xmalloc (strlen (search->name)
1142                              + strlen (filename)
1143                              + strlen (arch)
1144 #ifdef EXTRA_SHLIB_EXTENSION
1145                              + strlen (EXTRA_SHLIB_EXTENSION)
1146 #endif
1147                              + sizeof "/lib.so");
1148
1149   sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
1150
1151 #ifdef EXTRA_SHLIB_EXTENSION
1152   /* Try the .so extension first.  If that fails build a new filename
1153      using EXTRA_SHLIB_EXTENSION.  */
1154   if (! ldfile_try_open_bfd (string, entry))
1155     sprintf (string, "%s/lib%s%s%s", search->name,
1156              filename, arch, EXTRA_SHLIB_EXTENSION);
1157 #endif
1158
1159   if (! ldfile_try_open_bfd (string, entry))
1160     {
1161       free (string);
1162       return FALSE;
1163     }
1164
1165   entry->filename = string;
1166
1167   /* We have found a dynamic object to include in the link.  The ELF
1168      backend linker will create a DT_NEEDED entry in the .dynamic
1169      section naming this file.  If this file includes a DT_SONAME
1170      entry, it will be used.  Otherwise, the ELF linker will just use
1171      the name of the file.  For an archive found by searching, like
1172      this one, the DT_NEEDED entry should consist of just the name of
1173      the file, without the path information used to find it.  Note
1174      that we only need to do this if we have a dynamic object; an
1175      archive will never be referenced by a DT_NEEDED entry.
1176
1177      FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
1178      very pretty.  I haven't been able to think of anything that is
1179      pretty, though.  */
1180   if (bfd_check_format (entry->the_bfd, bfd_object)
1181       && (entry->the_bfd->flags & DYNAMIC) != 0)
1182     {
1183       ASSERT (entry->is_archive && entry->search_dirs_flag);
1184
1185       /* Rather than duplicating the logic above.  Just use the
1186          filename we recorded earlier.  */
1187
1188       filename = lbasename (entry->filename);
1189       bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
1190     }
1191
1192   return TRUE;
1193 }
1194
1195 EOF
1196 fi
1197
1198 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
1199 cat >>e${EMULATION_NAME}.c <<EOF
1200
1201 /* A variant of lang_output_section_find used by place_orphan.  */
1202
1203 static lang_output_section_statement_type *
1204 output_rel_find (asection *sec, int isdyn)
1205 {
1206   lang_output_section_statement_type *lookup;
1207   lang_output_section_statement_type *last = NULL;
1208   lang_output_section_statement_type *last_alloc = NULL;
1209   lang_output_section_statement_type *last_rel = NULL;
1210   lang_output_section_statement_type *last_rel_alloc = NULL;
1211   int rela = sec->name[4] == 'a';
1212
1213   for (lookup = &lang_output_section_statement.head->output_section_statement;
1214        lookup != NULL;
1215        lookup = lookup->next)
1216     {
1217       if (lookup->constraint != -1
1218           && strncmp (".rel", lookup->name, 4) == 0)
1219         {
1220           int lookrela = lookup->name[4] == 'a';
1221
1222           /* .rel.dyn must come before all other reloc sections, to suit
1223              GNU ld.so.  */
1224           if (isdyn)
1225             break;
1226
1227           /* Don't place after .rel.plt as doing so results in wrong
1228              dynamic tags.  */
1229           if (strcmp (".plt", lookup->name + 4 + lookrela) == 0)
1230             break;
1231
1232           if (rela == lookrela || last_rel == NULL)
1233             last_rel = lookup;
1234           if ((rela == lookrela || last_rel_alloc == NULL)
1235               && lookup->bfd_section != NULL
1236               && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1237             last_rel_alloc = lookup;
1238         }
1239
1240       last = lookup;
1241       if (lookup->bfd_section != NULL
1242           && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1243         last_alloc = lookup;
1244     }
1245
1246   if (last_rel_alloc)
1247     return last_rel_alloc;
1248
1249   if (last_rel)
1250     return last_rel;
1251
1252   if (last_alloc)
1253     return last_alloc;
1254
1255   return last;
1256 }
1257
1258 /* Place an orphan section.  We use this to put random SHF_ALLOC
1259    sections in the right segment.  */
1260
1261 static bfd_boolean
1262 gld${EMULATION_NAME}_place_orphan (lang_input_statement_type *file, asection *s)
1263 {
1264   static struct orphan_save hold[] =
1265     {
1266       { ".text",
1267         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1268         0, 0, 0, 0 },
1269       { ".rodata",
1270         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1271         0, 0, 0, 0 },
1272       { ".data",
1273         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1274         0, 0, 0, 0 },
1275       { ".bss",
1276         SEC_ALLOC,
1277         0, 0, 0, 0 },
1278       { 0,
1279         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1280         0, 0, 0, 0 },
1281       { ".interp",
1282         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1283         0, 0, 0, 0 },
1284       { ".sdata",
1285         SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_SMALL_DATA,
1286         0, 0, 0, 0 }
1287     };
1288   enum orphan_save_index
1289     {
1290       orphan_text = 0,
1291       orphan_rodata,
1292       orphan_data,
1293       orphan_bss,
1294       orphan_rel,
1295       orphan_interp,
1296       orphan_sdata
1297     };
1298   static int orphan_init_done = 0;
1299   struct orphan_save *place;
1300   const char *secname;
1301   lang_output_section_statement_type *after;
1302   lang_output_section_statement_type *os;
1303   int isdyn = 0;
1304
1305   secname = bfd_get_section_name (s->owner, s);
1306
1307   if (! link_info.relocatable
1308       && link_info.combreloc
1309       && (s->flags & SEC_ALLOC)
1310       && strncmp (secname, ".rel", 4) == 0)
1311     {
1312       if (secname[4] == 'a')
1313         secname = ".rela.dyn";
1314       else
1315         secname = ".rel.dyn";
1316       isdyn = 1;
1317     }
1318
1319   if (isdyn || (!config.unique_orphan_sections && !unique_section_p (s)))
1320     {
1321       /* Look through the script to see where to place this section.  */
1322       os = lang_output_section_find (secname);
1323
1324       if (os != NULL
1325           && (os->bfd_section == NULL
1326               || os->bfd_section->flags == 0
1327               || ((s->flags ^ os->bfd_section->flags)
1328                   & (SEC_LOAD | SEC_ALLOC)) == 0))
1329         {
1330           /* We already have an output section statement with this
1331              name, and its bfd section, if any, has compatible flags.
1332              If the section already exists but does not have any flags
1333              set, then it has been created by the linker, probably as a
1334              result of a --section-start command line switch.  */
1335           lang_add_section (&os->children, s, os, file);
1336           return TRUE;
1337         }
1338     }
1339
1340   if (!orphan_init_done)
1341     {
1342       struct orphan_save *ho;
1343       for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
1344         if (ho->name != NULL)
1345           {
1346             ho->os = lang_output_section_find (ho->name);
1347             if (ho->os != NULL && ho->os->flags == 0)
1348               ho->os->flags = ho->flags;
1349           }
1350       orphan_init_done = 1;
1351     }
1352
1353   /* If this is a final link, then always put .gnu.warning.SYMBOL
1354      sections into the .text section to get them out of the way.  */
1355   if (link_info.executable
1356       && ! link_info.relocatable
1357       && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
1358       && hold[orphan_text].os != NULL)
1359     {
1360       lang_add_section (&hold[orphan_text].os->children, s,
1361                         hold[orphan_text].os, file);
1362       return TRUE;
1363     }
1364
1365   /* Decide which segment the section should go in based on the
1366      section name and section flags.  We put loadable .note sections
1367      right after the .interp section, so that the PT_NOTE segment is
1368      stored right after the program headers where the OS can read it
1369      in the first page.  */
1370
1371   place = NULL;
1372   if ((s->flags & SEC_ALLOC) == 0)
1373     ;
1374   else if ((s->flags & SEC_LOAD) != 0
1375            && strncmp (secname, ".note", 5) == 0)
1376     place = &hold[orphan_interp];
1377   else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
1378     place = &hold[orphan_bss];
1379   else if ((s->flags & SEC_SMALL_DATA) != 0)
1380     place = &hold[orphan_sdata];
1381   else if ((s->flags & SEC_READONLY) == 0)
1382     place = &hold[orphan_data];
1383   else if (strncmp (secname, ".rel", 4) == 0
1384            && (s->flags & SEC_LOAD) != 0)
1385     place = &hold[orphan_rel];
1386   else if ((s->flags & SEC_CODE) == 0)
1387     place = &hold[orphan_rodata];
1388   else
1389     place = &hold[orphan_text];
1390
1391   after = NULL;
1392   if (place != NULL)
1393     {
1394       if (place->os == NULL)
1395         {
1396           if (place->name != NULL)
1397             place->os = lang_output_section_find (place->name);
1398           else
1399             place->os = output_rel_find (s, isdyn);
1400         }
1401       after = place->os;
1402       if (after == NULL)
1403         after = lang_output_section_find_by_flags (s, &place->os);
1404       if (after == NULL)
1405         /* *ABS* is always the first output section statement.  */
1406         after = &lang_output_section_statement.head->output_section_statement;
1407     }
1408
1409   /* Choose a unique name for the section.  This will be needed if the
1410      same section name appears in the input file with different
1411      loadable or allocatable characteristics.  */
1412   if (bfd_get_section_by_name (output_bfd, secname) != NULL)
1413     {
1414       static int count = 1;
1415       secname = bfd_get_unique_section_name (output_bfd, secname, &count);
1416       if (secname == NULL)
1417         einfo ("%F%P: place_orphan failed: %E\n");
1418     }
1419
1420   lang_insert_orphan (file, s, secname, after, place, NULL, NULL);
1421
1422   return TRUE;
1423 }
1424 EOF
1425 fi
1426
1427 if test x"$LDEMUL_FINISH" != xgld"$EMULATION_NAME"_finish; then
1428 cat >>e${EMULATION_NAME}.c <<EOF
1429
1430 static void
1431 gld${EMULATION_NAME}_finish (void)
1432 {
1433   if (bfd_elf_discard_info (output_bfd, &link_info))
1434     {
1435       lang_reset_memory_regions ();
1436
1437       /* Resize the sections.  */
1438       lang_size_sections (stat_ptr->head, abs_output_section,
1439                           &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE);
1440
1441       /* Redo special stuff.  */
1442       ldemul_after_allocation ();
1443
1444       /* Do the assignments again.  */
1445       lang_do_assignments (stat_ptr->head, abs_output_section,
1446                            (fill_type *) 0, (bfd_vma) 0);
1447     }
1448
1449   if (!link_info.relocatable)
1450     {
1451       lang_output_section_statement_type *os;
1452
1453       for (os = &lang_output_section_statement.head->output_section_statement;
1454            os != NULL;
1455            os = os->next)
1456         {
1457           asection *s;
1458
1459           if (os == abs_output_section || os->constraint == -1)
1460             continue;
1461           s = os->bfd_section;
1462           if (s != NULL && s->size == 0 && (s->flags & SEC_KEEP) == 0)
1463             {
1464               asection **p;
1465
1466               for (p = &output_bfd->sections; *p; p = &(*p)->next)
1467                 if (*p == s)
1468                   {
1469                     bfd_section_list_remove (output_bfd, p);
1470                     output_bfd->section_count--;
1471                     break;
1472                   }
1473             }
1474         }
1475     }
1476 }
1477 EOF
1478 fi
1479
1480 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1481 cat >>e${EMULATION_NAME}.c <<EOF
1482
1483 static char *
1484 gld${EMULATION_NAME}_get_script (int *isfile)
1485 EOF
1486
1487 if test -n "$COMPILE_IN"
1488 then
1489 # Scripts compiled in.
1490
1491 # sed commands to quote an ld script as a C string.
1492 sc="-f stringify.sed"
1493
1494 cat >>e${EMULATION_NAME}.c <<EOF
1495 {
1496   *isfile = 0;
1497
1498   if (link_info.relocatable && config.build_constructors)
1499     return
1500 EOF
1501 sed $sc ldscripts/${EMULATION_NAME}.xu                  >> e${EMULATION_NAME}.c
1502 echo '  ; else if (link_info.relocatable) return'       >> e${EMULATION_NAME}.c
1503 sed $sc ldscripts/${EMULATION_NAME}.xr                  >> e${EMULATION_NAME}.c
1504 echo '  ; else if (!config.text_read_only) return'      >> e${EMULATION_NAME}.c
1505 sed $sc ldscripts/${EMULATION_NAME}.xbn                 >> e${EMULATION_NAME}.c
1506 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
1507 echo '  ; else if (!config.magic_demand_paged) return'  >> e${EMULATION_NAME}.c
1508 sed $sc ldscripts/${EMULATION_NAME}.xn                  >> e${EMULATION_NAME}.c
1509 fi
1510 if test -n "$GENERATE_PIE_SCRIPT" ; then
1511 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1512 echo '  ; else if (link_info.pie && link_info.combreloc' >> e${EMULATION_NAME}.c
1513 echo '             && link_info.relro' >> e${EMULATION_NAME}.c
1514 echo '             && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1515 sed $sc ldscripts/${EMULATION_NAME}.xdw                 >> e${EMULATION_NAME}.c
1516 echo '  ; else if (link_info.pie && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1517 sed $sc ldscripts/${EMULATION_NAME}.xdc                 >> e${EMULATION_NAME}.c
1518 fi
1519 echo '  ; else if (link_info.pie) return'               >> e${EMULATION_NAME}.c
1520 sed $sc ldscripts/${EMULATION_NAME}.xd                  >> e${EMULATION_NAME}.c
1521 fi
1522 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1523 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1524 echo '  ; else if (link_info.shared && link_info.combreloc' >> e${EMULATION_NAME}.c
1525 echo '             && link_info.relro' >> e${EMULATION_NAME}.c
1526 echo '             && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1527 sed $sc ldscripts/${EMULATION_NAME}.xsw                 >> e${EMULATION_NAME}.c
1528 echo '  ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1529 sed $sc ldscripts/${EMULATION_NAME}.xsc                 >> e${EMULATION_NAME}.c
1530 fi
1531 echo '  ; else if (link_info.shared) return'            >> e${EMULATION_NAME}.c
1532 sed $sc ldscripts/${EMULATION_NAME}.xs                  >> e${EMULATION_NAME}.c
1533 fi
1534 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1535 echo '  ; else if (link_info.combreloc && link_info.relro' >> e${EMULATION_NAME}.c
1536 echo '             && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1537 sed $sc ldscripts/${EMULATION_NAME}.xw                  >> e${EMULATION_NAME}.c
1538 echo '  ; else if (link_info.combreloc) return'         >> e${EMULATION_NAME}.c
1539 sed $sc ldscripts/${EMULATION_NAME}.xc                  >> e${EMULATION_NAME}.c
1540 fi
1541 echo '  ; else return'                                  >> e${EMULATION_NAME}.c
1542 sed $sc ldscripts/${EMULATION_NAME}.x                   >> e${EMULATION_NAME}.c
1543 echo '; }'                                              >> e${EMULATION_NAME}.c
1544
1545 else
1546 # Scripts read from the filesystem.
1547
1548 cat >>e${EMULATION_NAME}.c <<EOF
1549 {
1550   *isfile = 1;
1551
1552   if (link_info.relocatable && config.build_constructors)
1553     return "ldscripts/${EMULATION_NAME}.xu";
1554   else if (link_info.relocatable)
1555     return "ldscripts/${EMULATION_NAME}.xr";
1556   else if (!config.text_read_only)
1557     return "ldscripts/${EMULATION_NAME}.xbn";
1558 EOF
1559 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
1560 else
1561 cat >>e${EMULATION_NAME}.c <<EOF
1562   else if (!config.magic_demand_paged)
1563     return "ldscripts/${EMULATION_NAME}.xn";
1564 EOF
1565 fi
1566 if test -n "$GENERATE_PIE_SCRIPT" ; then
1567 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1568 cat >>e${EMULATION_NAME}.c <<EOF
1569   else if (link_info.pie && link_info.combreloc
1570            && link_info.relro && (link_info.flags & DT_BIND_NOW))
1571     return "ldscripts/${EMULATION_NAME}.xdw";
1572   else if (link_info.pie && link_info.combreloc)
1573     return "ldscripts/${EMULATION_NAME}.xdc";
1574 EOF
1575 fi
1576 cat >>e${EMULATION_NAME}.c <<EOF
1577   else if (link_info.pie)
1578     return "ldscripts/${EMULATION_NAME}.xd";
1579 EOF
1580 fi
1581 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1582 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1583 cat >>e${EMULATION_NAME}.c <<EOF
1584   else if (link_info.shared && link_info.combreloc
1585            && link_info.relro && (link_info.flags & DT_BIND_NOW))
1586     return "ldscripts/${EMULATION_NAME}.xsw";
1587   else if (link_info.shared && link_info.combreloc)
1588     return "ldscripts/${EMULATION_NAME}.xsc";
1589 EOF
1590 fi
1591 cat >>e${EMULATION_NAME}.c <<EOF
1592   else if (link_info.shared)
1593     return "ldscripts/${EMULATION_NAME}.xs";
1594 EOF
1595 fi
1596 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1597 cat >>e${EMULATION_NAME}.c <<EOF
1598   else if (link_info.combreloc && link_info.relro
1599            && (link_info.flags & DT_BIND_NOW))
1600     return "ldscripts/${EMULATION_NAME}.xw";
1601   else if (link_info.combreloc)
1602     return "ldscripts/${EMULATION_NAME}.xc";
1603 EOF
1604 fi
1605 cat >>e${EMULATION_NAME}.c <<EOF
1606   else
1607     return "ldscripts/${EMULATION_NAME}.x";
1608 }
1609
1610 EOF
1611 fi
1612 fi
1613
1614 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1615
1616 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1617 cat >>e${EMULATION_NAME}.c <<EOF
1618  $PARSE_AND_LIST_PROLOGUE
1619 EOF
1620 fi
1621
1622 cat >>e${EMULATION_NAME}.c <<EOF
1623
1624 #define OPTION_DISABLE_NEW_DTAGS        (400)
1625 #define OPTION_ENABLE_NEW_DTAGS         (OPTION_DISABLE_NEW_DTAGS + 1)
1626 #define OPTION_GROUP                    (OPTION_ENABLE_NEW_DTAGS + 1)
1627 #define OPTION_EH_FRAME_HDR             (OPTION_GROUP + 1)
1628 #define OPTION_EXCLUDE_LIBS             (OPTION_EH_FRAME_HDR + 1)
1629   
1630 static void
1631 gld${EMULATION_NAME}_add_options
1632   (int ns, char **shortopts, int nl, struct option **longopts,
1633    int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
1634 {
1635   static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:";
1636   static const struct option xtra_long[] = {
1637 EOF
1638
1639 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1640 cat >>e${EMULATION_NAME}.c <<EOF
1641     {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1642     {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1643     {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
1644     {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
1645     {"Bgroup", no_argument, NULL, OPTION_GROUP},
1646 EOF
1647 fi
1648
1649 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
1650 cat >>e${EMULATION_NAME}.c <<EOF
1651     $PARSE_AND_LIST_LONGOPTS
1652 EOF
1653 fi
1654
1655 cat >>e${EMULATION_NAME}.c <<EOF
1656     {NULL, no_argument, NULL, 0}
1657   };
1658
1659   *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
1660   memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
1661   *longopts = (struct option *)
1662     xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
1663   memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
1664 }
1665
1666 static bfd_boolean
1667 gld${EMULATION_NAME}_handle_option (int optc)
1668 {
1669   switch (optc)
1670     {
1671     default:
1672       return FALSE;
1673
1674 EOF
1675
1676 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1677 cat >>e${EMULATION_NAME}.c <<EOF
1678     case OPTION_DISABLE_NEW_DTAGS:
1679       link_info.new_dtags = FALSE;
1680       break;
1681
1682     case OPTION_ENABLE_NEW_DTAGS:
1683       link_info.new_dtags = TRUE;
1684       break;
1685
1686     case OPTION_EH_FRAME_HDR:
1687       link_info.eh_frame_hdr = TRUE;
1688       break;
1689
1690     case OPTION_GROUP:
1691       link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
1692       /* Groups must be self-contained.  */
1693       link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
1694       link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
1695       break;
1696
1697     case OPTION_EXCLUDE_LIBS:
1698       add_excluded_libs (optarg);
1699       break;
1700
1701     case 'z':
1702       if (strcmp (optarg, "initfirst") == 0)
1703         link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
1704       else if (strcmp (optarg, "interpose") == 0)
1705         link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
1706       else if (strcmp (optarg, "loadfltr") == 0)
1707         link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
1708       else if (strcmp (optarg, "nodefaultlib") == 0)
1709         link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
1710       else if (strcmp (optarg, "nodelete") == 0)
1711         link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
1712       else if (strcmp (optarg, "nodlopen") == 0)
1713         link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
1714       else if (strcmp (optarg, "nodump") == 0)
1715         link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
1716       else if (strcmp (optarg, "now") == 0)
1717         {
1718           link_info.flags |= (bfd_vma) DF_BIND_NOW;
1719           link_info.flags_1 |= (bfd_vma) DF_1_NOW;
1720         }
1721       else if (strcmp (optarg, "origin") == 0)
1722         {
1723           link_info.flags |= (bfd_vma) DF_ORIGIN;
1724           link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
1725         }
1726       else if (strcmp (optarg, "defs") == 0)
1727         link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
1728       else if (strcmp (optarg, "muldefs") == 0)
1729         link_info.allow_multiple_definition = TRUE;
1730       else if (strcmp (optarg, "combreloc") == 0)
1731         link_info.combreloc = TRUE;
1732       else if (strcmp (optarg, "nocombreloc") == 0)
1733         link_info.combreloc = FALSE;
1734       else if (strcmp (optarg, "nocopyreloc") == 0)
1735         link_info.nocopyreloc = TRUE;
1736       else if (strcmp (optarg, "execstack") == 0)
1737         {
1738           link_info.execstack = TRUE;
1739           link_info.noexecstack = FALSE;
1740         }
1741       else if (strcmp (optarg, "noexecstack") == 0)
1742         {
1743           link_info.noexecstack = TRUE;
1744           link_info.execstack = FALSE;
1745         }
1746       else if (strcmp (optarg, "relro") == 0)
1747         link_info.relro = TRUE;
1748       else if (strcmp (optarg, "norelro") == 0)
1749         link_info.relro = FALSE;
1750       /* What about the other Solaris -z options? FIXME.  */
1751       break;
1752 EOF
1753 fi
1754
1755 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
1756 cat >>e${EMULATION_NAME}.c <<EOF
1757  $PARSE_AND_LIST_ARGS_CASES
1758 EOF
1759 fi
1760
1761 cat >>e${EMULATION_NAME}.c <<EOF
1762     }
1763
1764   return TRUE;
1765 }
1766
1767 EOF
1768
1769 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1770 cat >>e${EMULATION_NAME}.c <<EOF
1771
1772 static void
1773 gld${EMULATION_NAME}_list_options (FILE * file)
1774 {
1775 EOF
1776
1777 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1778 cat >>e${EMULATION_NAME}.c <<EOF
1779   fprintf (file, _("  -Bgroup\t\tSelects group name lookup rules for DSO\n"));
1780   fprintf (file, _("  --disable-new-dtags\tDisable new dynamic tags\n"));
1781   fprintf (file, _("  --enable-new-dtags\tEnable new dynamic tags\n"));
1782   fprintf (file, _("  --eh-frame-hdr\tCreate .eh_frame_hdr section\n"));
1783   fprintf (file, _("  -z combreloc\t\tMerge dynamic relocs into one section and sort\n"));
1784   fprintf (file, _("  -z defs\t\tReport unresolved symbols in object files.\n"));
1785   fprintf (file, _("  -z execstack\t\tMark executable as requiring executable stack\n"));
1786   fprintf (file, _("  -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
1787   fprintf (file, _("  -z interpose\t\tMark object to interpose all DSOs but executable\n"));
1788   fprintf (file, _("  -z loadfltr\t\tMark object requiring immediate process\n"));
1789   fprintf (file, _("  -z muldefs\t\tAllow multiple definitions\n"));
1790   fprintf (file, _("  -z nocombreloc\tDon't merge dynamic relocs into one section\n"));
1791   fprintf (file, _("  -z nocopyreloc\tDon't create copy relocs\n"));
1792   fprintf (file, _("  -z nodefaultlib\tMark object not to use default search paths\n"));
1793   fprintf (file, _("  -z nodelete\t\tMark DSO non-deletable at runtime\n"));
1794   fprintf (file, _("  -z nodlopen\t\tMark DSO not available to dlopen\n"));
1795   fprintf (file, _("  -z nodump\t\tMark DSO not available to dldump\n"));
1796   fprintf (file, _("  -z noexecstack\tMark executable as not requiring executable stack\n"));
1797   fprintf (file, _("  -z norelro\t\tDon't create RELRO program header\n"));
1798   fprintf (file, _("  -z now\t\tMark object non-lazy runtime binding\n"));
1799   fprintf (file, _("  -z origin\t\tMark object requiring immediate \$ORIGIN processing\n\t\t\t  at runtime\n"));
1800   fprintf (file, _("  -z relro\t\tCreate RELRO program header\n"));
1801   fprintf (file, _("  -z KEYWORD\t\tIgnored for Solaris compatibility\n"));
1802 EOF
1803 fi
1804
1805 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
1806 cat >>e${EMULATION_NAME}.c <<EOF
1807  $PARSE_AND_LIST_OPTIONS
1808 EOF
1809 fi
1810
1811 cat >>e${EMULATION_NAME}.c <<EOF
1812 }
1813 EOF
1814
1815 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
1816 cat >>e${EMULATION_NAME}.c <<EOF
1817  $PARSE_AND_LIST_EPILOGUE
1818 EOF
1819 fi
1820 fi
1821 else
1822 cat >>e${EMULATION_NAME}.c <<EOF
1823 #define gld${EMULATION_NAME}_add_options NULL
1824 #define gld${EMULATION_NAME}_handle_option NULL
1825 EOF
1826 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1827 cat >>e${EMULATION_NAME}.c <<EOF
1828 #define gld${EMULATION_NAME}_list_options NULL
1829 EOF
1830 fi
1831 fi
1832
1833 cat >>e${EMULATION_NAME}.c <<EOF
1834
1835 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1836 {
1837   ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
1838   ${LDEMUL_SYSLIB-syslib_default},
1839   ${LDEMUL_HLL-hll_default},
1840   ${LDEMUL_AFTER_PARSE-after_parse_default},
1841   ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
1842   ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
1843   ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
1844   ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
1845   ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
1846   ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
1847   "${EMULATION_NAME}",
1848   "${OUTPUT_FORMAT}",
1849   ${LDEMUL_FINISH-gld${EMULATION_NAME}_finish},
1850   ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
1851   ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
1852   ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
1853   ${LDEMUL_SET_SYMBOLS-NULL},
1854   ${LDEMUL_PARSE_ARGS-NULL},
1855   gld${EMULATION_NAME}_add_options,
1856   gld${EMULATION_NAME}_handle_option,
1857   ${LDEMUL_UNRECOGNIZED_FILE-NULL},
1858   ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
1859   ${LDEMUL_RECOGNIZED_FILE-gld${EMULATION_NAME}_load_symbols},
1860   ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
1861   ${LDEMUL_NEW_VERS_PATTERN-NULL}
1862 };
1863 EOF