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