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