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