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