* elf-bfd.h (enum elf_reloc_type_class): New.
[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 {
1139 if (! link_info.relocateable && link_info.combreloc)
1140 {
1141 if (strncmp (secname, ".rela", 5) == 0)
1142 os = lang_output_section_find (".rela.dyn");
1143 else
1144 os = lang_output_section_find (".rel.dyn");
1145
1146 if (os != NULL
1147 && os->bfd_section != NULL
1148 && ((s->flags ^ os->bfd_section->flags)
1149 & (SEC_LOAD | SEC_ALLOC)) == 0)
1150 {
1151 lang_add_section (&os->children, s, os, file);
1152 return true;
1153 }
1154 }
1155 place = &hold_rel;
1156 }
1157 else if ((s->flags & (SEC_CODE | SEC_READONLY)) == SEC_READONLY
1158 && HAVE_SECTION (hold_rodata, ".rodata"))
1159 place = &hold_rodata;
1160 else if ((s->flags & (SEC_CODE | SEC_READONLY)) == (SEC_CODE | SEC_READONLY)
1161 && hold_text.os != NULL)
1162 place = &hold_text;
1163
1164 #undef HAVE_SECTION
1165
1166 /* Choose a unique name for the section. This will be needed if the
1167 same section name appears in the input file with different
1168 loadable or allocatable characteristics. */
1169 outsecname = secname;
1170 if (bfd_get_section_by_name (output_bfd, outsecname) != NULL)
1171 {
1172 outsecname = bfd_get_unique_section_name (output_bfd,
1173 outsecname,
1174 &count);
1175 if (outsecname == NULL)
1176 einfo ("%F%P: place_orphan failed: %E\n");
1177 }
1178
1179 /* Start building a list of statements for this section.
1180 First save the current statement pointer. */
1181 old = stat_ptr;
1182
1183 /* If we have found an appropriate place for the output section
1184 statements for this orphan, add them to our own private list,
1185 inserting them later into the global statement list. */
1186 if (place != NULL)
1187 {
1188 stat_ptr = &add;
1189 lang_list_init (stat_ptr);
1190 }
1191
1192 if (config.build_constructors)
1193 {
1194 /* If the name of the section is representable in C, then create
1195 symbols to mark the start and the end of the section. */
1196 for (ps = outsecname; *ps != '\0'; ps++)
1197 if (! isalnum ((unsigned char) *ps) && *ps != '_')
1198 break;
1199 if (*ps == '\0')
1200 {
1201 char *symname;
1202 etree_type *e_align;
1203
1204 symname = (char *) xmalloc (ps - outsecname + sizeof "__start_");
1205 sprintf (symname, "__start_%s", outsecname);
1206 e_align = exp_unop (ALIGN_K,
1207 exp_intop ((bfd_vma) 1 << s->alignment_power));
1208 lang_add_assignment (exp_assop ('=', symname, e_align));
1209 }
1210 }
1211
1212 if (link_info.relocateable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
1213 address = exp_intop ((bfd_vma) 0);
1214 else
1215 address = NULL;
1216
1217 os = lang_enter_output_section_statement (outsecname, address, 0,
1218 (bfd_vma) 0,
1219 (etree_type *) NULL,
1220 (etree_type *) NULL,
1221 (etree_type *) NULL);
1222
1223 lang_add_section (&os->children, s, os, file);
1224
1225 lang_leave_output_section_statement
1226 ((bfd_vma) 0, "*default*",
1227 (struct lang_output_section_phdr_list *) NULL, "*default*");
1228
1229 if (config.build_constructors && *ps == '\0')
1230 {
1231 char *symname;
1232
1233 /* lang_leave_ouput_section_statement resets stat_ptr. Put
1234 stat_ptr back where we want it. */
1235 if (place != NULL)
1236 stat_ptr = &add;
1237
1238 symname = (char *) xmalloc (ps - outsecname + sizeof "__stop_");
1239 sprintf (symname, "__stop_%s", outsecname);
1240 lang_add_assignment (exp_assop ('=', symname,
1241 exp_nameop (NAME, ".")));
1242 }
1243
1244 /* Restore the global list pointer. */
1245 stat_ptr = old;
1246
1247 if (place != NULL)
1248 {
1249 asection *snew, **pps;
1250
1251 snew = os->bfd_section;
1252
1253 /* Shuffle the bfd section list to make the output file look
1254 neater. This is really only cosmetic. */
1255 if (place->section == NULL)
1256 {
1257 asection *bfd_section = place->os->bfd_section;
1258
1259 /* If the output statement hasn't been used to place
1260 any input sections (and thus doesn't have an output
1261 bfd_section), look for the closest prior output statement
1262 having an output section. */
1263 if (bfd_section == NULL)
1264 bfd_section = output_prev_sec_find (place->os);
1265
1266 if (bfd_section != NULL && bfd_section != snew)
1267 place->section = &bfd_section->next;
1268 }
1269
1270 if (place->section != NULL)
1271 {
1272 /* Unlink the section. */
1273 for (pps = &output_bfd->sections; *pps != snew; pps = &(*pps)->next)
1274 ;
1275 *pps = snew->next;
1276
1277 /* Now tack it on to the "place->os" section list. */
1278 snew->next = *place->section;
1279 *place->section = snew;
1280 }
1281
1282 /* Save the end of this list. Further ophans of this type will
1283 follow the one we've just added. */
1284 place->section = &snew->next;
1285
1286 /* The following is non-cosmetic. We try to put the output
1287 statements in some sort of reasonable order here, because
1288 they determine the final load addresses of the orphan
1289 sections. In addition, placing output statements in the
1290 wrong order may require extra segments. For instance,
1291 given a typical situation of all read-only sections placed
1292 in one segment and following that a segment containing all
1293 the read-write sections, we wouldn't want to place an orphan
1294 read/write section before or amongst the read-only ones. */
1295 if (add.head != NULL)
1296 {
1297 if (place->stmt == NULL)
1298 {
1299 /* Put the new statement list right at the head. */
1300 *add.tail = place->os->header.next;
1301 place->os->header.next = add.head;
1302 }
1303 else
1304 {
1305 /* Put it after the last orphan statement we added. */
1306 *add.tail = *place->stmt;
1307 *place->stmt = add.head;
1308 }
1309
1310 /* Fix the global list pointer if we happened to tack our
1311 new list at the tail. */
1312 if (*old->tail == add.head)
1313 old->tail = add.tail;
1314
1315 /* Save the end of this list. */
1316 place->stmt = add.tail;
1317 }
1318 }
1319
1320 return true;
1321 }
1322
1323 EOF
1324 fi
1325
1326 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1327 cat >>e${EMULATION_NAME}.c <<EOF
1328
1329 static char *
1330 gld${EMULATION_NAME}_get_script (isfile)
1331 int *isfile;
1332 EOF
1333
1334 if test -n "$COMPILE_IN"
1335 then
1336 # Scripts compiled in.
1337
1338 # sed commands to quote an ld script as a C string.
1339 sc="-f stringify.sed"
1340
1341 cat >>e${EMULATION_NAME}.c <<EOF
1342 {
1343 *isfile = 0;
1344
1345 if (link_info.relocateable == true && config.build_constructors == true)
1346 return
1347 EOF
1348 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1349 echo ' ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c
1350 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1351 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1352 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1353 if ! cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then
1354 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1355 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1356 fi
1357 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1358 echo ' ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1359 sed $sc ldscripts/${EMULATION_NAME}.xsc >> e${EMULATION_NAME}.c
1360 echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c
1361 sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
1362 fi
1363 echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c
1364 sed $sc ldscripts/${EMULATION_NAME}.xc >> e${EMULATION_NAME}.c
1365 echo ' ; else return' >> e${EMULATION_NAME}.c
1366 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1367 echo '; }' >> e${EMULATION_NAME}.c
1368
1369 else
1370 # Scripts read from the filesystem.
1371
1372 cat >>e${EMULATION_NAME}.c <<EOF
1373 {
1374 *isfile = 1;
1375
1376 if (link_info.relocateable == true && config.build_constructors == true)
1377 return "ldscripts/${EMULATION_NAME}.xu";
1378 else if (link_info.relocateable == true)
1379 return "ldscripts/${EMULATION_NAME}.xr";
1380 else if (!config.text_read_only)
1381 return "ldscripts/${EMULATION_NAME}.xbn";
1382 else if (!config.magic_demand_paged)
1383 return "ldscripts/${EMULATION_NAME}.xn";
1384 else if (link_info.shared)
1385 return "ldscripts/${EMULATION_NAME}.xs";
1386 else
1387 return "ldscripts/${EMULATION_NAME}.x";
1388 }
1389
1390 EOF
1391 fi
1392 fi
1393
1394 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1395
1396 if test x"$LDEMUL_PARSE_ARGS" != xgld"$EMULATION_NAME"_parse_args; then
1397
1398 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1399 cat >>e${EMULATION_NAME}.c <<EOF
1400 $PARSE_AND_LIST_PROLOGUE
1401 EOF
1402 fi
1403
1404 cat >>e${EMULATION_NAME}.c <<EOF
1405
1406 #include "getopt.h"
1407
1408 #define OPTION_DISABLE_NEW_DTAGS (400)
1409 #define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
1410 #define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
1411
1412 static struct option longopts[] =
1413 {
1414 EOF
1415
1416 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1417 cat >>e${EMULATION_NAME}.c <<EOF
1418 /* getopt allows abbreviations, so we do this to stop it from
1419 treating -d/-e as abbreviations for these options. */
1420 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1421 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1422 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1423 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1424 {"Bgroup", no_argument, NULL, OPTION_GROUP},
1425 {"Bgroup", no_argument, NULL, OPTION_GROUP},
1426 EOF
1427 fi
1428
1429 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
1430 cat >>e${EMULATION_NAME}.c <<EOF
1431 $PARSE_AND_LIST_LONGOPTS
1432 EOF
1433 fi
1434
1435 cat >>e${EMULATION_NAME}.c <<EOF
1436 {NULL, no_argument, NULL, 0}
1437 };
1438
1439
1440 static int gld${EMULATION_NAME}_parse_args PARAMS ((int, char **));
1441
1442 static int
1443 gld${EMULATION_NAME}_parse_args (argc, argv)
1444 int argc;
1445 char ** argv;
1446 {
1447 int longind;
1448 int optc;
1449 static int prevoptind = -1;
1450 int prevopterr = opterr;
1451 int wanterror;
1452
1453 if (prevoptind != optind)
1454 opterr = 0;
1455
1456 wanterror = opterr;
1457 prevoptind = optind;
1458
1459 optc = getopt_long_only (argc, argv,
1460 "-${PARSE_AND_LIST_SHORTOPTS}z:", longopts,
1461 &longind);
1462 opterr = prevopterr;
1463
1464 switch (optc)
1465 {
1466 default:
1467 if (wanterror)
1468 xexit (1);
1469 optind = prevoptind;
1470 return 0;
1471
1472 EOF
1473
1474 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1475 cat >>e${EMULATION_NAME}.c <<EOF
1476 case OPTION_DISABLE_NEW_DTAGS:
1477 link_info.new_dtags = false;
1478 break;
1479
1480 case OPTION_ENABLE_NEW_DTAGS:
1481 link_info.new_dtags = true;
1482 break;
1483
1484 case OPTION_GROUP:
1485 link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
1486 /* Groups must be self-contained. */
1487 link_info.no_undefined = true;
1488 break;
1489
1490 case 'z':
1491 if (strcmp (optarg, "initfirst") == 0)
1492 link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
1493 else if (strcmp (optarg, "interpose") == 0)
1494 link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
1495 else if (strcmp (optarg, "loadfltr") == 0)
1496 link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
1497 else if (strcmp (optarg, "nodefaultlib") == 0)
1498 link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
1499 else if (strcmp (optarg, "nodelete") == 0)
1500 link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
1501 else if (strcmp (optarg, "nodlopen") == 0)
1502 link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
1503 else if (strcmp (optarg, "nodump") == 0)
1504 link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
1505 else if (strcmp (optarg, "now") == 0)
1506 {
1507 link_info.flags |= (bfd_vma) DF_BIND_NOW;
1508 link_info.flags_1 |= (bfd_vma) DF_1_NOW;
1509 }
1510 else if (strcmp (optarg, "origin") == 0)
1511 {
1512 link_info.flags |= (bfd_vma) DF_ORIGIN;
1513 link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
1514 }
1515 else if (strcmp (optarg, "defs") == 0)
1516 link_info.no_undefined = true;
1517 else if (strcmp (optarg, "combreloc") == 0)
1518 link_info.combreloc = true;
1519 else if (strcmp (optarg, "nocombreloc") == 0)
1520 link_info.combreloc = false;
1521 /* What about the other Solaris -z options? FIXME. */
1522 break;
1523 EOF
1524 fi
1525
1526 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
1527 cat >>e${EMULATION_NAME}.c <<EOF
1528 $PARSE_AND_LIST_ARGS_CASES
1529 EOF
1530 fi
1531
1532 cat >>e${EMULATION_NAME}.c <<EOF
1533 }
1534
1535 return 1;
1536 }
1537
1538 EOF
1539 fi
1540
1541 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1542 cat >>e${EMULATION_NAME}.c <<EOF
1543
1544 static void gld${EMULATION_NAME}_list_options PARAMS ((FILE * file));
1545
1546 static void
1547 gld${EMULATION_NAME}_list_options (file)
1548 FILE * file;
1549 {
1550 EOF
1551
1552 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1553 cat >>e${EMULATION_NAME}.c <<EOF
1554 fprintf (file, _(" -Bgroup\t\tSelects group name lookup rules for DSO\n"));
1555 fprintf (file, _(" --disable-new-dtags\tDisable new dynamic tags\n"));
1556 fprintf (file, _(" --enable-new-dtags\tEnable new dynamic tags\n"));
1557 fprintf (file, _(" -z defs\t\tDisallows undefined symbols\n"));
1558 fprintf (file, _(" -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
1559 fprintf (file, _(" -z interpose\t\tMark object to interpose all DSOs but executable\n"));
1560 fprintf (file, _(" -z loadfltr\t\tMark object requiring immediate process\n"));
1561 fprintf (file, _(" -z nodefaultlib\tMark object not to use default search paths\n"));
1562 fprintf (file, _(" -z nodelete\t\tMark DSO non-deletable at runtime\n"));
1563 fprintf (file, _(" -z nodlopen\t\tMark DSO not available to dlopen\n"));
1564 fprintf (file, _(" -z nodump\t\tMark DSO not available to dldump\n"));
1565 fprintf (file, _(" -z now\t\tMark object non-lazy runtime binding\n"));
1566 fprintf (file, _(" -z origin\t\tMark object requiring immediate \$ORIGIN processing\n"));
1567 fprintf (file, _("\t\t\t at runtime\n"));
1568 fprintf (file, _(" -z KEYWORD\t\tIgnored for Solaris compatibility\n"));
1569 EOF
1570 fi
1571
1572 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
1573 cat >>e${EMULATION_NAME}.c <<EOF
1574 $PARSE_AND_LIST_OPTIONS
1575 EOF
1576 fi
1577
1578 cat >>e${EMULATION_NAME}.c <<EOF
1579 }
1580 EOF
1581
1582 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
1583 cat >>e${EMULATION_NAME}.c <<EOF
1584 $PARSE_AND_LIST_EPILOGUE
1585 EOF
1586 fi
1587 fi
1588 else
1589 if test x"$LDEMUL_PARSE_ARGS" != xgld"$EMULATION_NAME"_parse_args; then
1590 cat >>e${EMULATION_NAME}.c <<EOF
1591 #define gld${EMULATION_NAME}_parse_args NULL
1592 EOF
1593 fi
1594 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1595 cat >>e${EMULATION_NAME}.c <<EOF
1596 #define gld${EMULATION_NAME}_list_options NULL
1597 EOF
1598 fi
1599 fi
1600
1601 cat >>e${EMULATION_NAME}.c <<EOF
1602
1603 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1604 {
1605 ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
1606 ${LDEMUL_SYSLIB-syslib_default},
1607 ${LDEMUL_HLL-hll_default},
1608 ${LDEMUL_AFTER_PARSE-after_parse_default},
1609 ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
1610 ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
1611 ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
1612 ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
1613 ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
1614 ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
1615 "${EMULATION_NAME}",
1616 "${OUTPUT_FORMAT}",
1617 ${LDEMUL_FINISH-NULL},
1618 ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
1619 ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
1620 ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
1621 ${LDEMUL_SET_SYMBOLS-NULL},
1622 ${LDEMUL_PARSE_ARGS-gld${EMULATION_NAME}_parse_args},
1623 ${LDEMUL_UNRECOGNIZED_FILE-NULL},
1624 ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
1625 ${LDEMUL_RECOGNIZED_FILE-NULL},
1626 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
1627 };
1628 EOF