]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - ld/emultempl/sunos.em
* config/sh/tm-sh.h (BELIEVE_PCC_PROMOTION): Define, so that
[thirdparty/binutils-gdb.git] / ld / emultempl / sunos.em
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! */
5
6 /* SunOS emulation code for ${EMULATION_NAME}
7 Copyright (C) 1991, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
8 Written by Steve Chamberlain <sac@cygnus.com>
9 SunOS shared library support by Ian Lance Taylor <ian@cygnus.com>
10
11 This file is part of GLD, the Gnu Linker.
12
13 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation; either version 2 of the License, or
16 (at your option) any later version.
17
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
26
27 #define TARGET_IS_${EMULATION_NAME}
28
29 #include <ctype.h>
30 #include <sys/types.h>
31 #include <sys/stat.h>
32
33 #include "bfd.h"
34 #include "sysdep.h"
35 #include "bfdlink.h"
36 #include "libiberty.h"
37
38 #include "ld.h"
39 #include "ldmain.h"
40 #include "ldemul.h"
41 #include "ldfile.h"
42 #include "ldmisc.h"
43 #include "ldexp.h"
44 #include "ldlang.h"
45
46 #ifdef HAVE_DIRENT_H
47 # include <dirent.h>
48 #else
49 # define dirent direct
50 # ifdef HAVE_SYS_NDIR_H
51 # include <sys/ndir.h>
52 # endif
53 # ifdef HAVE_SYS_DIR_H
54 # include <sys/dir.h>
55 # endif
56 # ifdef HAVE_NDIR_H
57 # include <ndir.h>
58 # endif
59 #endif
60
61 static void gld${EMULATION_NAME}_before_parse PARAMS ((void));
62 static void gld${EMULATION_NAME}_set_symbols PARAMS ((void));
63 static void gld${EMULATION_NAME}_create_output_section_statements
64 PARAMS ((void));
65 static void gld${EMULATION_NAME}_find_so
66 PARAMS ((lang_input_statement_type *));
67 static char *gld${EMULATION_NAME}_search_dir
68 PARAMS ((const char *, const char *, boolean *));
69 static void gld${EMULATION_NAME}_after_open PARAMS ((void));
70 static void gld${EMULATION_NAME}_check_needed
71 PARAMS ((lang_input_statement_type *));
72 static boolean gld${EMULATION_NAME}_search_needed
73 PARAMS ((const char *, const char *));
74 static boolean gld${EMULATION_NAME}_try_needed
75 PARAMS ((const char *, const char *));
76 static void gld${EMULATION_NAME}_before_allocation PARAMS ((void));
77 static void gld${EMULATION_NAME}_find_assignment
78 PARAMS ((lang_statement_union_type *));
79 static void gld${EMULATION_NAME}_find_exp_assignment PARAMS ((etree_type *));
80 static void gld${EMULATION_NAME}_count_need
81 PARAMS ((lang_input_statement_type *));
82 static void gld${EMULATION_NAME}_set_need
83 PARAMS ((lang_input_statement_type *));
84 static char *gld${EMULATION_NAME}_get_script PARAMS ((int *isfile));
85
86 static void
87 gld${EMULATION_NAME}_before_parse()
88 {
89 ldfile_output_architecture = bfd_arch_${ARCH};
90 config.dynamic_link = true;
91 }
92
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. */
97
98 static void
99 gld${EMULATION_NAME}_set_symbols ()
100 {
101 EOF
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;
106
107 env = (const char *) getenv ("LD_LIBRARY_PATH");
108 if (env != NULL)
109 {
110 char *l;
111
112 l = xstrdup (env);
113 while (1)
114 {
115 char *c;
116
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 }
127 EOF
128 fi
129 fi
130 cat >>e${EMULATION_NAME}.c <<EOF
131 }
132
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. */
141
142 static void
143 gld${EMULATION_NAME}_create_output_section_statements ()
144 {
145 lang_for_each_input_file (gld${EMULATION_NAME}_find_so);
146 }
147
148 /* Search the directory for a .so file for each library search. */
149
150 static void
151 gld${EMULATION_NAME}_find_so (inp)
152 lang_input_statement_type *inp;
153 {
154 search_dirs_type *search;
155 char *found;
156 char *alc;
157 struct stat st;
158
159 if (! inp->search_dirs_flag
160 || ! inp->is_archive
161 || ! inp->dynamic)
162 return;
163
164 ASSERT (strncmp (inp->local_sym_name, "-l", 2) == 0);
165
166 for (search = search_head; search != NULL; search = search->next)
167 {
168 boolean found_static;
169
170 found = gld${EMULATION_NAME}_search_dir (search->name, inp->filename,
171 &found_static);
172 if (found != NULL || found_static)
173 break;
174 }
175
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 }
183
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;
188
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;
192
193 free (found);
194
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;
205
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;
211
212 inp->filename = alc;
213 inp->local_sym_name = alc;
214
215 inp->header.next = (lang_statement_union_type *) sa;
216 inp->next_real_file = (lang_statement_union_type *) sa;
217 }
218 }
219
220 /* Search a directory for a .so file. */
221
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;
227 {
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
237 *found_static = false;
238
239 force_maj = -1;
240 force_min = -1;
241 dot = strchr (filename, '.');
242 if (dot == NULL)
243 {
244 len = strlen (filename);
245 alc = NULL;
246 }
247 else
248 {
249 force_maj = atoi (dot + 1);
250
251 len = dot - filename;
252 alc = (char *) xmalloc (len + 1);
253 strncpy (alc, filename, len);
254 alc[len] = '\0';
255 filename = alc;
256
257 dot = strchr (dot + 1, '.');
258 if (dot != NULL)
259 force_min = atoi (dot + 1);
260 }
261
262 found = NULL;
263 max_maj = max_min = 0;
264
265 dir = opendir (dirname);
266 if (dir == NULL)
267 return NULL;
268
269 while ((entry = readdir (dir)) != NULL)
270 {
271 const char *s;
272 int found_maj, found_min;
273
274 if (strncmp (entry->d_name, "lib", 3) != 0
275 || strncmp (entry->d_name + 3, filename, len) != 0)
276 continue;
277
278 if (dot == NULL
279 && strcmp (entry->d_name + 3 + len, ".a") == 0)
280 {
281 *found_static = true;
282 continue;
283 }
284
285 if (strncmp (entry->d_name + 3 + len, ".so.", 4) != 0
286 || ! isdigit (entry->d_name[7 + len]))
287 continue;
288
289 for (s = entry->d_name + 7 + len; *s != '\0'; s++)
290 if (*s != '.' && ! isdigit (*s))
291 break;
292 if (*s != '\0')
293 continue;
294
295 /* We've found a .so file. Work out the major and minor
296 version numbers. */
297 found_maj = 0;
298 found_min = 0;
299 sscanf (entry->d_name + 3 + len, ".so.%d.%d",
300 &found_maj, &found_min);
301
302 if ((force_maj != -1 && force_maj != found_maj)
303 || (force_min != -1 && force_min != found_min))
304 continue;
305
306 /* We've found a match for the name we are searching for. See
307 if this is the version we should use. If the major and minor
308 versions match, we use the last entry in alphabetical order;
309 I don't know if this is how SunOS distinguishes libc.so.1.8
310 from libc.so.1.8.1, but it ought to suffice. */
311 if (found == NULL
312 || (found_maj > max_maj)
313 || (found_maj == max_maj
314 && (found_min > max_min
315 || (found_min == max_min
316 && strcmp (entry->d_name, found) > 0))))
317 {
318 if (found != NULL)
319 free (found);
320 found = (char *) xmalloc (strlen (entry->d_name) + 1);
321 strcpy (found, entry->d_name);
322 max_maj = found_maj;
323 max_min = found_min;
324 }
325 }
326
327 closedir (dir);
328
329 if (alc != NULL)
330 free (alc);
331
332 return found;
333 }
334
335 /* These variables are required to pass information back and forth
336 between after_open and check_needed. */
337
338 static struct bfd_link_needed_list *global_needed;
339 static boolean global_found;
340
341 /* This is called after all the input files have been opened. */
342
343 static void
344 gld${EMULATION_NAME}_after_open ()
345 {
346 struct bfd_link_needed_list *needed, *l;
347
348 /* We only need to worry about this when doing a final link. */
349 if (link_info.relocateable || link_info.shared)
350 return;
351
352 /* Get the list of files which appear in ld_need entries in dynamic
353 objects included in the link. For each such file, we want to
354 track down the corresponding library, and include the symbol
355 table in the link. This is what the runtime dynamic linker will
356 do. Tracking the files down here permits one dynamic object to
357 include another without requiring special action by the person
358 doing the link. Note that the needed list can actually grow
359 while we are stepping through this loop. */
360 needed = bfd_sunos_get_needed_list (output_bfd, &link_info);
361 for (l = needed; l != NULL; l = l->next)
362 {
363 struct bfd_link_needed_list *ll;
364 const char *lname;
365 search_dirs_type *search;
366
367 lname = l->name;
368
369 /* If we've already seen this file, skip it. */
370 for (ll = needed; ll != l; ll = ll->next)
371 if (strcmp (ll->name, lname) == 0)
372 break;
373 if (ll != l)
374 continue;
375
376 /* See if this file was included in the link explicitly. */
377 global_needed = l;
378 global_found = false;
379 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
380 if (global_found)
381 continue;
382
383 if (strncmp (lname, "-l", 2) != 0)
384 {
385 bfd *abfd;
386
387 abfd = bfd_openr (lname, bfd_get_target (output_bfd));
388 if (abfd != NULL)
389 {
390 if (! bfd_check_format (abfd, bfd_object))
391 {
392 (void) bfd_close (abfd);
393 abfd = NULL;
394 }
395 }
396 if (abfd != NULL)
397 {
398 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
399 {
400 (void) bfd_close (abfd);
401 abfd = NULL;
402 }
403 }
404 if (abfd != NULL)
405 {
406 /* We've found the needed dynamic object. */
407 if (! bfd_link_add_symbols (abfd, &link_info))
408 einfo ("%F%B: could not read symbols: %E\n", abfd);
409 }
410 else
411 {
412 einfo ("%P: warning: %s, needed by %B, not found\n",
413 lname, l->by);
414 }
415
416 continue;
417 }
418
419 lname += 2;
420
421 /* We want to search for the file in the same way that the
422 dynamic linker will search. That means that we want to use
423 rpath_link, rpath or -L, then the environment variable
424 LD_LIBRARY_PATH (native only), then (if rpath was used) the
425 linker script LIB_SEARCH_DIRS. */
426 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
427 lname))
428 continue;
429 if (command_line.rpath != NULL)
430 {
431 if (gld${EMULATION_NAME}_search_needed (command_line.rpath, lname))
432 continue;
433 }
434 else
435 {
436 for (search = search_head; search != NULL; search = search->next)
437 if (gld${EMULATION_NAME}_try_needed (search->name, lname))
438 break;
439 if (search != NULL)
440 continue;
441 }
442 EOF
443 if [ "x${host}" = "x${target}" ] ; then
444 if [ "x${DEFAULT_EMULATION}" = "x${EMULATION_NAME}" ] ; then
445 cat >>e${EMULATION_NAME}.c <<EOF
446 {
447 const char *lib_path;
448
449 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
450 if (gld${EMULATION_NAME}_search_needed (lib_path, lname))
451 continue;
452 }
453 EOF
454 fi
455 fi
456 cat >>e${EMULATION_NAME}.c <<EOF
457 if (command_line.rpath != NULL)
458 {
459 for (search = search_head; search != NULL; search = search->next)
460 {
461 if (search->cmdline)
462 continue;
463 if (gld${EMULATION_NAME}_try_needed (search->name, lname))
464 break;
465 }
466 if (search != NULL)
467 continue;
468 }
469
470 einfo ("%P: warning: %s, needed by %B, not found\n",
471 l->name, l->by);
472 }
473 }
474
475 /* Search for a needed file in a path. */
476
477 static boolean
478 gld${EMULATION_NAME}_search_needed (path, name)
479 const char *path;
480 const char *name;
481 {
482 const char *s;
483
484 if (path == NULL || *path == '\0')
485 return false;
486 while (1)
487 {
488 const char *dir;
489 char *dircopy;
490
491 s = strchr (path, ':');
492 if (s == NULL)
493 {
494 dircopy = NULL;
495 dir = path;
496 }
497 else
498 {
499 dircopy = (char *) xmalloc (s - path + 1);
500 memcpy (dircopy, path, s - path);
501 dircopy[s - path] = '\0';
502 dir = dircopy;
503 }
504
505 if (gld${EMULATION_NAME}_try_needed (dir, name))
506 return true;
507
508 if (dircopy != NULL)
509 free (dircopy);
510
511 if (s == NULL)
512 break;
513 path = s + 1;
514 }
515
516 return false;
517 }
518
519 /* This function is called for each possible directory for a needed
520 dynamic object. */
521
522 static boolean
523 gld${EMULATION_NAME}_try_needed (dir, name)
524 const char *dir;
525 const char *name;
526 {
527 char *file;
528 char *alc;
529 boolean ignore;
530 bfd *abfd;
531
532 file = gld${EMULATION_NAME}_search_dir (dir, name, &ignore);
533 if (file == NULL)
534 return false;
535
536 alc = (char *) xmalloc (strlen (dir) + strlen (file) + 2);
537 sprintf (alc, "%s/%s", dir, file);
538 free (file);
539 abfd = bfd_openr (alc, bfd_get_target (output_bfd));
540 if (abfd == NULL)
541 return false;
542 if (! bfd_check_format (abfd, bfd_object))
543 {
544 (void) bfd_close (abfd);
545 return false;
546 }
547 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
548 {
549 (void) bfd_close (abfd);
550 return false;
551 }
552
553 /* We've found the needed dynamic object. */
554
555 /* Add this file into the symbol table. */
556 if (! bfd_link_add_symbols (abfd, &link_info))
557 einfo ("%F%B: could not read symbols: %E\n", abfd);
558
559 return true;
560 }
561
562 /* See if we have already included a needed object in the link. This
563 does not have to be precise, as it does no harm to include a
564 dynamic object more than once. */
565
566 static void
567 gld${EMULATION_NAME}_check_needed (s)
568 lang_input_statement_type *s;
569 {
570 if (s->filename == NULL)
571 return;
572 if (strncmp (global_needed->name, "-l", 2) != 0)
573 {
574 if (strcmp (s->filename, global_needed->name) == 0)
575 global_found = true;
576 }
577 else
578 {
579 const char *sname, *lname;
580 const char *sdot, *ldot;
581 int lmaj, lmin, smaj, smin;
582
583 lname = global_needed->name + 2;
584
585 sname = strrchr (s->filename, '/');
586 if (sname == NULL)
587 sname = s->filename;
588 else
589 ++sname;
590
591 if (strncmp (sname, "lib", 3) != 0)
592 return;
593 sname += 3;
594
595 ldot = strchr (lname, '.');
596 if (ldot == NULL)
597 ldot = lname + strlen (lname);
598
599 sdot = strstr (sname, ".so.");
600 if (sdot == NULL)
601 return;
602
603 if (sdot - sname != ldot - lname
604 || strncmp (lname, sname, sdot - sname) != 0)
605 return;
606
607 lmaj = lmin = -1;
608 sscanf (ldot, ".%d.%d", &lmaj, &lmin);
609 smaj = smin = -1;
610 sscanf (sdot, ".so.%d.%d", &smaj, &smin);
611 if ((smaj != lmaj && smaj != -1 && lmaj != -1)
612 || (smin != lmin && smin != -1 && lmin != -1))
613 return;
614
615 global_found = true;
616 }
617 }
618
619 /* We need to use static variables to pass information around the call
620 to lang_for_each_statement. Ick. */
621
622 static const char *find_assign;
623 static boolean found_assign;
624
625 /* We need to use static variables to pass information around the call
626 to lang_for_each_input_file. Ick. */
627
628 static bfd_size_type need_size;
629 static bfd_size_type need_entries;
630 static bfd_byte *need_contents;
631 static bfd_byte *need_pinfo;
632 static bfd_byte *need_pnames;
633
634 /* The size of one entry in the .need section, not including the file
635 name. */
636
637 #define NEED_ENTRY_SIZE (16)
638
639 /* This is called after the sections have been attached to output
640 sections, but before any sizes or addresses have been set. */
641
642 static void
643 gld${EMULATION_NAME}_before_allocation ()
644 {
645 struct bfd_link_hash_entry *hdyn = NULL;
646 asection *sneed;
647 asection *srules;
648 asection *sdyn;
649
650 /* The SunOS native linker creates a shared library whenever there
651 are any undefined symbols in a link, unless -e is used. This is
652 pretty weird, but we are compatible. */
653 if (! link_info.shared && ! link_info.relocateable && ! entry_from_cmdline)
654 {
655 struct bfd_link_hash_entry *h;
656
657 for (h = link_info.hash->undefs; h != NULL; h = h->next)
658 {
659 if (h->type == bfd_link_hash_undefined
660 && h->u.undef.abfd != NULL
661 && (h->u.undef.abfd->flags & DYNAMIC) == 0
662 && strcmp (h->root.string, "__DYNAMIC") != 0
663 && strcmp (h->root.string, "__GLOBAL_OFFSET_TABLE_") != 0)
664 {
665 find_assign = h->root.string;
666 found_assign = false;
667 lang_for_each_statement (gld${EMULATION_NAME}_find_assignment);
668 if (! found_assign)
669 {
670 link_info.shared = true;
671 break;
672 }
673 }
674 }
675 }
676
677 if (link_info.shared)
678 {
679 lang_output_section_statement_type *os;
680
681 /* Set the .text section to start at 0x20, not 0x2020. FIXME:
682 This is too magical. */
683 os = lang_output_section_statement_lookup (".text");
684 if (os->addr_tree == NULL)
685 os->addr_tree = exp_intop (0x20);
686 }
687
688 /* We need to create a __DYNAMIC symbol. We don't do this in the
689 linker script because we want to set the value to the start of
690 the dynamic section if there is one, or to zero if there isn't
691 one. We need to create the symbol before calling
692 size_dynamic_sections, although we can't set the value until
693 afterward. */
694 if (! link_info.relocateable)
695 {
696 hdyn = bfd_link_hash_lookup (link_info.hash, "__DYNAMIC", true, false,
697 false);
698 if (hdyn == NULL)
699 einfo ("%P%F: bfd_link_hash_lookup: %E\n");
700 if (! bfd_sunos_record_link_assignment (output_bfd, &link_info,
701 "__DYNAMIC"))
702 einfo ("%P%F: failed to record assignment to __DYNAMIC: %E\n");
703 }
704
705 /* If we are going to make any variable assignments, we need to let
706 the backend linker know about them in case the variables are
707 referred to by dynamic objects. */
708 lang_for_each_statement (gld${EMULATION_NAME}_find_assignment);
709
710 /* Let the backend linker work out the sizes of any sections
711 required by dynamic linking. */
712 if (! bfd_sunos_size_dynamic_sections (output_bfd, &link_info, &sdyn,
713 &sneed, &srules))
714 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
715
716 if (sneed != NULL)
717 {
718 /* Set up the .need section. See the description of the ld_need
719 field in include/aout/sun4.h. */
720
721 need_entries = 0;
722 need_size = 0;
723
724 lang_for_each_input_file (gld${EMULATION_NAME}_count_need);
725
726 /* We should only have a .need section if we have at least one
727 dynamic object. */
728 ASSERT (need_entries != 0);
729
730 sneed->_raw_size = need_size;
731 sneed->contents = (bfd_byte *) xmalloc (need_size);
732
733 need_contents = sneed->contents;
734 need_pinfo = sneed->contents;
735 need_pnames = sneed->contents + need_entries * 16;
736
737 lang_for_each_input_file (gld${EMULATION_NAME}_set_need);
738
739 ASSERT ((bfd_size_type) (need_pnames - sneed->contents) == need_size);
740 }
741
742 if (srules != NULL)
743 {
744 /* Set up the .rules section. This is just a PATH like string
745 of the -L arguments given on the command line. We permit the
746 user to specify the directories using the -rpath command line
747 option. */
748 if (command_line.rpath)
749 {
750 srules->_raw_size = strlen (command_line.rpath);
751 srules->contents = (bfd_byte *) command_line.rpath;
752 }
753 else
754 {
755 unsigned int size;
756 search_dirs_type *search;
757
758 size = 0;
759 for (search = search_head; search != NULL; search = search->next)
760 if (search->cmdline)
761 size += strlen (search->name) + 1;
762 srules->_raw_size = size;
763 if (size > 0)
764 {
765 char *p;
766
767 srules->contents = (bfd_byte *) xmalloc (size);
768 p = (char *) srules->contents;
769 *p = '\0';
770 for (search = search_head; search != NULL; search = search->next)
771 {
772 if (search->cmdline)
773 {
774 if (p != (char *) srules->contents)
775 *p++ = ':';
776 strcpy (p, search->name);
777 p += strlen (p);
778 }
779 }
780 }
781 }
782 }
783
784 /* We must assign a value to __DYNAMIC. It should be zero if we are
785 not doing a dynamic link, or the start of the .dynamic section if
786 we are doing one. */
787 if (! link_info.relocateable)
788 {
789 hdyn->type = bfd_link_hash_defined;
790 hdyn->u.def.value = 0;
791 if (sdyn != NULL)
792 hdyn->u.def.section = sdyn;
793 else
794 hdyn->u.def.section = bfd_abs_section_ptr;
795 }
796 }
797
798 /* This is called by the before_allocation routine via
799 lang_for_each_statement. It does one of two things: if the
800 variable find_assign is set, it sets found_assign if it finds an
801 assignment to that variable; otherwise it tells the backend linker
802 about all assignment statements, in case they are assignments to
803 symbols which are referred to by dynamic objects. */
804
805 static void
806 gld${EMULATION_NAME}_find_assignment (s)
807 lang_statement_union_type *s;
808 {
809 if (s->header.type == lang_assignment_statement_enum
810 && (find_assign == NULL || ! found_assign))
811 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
812 }
813
814 /* Look through an expression for an assignment statement. */
815
816 static void
817 gld${EMULATION_NAME}_find_exp_assignment (exp)
818 etree_type *exp;
819 {
820 switch (exp->type.node_class)
821 {
822 case etree_assign:
823 if (find_assign != NULL)
824 {
825 if (strcmp (find_assign, exp->assign.dst) == 0)
826 found_assign = true;
827 return;
828 }
829
830 if (strcmp (exp->assign.dst, ".") != 0)
831 {
832 if (! bfd_sunos_record_link_assignment (output_bfd, &link_info,
833 exp->assign.dst))
834 einfo ("%P%F: failed to record assignment to %s: %E\n",
835 exp->assign.dst);
836 }
837 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
838 break;
839
840 case etree_binary:
841 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
842 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
843 break;
844
845 case etree_trinary:
846 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
847 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
848 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
849 break;
850
851 case etree_unary:
852 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
853 break;
854
855 default:
856 break;
857 }
858 }
859
860 /* Work out the size of the .need section, and the number of entries.
861 The backend will set the ld_need field of the dynamic linking
862 information to point to the .need section. See include/aout/sun4.h
863 for more information. */
864
865 static void
866 gld${EMULATION_NAME}_count_need (inp)
867 lang_input_statement_type *inp;
868 {
869 if (inp->the_bfd != NULL
870 && (inp->the_bfd->flags & DYNAMIC) != 0)
871 {
872 ++need_entries;
873 need_size += NEED_ENTRY_SIZE;
874 if (! inp->is_archive)
875 need_size += strlen (inp->filename) + 1;
876 else
877 {
878 ASSERT (inp->local_sym_name[0] == '-'
879 && inp->local_sym_name[1] == 'l');
880 need_size += strlen (inp->local_sym_name + 2) + 1;
881 }
882 }
883 }
884
885 /* Fill in the contents of the .need section. */
886
887 static void
888 gld${EMULATION_NAME}_set_need (inp)
889 lang_input_statement_type *inp;
890 {
891 if (inp->the_bfd != NULL
892 && (inp->the_bfd->flags & DYNAMIC) != 0)
893 {
894 bfd_size_type c;
895
896 /* To really fill in the .need section contents, we need to know
897 the final file position of the section, but we don't.
898 Instead, we use offsets, and rely on the BFD backend to
899 finish the section up correctly. FIXME: Talk about lack of
900 referential locality. */
901 bfd_put_32 (output_bfd, need_pnames - need_contents, need_pinfo);
902 if (! inp->is_archive)
903 {
904 bfd_put_32 (output_bfd, (bfd_vma) 0, need_pinfo + 4);
905 bfd_put_16 (output_bfd, (bfd_vma) 0, need_pinfo + 8);
906 bfd_put_16 (output_bfd, (bfd_vma) 0, need_pinfo + 10);
907 strcpy (need_pnames, inp->filename);
908 }
909 else
910 {
911 char *verstr;
912 int maj, min;
913
914 bfd_put_32 (output_bfd, (bfd_vma) 0x80000000, need_pinfo + 4);
915 maj = 0;
916 min = 0;
917 verstr = strstr (inp->filename, ".so.");
918 if (verstr != NULL)
919 sscanf (verstr, ".so.%d.%d", &maj, &min);
920 bfd_put_16 (output_bfd, (bfd_vma) maj, need_pinfo + 8);
921 bfd_put_16 (output_bfd, (bfd_vma) min, need_pinfo + 10);
922 strcpy (need_pnames, inp->local_sym_name + 2);
923 }
924
925 c = (need_pinfo - need_contents) / NEED_ENTRY_SIZE;
926 if (c + 1 >= need_entries)
927 bfd_put_32 (output_bfd, (bfd_vma) 0, need_pinfo + 12);
928 else
929 bfd_put_32 (output_bfd, (bfd_vma) (c + 1) * NEED_ENTRY_SIZE,
930 need_pinfo + 12);
931
932 need_pinfo += NEED_ENTRY_SIZE;
933 need_pnames += strlen (need_pnames) + 1;
934 }
935 }
936
937 static char *
938 gld${EMULATION_NAME}_get_script(isfile)
939 int *isfile;
940 EOF
941
942 if test -n "$COMPILE_IN"
943 then
944 # Scripts compiled in.
945
946 # sed commands to quote an ld script as a C string.
947 sc='s/["\\]/\\&/g
948 s/$/\\n\\/
949 1s/^/"/
950 $s/$/n"/
951 '
952
953 cat >>e${EMULATION_NAME}.c <<EOF
954 {
955 *isfile = 0;
956
957 if (link_info.relocateable == true && config.build_constructors == true)
958 return `sed "$sc" ldscripts/${EMULATION_NAME}.xu`;
959 else if (link_info.relocateable == true)
960 return `sed "$sc" ldscripts/${EMULATION_NAME}.xr`;
961 else if (!config.text_read_only)
962 return `sed "$sc" ldscripts/${EMULATION_NAME}.xbn`;
963 else if (!config.magic_demand_paged)
964 return `sed "$sc" ldscripts/${EMULATION_NAME}.xn`;
965 else
966 return `sed "$sc" ldscripts/${EMULATION_NAME}.x`;
967 }
968 EOF
969
970 else
971 # Scripts read from the filesystem.
972
973 cat >>e${EMULATION_NAME}.c <<EOF
974 {
975 *isfile = 1;
976
977 if (link_info.relocateable == true && config.build_constructors == true)
978 return "ldscripts/${EMULATION_NAME}.xu";
979 else if (link_info.relocateable == true)
980 return "ldscripts/${EMULATION_NAME}.xr";
981 else if (!config.text_read_only)
982 return "ldscripts/${EMULATION_NAME}.xbn";
983 else if (!config.magic_demand_paged)
984 return "ldscripts/${EMULATION_NAME}.xn";
985 else
986 return "ldscripts/${EMULATION_NAME}.x";
987 }
988 EOF
989
990 fi
991
992 cat >>e${EMULATION_NAME}.c <<EOF
993
994 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
995 {
996 gld${EMULATION_NAME}_before_parse,
997 syslib_default,
998 hll_default,
999 after_parse_default,
1000 gld${EMULATION_NAME}_after_open,
1001 after_allocation_default,
1002 set_output_arch_default,
1003 ldemul_default_target,
1004 gld${EMULATION_NAME}_before_allocation,
1005 gld${EMULATION_NAME}_get_script,
1006 "${EMULATION_NAME}",
1007 "${OUTPUT_FORMAT}",
1008 NULL, /* finish */
1009 gld${EMULATION_NAME}_create_output_section_statements,
1010 NULL, /* open_dynamic_library */
1011 NULL, /* place_orphan */
1012 gld${EMULATION_NAME}_set_symbols
1013 };
1014 EOF