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