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