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