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