* read.c (read_a_source_file): Conditionally allow matched "
[binutils.git] / ld / emultempl / sunos.em
blob8e9599c55589c22f0207d0ce09280880b1973bce
1 # This shell script emits a C file. -*- C -*-
2 # It does some substitutions.
3 cat >e${EMULATION_NAME}.c <<EOF
4 /* This file is is generated by a shell script.  DO NOT EDIT! */
6 /* SunOS emulation code for ${EMULATION_NAME}
7    Copyright (C) 1991, 93, 94, 95, 96, 97, 98, 1999
8    Free Software Foundation, Inc.
9    Written by Steve Chamberlain <sac@cygnus.com>
10    SunOS shared library support by Ian Lance Taylor <ian@cygnus.com>
12 This file is part of GLD, the Gnu Linker.
14 This program is free software; you can redistribute it and/or modify
15 it under the terms of the GNU General Public License as published by
16 the Free Software Foundation; either version 2 of the License, or
17 (at your option) any later version.
19 This program is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22 GNU General Public License for more details.
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, write to the Free Software
26 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
28 #define TARGET_IS_${EMULATION_NAME}
30 #include <ctype.h>
32 #include "bfd.h"
33 #include "sysdep.h"
34 #include "bfdlink.h"
35 #include "libiberty.h"
37 #include "ld.h"
38 #include "ldmain.h"
39 #include "ldemul.h"
40 #include "ldfile.h"
41 #include "ldmisc.h"
42 #include "ldexp.h"
43 #include "ldlang.h"
45 #ifdef HAVE_DIRENT_H
46 # include <dirent.h>
47 #else
48 # define dirent direct
49 # ifdef HAVE_SYS_NDIR_H
50 #  include <sys/ndir.h>
51 # endif
52 # ifdef HAVE_SYS_DIR_H
53 #  include <sys/dir.h>
54 # endif
55 # ifdef HAVE_NDIR_H
56 #  include <ndir.h>
57 # endif
58 #endif
60 static void gld${EMULATION_NAME}_before_parse PARAMS ((void));
61 static void gld${EMULATION_NAME}_set_symbols PARAMS ((void));
62 static void gld${EMULATION_NAME}_create_output_section_statements
63   PARAMS ((void));
64 static void gld${EMULATION_NAME}_find_so
65   PARAMS ((lang_input_statement_type *));
66 static char *gld${EMULATION_NAME}_search_dir
67   PARAMS ((const char *, const char *, boolean *));
68 static void gld${EMULATION_NAME}_after_open PARAMS ((void));
69 static void gld${EMULATION_NAME}_check_needed
70   PARAMS ((lang_input_statement_type *));
71 static boolean gld${EMULATION_NAME}_search_needed
72   PARAMS ((const char *, const char *));
73 static boolean gld${EMULATION_NAME}_try_needed
74   PARAMS ((const char *, const char *));
75 static void gld${EMULATION_NAME}_before_allocation PARAMS ((void));
76 static void gld${EMULATION_NAME}_find_assignment
77   PARAMS ((lang_statement_union_type *));
78 static void gld${EMULATION_NAME}_find_exp_assignment PARAMS ((etree_type *));
79 static void gld${EMULATION_NAME}_count_need
80   PARAMS ((lang_input_statement_type *));
81 static void gld${EMULATION_NAME}_set_need
82   PARAMS ((lang_input_statement_type *));
83 static char *gld${EMULATION_NAME}_get_script PARAMS ((int *isfile));
85 static void
86 gld${EMULATION_NAME}_before_parse()
88   ldfile_output_architecture = bfd_arch_${ARCH};
89   config.dynamic_link = true;
90   config.has_shared = true;
93 /* This is called after the command line arguments have been parsed,
94    but before the linker script has been read.  If this is a native
95    linker, we add the directories in LD_LIBRARY_PATH to the search
96    list.  */
98 static void
99 gld${EMULATION_NAME}_set_symbols ()
102 if [ "x${host}" = "x${target}" ] ; then
103   if [ "x${DEFAULT_EMULATION}" = "x${EMULATION_NAME}" ] ; then
104 cat >>e${EMULATION_NAME}.c <<EOF
105   const char *env;
107   env = (const char *) getenv ("LD_LIBRARY_PATH");
108   if (env != NULL)
109     {
110       char *l;
112       l = xstrdup (env);
113       while (1)
114         {
115           char *c;
117           c = strchr (l, ':');
118           if (c != NULL)
119             *c++ = '\0';
120           if (*l != '\0')
121             ldfile_add_library_path (l, false);
122           if (c == NULL)
123             break;
124           l = c;
125         }
126     }
128   fi
130 cat >>e${EMULATION_NAME}.c <<EOF
133 /* Despite the name, we use this routine to search for dynamic
134    libraries.  On SunOS this requires a directory search.  We need to
135    find the .so file with the highest version number.  The user may
136    restrict the major version by saying, e.g., -lc.1.  Also, if we
137    find a .so file, we need to look for a the same file after
138    replacing .so with .sa; if it exists, it will be an archive which
139    provide some initializations for data symbols, and we need to
140    search it after including the .so file.  */
142 static void
143 gld${EMULATION_NAME}_create_output_section_statements ()
145   lang_for_each_input_file (gld${EMULATION_NAME}_find_so);
148 /* Search the directory for a .so file for each library search.  */
150 static void
151 gld${EMULATION_NAME}_find_so (inp)
152      lang_input_statement_type *inp;
154   search_dirs_type *search;
155   char *found = NULL;
156   char *alc;
157   struct stat st;
159   if (! inp->search_dirs_flag
160       || ! inp->is_archive
161       || ! inp->dynamic)
162     return;
164   ASSERT (strncmp (inp->local_sym_name, "-l", 2) == 0);
166   for (search = search_head; search != NULL; search = search->next)
167     {
168       boolean found_static;
170       found = gld${EMULATION_NAME}_search_dir (search->name, inp->filename,
171                                                &found_static);
172       if (found != NULL || found_static)
173         break;
174     }
176   if (found == NULL)
177     {
178       /* We did not find a matching .so file.  This isn't an error,
179          since there might still be a matching .a file, which will be
180          found by the usual search.  */
181       return;
182     }
184   /* Replace the filename with the one we have found.  */
185   alc = (char *) xmalloc (strlen (search->name) + strlen (found) + 2);
186   sprintf (alc, "%s/%s", search->name, found);
187   inp->filename = alc;
189   /* Turn off the search_dirs_flag to prevent ldfile_open_file from
190      searching for this file again.  */
191   inp->search_dirs_flag = false;
193   free (found);
195   /* Now look for the same file name, but with .sa instead of .so.  If
196      found, add it to the list of input files.  */
197   alc = (char *) xmalloc (strlen (inp->filename) + 1);
198   strcpy (alc, inp->filename);
199   strstr (alc + strlen (search->name), ".so")[2] = 'a';
200   if (stat (alc, &st) != 0)
201     free (alc);
202   else
203     {
204       lang_input_statement_type *sa;
206       /* Add the .sa file to the statement list just before the .so
207          file.  This is really a hack.  */
208       sa = ((lang_input_statement_type *)
209             xmalloc (sizeof (lang_input_statement_type)));
210       *sa = *inp;
212       inp->filename = alc;
213       inp->local_sym_name = alc;
215       inp->header.next = (lang_statement_union_type *) sa;
216       inp->next_real_file = (lang_statement_union_type *) sa;
217     }
220 /* Search a directory for a .so file.  */
222 static char *
223 gld${EMULATION_NAME}_search_dir (dirname, filename, found_static)
224      const char *dirname;
225      const char *filename;
226      boolean *found_static;
228   int force_maj, force_min;
229   const char *dot;
230   unsigned int len;
231   char *alc;
232   char *found;
233   int max_maj, max_min;
234   DIR *dir;
235   struct dirent *entry;
236   unsigned int dirnamelen;
237   char *full_path;
238   int statval;
239   struct stat st;
241   *found_static = false;
243   force_maj = -1;
244   force_min = -1;
245   dot = strchr (filename, '.');
246   if (dot == NULL)
247     {
248       len = strlen (filename);
249       alc = NULL;
250     }
251   else
252     {
253       force_maj = atoi (dot + 1);
255       len = dot - filename;
256       alc = (char *) xmalloc (len + 1);
257       strncpy (alc, filename, len);
258       alc[len] = '\0';
259       filename = alc;
261       dot = strchr (dot + 1, '.');
262       if (dot != NULL)
263         force_min = atoi (dot + 1);
264     }
266   found = NULL;
267   max_maj = max_min = 0;
269   dir = opendir (dirname);
270   if (dir == NULL)
271     return NULL;
272   dirnamelen = strlen (dirname);
273   
274   while ((entry = readdir (dir)) != NULL)
275     {
276       const char *s;
277       int found_maj, found_min;
279       if (strncmp (entry->d_name, "lib", 3) != 0
280           || strncmp (entry->d_name + 3, filename, len) != 0)
281         continue;
283       if (dot == NULL
284           && strcmp (entry->d_name + 3 + len, ".a") == 0)
285         {
286           *found_static = true;
287           continue;
288         }
290       /* We accept libfoo.so without a version number, even though the
291          native linker does not.  This is more convenient for packages
292          which just generate .so files for shared libraries, as on ELF
293          systems.  */
294       if (strncmp (entry->d_name + 3 + len, ".so", 3) != 0)
295         continue;
296       if (entry->d_name[6 + len] == '\0')
297         ;
298       else if (entry->d_name[6 + len] == '.'
299                && isdigit ((unsigned char) entry->d_name[7 + len]))
300         ;
301       else
302         continue;
304       for (s = entry->d_name + 6 + len; *s != '\0'; s++)
305         if (*s != '.' && ! isdigit ((unsigned char) *s))
306           break;
307       if (*s != '\0')
308         continue;
310       /* We've found a .so file.  Work out the major and minor
311          version numbers.  */
312       found_maj = 0;
313       found_min = 0;
314       sscanf (entry->d_name + 3 + len, ".so.%d.%d",
315               &found_maj, &found_min);
317       if ((force_maj != -1 && force_maj != found_maj)
318           || (force_min != -1 && force_min != found_min))
319         continue;
321       /* Make sure the file really exists (ignore broken symlinks).  */
322       full_path = xmalloc (dirnamelen + 1 + strlen (entry->d_name) + 1);
323       sprintf (full_path, "%s/%s", dirname, entry->d_name);
324       statval = stat (full_path, &st);
325       free (full_path);
326       if (statval != 0)
327         continue;
329       /* We've found a match for the name we are searching for.  See
330          if this is the version we should use.  If the major and minor
331          versions match, we use the last entry in alphabetical order;
332          I don't know if this is how SunOS distinguishes libc.so.1.8
333          from libc.so.1.8.1, but it ought to suffice.  */
334       if (found == NULL
335           || (found_maj > max_maj)
336           || (found_maj == max_maj
337               && (found_min > max_min
338                   || (found_min == max_min
339                       && strcmp (entry->d_name, found) > 0))))
340         {
341           if (found != NULL)
342             free (found);
343           found = (char *) xmalloc (strlen (entry->d_name) + 1);
344           strcpy (found, entry->d_name);
345           max_maj = found_maj;
346           max_min = found_min;
347         }
348     }
350   closedir (dir);
352   if (alc != NULL)
353     free (alc);
355   return found;
358 /* These variables are required to pass information back and forth
359    between after_open and check_needed.  */
361 static struct bfd_link_needed_list *global_needed;
362 static boolean global_found;
364 /* This is called after all the input files have been opened.  */
366 static void
367 gld${EMULATION_NAME}_after_open ()
369   struct bfd_link_needed_list *needed, *l;
371   /* We only need to worry about this when doing a final link.  */
372   if (link_info.relocateable || link_info.shared)
373     return;
375   /* Get the list of files which appear in ld_need entries in dynamic
376      objects included in the link.  For each such file, we want to
377      track down the corresponding library, and include the symbol
378      table in the link.  This is what the runtime dynamic linker will
379      do.  Tracking the files down here permits one dynamic object to
380      include another without requiring special action by the person
381      doing the link.  Note that the needed list can actually grow
382      while we are stepping through this loop.  */
383   needed = bfd_sunos_get_needed_list (output_bfd, &link_info);
384   for (l = needed; l != NULL; l = l->next)
385     {
386       struct bfd_link_needed_list *ll;
387       const char *lname;
388       search_dirs_type *search;
390       lname = l->name;
392       /* If we've already seen this file, skip it.  */
393       for (ll = needed; ll != l; ll = ll->next)
394         if (strcmp (ll->name, lname) == 0)
395           break;
396       if (ll != l)
397         continue;
399       /* See if this file was included in the link explicitly.  */
400       global_needed = l;
401       global_found = false;
402       lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
403       if (global_found)
404         continue;
406       if (strncmp (lname, "-l", 2) != 0)
407         {
408           bfd *abfd;
410           abfd = bfd_openr (lname, bfd_get_target (output_bfd));
411           if (abfd != NULL)
412             {
413               if (! bfd_check_format (abfd, bfd_object))
414                 {
415                   (void) bfd_close (abfd);
416                   abfd = NULL;
417                 }
418             }
419           if (abfd != NULL)
420             {
421               if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
422                 {
423                   (void) bfd_close (abfd);
424                   abfd = NULL;
425                 }
426             }
427           if (abfd != NULL)
428             {
429               /* We've found the needed dynamic object.  */
430               if (! bfd_link_add_symbols (abfd, &link_info))
431                 einfo ("%F%B: could not read symbols: %E\n", abfd);
432             }
433           else
434             {
435               einfo ("%P: warning: %s, needed by %B, not found\n",
436                      lname, l->by);
437             }
439           continue;
440         }
442       lname += 2;
444       /* We want to search for the file in the same way that the
445          dynamic linker will search.  That means that we want to use
446          rpath_link, rpath or -L, then the environment variable
447          LD_LIBRARY_PATH (native only), then (if rpath was used) the
448          linker script LIB_SEARCH_DIRS.  */
449       if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
450                                               lname))
451         continue;
452       if (command_line.rpath != NULL)
453         {
454           if (gld${EMULATION_NAME}_search_needed (command_line.rpath, lname))
455             continue;
456         }
457       else
458         {
459           for (search = search_head; search != NULL; search = search->next)
460             if (gld${EMULATION_NAME}_try_needed (search->name, lname))
461               break;
462           if (search != NULL)
463             continue;
464         }
466 if [ "x${host}" = "x${target}" ] ; then
467   if [ "x${DEFAULT_EMULATION}" = "x${EMULATION_NAME}" ] ; then
468 cat >>e${EMULATION_NAME}.c <<EOF
469       {
470         const char *lib_path;
472         lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
473         if (gld${EMULATION_NAME}_search_needed (lib_path, lname))
474           continue;
475       }
477   fi
479 cat >>e${EMULATION_NAME}.c <<EOF
480       if (command_line.rpath != NULL)
481         {
482           for (search = search_head; search != NULL; search = search->next)
483             {
484               if (search->cmdline)
485                 continue;
486               if (gld${EMULATION_NAME}_try_needed (search->name, lname))
487                 break;
488             }
489           if (search != NULL)
490             continue;
491         }
493       einfo ("%P: warning: %s, needed by %B, not found\n",
494              l->name, l->by);
495     }
498 /* Search for a needed file in a path.  */
500 static boolean
501 gld${EMULATION_NAME}_search_needed (path, name)
502      const char *path;
503      const char *name;
505   const char *s;
507   if (path == NULL || *path == '\0')
508     return false;
509   while (1)
510     {
511       const char *dir;
512       char *dircopy;
514       s = strchr (path, ':');
515       if (s == NULL)
516         {
517           dircopy = NULL;
518           dir = path;
519         }
520       else
521         {
522           dircopy = (char *) xmalloc (s - path + 1);
523           memcpy (dircopy, path, s - path);
524           dircopy[s - path] = '\0';
525           dir = dircopy;
526         }
528       if (gld${EMULATION_NAME}_try_needed (dir, name))
529         return true;
531       if (dircopy != NULL)
532         free (dircopy);
534       if (s == NULL)
535         break;
536       path = s + 1;
537     }
539   return false;   
542 /* This function is called for each possible directory for a needed
543    dynamic object.  */
545 static boolean
546 gld${EMULATION_NAME}_try_needed (dir, name)
547      const char *dir;
548      const char *name;
550   char *file;
551   char *alc;
552   boolean ignore;
553   bfd *abfd;
555   file = gld${EMULATION_NAME}_search_dir (dir, name, &ignore);
556   if (file == NULL)
557     return false;
559   alc = (char *) xmalloc (strlen (dir) + strlen (file) + 2);
560   sprintf (alc, "%s/%s", dir, file);
561   free (file);
562   abfd = bfd_openr (alc, bfd_get_target (output_bfd));
563   if (abfd == NULL)
564     return false;
565   if (! bfd_check_format (abfd, bfd_object))
566     {
567       (void) bfd_close (abfd);
568       return false;
569     }
570   if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
571     {
572       (void) bfd_close (abfd);
573       return false;
574     }
576   /* We've found the needed dynamic object.  */
578   /* Add this file into the symbol table.  */
579   if (! bfd_link_add_symbols (abfd, &link_info))
580     einfo ("%F%B: could not read symbols: %E\n", abfd);
582   return true;
585 /* See if we have already included a needed object in the link.  This
586    does not have to be precise, as it does no harm to include a
587    dynamic object more than once.  */
589 static void
590 gld${EMULATION_NAME}_check_needed (s)
591      lang_input_statement_type *s;
593   if (s->filename == NULL)
594     return;
595   if (strncmp (global_needed->name, "-l", 2) != 0)
596     {
597       if (strcmp (s->filename, global_needed->name) == 0)
598         global_found = true;
599     }
600   else
601     {
602       const char *sname, *lname;
603       const char *sdot, *ldot;
604       int lmaj, lmin, smaj, smin;
606       lname = global_needed->name + 2;
608       sname = strrchr (s->filename, '/');
609       if (sname == NULL)
610         sname = s->filename;
611       else
612         ++sname;
614       if (strncmp (sname, "lib", 3) != 0)
615         return;
616       sname += 3;
618       ldot = strchr (lname, '.');
619       if (ldot == NULL)
620         ldot = lname + strlen (lname);
622       sdot = strstr (sname, ".so.");
623       if (sdot == NULL)
624         return;
626       if (sdot - sname != ldot - lname
627           || strncmp (lname, sname, sdot - sname) != 0)
628         return;
630       lmaj = lmin = -1;
631       sscanf (ldot, ".%d.%d", &lmaj, &lmin);
632       smaj = smin = -1;
633       sscanf (sdot, ".so.%d.%d", &smaj, &smin);
634       if ((smaj != lmaj && smaj != -1 && lmaj != -1)
635           || (smin != lmin && smin != -1 && lmin != -1))
636         return;
638       global_found = true;
639     }
642 /* We need to use static variables to pass information around the call
643    to lang_for_each_statement.  Ick.  */
645 static const char *find_assign;
646 static boolean found_assign;
648 /* We need to use static variables to pass information around the call
649    to lang_for_each_input_file.  Ick.  */
651 static bfd_size_type need_size;
652 static bfd_size_type need_entries;
653 static bfd_byte *need_contents;
654 static bfd_byte *need_pinfo;
655 static bfd_byte *need_pnames;
657 /* The size of one entry in the .need section, not including the file
658    name.  */
660 #define NEED_ENTRY_SIZE (16)
662 /* This is called after the sections have been attached to output
663    sections, but before any sizes or addresses have been set.  */
665 static void
666 gld${EMULATION_NAME}_before_allocation ()
668   struct bfd_link_hash_entry *hdyn = NULL;
669   asection *sneed;
670   asection *srules;
671   asection *sdyn;
673   /* The SunOS native linker creates a shared library whenever there
674      are any undefined symbols in a link, unless -e is used.  This is
675      pretty weird, but we are compatible.  */
676   if (! link_info.shared && ! link_info.relocateable && ! entry_from_cmdline)
677     {
678       struct bfd_link_hash_entry *h;
679       
680       for (h = link_info.hash->undefs; h != NULL; h = h->next)
681         {
682           if (h->type == bfd_link_hash_undefined
683               && h->u.undef.abfd != NULL
684               && (h->u.undef.abfd->flags & DYNAMIC) == 0
685               && strcmp (h->root.string, "__DYNAMIC") != 0
686               && strcmp (h->root.string, "__GLOBAL_OFFSET_TABLE_") != 0)
687             {
688               find_assign = h->root.string;
689               found_assign = false;
690               lang_for_each_statement (gld${EMULATION_NAME}_find_assignment);
691               if (! found_assign)
692                 {
693                   link_info.shared = true;
694                   break;
695                 }
696             }
697         }
698     }
700   if (link_info.shared)
701     {
702       lang_output_section_statement_type *os;
704       /* Set the .text section to start at 0x20, not 0x2020.  FIXME:
705          This is too magical.  */
706       os = lang_output_section_statement_lookup (".text");
707       if (os->addr_tree == NULL)
708         os->addr_tree = exp_intop (0x20);
709     }
711   /* We need to create a __DYNAMIC symbol.  We don't do this in the
712      linker script because we want to set the value to the start of
713      the dynamic section if there is one, or to zero if there isn't
714      one.  We need to create the symbol before calling
715      size_dynamic_sections, although we can't set the value until
716      afterward.  */
717   if (! link_info.relocateable)
718     {
719       hdyn = bfd_link_hash_lookup (link_info.hash, "__DYNAMIC", true, false,
720                                    false);
721       if (hdyn == NULL)
722         einfo ("%P%F: bfd_link_hash_lookup: %E\n");
723       if (! bfd_sunos_record_link_assignment (output_bfd, &link_info,
724                                               "__DYNAMIC"))
725         einfo ("%P%F: failed to record assignment to __DYNAMIC: %E\n");
726     }
728   /* If we are going to make any variable assignments, we need to let
729      the backend linker know about them in case the variables are
730      referred to by dynamic objects.  */
731   lang_for_each_statement (gld${EMULATION_NAME}_find_assignment);
733   /* Let the backend linker work out the sizes of any sections
734      required by dynamic linking.  */
735   if (! bfd_sunos_size_dynamic_sections (output_bfd, &link_info, &sdyn,
736                                          &sneed, &srules))
737     einfo ("%P%F: failed to set dynamic section sizes: %E\n");
739   if (sneed != NULL)
740     {
741       /* Set up the .need section.  See the description of the ld_need
742          field in include/aout/sun4.h.  */
744       need_entries = 0;
745       need_size = 0;
747       lang_for_each_input_file (gld${EMULATION_NAME}_count_need);
749       /* We should only have a .need section if we have at least one
750          dynamic object.  */
751       ASSERT (need_entries != 0);
753       sneed->_raw_size = need_size;
754       sneed->contents = (bfd_byte *) xmalloc (need_size);
756       need_contents = sneed->contents;
757       need_pinfo = sneed->contents;
758       need_pnames = sneed->contents + need_entries * 16;
760       lang_for_each_input_file (gld${EMULATION_NAME}_set_need);
762       ASSERT ((bfd_size_type) (need_pnames - sneed->contents) == need_size);
763     }
765   if (srules != NULL)
766     {
767       /* Set up the .rules section.  This is just a PATH like string
768          of the -L arguments given on the command line.  We permit the
769          user to specify the directories using the -rpath command line
770          option.  */
771       if (command_line.rpath)
772         {
773           srules->_raw_size = strlen (command_line.rpath);
774           srules->contents = (bfd_byte *) command_line.rpath;
775         }
776       else
777         {
778           unsigned int size;
779           search_dirs_type *search;
781           size = 0;
782           for (search = search_head; search != NULL; search = search->next)
783             if (search->cmdline)
784               size += strlen (search->name) + 1;
785           srules->_raw_size = size;
786           if (size > 0)
787             {
788               char *p;
790               srules->contents = (bfd_byte *) xmalloc (size);
791               p = (char *) srules->contents;
792               *p = '\0';
793               for (search = search_head; search != NULL; search = search->next)
794                 {
795                   if (search->cmdline)
796                     {
797                       if (p != (char *) srules->contents)
798                         *p++ = ':';
799                       strcpy (p, search->name);
800                       p += strlen (p);
801                     }
802                 }
803             }
804         }
805     }
807   /* We must assign a value to __DYNAMIC.  It should be zero if we are
808      not doing a dynamic link, or the start of the .dynamic section if
809      we are doing one.  */
810   if (! link_info.relocateable)
811     {
812       hdyn->type = bfd_link_hash_defined;
813       hdyn->u.def.value = 0;
814       if (sdyn != NULL)
815         hdyn->u.def.section = sdyn;
816       else
817         hdyn->u.def.section = bfd_abs_section_ptr;
818     }
821 /* This is called by the before_allocation routine via
822    lang_for_each_statement.  It does one of two things: if the
823    variable find_assign is set, it sets found_assign if it finds an
824    assignment to that variable; otherwise it tells the backend linker
825    about all assignment statements, in case they are assignments to
826    symbols which are referred to by dynamic objects.  */
828 static void
829 gld${EMULATION_NAME}_find_assignment (s)
830      lang_statement_union_type *s;
832   if (s->header.type == lang_assignment_statement_enum
833       && (find_assign == NULL || ! found_assign))
834     gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
837 /* Look through an expression for an assignment statement.  */
839 static void
840 gld${EMULATION_NAME}_find_exp_assignment (exp)
841      etree_type *exp;
843   switch (exp->type.node_class)
844     {
845     case etree_assign:
846       if (find_assign != NULL)
847         {
848           if (strcmp (find_assign, exp->assign.dst) == 0)
849             found_assign = true;
850           return;
851         }
853       if (strcmp (exp->assign.dst, ".") != 0)
854         {
855           if (! bfd_sunos_record_link_assignment (output_bfd, &link_info,
856                                                   exp->assign.dst))
857             einfo ("%P%F: failed to record assignment to %s: %E\n",
858                    exp->assign.dst);
859         }
860       gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
861       break;
863     case etree_binary:
864       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
865       gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
866       break;
868     case etree_trinary:
869       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
870       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
871       gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
872       break;
874     case etree_unary:
875       gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
876       break;
878     default:
879       break;
880     }
883 /* Work out the size of the .need section, and the number of entries.
884    The backend will set the ld_need field of the dynamic linking
885    information to point to the .need section.  See include/aout/sun4.h
886    for more information.  */
888 static void
889 gld${EMULATION_NAME}_count_need (inp)
890      lang_input_statement_type *inp;
892   if (inp->the_bfd != NULL
893       && (inp->the_bfd->flags & DYNAMIC) != 0)
894     {
895       ++need_entries;
896       need_size += NEED_ENTRY_SIZE;
897       if (! inp->is_archive)
898         need_size += strlen (inp->filename) + 1;
899       else
900         {
901           ASSERT (inp->local_sym_name[0] == '-'
902                   && inp->local_sym_name[1] == 'l');
903           need_size += strlen (inp->local_sym_name + 2) + 1;
904         }
905     }
908 /* Fill in the contents of the .need section.  */
910 static void
911 gld${EMULATION_NAME}_set_need (inp)
912      lang_input_statement_type *inp;
914   if (inp->the_bfd != NULL
915       && (inp->the_bfd->flags & DYNAMIC) != 0)
916     {
917       bfd_size_type c;
919       /* To really fill in the .need section contents, we need to know
920          the final file position of the section, but we don't.
921          Instead, we use offsets, and rely on the BFD backend to
922          finish the section up correctly.  FIXME: Talk about lack of
923          referential locality.  */
924       bfd_put_32 (output_bfd, need_pnames - need_contents, need_pinfo);
925       if (! inp->is_archive)
926         {
927           bfd_put_32 (output_bfd, (bfd_vma) 0, need_pinfo + 4);
928           bfd_put_16 (output_bfd, (bfd_vma) 0, need_pinfo + 8);
929           bfd_put_16 (output_bfd, (bfd_vma) 0, need_pinfo + 10);
930           strcpy (need_pnames, inp->filename);
931         }
932       else
933         {
934           char *verstr;
935           int maj, min;
937           bfd_put_32 (output_bfd, (bfd_vma) 0x80000000, need_pinfo + 4);
938           maj = 0;
939           min = 0;
940           verstr = strstr (inp->filename, ".so.");
941           if (verstr != NULL)
942             sscanf (verstr, ".so.%d.%d", &maj, &min);
943           bfd_put_16 (output_bfd, (bfd_vma) maj, need_pinfo + 8);
944           bfd_put_16 (output_bfd, (bfd_vma) min, need_pinfo + 10);
945           strcpy (need_pnames, inp->local_sym_name + 2);
946         }
948       c = (need_pinfo - need_contents) / NEED_ENTRY_SIZE;
949       if (c + 1 >= need_entries)
950         bfd_put_32 (output_bfd, (bfd_vma) 0, need_pinfo + 12);
951       else
952         bfd_put_32 (output_bfd, (bfd_vma) (c + 1) * NEED_ENTRY_SIZE,
953                     need_pinfo + 12);
955       need_pinfo += NEED_ENTRY_SIZE;
956       need_pnames += strlen (need_pnames) + 1;
957     }
960 static char *
961 gld${EMULATION_NAME}_get_script(isfile)
962      int *isfile;
965 if test -n "$COMPILE_IN"
966 then
967 # Scripts compiled in.
969 # sed commands to quote an ld script as a C string.
970 sc='s/["\\]/\\&/g
971 s/$/\\n\\/
972 1s/^/"/
973 $s/$/n"/
976 cat >>e${EMULATION_NAME}.c <<EOF
977 {                            
978   *isfile = 0;
980   if (link_info.relocateable == true && config.build_constructors == true)
981     return `sed "$sc" ldscripts/${EMULATION_NAME}.xu`;
982   else if (link_info.relocateable == true)
983     return `sed "$sc" ldscripts/${EMULATION_NAME}.xr`;
984   else if (!config.text_read_only)
985     return `sed "$sc" ldscripts/${EMULATION_NAME}.xbn`;
986   else if (!config.magic_demand_paged)
987     return `sed "$sc" ldscripts/${EMULATION_NAME}.xn`;
988   else
989     return `sed "$sc" ldscripts/${EMULATION_NAME}.x`;
993 else
994 # Scripts read from the filesystem.
996 cat >>e${EMULATION_NAME}.c <<EOF
997 {                            
998   *isfile = 1;
1000   if (link_info.relocateable == true && config.build_constructors == true)
1001     return "ldscripts/${EMULATION_NAME}.xu";
1002   else if (link_info.relocateable == true)
1003     return "ldscripts/${EMULATION_NAME}.xr";
1004   else if (!config.text_read_only)
1005     return "ldscripts/${EMULATION_NAME}.xbn";
1006   else if (!config.magic_demand_paged)
1007     return "ldscripts/${EMULATION_NAME}.xn";
1008   else
1009     return "ldscripts/${EMULATION_NAME}.x";
1015 cat >>e${EMULATION_NAME}.c <<EOF
1017 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = 
1019   gld${EMULATION_NAME}_before_parse,
1020   syslib_default,
1021   hll_default,
1022   after_parse_default,
1023   gld${EMULATION_NAME}_after_open,
1024   after_allocation_default,
1025   set_output_arch_default,
1026   ldemul_default_target,
1027   gld${EMULATION_NAME}_before_allocation,
1028   gld${EMULATION_NAME}_get_script,
1029   "${EMULATION_NAME}",
1030   "${OUTPUT_FORMAT}",
1031   NULL, /* finish */
1032   gld${EMULATION_NAME}_create_output_section_statements,
1033   NULL, /* open_dynamic_library */
1034   NULL, /* place_orphan */
1035   gld${EMULATION_NAME}_set_symbols