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