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