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