elf32.em revision 60525
172677Speter# $FreeBSD: head/contrib/binutils/ld/emultempl/elf32.em 60525 2000-05-13 17:51:22Z obrien $
272677Speter# This shell script emits a C file. -*- C -*-
372677Speter# It does some substitutions.
472677Speter# This file is now misnamed, because it supports both 32 bit and 64 bit
572677Speter# ELF emulations.
672677Spetertest -z "${ELFSIZE}" && ELFSIZE=32
772677Spetercat >e${EMULATION_NAME}.c <<EOF
872677Speter/* This file is is generated by a shell script.  DO NOT EDIT! */
972677Speter
1072677Speter/* ${ELFSIZE} bit ELF emulation code for ${EMULATION_NAME}
1172677Speter   Copyright (C) 1991, 93, 94, 95, 96, 97, 98, 1999
1272677Speter   Free Software Foundation, Inc.
1372677Speter   Written by Steve Chamberlain <sac@cygnus.com>
1472677Speter   ELF support by Ian Lance Taylor <ian@cygnus.com>
1572677Speter
1672677SpeterThis file is part of GLD, the Gnu Linker.
1772677Speter
1872677SpeterThis program is free software; you can redistribute it and/or modify
1972677Speterit under the terms of the GNU General Public License as published by
2072677Speterthe Free Software Foundation; either version 2 of the License, or
2172677Speter(at your option) any later version.
2272677Speter
2394342SgshapiroThis program is distributed in the hope that it will be useful,
2494342Sgshapirobut WITHOUT ANY WARRANTY; without even the implied warranty of
2594342SgshapiroMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2694342SgshapiroGNU General Public License for more details.
2794342Sgshapiro
2894342SgshapiroYou should have received a copy of the GNU General Public License
2994342Sgshapiroalong with this program; if not, write to the Free Software
3072677SpeterFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
3172677Speter
3272677Speter#define TARGET_IS_${EMULATION_NAME}
3372677Speter
3472677Speter#include "bfd.h"
3572677Speter#include "sysdep.h"
3672677Speter
37#include <ctype.h>
38
39#include "bfdlink.h"
40
41#include "ld.h"
42#include "ldmain.h"
43#include "ldemul.h"
44#include "ldfile.h"
45#include "ldmisc.h"
46#include "ldexp.h"
47#include "ldlang.h"
48#include "ldgram.h"
49
50static void gld${EMULATION_NAME}_before_parse PARAMS ((void));
51static boolean gld${EMULATION_NAME}_open_dynamic_archive
52  PARAMS ((const char *, search_dirs_type *, lang_input_statement_type *));
53static void gld${EMULATION_NAME}_after_open PARAMS ((void));
54static void gld${EMULATION_NAME}_check_needed
55  PARAMS ((lang_input_statement_type *));
56static void gld${EMULATION_NAME}_stat_needed
57  PARAMS ((lang_input_statement_type *));
58static boolean gld${EMULATION_NAME}_search_needed
59  PARAMS ((const char *, const char *, int));
60static boolean gld${EMULATION_NAME}_try_needed PARAMS ((const char *, int));
61static void gld${EMULATION_NAME}_vercheck
62  PARAMS ((lang_input_statement_type *));
63static void gld${EMULATION_NAME}_before_allocation PARAMS ((void));
64static void gld${EMULATION_NAME}_find_statement_assignment
65  PARAMS ((lang_statement_union_type *));
66static void gld${EMULATION_NAME}_find_exp_assignment PARAMS ((etree_type *));
67static boolean gld${EMULATION_NAME}_place_orphan
68  PARAMS ((lang_input_statement_type *, asection *));
69static void gld${EMULATION_NAME}_place_section
70  PARAMS ((lang_statement_union_type *));
71static char *gld${EMULATION_NAME}_get_script PARAMS ((int *isfile));
72
73static void
74gld${EMULATION_NAME}_before_parse()
75{
76  ldfile_output_architecture = bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`;
77  config.dynamic_link = ${DYNAMIC_LINK-true};
78  config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo true ; else echo false ; fi`;
79}
80
81/* Try to open a dynamic archive.  This is where we know that ELF
82   dynamic libraries have an extension of .so (or .sl on oddball systems
83   like hpux).  */
84
85static boolean
86gld${EMULATION_NAME}_open_dynamic_archive (arch, search, entry)
87     const char *arch;
88     search_dirs_type *search;
89     lang_input_statement_type *entry;
90{
91  const char *filename;
92  char *string;
93
94  if (! entry->is_archive)
95    return false;
96
97  filename = entry->filename;
98
99  /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
100     is defined, but it does not seem worth the headache to optimize
101     away those two bytes of space.  */
102  string = (char *) xmalloc (strlen (search->name)
103			     + strlen (filename)
104			     + strlen (arch)
105#ifdef EXTRA_SHLIB_EXTENSION
106			     + strlen (EXTRA_SHLIB_EXTENSION)
107#endif
108			     + sizeof "/lib.so");
109
110  sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
111
112#ifdef EXTRA_SHLIB_EXTENSION
113  /* Try the .so extension first.  If that fails build a new filename
114     using EXTRA_SHLIB_EXTENSION.  */
115  if (! ldfile_try_open_bfd (string, entry))
116    sprintf (string, "%s/lib%s%s%s", search->name,
117	     filename, arch, EXTRA_SHLIB_EXTENSION);
118#endif
119
120  if (! ldfile_try_open_bfd (string, entry))
121    {
122      free (string);
123      return false;
124    }
125
126  entry->filename = string;
127
128  /* We have found a dynamic object to include in the link.  The ELF
129     backend linker will create a DT_NEEDED entry in the .dynamic
130     section naming this file.  If this file includes a DT_SONAME
131     entry, it will be used.  Otherwise, the ELF linker will just use
132     the name of the file.  For an archive found by searching, like
133     this one, the DT_NEEDED entry should consist of just the name of
134     the file, without the path information used to find it.  Note
135     that we only need to do this if we have a dynamic object; an
136     archive will never be referenced by a DT_NEEDED entry.
137
138     FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
139     very pretty.  I haven't been able to think of anything that is
140     pretty, though.  */
141  if (bfd_check_format (entry->the_bfd, bfd_object)
142      && (entry->the_bfd->flags & DYNAMIC) != 0)
143    {
144      char *needed_name;
145
146      ASSERT (entry->is_archive && entry->search_dirs_flag);
147
148      /* Rather than duplicating the logic above.  Just use the
149	 filename we recorded earlier.
150
151	 First strip off everything before the last '/'.  */
152      filename = strrchr (entry->filename, '/');
153      filename++;
154
155      needed_name = (char *) xmalloc (strlen (filename) + 1);
156      strcpy (needed_name, filename);
157      bfd_elf_set_dt_needed_name (entry->the_bfd, needed_name);
158    }
159
160  return true;
161}
162
163EOF
164if [ "x${host}" = "x${target}" ] ; then
165  case " ${EMULATION_LIBPATH} " in
166  *" ${EMULATION_NAME} "*)
167    case ${target} in
168      *-*-freebsd*)
169	cat >>e${EMULATION_NAME}.c <<EOF
170/*
171 * Read the system search path the FreeBSD way rather than like Linux.
172 */
173#include <elf.h>
174
175static boolean gld${EMULATION_NAME}_check_ld_elf_hints
176  PARAMS ((const char *, int));
177
178static boolean
179gld${EMULATION_NAME}_check_ld_elf_hints (name, force)
180     const char *name;
181     int force;
182{
183  static boolean initialized;
184  static char *ld_elf_hints;
185
186  if (! initialized)
187    {
188      FILE *f;
189
190      f = fopen (_PATH_ELF_HINTS, FOPEN_RB);
191      if (f != NULL)
192	{
193	  struct elfhints_hdr hdr;
194
195	  if (fread(&hdr, 1, sizeof(hdr), f) == sizeof(hdr) &&
196	      hdr.magic == ELFHINTS_MAGIC &&
197	      hdr.version == 1)
198	    {
199	      if (fseek(f, hdr.strtab + hdr.dirlist, SEEK_SET) != -1)
200		{
201		  char *b;
202
203		  b = (char *) xmalloc (hdr.dirlistlen + 1);
204		  if (fread(b, 1, hdr.dirlistlen + 1, f) !=
205		      hdr.dirlistlen + 1)
206		    {
207		      free(b);
208		    }
209		  else
210		    {
211		      ld_elf_hints = b;
212		    }
213		}
214	    }
215	  fclose (f);
216	}
217
218      initialized = true;
219    }
220
221  if (ld_elf_hints == NULL)
222    return false;
223
224  return gld${EMULATION_NAME}_search_needed (ld_elf_hints, name, force);
225}
226EOF
227	;;
228
229      *linux*|*Linux*|*LINUX*)
230	cat >>e${EMULATION_NAME}.c <<EOF
231
232/* For a native linker, check the file /etc/ld.so.conf for directories
233   in which we may find shared libraries.  /etc/ld.so.conf is really
234   only meaningful on Linux.  */
235
236static boolean gld${EMULATION_NAME}_check_ld_so_conf
237  PARAMS ((const char *, int));
238
239static boolean
240gld${EMULATION_NAME}_check_ld_so_conf (name, force)
241     const char *name;
242     int force;
243{
244  static boolean initialized;
245  static char *ld_so_conf;
246
247  if (! initialized)
248    {
249      FILE *f;
250
251      f = fopen ("/etc/ld.so.conf", FOPEN_RT);
252      if (f != NULL)
253	{
254	  char *b;
255	  size_t len, alloc;
256	  int c;
257
258	  len = 0;
259	  alloc = 100;
260	  b = (char *) xmalloc (alloc);
261
262	  while ((c = getc (f)) != EOF)
263	    {
264	      if (len + 1 >= alloc)
265		{
266		  alloc *= 2;
267		  b = (char *) xrealloc (b, alloc);
268		}
269	      if (c != ':'
270		  && c != ' '
271		  && c != '\t'
272		  && c != '\n'
273		  && c != ',')
274		{
275		  b[len] = c;
276		  ++len;
277		}
278	      else
279		{
280		  if (len > 0 && b[len - 1] != ':')
281		    {
282		      b[len] = ':';
283		      ++len;
284		    }
285		}
286	    }
287
288	  if (len > 0 && b[len - 1] == ':')
289	    --len;
290
291	  if (len > 0)
292	    b[len] = '\0';
293	  else
294	    {
295	      free (b);
296	      b = NULL;
297	    }
298
299	  fclose (f);
300
301	  ld_so_conf = b;
302	}
303
304      initialized = true;
305    }
306
307  if (ld_so_conf == NULL)
308    return false;
309
310  return gld${EMULATION_NAME}_search_needed (ld_so_conf, name, force);
311}
312
313EOF
314	;;
315    esac
316  esac
317fi
318cat >>e${EMULATION_NAME}.c <<EOF
319
320/* These variables are required to pass information back and forth
321   between after_open and check_needed and stat_needed and vercheck.  */
322
323static struct bfd_link_needed_list *global_needed;
324static struct stat global_stat;
325static boolean global_found;
326static struct bfd_link_needed_list *global_vercheck_needed;
327static boolean global_vercheck_failed;
328
329/* This is called after all the input files have been opened.  */
330
331static void
332gld${EMULATION_NAME}_after_open ()
333{
334  struct bfd_link_needed_list *needed, *l;
335
336  /* We only need to worry about this when doing a final link.  */
337  if (link_info.relocateable || link_info.shared)
338    return;
339
340  /* Get the list of files which appear in DT_NEEDED entries in
341     dynamic objects included in the link (often there will be none).
342     For each such file, we want to track down the corresponding
343     library, and include the symbol table in the link.  This is what
344     the runtime dynamic linker will do.  Tracking the files down here
345     permits one dynamic object to include another without requiring
346     special action by the person doing the link.  Note that the
347     needed list can actually grow while we are stepping through this
348     loop.  */
349  needed = bfd_elf_get_needed_list (output_bfd, &link_info);
350  for (l = needed; l != NULL; l = l->next)
351    {
352      struct bfd_link_needed_list *ll;
353      int force;
354
355      /* If we've already seen this file, skip it.  */
356      for (ll = needed; ll != l; ll = ll->next)
357	if (strcmp (ll->name, l->name) == 0)
358	  break;
359      if (ll != l)
360	continue;
361
362      /* See if this file was included in the link explicitly.  */
363      global_needed = l;
364      global_found = false;
365      lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
366      if (global_found)
367	continue;
368
369      /* We need to find this file and include the symbol table.  We
370	 want to search for the file in the same way that the dynamic
371	 linker will search.  That means that we want to use
372	 rpath_link, rpath, then the environment variable
373	 LD_LIBRARY_PATH (native only), then the linker script
374	 LIB_SEARCH_DIRS.  We do not search using the -L arguments.
375
376	 We search twice.  The first time, we skip objects which may
377	 introduce version mismatches.  The second time, we force
378	 their use.  See gld${EMULATION_NAME}_vercheck comment.  */
379      for (force = 0; force < 2; force++)
380	{
381	  const char *lib_path;
382	  size_t len;
383	  search_dirs_type *search;
384
385	  if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
386						  l->name, force))
387	    break;
388	  if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
389						  l->name, force))
390	    break;
391	  if (command_line.rpath_link == NULL
392	      && command_line.rpath == NULL)
393	    {
394	      lib_path = (const char *) getenv ("LD_RUN_PATH");
395	      if (gld${EMULATION_NAME}_search_needed (lib_path, l->name,
396						      force))
397		break;
398	    }
399EOF
400if [ "x${host}" = "x${target}" ] ; then
401  case " ${EMULATION_LIBPATH} " in
402  *" ${EMULATION_NAME} "*)
403cat >>e${EMULATION_NAME}.c <<EOF
404	  lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
405	  if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, force))
406	    break;
407EOF
408  ;;
409  esac
410fi
411cat >>e${EMULATION_NAME}.c <<EOF
412	  len = strlen (l->name);
413	  for (search = search_head; search != NULL; search = search->next)
414	    {
415	      char *filename;
416
417	      if (search->cmdline)
418		continue;
419	      filename = (char *) xmalloc (strlen (search->name) + len + 2);
420	      sprintf (filename, "%s/%s", search->name, l->name);
421	      if (gld${EMULATION_NAME}_try_needed (filename, force))
422		break;
423	      free (filename);
424	    }
425	  if (search != NULL)
426	    break;
427EOF
428if [ "x${host}" = "x${target}" ] ; then
429  case " ${EMULATION_LIBPATH} " in
430  *" ${EMULATION_NAME} "*)
431    case ${target} in
432      *-*-freebsd*)
433	cat >>e${EMULATION_NAME}.c <<EOF
434	  if (gld${EMULATION_NAME}_check_ld_elf_hints (l->name, force))
435	    break;
436EOF
437        ;;
438      *linux*|*Linux*|*LINUX*)
439	cat >>e${EMULATION_NAME}.c <<EOF
440	  if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
441	    break;
442EOF
443        ;;
444    esac
445  ;;
446  esac
447fi
448cat >>e${EMULATION_NAME}.c <<EOF
449	}
450
451      if (force < 2)
452	continue;
453
454      einfo ("%P: warning: %s, needed by %B, not found (try using --rpath)\n",
455	     l->name, l->by);
456    }
457}
458
459/* Search for a needed file in a path.  */
460
461static boolean
462gld${EMULATION_NAME}_search_needed (path, name, force)
463     const char *path;
464     const char *name;
465     int force;
466{
467  const char *s;
468  size_t len;
469
470  if (path == NULL || *path == '\0')
471    return false;
472  len = strlen (name);
473  while (1)
474    {
475      char *filename, *sset;
476
477      s = strchr (path, ':');
478      if (s == NULL)
479	s = path + strlen (path);
480
481      filename = (char *) xmalloc (s - path + len + 2);
482      if (s == path)
483	sset = filename;
484      else
485	{
486	  memcpy (filename, path, s - path);
487	  filename[s - path] = '/';
488	  sset = filename + (s - path) + 1;
489	}
490      strcpy (sset, name);
491
492      if (gld${EMULATION_NAME}_try_needed (filename, force))
493	return true;
494
495      free (filename);
496
497      if (*s == '\0')
498	break;
499      path = s + 1;
500    }
501
502  return false;	  
503}
504
505/* This function is called for each possible name for a dynamic object
506   named by a DT_NEEDED entry.  The FORCE parameter indicates whether
507   to skip the check for a conflicting version.  */
508
509static boolean
510gld${EMULATION_NAME}_try_needed (name, force)
511     const char *name;
512     int force;
513{
514  bfd *abfd;
515
516  abfd = bfd_openr (name, bfd_get_target (output_bfd));
517  if (abfd == NULL)
518    return false;
519  if (! bfd_check_format (abfd, bfd_object))
520    {
521      (void) bfd_close (abfd);
522      return false;
523    }
524  if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
525    {
526      (void) bfd_close (abfd);
527      return false;
528    }
529
530  /* Check whether this object would include any conflicting library
531     versions.  If FORCE is set, then we skip this check; we use this
532     the second time around, if we couldn't find any compatible
533     instance of the shared library.  */
534
535  if (! force)
536    {
537      struct bfd_link_needed_list *needed;
538
539      if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
540	einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
541
542      if (needed != NULL)
543	{
544	  global_vercheck_needed = needed;
545	  global_vercheck_failed = false;
546	  lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
547	  if (global_vercheck_failed)
548	    {
549	      (void) bfd_close (abfd);
550	      /* Return false to force the caller to move on to try
551                 another file on the search path.  */
552	      return false;
553	    }
554
555	  /* But wait!  It gets much worse.  On Linux, if a shared
556             library does not use libc at all, we are supposed to skip
557             it the first time around in case we encounter a shared
558             library later on with the same name which does use the
559             version of libc that we want.  This is much too horrible
560             to use on any system other than Linux.  */
561
562EOF
563case ${target} in
564  *-*-linux-gnu*)
565    cat >>e${EMULATION_NAME}.c <<EOF
566	  {
567	    struct bfd_link_needed_list *l;
568
569	    for (l = needed; l != NULL; l = l->next)
570	      if (strncmp (l->name, "libc.so", 7) == 0)
571		break;
572	    if (l == NULL)
573	      {
574		(void) bfd_close (abfd);
575		return false;
576	      }
577	  }
578
579EOF
580    ;;
581esac
582cat >>e${EMULATION_NAME}.c <<EOF
583	}
584    }
585
586  /* We've found a dynamic object matching the DT_NEEDED entry.  */
587
588  /* We have already checked that there is no other input file of the
589     same name.  We must now check again that we are not including the
590     same file twice.  We need to do this because on many systems
591     libc.so is a symlink to, e.g., libc.so.1.  The SONAME entry will
592     reference libc.so.1.  If we have already included libc.so, we
593     don't want to include libc.so.1 if they are the same file, and we
594     can only check that using stat.  */
595
596  if (bfd_stat (abfd, &global_stat) != 0)
597    einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
598  global_found = false;
599  lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
600  if (global_found)
601    {
602      /* Return true to indicate that we found the file, even though
603         we aren't going to do anything with it.  */
604      return true;
605    }
606
607  /* Tell the ELF backend that don't want the output file to have a
608     DT_NEEDED entry for this file.  */
609  bfd_elf_set_dt_needed_name (abfd, "");
610
611  /* Add this file into the symbol table.  */
612  if (! bfd_link_add_symbols (abfd, &link_info))
613    einfo ("%F%B: could not read symbols: %E\n", abfd);
614
615  return true;
616}
617
618/* See if an input file matches a DT_NEEDED entry by name.  */
619
620static void
621gld${EMULATION_NAME}_check_needed (s)
622     lang_input_statement_type *s;
623{
624  if (global_found)
625    return;
626
627  if (s->filename != NULL
628      && strcmp (s->filename, global_needed->name) == 0)
629    {
630      global_found = true;
631      return;
632    }
633
634  if (s->the_bfd != NULL)
635    {
636      const char *soname;
637
638      soname = bfd_elf_get_dt_soname (s->the_bfd);
639      if (soname != NULL
640	  && strcmp (soname, global_needed->name) == 0)
641	{
642	  global_found = true;
643	  return;
644	}
645    }
646	  
647  if (s->search_dirs_flag
648      && s->filename != NULL
649      && strchr (global_needed->name, '/') == NULL)
650    {
651      const char *f;
652
653      f = strrchr (s->filename, '/');
654      if (f != NULL
655	  && strcmp (f + 1, global_needed->name) == 0)
656	{
657	  global_found = true;
658	  return;
659	}
660    }
661}
662
663/* See if an input file matches a DT_NEEDED entry by running stat on
664   the file.  */
665
666static void
667gld${EMULATION_NAME}_stat_needed (s)
668     lang_input_statement_type *s;
669{
670  struct stat st;
671  const char *suffix;
672  const char *soname;
673  const char *f;
674
675  if (global_found)
676    return;
677  if (s->the_bfd == NULL)
678    return;
679
680  if (bfd_stat (s->the_bfd, &st) != 0)
681    {
682      einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
683      return;
684    }
685
686  if (st.st_dev == global_stat.st_dev
687      && st.st_ino == global_stat.st_ino)
688    {
689      global_found = true;
690      return;
691    }
692
693  /* We issue a warning if it looks like we are including two
694     different versions of the same shared library.  For example,
695     there may be a problem if -lc picks up libc.so.6 but some other
696     shared library has a DT_NEEDED entry of libc.so.5.  This is a
697     hueristic test, and it will only work if the name looks like
698     NAME.so.VERSION.  FIXME: Depending on file names is error-prone.
699     If we really want to issue warnings about mixing version numbers
700     of shared libraries, we need to find a better way.  */
701
702  if (strchr (global_needed->name, '/') != NULL)
703    return;
704  suffix = strstr (global_needed->name, ".so.");
705  if (suffix == NULL)
706    return;
707  suffix += sizeof ".so." - 1;
708
709  soname = bfd_elf_get_dt_soname (s->the_bfd);
710  if (soname == NULL)
711    soname = s->filename;
712
713  f = strrchr (soname, '/');
714  if (f != NULL)
715    ++f;
716  else
717    f = soname;
718
719  if (strncmp (f, global_needed->name, suffix - global_needed->name) == 0)
720    einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
721	   global_needed->name, global_needed->by, f);
722}
723
724/* On Linux, it's possible to have different versions of the same
725   shared library linked against different versions of libc.  The
726   dynamic linker somehow tags which libc version to use in
727   /etc/ld.so.cache, and, based on the libc that it sees in the
728   executable, chooses which version of the shared library to use.
729
730   We try to do a similar check here by checking whether this shared
731   library needs any other shared libraries which may conflict with
732   libraries we have already included in the link.  If it does, we
733   skip it, and try to find another shared library farther on down the
734   link path.
735
736   This is called via lang_for_each_input_file.
737   GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
738   which we ar checking.  This sets GLOBAL_VERCHECK_FAILED if we find
739   a conflicting version.  */
740
741static void
742gld${EMULATION_NAME}_vercheck (s)
743     lang_input_statement_type *s;
744{
745  const char *soname, *f;
746  struct bfd_link_needed_list *l;
747
748  if (global_vercheck_failed)
749    return;
750  if (s->the_bfd == NULL
751      || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
752    return;
753
754  soname = bfd_elf_get_dt_soname (s->the_bfd);
755  if (soname == NULL)
756    soname = bfd_get_filename (s->the_bfd);
757
758  f = strrchr (soname, '/');
759  if (f != NULL)
760    ++f;
761  else
762    f = soname;
763
764  for (l = global_vercheck_needed; l != NULL; l = l->next)
765    {
766      const char *suffix;
767
768      if (strcmp (f, l->name) == 0)
769	{
770	  /* Probably can't happen, but it's an easy check.  */
771	  continue;
772	}
773
774      if (strchr (l->name, '/') != NULL)
775	continue;
776
777      suffix = strstr (l->name, ".so.");
778      if (suffix == NULL)
779	continue;
780
781      suffix += sizeof ".so." - 1;
782
783      if (strncmp (f, l->name, suffix - l->name) == 0)
784	{
785	  /* Here we know that S is a dynamic object FOO.SO.VER1, and
786             the object we are considering needs a dynamic object
787             FOO.SO.VER2, and VER1 and VER2 are different.  This
788             appears to be a version mismatch, so we tell the caller
789             to try a different version of this library.  */
790	  global_vercheck_failed = true;
791	  return;
792	}
793    }
794}
795
796/* This is called after the sections have been attached to output
797   sections, but before any sizes or addresses have been set.  */
798
799static void
800gld${EMULATION_NAME}_before_allocation ()
801{
802  const char *rpath;
803  asection *sinterp;
804
805  /* If we are going to make any variable assignments, we need to let
806     the ELF backend know about them in case the variables are
807     referred to by dynamic objects.  */
808  lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
809
810  /* Let the ELF backend work out the sizes of any sections required
811     by dynamic linking.  */
812  rpath = command_line.rpath;
813  if (rpath == NULL)
814    rpath = (const char *) getenv ("LD_RUN_PATH");
815  if (! (bfd_elf${ELFSIZE}_size_dynamic_sections
816         (output_bfd, command_line.soname, rpath,
817	  command_line.export_dynamic, command_line.filter_shlib,
818	  (const char * const *) command_line.auxiliary_filters,
819	  &link_info, &sinterp, lang_elf_version_info)))
820    einfo ("%P%F: failed to set dynamic section sizes: %E\n");
821
822  /* Let the user override the dynamic linker we are using.  */
823  if (command_line.interpreter != NULL
824      && sinterp != NULL)
825    {
826      sinterp->contents = (bfd_byte *) command_line.interpreter;
827      sinterp->_raw_size = strlen (command_line.interpreter) + 1;
828    }
829
830  /* Look for any sections named .gnu.warning.  As a GNU extensions,
831     we treat such sections as containing warning messages.  We print
832     out the warning message, and then zero out the section size so
833     that it does not get copied into the output file.  */
834
835  {
836    LANG_FOR_EACH_INPUT_STATEMENT (is)
837      {
838	asection *s;
839	bfd_size_type sz;
840	char *msg;
841	boolean ret;
842
843	if (is->just_syms_flag)
844	  continue;
845
846	s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
847	if (s == NULL)
848	  continue;
849
850	sz = bfd_section_size (is->the_bfd, s);
851	msg = xmalloc ((size_t) sz + 1);
852	if (! bfd_get_section_contents (is->the_bfd, s, msg, (file_ptr) 0, sz))
853	  einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
854		 is->the_bfd);
855	msg[sz] = '\0';
856	ret = link_info.callbacks->warning (&link_info, msg,
857					    (const char *) NULL,
858					    is->the_bfd, (asection *) NULL,
859					    (bfd_vma) 0);
860	ASSERT (ret);
861	free (msg);
862
863	/* Clobber the section size, so that we don't waste copying the
864	   warning into the output file.  */
865	s->_raw_size = 0;
866      }
867  }
868}
869
870/* This is called by the before_allocation routine via
871   lang_for_each_statement.  It locates any assignment statements, and
872   tells the ELF backend about them, in case they are assignments to
873   symbols which are referred to by dynamic objects.  */
874
875static void
876gld${EMULATION_NAME}_find_statement_assignment (s)
877     lang_statement_union_type *s;
878{
879  if (s->header.type == lang_assignment_statement_enum)
880    gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
881}
882
883/* Look through an expression for an assignment statement.  */
884
885static void
886gld${EMULATION_NAME}_find_exp_assignment (exp)
887     etree_type *exp;
888{
889  struct bfd_link_hash_entry *h;
890
891  switch (exp->type.node_class)
892    {
893    case etree_provide:
894      h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
895				false, false, false);
896      if (h == NULL)
897	break;
898
899      /* We call record_link_assignment even if the symbol is defined.
900	 This is because if it is defined by a dynamic object, we
901	 actually want to use the value defined by the linker script,
902	 not the value from the dynamic object (because we are setting
903	 symbols like etext).  If the symbol is defined by a regular
904	 object, then, as it happens, calling record_link_assignment
905	 will do no harm.  */
906
907      /* Fall through.  */
908    case etree_assign:
909      if (strcmp (exp->assign.dst, ".") != 0)
910	{
911	  if (! (bfd_elf${ELFSIZE}_record_link_assignment
912		 (output_bfd, &link_info, exp->assign.dst,
913		  exp->type.node_class == etree_provide ? true : false)))
914	    einfo ("%P%F: failed to record assignment to %s: %E\n",
915		   exp->assign.dst);
916	}
917      gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
918      break;
919
920    case etree_binary:
921      gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
922      gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
923      break;
924
925    case etree_trinary:
926      gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
927      gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
928      gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
929      break;
930
931    case etree_unary:
932      gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
933      break;
934
935    default:
936      break;
937    }
938}
939
940/* Place an orphan section.  We use this to put random SHF_ALLOC
941   sections in the right segment.  */
942
943static asection *hold_section;
944static lang_output_section_statement_type *hold_use;
945static lang_output_section_statement_type *hold_text;
946static lang_output_section_statement_type *hold_rodata;
947static lang_output_section_statement_type *hold_data;
948static lang_output_section_statement_type *hold_bss;
949static lang_output_section_statement_type *hold_rel;
950static lang_output_section_statement_type *hold_interp;
951
952/*ARGSUSED*/
953static boolean
954gld${EMULATION_NAME}_place_orphan (file, s)
955     lang_input_statement_type *file;
956     asection *s;
957{
958  lang_output_section_statement_type *place;
959  asection *snew, **pps;
960  lang_statement_list_type *old;
961  lang_statement_list_type add;
962  etree_type *address;
963  const char *secname, *ps;
964  const char *outsecname;
965  lang_output_section_statement_type *os;
966
967  if ((s->flags & SEC_ALLOC) == 0)
968    return false;
969
970  /* Look through the script to see where to place this section.  */
971  hold_section = s;
972  hold_use = NULL;
973  lang_for_each_statement (gld${EMULATION_NAME}_place_section);
974
975  if (hold_use != NULL)
976    {
977      /* We have already placed a section with this name.  */
978      wild_doit (&hold_use->children, s, hold_use, file);
979      return true;
980    }
981
982  secname = bfd_get_section_name (s->owner, s);
983
984  /* If this is a final link, then always put .gnu.warning.SYMBOL
985     sections into the .text section to get them out of the way.  */
986  if (! link_info.shared
987      && ! link_info.relocateable
988      && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
989      && hold_text != NULL)
990    {
991      wild_doit (&hold_text->children, s, hold_text, file);
992      return true;
993    }
994
995  /* Decide which segment the section should go in based on the
996     section name and section flags.  We put loadable .note sections
997     right after the .interp section, so that the PT_NOTE segment is
998     stored right after the program headers where the OS can read it
999     in the first page.  */
1000  place = NULL;
1001  if (s->flags & SEC_EXCLUDE)
1002    return false;
1003  else if ((s->flags & SEC_LOAD) != 0
1004      && strncmp (secname, ".note", 4) == 0
1005      && hold_interp != NULL)
1006    place = hold_interp;
1007  else if ((s->flags & SEC_HAS_CONTENTS) == 0
1008	   && hold_bss != NULL)
1009    place = hold_bss;
1010  else if ((s->flags & SEC_READONLY) == 0
1011	   && hold_data != NULL)
1012    place = hold_data;
1013  else if (strncmp (secname, ".rel", 4) == 0
1014	   && hold_rel != NULL)
1015    place = hold_rel;
1016  else if ((s->flags & SEC_CODE) == 0
1017	   && (s->flags & SEC_READONLY) != 0
1018	   && hold_rodata != NULL)
1019    place = hold_rodata;
1020  else if ((s->flags & SEC_READONLY) != 0
1021	   && hold_text != NULL)
1022    place = hold_text;
1023  if (place == NULL)
1024    return false;
1025
1026  /* Choose a unique name for the section.  This will be needed if the
1027     same section name appears in the input file with different
1028     loadable or allocateable characteristics.  */
1029  outsecname = secname;
1030  if (bfd_get_section_by_name (output_bfd, outsecname) != NULL)
1031    {
1032      unsigned int len;
1033      char *newname;
1034      unsigned int i;
1035
1036      len = strlen (outsecname);
1037      newname = xmalloc (len + 5);
1038      strcpy (newname, outsecname);
1039      i = 0;
1040      do
1041	{
1042	  sprintf (newname + len, "%d", i);
1043	  ++i;
1044	}
1045      while (bfd_get_section_by_name (output_bfd, newname) != NULL);
1046
1047      outsecname = newname;
1048    }
1049
1050  /* Create the section in the output file, and put it in the right
1051     place.  This shuffling is to make the output file look neater.  */
1052  snew = bfd_make_section (output_bfd, outsecname);
1053  if (snew == NULL)
1054      einfo ("%P%F: output format %s cannot represent section called %s\n",
1055	     output_bfd->xvec->name, outsecname);
1056  if (place->bfd_section != NULL)
1057    {
1058      for (pps = &output_bfd->sections; *pps != snew; pps = &(*pps)->next)
1059	;
1060      *pps = snew->next;
1061      snew->next = place->bfd_section->next;
1062      place->bfd_section->next = snew;
1063    }
1064
1065  /* Start building a list of statements for this section.  */
1066  old = stat_ptr;
1067  stat_ptr = &add;
1068  lang_list_init (stat_ptr);
1069
1070  /* If the name of the section is representable in C, then create
1071     symbols to mark the start and the end of the section.  */
1072  for (ps = outsecname; *ps != '\0'; ps++)
1073    if (! isalnum ((unsigned char) *ps) && *ps != '_')
1074      break;
1075  if (*ps == '\0' && config.build_constructors)
1076    {
1077      char *symname;
1078
1079      symname = (char *) xmalloc (ps - outsecname + sizeof "__start_");
1080      sprintf (symname, "__start_%s", outsecname);
1081      lang_add_assignment (exp_assop ('=', symname,
1082				      exp_unop (ALIGN_K,
1083						exp_intop ((bfd_vma) 1
1084							   << s->alignment_power))));
1085    }
1086
1087  if (! link_info.relocateable)
1088    address = NULL;
1089  else
1090    address = exp_intop ((bfd_vma) 0);
1091
1092  lang_enter_output_section_statement (outsecname, address, 0,
1093				       (bfd_vma) 0,
1094				       (etree_type *) NULL,
1095				       (etree_type *) NULL,
1096				       (etree_type *) NULL);
1097
1098  os = lang_output_section_statement_lookup (outsecname);
1099  wild_doit (&os->children, s, os, file);
1100
1101  lang_leave_output_section_statement
1102    ((bfd_vma) 0, "*default*", (struct lang_output_section_phdr_list *) NULL,
1103     "*default*");
1104  stat_ptr = &add;
1105
1106  if (*ps == '\0' && config.build_constructors)
1107    {
1108      char *symname;
1109
1110      symname = (char *) xmalloc (ps - outsecname + sizeof "__stop_");
1111      sprintf (symname, "__stop_%s", outsecname);
1112      lang_add_assignment (exp_assop ('=', symname,
1113				      exp_nameop (NAME, ".")));
1114    }
1115
1116  /* Now stick the new statement list right after PLACE.  */
1117  *add.tail = place->header.next;
1118  place->header.next = add.head;
1119
1120  stat_ptr = old;
1121
1122  return true;
1123}
1124
1125static void
1126gld${EMULATION_NAME}_place_section (s)
1127     lang_statement_union_type *s;
1128{
1129  lang_output_section_statement_type *os;
1130
1131  if (s->header.type != lang_output_section_statement_enum)
1132    return;
1133
1134  os = &s->output_section_statement;
1135
1136  if (strcmp (os->name, hold_section->name) == 0
1137      && os->bfd_section != NULL
1138      && ((hold_section->flags & (SEC_LOAD | SEC_ALLOC))
1139	  == (os->bfd_section->flags & (SEC_LOAD | SEC_ALLOC))))
1140    hold_use = os;
1141
1142  if (strcmp (os->name, ".text") == 0)
1143    hold_text = os;
1144  else if (strcmp (os->name, ".rodata") == 0)
1145    hold_rodata = os;
1146  else if (strcmp (os->name, ".data") == 0)
1147    hold_data = os;
1148  else if (strcmp (os->name, ".bss") == 0)
1149    hold_bss = os;
1150  else if (hold_rel == NULL
1151	   && os->bfd_section != NULL
1152	   && (os->bfd_section->flags & SEC_ALLOC) != 0
1153	   && strncmp (os->name, ".rel", 4) == 0)
1154    hold_rel = os;
1155  else if (strcmp (os->name, ".interp") == 0)
1156    hold_interp = os;
1157}
1158
1159static char *
1160gld${EMULATION_NAME}_get_script(isfile)
1161     int *isfile;
1162EOF
1163
1164if test -n "$COMPILE_IN"
1165then
1166# Scripts compiled in.
1167
1168# sed commands to quote an ld script as a C string.
1169sc="-f stringify.sed"
1170
1171cat >>e${EMULATION_NAME}.c <<EOF
1172{			     
1173  *isfile = 0;
1174
1175  if (link_info.relocateable == true && config.build_constructors == true)
1176    return
1177EOF
1178sed $sc ldscripts/${EMULATION_NAME}.xu                     >> e${EMULATION_NAME}.c
1179echo '  ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c
1180sed $sc ldscripts/${EMULATION_NAME}.xr                     >> e${EMULATION_NAME}.c
1181echo '  ; else if (!config.text_read_only) return'         >> e${EMULATION_NAME}.c
1182sed $sc ldscripts/${EMULATION_NAME}.xbn                    >> e${EMULATION_NAME}.c
1183echo '  ; else if (!config.magic_demand_paged) return'     >> e${EMULATION_NAME}.c
1184sed $sc ldscripts/${EMULATION_NAME}.xn                     >> e${EMULATION_NAME}.c
1185
1186if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1187echo '  ; else if (link_info.shared) return'		   >> e${EMULATION_NAME}.c
1188sed $sc ldscripts/${EMULATION_NAME}.xs                     >> e${EMULATION_NAME}.c
1189fi
1190
1191echo '  ; else return'                                     >> e${EMULATION_NAME}.c
1192sed $sc ldscripts/${EMULATION_NAME}.x                      >> e${EMULATION_NAME}.c
1193echo '; }'                                                 >> e${EMULATION_NAME}.c
1194
1195else
1196# Scripts read from the filesystem.
1197
1198cat >>e${EMULATION_NAME}.c <<EOF
1199{			     
1200  *isfile = 1;
1201
1202  if (link_info.relocateable == true && config.build_constructors == true)
1203    return "ldscripts/${EMULATION_NAME}.xu";
1204  else if (link_info.relocateable == true)
1205    return "ldscripts/${EMULATION_NAME}.xr";
1206  else if (!config.text_read_only)
1207    return "ldscripts/${EMULATION_NAME}.xbn";
1208  else if (!config.magic_demand_paged)
1209    return "ldscripts/${EMULATION_NAME}.xn";
1210  else if (link_info.shared)
1211    return "ldscripts/${EMULATION_NAME}.xs";
1212  else
1213    return "ldscripts/${EMULATION_NAME}.x";
1214}
1215EOF
1216
1217fi
1218
1219if test -n "$PARSE_AND_LIST_ARGS" ; then
1220cat >>e${EMULATION_NAME}.c <<EOF
1221static int  gld_${EMULATION_NAME}_parse_args PARAMS ((int, char **));
1222static void gld_${EMULATION_NAME}_list_options PARAMS ((FILE * file));
1223
1224 $PARSE_AND_LIST_ARGS
1225EOF
1226else
1227
1228cat >>e${EMULATION_NAME}.c <<EOF
1229#define gld_${EMULATION_NAME}_parse_args   NULL
1230#define gld_${EMULATION_NAME}_list_options NULL
1231EOF
1232
1233fi
1234
1235cat >>e${EMULATION_NAME}.c <<EOF
1236
1237struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = 
1238{
1239  gld${EMULATION_NAME}_before_parse,
1240  syslib_default,
1241  hll_default,
1242  after_parse_default,
1243  gld${EMULATION_NAME}_after_open,
1244  after_allocation_default,
1245  set_output_arch_default,
1246  ldemul_default_target,
1247  gld${EMULATION_NAME}_before_allocation,
1248  gld${EMULATION_NAME}_get_script,
1249  "${EMULATION_NAME}",
1250  "${OUTPUT_FORMAT}",
1251  NULL, 	/* finish */
1252  NULL, 	/* create output section statements */
1253  gld${EMULATION_NAME}_open_dynamic_archive,
1254  gld${EMULATION_NAME}_place_orphan,
1255  NULL,		/* set_symbols */
1256  gld_${EMULATION_NAME}_parse_args,
1257  NULL,		/* unrecognized_file */
1258  gld_${EMULATION_NAME}_list_options,
1259  NULL,		/* recognized_file */
1260  NULL		/* find_potential_libraries */
1261};
1262EOF
1263