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