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