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