* emultempl/elf32.em: Formatting fixes.
[binutils-gdb.git] / ld / emultempl / elf32.em
1 # This shell script emits a C file. -*- C -*-
2 # It does some substitutions.
3 # This file is now misnamed, because it supports both 32 bit and 64 bit
4 # ELF emulations.
5 test -z "${ELFSIZE}" && ELFSIZE=32
6 if [ -z "$MACHINE" ]; then
7 OUTPUT_ARCH=${ARCH}
8 else
9 OUTPUT_ARCH=${ARCH}:${MACHINE}
10 fi
11 cat >e${EMULATION_NAME}.c <<EOF
12 /* This file is is generated by a shell script. DO NOT EDIT! */
13
14 /* ${ELFSIZE} bit ELF emulation code for ${EMULATION_NAME}
15 Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
16 Free Software Foundation, Inc.
17 Written by Steve Chamberlain <sac@cygnus.com>
18 ELF support by Ian Lance Taylor <ian@cygnus.com>
19
20 This file is part of GLD, the Gnu Linker.
21
22 This program is free software; you can redistribute it and/or modify
23 it under the terms of the GNU General Public License as published by
24 the Free Software Foundation; either version 2 of the License, or
25 (at your option) any later version.
26
27 This program is distributed in the hope that it will be useful,
28 but WITHOUT ANY WARRANTY; without even the implied warranty of
29 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 GNU General Public License for more details.
31
32 You should have received a copy of the GNU General Public License
33 along with this program; if not, write to the Free Software
34 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
35
36 #define TARGET_IS_${EMULATION_NAME}
37
38 #include "bfd.h"
39 #include "sysdep.h"
40 #include "libiberty.h"
41
42 #include <ctype.h>
43
44 #include "bfdlink.h"
45
46 #include "ld.h"
47 #include "ldmain.h"
48 #include "ldmisc.h"
49 #include "ldexp.h"
50 #include "ldlang.h"
51 #include "ldfile.h"
52 #include "ldemul.h"
53 #include "ldgram.h"
54 #include "elf/common.h"
55
56 static void gld${EMULATION_NAME}_before_parse
57 PARAMS ((void));
58 static void gld${EMULATION_NAME}_vercheck
59 PARAMS ((lang_input_statement_type *));
60 static void gld${EMULATION_NAME}_stat_needed
61 PARAMS ((lang_input_statement_type *));
62 static boolean gld${EMULATION_NAME}_try_needed
63 PARAMS ((const char *, int));
64 static boolean gld${EMULATION_NAME}_search_needed
65 PARAMS ((const char *, const char *, int));
66 static void gld${EMULATION_NAME}_check_needed
67 PARAMS ((lang_input_statement_type *));
68 static void gld${EMULATION_NAME}_after_open
69 PARAMS ((void));
70 static void gld${EMULATION_NAME}_find_exp_assignment
71 PARAMS ((etree_type *));
72 static void gld${EMULATION_NAME}_find_statement_assignment
73 PARAMS ((lang_statement_union_type *));
74 static void gld${EMULATION_NAME}_before_allocation
75 PARAMS ((void));
76 static boolean gld${EMULATION_NAME}_open_dynamic_archive
77 PARAMS ((const char *, search_dirs_type *, lang_input_statement_type *));
78 static lang_output_section_statement_type *output_rel_find
79 PARAMS ((void));
80 static asection *output_prev_sec_find
81 PARAMS ((lang_output_section_statement_type *));
82 static boolean gld${EMULATION_NAME}_place_orphan
83 PARAMS ((lang_input_statement_type *, asection *));
84 static char *gld${EMULATION_NAME}_get_script
85 PARAMS ((int *isfile));
86
87 EOF
88
89 # Import any needed special functions and/or overrides.
90 #
91 if test -n "$EXTRA_EM_FILE" ; then
92 . ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
93 fi
94
95 # Functions in this file can be overridden by setting the LDEMUL_* shell
96 # variables. If the name of the overriding function is the same as is
97 # defined in this file, then don't output this file's version.
98 # If a different overriding name is given then output the standard function
99 # as presumably it is called from the overriding function.
100 #
101 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
102 cat >>e${EMULATION_NAME}.c <<EOF
103
104 static void
105 gld${EMULATION_NAME}_before_parse ()
106 {
107 const bfd_arch_info_type *arch = bfd_scan_arch ("${OUTPUT_ARCH}");
108 if (arch)
109 {
110 ldfile_output_architecture = arch->arch;
111 ldfile_output_machine = arch->mach;
112 ldfile_output_machine_name = arch->printable_name;
113 }
114 else
115 ldfile_output_architecture = bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`;
116 config.dynamic_link = ${DYNAMIC_LINK-true};
117 config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo true ; else echo false ; fi`;
118 }
119
120 EOF
121 fi
122
123 cat >>e${EMULATION_NAME}.c <<EOF
124
125 /* These variables are required to pass information back and forth
126 between after_open and check_needed and stat_needed and vercheck. */
127
128 static struct bfd_link_needed_list *global_needed;
129 static struct stat global_stat;
130 static boolean global_found;
131 static struct bfd_link_needed_list *global_vercheck_needed;
132 static boolean global_vercheck_failed;
133
134
135 /* On Linux, it's possible to have different versions of the same
136 shared library linked against different versions of libc. The
137 dynamic linker somehow tags which libc version to use in
138 /etc/ld.so.cache, and, based on the libc that it sees in the
139 executable, chooses which version of the shared library to use.
140
141 We try to do a similar check here by checking whether this shared
142 library needs any other shared libraries which may conflict with
143 libraries we have already included in the link. If it does, we
144 skip it, and try to find another shared library farther on down the
145 link path.
146
147 This is called via lang_for_each_input_file.
148 GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
149 which we are checking. This sets GLOBAL_VERCHECK_FAILED if we find
150 a conflicting version. */
151
152 static void
153 gld${EMULATION_NAME}_vercheck (s)
154 lang_input_statement_type *s;
155 {
156 const char *soname;
157 struct bfd_link_needed_list *l;
158
159 if (global_vercheck_failed)
160 return;
161 if (s->the_bfd == NULL
162 || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
163 return;
164
165 soname = bfd_elf_get_dt_soname (s->the_bfd);
166 if (soname == NULL)
167 soname = basename (bfd_get_filename (s->the_bfd));
168
169 for (l = global_vercheck_needed; l != NULL; l = l->next)
170 {
171 const char *suffix;
172
173 if (strcmp (soname, l->name) == 0)
174 {
175 /* Probably can't happen, but it's an easy check. */
176 continue;
177 }
178
179 if (strchr (l->name, '/') != NULL)
180 continue;
181
182 suffix = strstr (l->name, ".so.");
183 if (suffix == NULL)
184 continue;
185
186 suffix += sizeof ".so." - 1;
187
188 if (strncmp (soname, l->name, suffix - l->name) == 0)
189 {
190 /* Here we know that S is a dynamic object FOO.SO.VER1, and
191 the object we are considering needs a dynamic object
192 FOO.SO.VER2, and VER1 and VER2 are different. This
193 appears to be a version mismatch, so we tell the caller
194 to try a different version of this library. */
195 global_vercheck_failed = true;
196 return;
197 }
198 }
199 }
200
201
202 /* See if an input file matches a DT_NEEDED entry by running stat on
203 the file. */
204
205 static void
206 gld${EMULATION_NAME}_stat_needed (s)
207 lang_input_statement_type *s;
208 {
209 struct stat st;
210 const char *suffix;
211 const char *soname;
212
213 if (global_found)
214 return;
215 if (s->the_bfd == NULL)
216 return;
217
218 if (bfd_stat (s->the_bfd, &st) != 0)
219 {
220 einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
221 return;
222 }
223
224 if (st.st_dev == global_stat.st_dev
225 && st.st_ino == global_stat.st_ino)
226 {
227 global_found = true;
228 return;
229 }
230
231 /* We issue a warning if it looks like we are including two
232 different versions of the same shared library. For example,
233 there may be a problem if -lc picks up libc.so.6 but some other
234 shared library has a DT_NEEDED entry of libc.so.5. This is a
235 heuristic test, and it will only work if the name looks like
236 NAME.so.VERSION. FIXME: Depending on file names is error-prone.
237 If we really want to issue warnings about mixing version numbers
238 of shared libraries, we need to find a better way. */
239
240 if (strchr (global_needed->name, '/') != NULL)
241 return;
242 suffix = strstr (global_needed->name, ".so.");
243 if (suffix == NULL)
244 return;
245 suffix += sizeof ".so." - 1;
246
247 soname = bfd_elf_get_dt_soname (s->the_bfd);
248 if (soname == NULL)
249 soname = basename (s->filename);
250
251 if (strncmp (soname, global_needed->name, suffix - global_needed->name) == 0)
252 einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
253 global_needed->name, global_needed->by, soname);
254 }
255
256
257 /* This function is called for each possible name for a dynamic object
258 named by a DT_NEEDED entry. The FORCE parameter indicates whether
259 to skip the check for a conflicting version. */
260
261 static boolean
262 gld${EMULATION_NAME}_try_needed (name, force)
263 const char *name;
264 int force;
265 {
266 bfd *abfd;
267 const char *soname;
268
269 abfd = bfd_openr (name, bfd_get_target (output_bfd));
270 if (abfd == NULL)
271 return false;
272 if (! bfd_check_format (abfd, bfd_object))
273 {
274 bfd_close (abfd);
275 return false;
276 }
277 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
278 {
279 bfd_close (abfd);
280 return false;
281 }
282
283 /* Check whether this object would include any conflicting library
284 versions. If FORCE is set, then we skip this check; we use this
285 the second time around, if we couldn't find any compatible
286 instance of the shared library. */
287
288 if (! force)
289 {
290 struct bfd_link_needed_list *needed;
291
292 if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
293 einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
294
295 if (needed != NULL)
296 {
297 global_vercheck_needed = needed;
298 global_vercheck_failed = false;
299 lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
300 if (global_vercheck_failed)
301 {
302 bfd_close (abfd);
303 /* Return false to force the caller to move on to try
304 another file on the search path. */
305 return false;
306 }
307
308 /* But wait! It gets much worse. On Linux, if a shared
309 library does not use libc at all, we are supposed to skip
310 it the first time around in case we encounter a shared
311 library later on with the same name which does use the
312 version of libc that we want. This is much too horrible
313 to use on any system other than Linux. */
314
315 EOF
316 case ${target} in
317 *-*-linux-gnu*)
318 cat >>e${EMULATION_NAME}.c <<EOF
319 {
320 struct bfd_link_needed_list *l;
321
322 for (l = needed; l != NULL; l = l->next)
323 if (strncmp (l->name, "libc.so", 7) == 0)
324 break;
325 if (l == NULL)
326 {
327 bfd_close (abfd);
328 return false;
329 }
330 }
331
332 EOF
333 ;;
334 esac
335 cat >>e${EMULATION_NAME}.c <<EOF
336 }
337 }
338
339 /* We've found a dynamic object matching the DT_NEEDED entry. */
340
341 /* We have already checked that there is no other input file of the
342 same name. We must now check again that we are not including the
343 same file twice. We need to do this because on many systems
344 libc.so is a symlink to, e.g., libc.so.1. The SONAME entry will
345 reference libc.so.1. If we have already included libc.so, we
346 don't want to include libc.so.1 if they are the same file, and we
347 can only check that using stat. */
348
349 if (bfd_stat (abfd, &global_stat) != 0)
350 einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
351
352 /* First strip off everything before the last '/'. */
353 soname = basename (abfd->filename);
354
355 if (trace_file_tries)
356 info_msg (_("found %s at %s\n"), soname, name);
357
358 global_found = false;
359 lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
360 if (global_found)
361 {
362 /* Return true to indicate that we found the file, even though
363 we aren't going to do anything with it. */
364 return true;
365 }
366
367 /* Tell the ELF backend that we don't want the output file to have a
368 DT_NEEDED entry for this file. */
369 bfd_elf_set_dt_needed_name (abfd, "");
370
371 /* Previos basename call was clobbered in lang_for_each_input_file. */
372 soname = basename (abfd->filename);
373
374 /* Tell the ELF backend that the output file needs a DT_NEEDED
375 entry for this file if it is used to resolve the reference in
376 a regular object. */
377 bfd_elf_set_dt_needed_soname (abfd, soname);
378
379 /* Add this file into the symbol table. */
380 if (! bfd_link_add_symbols (abfd, &link_info))
381 einfo ("%F%B: could not read symbols: %E\n", abfd);
382
383 return true;
384 }
385
386
387 /* Search for a needed file in a path. */
388
389 static boolean
390 gld${EMULATION_NAME}_search_needed (path, name, force)
391 const char *path;
392 const char *name;
393 int force;
394 {
395 const char *s;
396 size_t len;
397
398 if (name[0] == '/')
399 return gld${EMULATION_NAME}_try_needed (name, force);
400
401 if (path == NULL || *path == '\0')
402 return false;
403 len = strlen (name);
404 while (1)
405 {
406 char *filename, *sset;
407
408 s = strchr (path, ':');
409 if (s == NULL)
410 s = path + strlen (path);
411
412 filename = (char *) xmalloc (s - path + len + 2);
413 if (s == path)
414 sset = filename;
415 else
416 {
417 memcpy (filename, path, s - path);
418 filename[s - path] = '/';
419 sset = filename + (s - path) + 1;
420 }
421 strcpy (sset, name);
422
423 if (gld${EMULATION_NAME}_try_needed (filename, force))
424 return true;
425
426 free (filename);
427
428 if (*s == '\0')
429 break;
430 path = s + 1;
431 }
432
433 return false;
434 }
435
436 EOF
437 if [ "x${host}" = "x${target}" ] ; then
438 case " ${EMULATION_LIBPATH} " in
439 *" ${EMULATION_NAME} "*)
440 case ${target} in
441 *-*-linux-gnu*)
442 cat >>e${EMULATION_NAME}.c <<EOF
443
444 /* For a native linker, check the file /etc/ld.so.conf for directories
445 in which we may find shared libraries. /etc/ld.so.conf is really
446 only meaningful on Linux. */
447
448 static boolean gld${EMULATION_NAME}_check_ld_so_conf
449 PARAMS ((const char *, int));
450
451 static boolean
452 gld${EMULATION_NAME}_check_ld_so_conf (name, force)
453 const char *name;
454 int force;
455 {
456 static boolean initialized;
457 static char *ld_so_conf;
458
459 if (! initialized)
460 {
461 FILE *f;
462
463 f = fopen ("/etc/ld.so.conf", FOPEN_RT);
464 if (f != NULL)
465 {
466 char *b;
467 size_t len, alloc;
468 int c;
469
470 len = 0;
471 alloc = 100;
472 b = (char *) xmalloc (alloc);
473
474 while ((c = getc (f)) != EOF)
475 {
476 if (len + 1 >= alloc)
477 {
478 alloc *= 2;
479 b = (char *) xrealloc (b, alloc);
480 }
481 if (c != ':'
482 && c != ' '
483 && c != '\t'
484 && c != '\n'
485 && c != ',')
486 {
487 b[len] = c;
488 ++len;
489 }
490 else
491 {
492 if (len > 0 && b[len - 1] != ':')
493 {
494 b[len] = ':';
495 ++len;
496 }
497 }
498 }
499
500 if (len > 0 && b[len - 1] == ':')
501 --len;
502
503 if (len > 0)
504 b[len] = '\0';
505 else
506 {
507 free (b);
508 b = NULL;
509 }
510
511 fclose (f);
512
513 ld_so_conf = b;
514 }
515
516 initialized = true;
517 }
518
519 if (ld_so_conf == NULL)
520 return false;
521
522 return gld${EMULATION_NAME}_search_needed (ld_so_conf, name, force);
523 }
524
525 EOF
526 # Linux
527 ;;
528 esac
529 esac
530 fi
531 cat >>e${EMULATION_NAME}.c <<EOF
532
533 /* See if an input file matches a DT_NEEDED entry by name. */
534
535 static void
536 gld${EMULATION_NAME}_check_needed (s)
537 lang_input_statement_type *s;
538 {
539 if (global_found)
540 return;
541
542 if (s->filename != NULL)
543 {
544 const char *f;
545
546 if (strcmp (s->filename, global_needed->name) == 0)
547 {
548 global_found = true;
549 return;
550 }
551
552 if (s->search_dirs_flag)
553 {
554 f = strrchr (s->filename, '/');
555 if (f != NULL
556 && strcmp (f + 1, global_needed->name) == 0)
557 {
558 global_found = true;
559 return;
560 }
561 }
562 }
563
564 if (s->the_bfd != NULL)
565 {
566 const char *soname;
567
568 soname = bfd_elf_get_dt_soname (s->the_bfd);
569 if (soname != NULL
570 && strcmp (soname, global_needed->name) == 0)
571 {
572 global_found = true;
573 return;
574 }
575 }
576 }
577
578 EOF
579
580 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
581 cat >>e${EMULATION_NAME}.c <<EOF
582
583 /* This is called after all the input files have been opened. */
584
585 static void
586 gld${EMULATION_NAME}_after_open ()
587 {
588 struct bfd_link_needed_list *needed, *l;
589
590 /* We only need to worry about this when doing a final link. */
591 if (link_info.relocateable || link_info.shared)
592 return;
593
594 /* Get the list of files which appear in DT_NEEDED entries in
595 dynamic objects included in the link (often there will be none).
596 For each such file, we want to track down the corresponding
597 library, and include the symbol table in the link. This is what
598 the runtime dynamic linker will do. Tracking the files down here
599 permits one dynamic object to include another without requiring
600 special action by the person doing the link. Note that the
601 needed list can actually grow while we are stepping through this
602 loop. */
603 needed = bfd_elf_get_needed_list (output_bfd, &link_info);
604 for (l = needed; l != NULL; l = l->next)
605 {
606 struct bfd_link_needed_list *ll;
607 int force;
608
609 /* If we've already seen this file, skip it. */
610 for (ll = needed; ll != l; ll = ll->next)
611 if (strcmp (ll->name, l->name) == 0)
612 break;
613 if (ll != l)
614 continue;
615
616 /* See if this file was included in the link explicitly. */
617 global_needed = l;
618 global_found = false;
619 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
620 if (global_found)
621 continue;
622
623 if (trace_file_tries)
624 info_msg (_("%s needed by %B\n"), l->name, l->by);
625
626 /* We need to find this file and include the symbol table. We
627 want to search for the file in the same way that the dynamic
628 linker will search. That means that we want to use
629 rpath_link, rpath, then the environment variable
630 LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
631 entries (native only), then the linker script LIB_SEARCH_DIRS.
632 We do not search using the -L arguments.
633
634 We search twice. The first time, we skip objects which may
635 introduce version mismatches. The second time, we force
636 their use. See gld${EMULATION_NAME}_vercheck comment. */
637 for (force = 0; force < 2; force++)
638 {
639 size_t len;
640 search_dirs_type *search;
641 EOF
642 if [ "x${host}" = "x${target}" ] ; then
643 case " ${EMULATION_LIBPATH} " in
644 *" ${EMULATION_NAME} "*)
645 cat >>e${EMULATION_NAME}.c <<EOF
646 const char *lib_path;
647 struct bfd_link_needed_list *rp;
648 int found;
649 EOF
650 ;;
651 esac
652 fi
653 cat >>e${EMULATION_NAME}.c <<EOF
654
655 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
656 l->name, force))
657 break;
658 EOF
659 if [ "x${host}" = "x${target}" ] ; then
660 case " ${EMULATION_LIBPATH} " in
661 *" ${EMULATION_NAME} "*)
662 cat >>e${EMULATION_NAME}.c <<EOF
663 if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
664 l->name, force))
665 break;
666 if (command_line.rpath_link == NULL
667 && command_line.rpath == NULL)
668 {
669 lib_path = (const char *) getenv ("LD_RUN_PATH");
670 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name,
671 force))
672 break;
673 }
674 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
675 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, force))
676 break;
677
678 found = 0;
679 rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
680 for (; !found && rp != NULL; rp = rp->next)
681 {
682 found = (rp->by == l->by
683 && gld${EMULATION_NAME}_search_needed (rp->name,
684 l->name,
685 force));
686 }
687 if (found)
688 break;
689
690 EOF
691 ;;
692 esac
693 fi
694 cat >>e${EMULATION_NAME}.c <<EOF
695 len = strlen (l->name);
696 for (search = search_head; search != NULL; search = search->next)
697 {
698 char *filename;
699
700 if (search->cmdline)
701 continue;
702 filename = (char *) xmalloc (strlen (search->name) + len + 2);
703 sprintf (filename, "%s/%s", search->name, l->name);
704 if (gld${EMULATION_NAME}_try_needed (filename, force))
705 break;
706 free (filename);
707 }
708 if (search != NULL)
709 break;
710 EOF
711 if [ "x${host}" = "x${target}" ] ; then
712 case " ${EMULATION_LIBPATH} " in
713 *" ${EMULATION_NAME} "*)
714 case ${target} in
715 *-*-linux-gnu*)
716 cat >>e${EMULATION_NAME}.c <<EOF
717 if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
718 break;
719 EOF
720 # Linux
721 ;;
722 esac
723 ;;
724 esac
725 fi
726 cat >>e${EMULATION_NAME}.c <<EOF
727 }
728
729 if (force < 2)
730 continue;
731
732 einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
733 l->name, l->by);
734 }
735 }
736
737 EOF
738 fi
739
740 cat >>e${EMULATION_NAME}.c <<EOF
741
742 /* Look through an expression for an assignment statement. */
743
744 static void
745 gld${EMULATION_NAME}_find_exp_assignment (exp)
746 etree_type *exp;
747 {
748 struct bfd_link_hash_entry *h;
749
750 switch (exp->type.node_class)
751 {
752 case etree_provide:
753 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
754 false, false, false);
755 if (h == NULL)
756 break;
757
758 /* We call record_link_assignment even if the symbol is defined.
759 This is because if it is defined by a dynamic object, we
760 actually want to use the value defined by the linker script,
761 not the value from the dynamic object (because we are setting
762 symbols like etext). If the symbol is defined by a regular
763 object, then, as it happens, calling record_link_assignment
764 will do no harm. */
765
766 /* Fall through. */
767 case etree_assign:
768 if (strcmp (exp->assign.dst, ".") != 0)
769 {
770 if (! (bfd_elf${ELFSIZE}_record_link_assignment
771 (output_bfd, &link_info, exp->assign.dst,
772 exp->type.node_class == etree_provide ? true : false)))
773 einfo ("%P%F: failed to record assignment to %s: %E\n",
774 exp->assign.dst);
775 }
776 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
777 break;
778
779 case etree_binary:
780 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
781 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
782 break;
783
784 case etree_trinary:
785 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
786 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
787 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
788 break;
789
790 case etree_unary:
791 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
792 break;
793
794 default:
795 break;
796 }
797 }
798
799
800 /* This is called by the before_allocation routine via
801 lang_for_each_statement. It locates any assignment statements, and
802 tells the ELF backend about them, in case they are assignments to
803 symbols which are referred to by dynamic objects. */
804
805 static void
806 gld${EMULATION_NAME}_find_statement_assignment (s)
807 lang_statement_union_type *s;
808 {
809 if (s->header.type == lang_assignment_statement_enum)
810 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
811 }
812
813 EOF
814
815 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
816 if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
817 ELF_INTERPRETER_SET_DEFAULT="
818 if (sinterp != NULL)
819 {
820 sinterp->contents = ${ELF_INTERPRETER_NAME};
821 sinterp->_raw_size = strlen (sinterp->contents) + 1;
822 }
823
824 "
825 else
826 ELF_INTERPRETER_SET_DEFAULT=
827 fi
828 cat >>e${EMULATION_NAME}.c <<EOF
829
830 /* This is called after the sections have been attached to output
831 sections, but before any sizes or addresses have been set. */
832
833 static void
834 gld${EMULATION_NAME}_before_allocation ()
835 {
836 const char *rpath;
837 asection *sinterp;
838
839 /* If we are going to make any variable assignments, we need to let
840 the ELF backend know about them in case the variables are
841 referred to by dynamic objects. */
842 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
843
844 /* Let the ELF backend work out the sizes of any sections required
845 by dynamic linking. */
846 rpath = command_line.rpath;
847 if (rpath == NULL)
848 rpath = (const char *) getenv ("LD_RUN_PATH");
849 if (! (bfd_elf${ELFSIZE}_size_dynamic_sections
850 (output_bfd, command_line.soname, rpath,
851 command_line.filter_shlib,
852 (const char * const *) command_line.auxiliary_filters,
853 &link_info, &sinterp, lang_elf_version_info)))
854 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
855 ${ELF_INTERPRETER_SET_DEFAULT}
856 /* Let the user override the dynamic linker we are using. */
857 if (command_line.interpreter != NULL
858 && sinterp != NULL)
859 {
860 sinterp->contents = (bfd_byte *) command_line.interpreter;
861 sinterp->_raw_size = strlen (command_line.interpreter) + 1;
862 }
863
864 /* Look for any sections named .gnu.warning. As a GNU extensions,
865 we treat such sections as containing warning messages. We print
866 out the warning message, and then zero out the section size so
867 that it does not get copied into the output file. */
868
869 {
870 LANG_FOR_EACH_INPUT_STATEMENT (is)
871 {
872 asection *s;
873 bfd_size_type sz;
874 char *msg;
875 boolean ret;
876
877 if (is->just_syms_flag)
878 continue;
879
880 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
881 if (s == NULL)
882 continue;
883
884 sz = bfd_section_size (is->the_bfd, s);
885 msg = xmalloc ((size_t) sz + 1);
886 if (! bfd_get_section_contents (is->the_bfd, s, msg, (file_ptr) 0, sz))
887 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
888 is->the_bfd);
889 msg[sz] = '\0';
890 ret = link_info.callbacks->warning (&link_info, msg,
891 (const char *) NULL,
892 is->the_bfd, (asection *) NULL,
893 (bfd_vma) 0);
894 ASSERT (ret);
895 free (msg);
896
897 /* Clobber the section size, so that we don't waste copying the
898 warning into the output file. */
899 s->_raw_size = 0;
900 }
901 }
902 }
903
904 EOF
905 fi
906
907 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
908 cat >>e${EMULATION_NAME}.c <<EOF
909
910 /* Try to open a dynamic archive. This is where we know that ELF
911 dynamic libraries have an extension of .so (or .sl on oddball systems
912 like hpux). */
913
914 static boolean
915 gld${EMULATION_NAME}_open_dynamic_archive (arch, search, entry)
916 const char *arch;
917 search_dirs_type *search;
918 lang_input_statement_type *entry;
919 {
920 const char *filename;
921 char *string;
922
923 if (! entry->is_archive)
924 return false;
925
926 filename = entry->filename;
927
928 /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
929 is defined, but it does not seem worth the headache to optimize
930 away those two bytes of space. */
931 string = (char *) xmalloc (strlen (search->name)
932 + strlen (filename)
933 + strlen (arch)
934 #ifdef EXTRA_SHLIB_EXTENSION
935 + strlen (EXTRA_SHLIB_EXTENSION)
936 #endif
937 + sizeof "/lib.so");
938
939 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
940
941 #ifdef EXTRA_SHLIB_EXTENSION
942 /* Try the .so extension first. If that fails build a new filename
943 using EXTRA_SHLIB_EXTENSION. */
944 if (! ldfile_try_open_bfd (string, entry))
945 sprintf (string, "%s/lib%s%s%s", search->name,
946 filename, arch, EXTRA_SHLIB_EXTENSION);
947 #endif
948
949 if (! ldfile_try_open_bfd (string, entry))
950 {
951 free (string);
952 return false;
953 }
954
955 entry->filename = string;
956
957 /* We have found a dynamic object to include in the link. The ELF
958 backend linker will create a DT_NEEDED entry in the .dynamic
959 section naming this file. If this file includes a DT_SONAME
960 entry, it will be used. Otherwise, the ELF linker will just use
961 the name of the file. For an archive found by searching, like
962 this one, the DT_NEEDED entry should consist of just the name of
963 the file, without the path information used to find it. Note
964 that we only need to do this if we have a dynamic object; an
965 archive will never be referenced by a DT_NEEDED entry.
966
967 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
968 very pretty. I haven't been able to think of anything that is
969 pretty, though. */
970 if (bfd_check_format (entry->the_bfd, bfd_object)
971 && (entry->the_bfd->flags & DYNAMIC) != 0)
972 {
973 ASSERT (entry->is_archive && entry->search_dirs_flag);
974
975 /* Rather than duplicating the logic above. Just use the
976 filename we recorded earlier. */
977
978 filename = xstrdup (basename (entry->filename));
979 bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
980 }
981
982 return true;
983 }
984
985 EOF
986 fi
987
988 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
989 cat >>e${EMULATION_NAME}.c <<EOF
990
991 /* A variant of lang_output_section_find. Used by place_orphan. */
992
993 static lang_output_section_statement_type *
994 output_rel_find ()
995 {
996 lang_statement_union_type *u;
997 lang_output_section_statement_type *lookup;
998
999 for (u = lang_output_section_statement.head;
1000 u != (lang_statement_union_type *) NULL;
1001 u = lookup->next)
1002 {
1003 lookup = &u->output_section_statement;
1004 if (strncmp (".rel", lookup->name, 4) == 0
1005 && lookup->bfd_section != NULL
1006 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1007 {
1008 return lookup;
1009 }
1010 }
1011 return (lang_output_section_statement_type *) NULL;
1012 }
1013
1014 /* Find the last output section before given output statement.
1015 Used by place_orphan. */
1016
1017 static asection *
1018 output_prev_sec_find (os)
1019 lang_output_section_statement_type *os;
1020 {
1021 asection *s = (asection *) NULL;
1022 lang_statement_union_type *u;
1023 lang_output_section_statement_type *lookup;
1024
1025 for (u = lang_output_section_statement.head;
1026 u != (lang_statement_union_type *) NULL;
1027 u = lookup->next)
1028 {
1029 lookup = &u->output_section_statement;
1030 if (lookup == os)
1031 return s;
1032
1033 if (lookup->bfd_section != NULL && lookup->bfd_section->owner != NULL)
1034 s = lookup->bfd_section;
1035 }
1036
1037 return NULL;
1038 }
1039
1040 /* Place an orphan section. We use this to put random SHF_ALLOC
1041 sections in the right segment. */
1042
1043 struct orphan_save {
1044 lang_output_section_statement_type *os;
1045 asection **section;
1046 lang_statement_union_type **stmt;
1047 };
1048
1049 static boolean
1050 gld${EMULATION_NAME}_place_orphan (file, s)
1051 lang_input_statement_type *file;
1052 asection *s;
1053 {
1054 static struct orphan_save hold_text;
1055 static struct orphan_save hold_rodata;
1056 static struct orphan_save hold_data;
1057 static struct orphan_save hold_bss;
1058 static struct orphan_save hold_rel;
1059 static struct orphan_save hold_interp;
1060 static struct orphan_save hold_sdata;
1061 static int count = 1;
1062 struct orphan_save *place;
1063 lang_statement_list_type *old;
1064 lang_statement_list_type add;
1065 etree_type *address;
1066 const char *secname;
1067 const char *outsecname;
1068 const char *ps = NULL;
1069 lang_output_section_statement_type *os;
1070
1071 secname = bfd_get_section_name (s->owner, s);
1072
1073 if (! config.unique_orphan_sections && ! unique_section_p (secname))
1074 {
1075 /* Look through the script to see where to place this section. */
1076 os = lang_output_section_find (secname);
1077
1078 if (os != NULL
1079 && (os->bfd_section == NULL
1080 || ((s->flags ^ os->bfd_section->flags)
1081 & (SEC_LOAD | SEC_ALLOC)) == 0))
1082 {
1083 /* We already have an output section statement with this
1084 name, and its bfd section, if any, has compatible flags. */
1085 lang_add_section (&os->children, s, os, file);
1086 return true;
1087 }
1088 }
1089
1090 if (hold_text.os == NULL)
1091 hold_text.os = lang_output_section_find (".text");
1092
1093 /* If this is a final link, then always put .gnu.warning.SYMBOL
1094 sections into the .text section to get them out of the way. */
1095 if (! link_info.shared
1096 && ! link_info.relocateable
1097 && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
1098 && hold_text.os != NULL)
1099 {
1100 lang_add_section (&hold_text.os->children, s, hold_text.os, file);
1101 return true;
1102 }
1103
1104 /* Decide which segment the section should go in based on the
1105 section name and section flags. We put loadable .note sections
1106 right after the .interp section, so that the PT_NOTE segment is
1107 stored right after the program headers where the OS can read it
1108 in the first page. */
1109 #define HAVE_SECTION(hold, name) \
1110 (hold.os != NULL || (hold.os = lang_output_section_find (name)) != NULL)
1111
1112 if (s->flags & SEC_EXCLUDE)
1113 {
1114 if (s->output_section == NULL)
1115 s->output_section = bfd_abs_section_ptr;
1116 return true;
1117 }
1118
1119 place = NULL;
1120 if ((s->flags & SEC_ALLOC) == 0)
1121 ;
1122 else if ((s->flags & SEC_LOAD) != 0
1123 && strncmp (secname, ".note", 5) == 0
1124 && HAVE_SECTION (hold_interp, ".interp"))
1125 place = &hold_interp;
1126 else if ((s->flags & SEC_HAS_CONTENTS) == 0
1127 && HAVE_SECTION (hold_bss, ".bss"))
1128 place = &hold_bss;
1129 else if ((s->flags & SEC_SMALL_DATA) != 0
1130 && HAVE_SECTION (hold_sdata, ".sdata"))
1131 place = &hold_sdata;
1132 else if ((s->flags & SEC_READONLY) == 0
1133 && HAVE_SECTION (hold_data, ".data"))
1134 place = &hold_data;
1135 else if (strncmp (secname, ".rel", 4) == 0
1136 && (hold_rel.os != NULL
1137 || (hold_rel.os = output_rel_find ()) != NULL))
1138 place = &hold_rel;
1139 else if ((s->flags & (SEC_CODE | SEC_READONLY)) == SEC_READONLY
1140 && HAVE_SECTION (hold_rodata, ".rodata"))
1141 place = &hold_rodata;
1142 else if ((s->flags & (SEC_CODE | SEC_READONLY)) == (SEC_CODE | SEC_READONLY)
1143 && hold_text.os != NULL)
1144 place = &hold_text;
1145
1146 #undef HAVE_SECTION
1147
1148 /* Choose a unique name for the section. This will be needed if the
1149 same section name appears in the input file with different
1150 loadable or allocatable characteristics. */
1151 outsecname = secname;
1152 if (bfd_get_section_by_name (output_bfd, outsecname) != NULL)
1153 {
1154 outsecname = bfd_get_unique_section_name (output_bfd,
1155 outsecname,
1156 &count);
1157 if (outsecname == NULL)
1158 einfo ("%F%P: place_orphan failed: %E\n");
1159 }
1160
1161 /* Start building a list of statements for this section.
1162 First save the current statement pointer. */
1163 old = stat_ptr;
1164
1165 /* If we have found an appropriate place for the output section
1166 statements for this orphan, add them to our own private list,
1167 inserting them later into the global statement list. */
1168 if (place != NULL)
1169 {
1170 stat_ptr = &add;
1171 lang_list_init (stat_ptr);
1172 }
1173
1174 if (config.build_constructors)
1175 {
1176 /* If the name of the section is representable in C, then create
1177 symbols to mark the start and the end of the section. */
1178 for (ps = outsecname; *ps != '\0'; ps++)
1179 if (! isalnum ((unsigned char) *ps) && *ps != '_')
1180 break;
1181 if (*ps == '\0')
1182 {
1183 char *symname;
1184 etree_type *e_align;
1185
1186 symname = (char *) xmalloc (ps - outsecname + sizeof "__start_");
1187 sprintf (symname, "__start_%s", outsecname);
1188 e_align = exp_unop (ALIGN_K,
1189 exp_intop ((bfd_vma) 1 << s->alignment_power));
1190 lang_add_assignment (exp_assop ('=', symname, e_align));
1191 }
1192 }
1193
1194 if (link_info.relocateable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
1195 address = exp_intop ((bfd_vma) 0);
1196 else
1197 address = NULL;
1198
1199 os = lang_enter_output_section_statement (outsecname, address, 0,
1200 (bfd_vma) 0,
1201 (etree_type *) NULL,
1202 (etree_type *) NULL,
1203 (etree_type *) NULL);
1204
1205 lang_add_section (&os->children, s, os, file);
1206
1207 lang_leave_output_section_statement
1208 ((bfd_vma) 0, "*default*",
1209 (struct lang_output_section_phdr_list *) NULL, "*default*");
1210
1211 if (config.build_constructors && *ps == '\0')
1212 {
1213 char *symname;
1214
1215 /* lang_leave_ouput_section_statement resets stat_ptr. Put
1216 stat_ptr back where we want it. */
1217 if (place != NULL)
1218 stat_ptr = &add;
1219
1220 symname = (char *) xmalloc (ps - outsecname + sizeof "__stop_");
1221 sprintf (symname, "__stop_%s", outsecname);
1222 lang_add_assignment (exp_assop ('=', symname,
1223 exp_nameop (NAME, ".")));
1224 }
1225
1226 /* Restore the global list pointer. */
1227 stat_ptr = old;
1228
1229 if (place != NULL)
1230 {
1231 asection *snew, **pps;
1232
1233 snew = os->bfd_section;
1234
1235 /* Shuffle the bfd section list to make the output file look
1236 neater. This is really only cosmetic. */
1237 if (place->section == NULL)
1238 {
1239 asection *bfd_section = place->os->bfd_section;
1240
1241 /* If the output statement hasn't been used to place
1242 any input sections (and thus doesn't have an output
1243 bfd_section), look for the closest prior output statement
1244 having an output section. */
1245 if (bfd_section == NULL)
1246 bfd_section = output_prev_sec_find (place->os);
1247
1248 if (bfd_section != NULL && bfd_section != snew)
1249 place->section = &bfd_section->next;
1250 }
1251
1252 if (place->section != NULL)
1253 {
1254 /* Unlink the section. */
1255 for (pps = &output_bfd->sections; *pps != snew; pps = &(*pps)->next)
1256 ;
1257 *pps = snew->next;
1258
1259 /* Now tack it on to the "place->os" section list. */
1260 snew->next = *place->section;
1261 *place->section = snew;
1262 }
1263
1264 /* Save the end of this list. Further ophans of this type will
1265 follow the one we've just added. */
1266 place->section = &snew->next;
1267
1268 /* The following is non-cosmetic. We try to put the output
1269 statements in some sort of reasonable order here, because
1270 they determine the final load addresses of the orphan
1271 sections. In addition, placing output statements in the
1272 wrong order may require extra segments. For instance,
1273 given a typical situation of all read-only sections placed
1274 in one segment and following that a segment containing all
1275 the read-write sections, we wouldn't want to place an orphan
1276 read/write section before or amongst the read-only ones. */
1277 if (add.head != NULL)
1278 {
1279 if (place->stmt == NULL)
1280 {
1281 /* Put the new statement list right at the head. */
1282 *add.tail = place->os->header.next;
1283 place->os->header.next = add.head;
1284 }
1285 else
1286 {
1287 /* Put it after the last orphan statement we added. */
1288 *add.tail = *place->stmt;
1289 *place->stmt = add.head;
1290 }
1291
1292 /* Fix the global list pointer if we happened to tack our
1293 new list at the tail. */
1294 if (*old->tail == add.head)
1295 old->tail = add.tail;
1296
1297 /* Save the end of this list. */
1298 place->stmt = add.tail;
1299 }
1300 }
1301
1302 return true;
1303 }
1304
1305 EOF
1306 fi
1307
1308 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1309 cat >>e${EMULATION_NAME}.c <<EOF
1310
1311 static char *
1312 gld${EMULATION_NAME}_get_script (isfile)
1313 int *isfile;
1314 EOF
1315
1316 if test -n "$COMPILE_IN"
1317 then
1318 # Scripts compiled in.
1319
1320 # sed commands to quote an ld script as a C string.
1321 sc="-f stringify.sed"
1322
1323 cat >>e${EMULATION_NAME}.c <<EOF
1324 {
1325 *isfile = 0;
1326
1327 if (link_info.relocateable == true && config.build_constructors == true)
1328 return
1329 EOF
1330 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1331 echo ' ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c
1332 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1333 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1334 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1335 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1336 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1337
1338 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1339 echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c
1340 sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
1341 fi
1342
1343 echo ' ; else return' >> e${EMULATION_NAME}.c
1344 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1345 echo '; }' >> e${EMULATION_NAME}.c
1346
1347 else
1348 # Scripts read from the filesystem.
1349
1350 cat >>e${EMULATION_NAME}.c <<EOF
1351 {
1352 *isfile = 1;
1353
1354 if (link_info.relocateable == true && config.build_constructors == true)
1355 return "ldscripts/${EMULATION_NAME}.xu";
1356 else if (link_info.relocateable == true)
1357 return "ldscripts/${EMULATION_NAME}.xr";
1358 else if (!config.text_read_only)
1359 return "ldscripts/${EMULATION_NAME}.xbn";
1360 else if (!config.magic_demand_paged)
1361 return "ldscripts/${EMULATION_NAME}.xn";
1362 else if (link_info.shared)
1363 return "ldscripts/${EMULATION_NAME}.xs";
1364 else
1365 return "ldscripts/${EMULATION_NAME}.x";
1366 }
1367
1368 EOF
1369 fi
1370 fi
1371
1372 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1373
1374 if test x"$LDEMUL_PARSE_ARGS" != xgld"$EMULATION_NAME"_parse_args; then
1375
1376 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1377 cat >>e${EMULATION_NAME}.c <<EOF
1378 $PARSE_AND_LIST_PROLOGUE
1379 EOF
1380 fi
1381
1382 cat >>e${EMULATION_NAME}.c <<EOF
1383
1384 #include "getopt.h"
1385
1386 #define OPTION_DISABLE_NEW_DTAGS (400)
1387 #define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
1388 #define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
1389
1390 static struct option longopts[] =
1391 {
1392 EOF
1393
1394 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1395 cat >>e${EMULATION_NAME}.c <<EOF
1396 /* getopt allows abbreviations, so we do this to stop it from
1397 treating -d/-e as abbreviations for these options. */
1398 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1399 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1400 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1401 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1402 {"Bgroup", no_argument, NULL, OPTION_GROUP},
1403 {"Bgroup", no_argument, NULL, OPTION_GROUP},
1404 EOF
1405 fi
1406
1407 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
1408 cat >>e${EMULATION_NAME}.c <<EOF
1409 $PARSE_AND_LIST_LONGOPTS
1410 EOF
1411 fi
1412
1413 cat >>e${EMULATION_NAME}.c <<EOF
1414 {NULL, no_argument, NULL, 0}
1415 };
1416
1417
1418 static int gld${EMULATION_NAME}_parse_args PARAMS ((int, char **));
1419
1420 static int
1421 gld${EMULATION_NAME}_parse_args (argc, argv)
1422 int argc;
1423 char ** argv;
1424 {
1425 int longind;
1426 int optc;
1427 static int prevoptind = -1;
1428 int prevopterr = opterr;
1429 int wanterror;
1430
1431 if (prevoptind != optind)
1432 opterr = 0;
1433
1434 wanterror = opterr;
1435 prevoptind = optind;
1436
1437 optc = getopt_long_only (argc, argv,
1438 "-${PARSE_AND_LIST_SHORTOPTS}z:", longopts,
1439 &longind);
1440 opterr = prevopterr;
1441
1442 switch (optc)
1443 {
1444 default:
1445 if (wanterror)
1446 xexit (1);
1447 optind = prevoptind;
1448 return 0;
1449
1450 EOF
1451
1452 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1453 cat >>e${EMULATION_NAME}.c <<EOF
1454 case OPTION_DISABLE_NEW_DTAGS:
1455 link_info.new_dtags = false;
1456 break;
1457
1458 case OPTION_ENABLE_NEW_DTAGS:
1459 link_info.new_dtags = true;
1460 break;
1461
1462 case OPTION_GROUP:
1463 link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
1464 /* Groups must be self-contained. */
1465 link_info.no_undefined = true;
1466 break;
1467
1468 case 'z':
1469 if (strcmp (optarg, "initfirst") == 0)
1470 link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
1471 else if (strcmp (optarg, "interpose") == 0)
1472 link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
1473 else if (strcmp (optarg, "loadfltr") == 0)
1474 link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
1475 else if (strcmp (optarg, "nodefaultlib") == 0)
1476 link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
1477 else if (strcmp (optarg, "nodelete") == 0)
1478 link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
1479 else if (strcmp (optarg, "nodlopen") == 0)
1480 link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
1481 else if (strcmp (optarg, "nodump") == 0)
1482 link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
1483 else if (strcmp (optarg, "now") == 0)
1484 {
1485 link_info.flags |= (bfd_vma) DF_BIND_NOW;
1486 link_info.flags_1 |= (bfd_vma) DF_1_NOW;
1487 }
1488 else if (strcmp (optarg, "origin") == 0)
1489 {
1490 link_info.flags |= (bfd_vma) DF_ORIGIN;
1491 link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
1492 }
1493 else if (strcmp (optarg, "defs") == 0)
1494 link_info.no_undefined = true;
1495 /* What about the other Solaris -z options? FIXME. */
1496 break;
1497 EOF
1498 fi
1499
1500 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
1501 cat >>e${EMULATION_NAME}.c <<EOF
1502 $PARSE_AND_LIST_ARGS_CASES
1503 EOF
1504 fi
1505
1506 cat >>e${EMULATION_NAME}.c <<EOF
1507 }
1508
1509 return 1;
1510 }
1511
1512 EOF
1513 fi
1514
1515 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1516 cat >>e${EMULATION_NAME}.c <<EOF
1517
1518 static void gld${EMULATION_NAME}_list_options PARAMS ((FILE * file));
1519
1520 static void
1521 gld${EMULATION_NAME}_list_options (file)
1522 FILE * file;
1523 {
1524 EOF
1525
1526 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1527 cat >>e${EMULATION_NAME}.c <<EOF
1528 fprintf (file, _(" -Bgroup\t\tSelects group name lookup rules for DSO\n"));
1529 fprintf (file, _(" --disable-new-dtags\tDisable new dynamic tags\n"));
1530 fprintf (file, _(" --enable-new-dtags\tEnable new dynamic tags\n"));
1531 fprintf (file, _(" -z defs\t\tDisallows undefined symbols\n"));
1532 fprintf (file, _(" -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
1533 fprintf (file, _(" -z interpose\t\tMark object to interpose all DSOs but executable\n"));
1534 fprintf (file, _(" -z loadfltr\t\tMark object requiring immediate process\n"));
1535 fprintf (file, _(" -z nodefaultlib\tMark object not to use default search paths\n"));
1536 fprintf (file, _(" -z nodelete\t\tMark DSO non-deletable at runtime\n"));
1537 fprintf (file, _(" -z nodlopen\t\tMark DSO not available to dlopen\n"));
1538 fprintf (file, _(" -z nodump\t\tMark DSO not available to dldump\n"));
1539 fprintf (file, _(" -z now\t\tMark object non-lazy runtime binding\n"));
1540 fprintf (file, _(" -z origin\t\tMark object requiring immediate \$ORIGIN processing\n"));
1541 fprintf (file, _("\t\t\t at runtime\n"));
1542 fprintf (file, _(" -z KEYWORD\t\tIgnored for Solaris compatibility\n"));
1543 EOF
1544 fi
1545
1546 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
1547 cat >>e${EMULATION_NAME}.c <<EOF
1548 $PARSE_AND_LIST_OPTIONS
1549 EOF
1550 fi
1551
1552 cat >>e${EMULATION_NAME}.c <<EOF
1553 }
1554 EOF
1555
1556 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
1557 cat >>e${EMULATION_NAME}.c <<EOF
1558 $PARSE_AND_LIST_EPILOGUE
1559 EOF
1560 fi
1561 fi
1562 else
1563 if test x"$LDEMUL_PARSE_ARGS" != xgld"$EMULATION_NAME"_parse_args; then
1564 cat >>e${EMULATION_NAME}.c <<EOF
1565 #define gld${EMULATION_NAME}_parse_args NULL
1566 EOF
1567 fi
1568 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1569 cat >>e${EMULATION_NAME}.c <<EOF
1570 #define gld${EMULATION_NAME}_list_options NULL
1571 EOF
1572 fi
1573 fi
1574
1575 cat >>e${EMULATION_NAME}.c <<EOF
1576
1577 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1578 {
1579 ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
1580 ${LDEMUL_SYSLIB-syslib_default},
1581 ${LDEMUL_HLL-hll_default},
1582 ${LDEMUL_AFTER_PARSE-after_parse_default},
1583 ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
1584 ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
1585 ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
1586 ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
1587 ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
1588 ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
1589 "${EMULATION_NAME}",
1590 "${OUTPUT_FORMAT}",
1591 ${LDEMUL_FINISH-NULL},
1592 ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
1593 ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
1594 ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
1595 ${LDEMUL_SET_SYMBOLS-NULL},
1596 ${LDEMUL_PARSE_ARGS-gld${EMULATION_NAME}_parse_args},
1597 ${LDEMUL_UNRECOGNIZED_FILE-NULL},
1598 ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
1599 ${LDEMUL_RECOGNIZED_FILE-NULL},
1600 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
1601 };
1602 EOF