]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - ld/emultempl/elf32.em
* Makefile.am (GENSCRIPTS): Pass prefix.
[thirdparty/binutils-gdb.git] / ld / emultempl / elf32.em
CommitLineData
252b5132
RH
1# This shell script emits a C file. -*- C -*-
2# It does some substitutions.
3# This file is now misnamed, because it supports both 32 bit and 64 bit
4# ELF emulations.
5test -z "${ELFSIZE}" && ELFSIZE=32
86af25fe
L
6if [ -z "$MACHINE" ]; then
7 OUTPUT_ARCH=${ARCH}
8else
9 OUTPUT_ARCH=${ARCH}:${MACHINE}
10fi
252b5132
RH
11cat >e${EMULATION_NAME}.c <<EOF
12/* This file is is generated by a shell script. DO NOT EDIT! */
13
14/* ${ELFSIZE} bit ELF emulation code for ${EMULATION_NAME}
e3dc8847 15 Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
dfcffada 16 2002, 2003, 2004, 2005, 2006 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"
ecca9871 56#include "elf-bfd.h"
252b5132 57
0c7a8e5a
AM
58/* Declare functions used by various EXTRA_EM_FILEs. */
59static void gld${EMULATION_NAME}_before_parse (void);
60static void gld${EMULATION_NAME}_after_open (void);
61static void gld${EMULATION_NAME}_before_allocation (void);
7b986e99 62static bfd_boolean gld${EMULATION_NAME}_place_orphan (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
dfcffada 544static bfd_boolean
d3989512
JJ
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
dfcffada 587static bfd_boolean
d3989512
JJ
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)
dfcffada 596 return FALSE;
d3989512 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);
dfcffada 694 return TRUE;
d3989512 695}
252b5132 696
d3989512
JJ
697static bfd_boolean
698gld${EMULATION_NAME}_check_ld_so_conf (const char *name, int force)
699{
700 static bfd_boolean initialized;
701 static char *ld_so_conf;
702 struct dt_needed needed;
252b5132 703
d3989512
JJ
704 if (! initialized)
705 {
706 char *tmppath;
707 struct gld${EMULATION_NAME}_ld_so_conf info;
9c8ebd6a 708
d3989512
JJ
709 info.path = NULL;
710 info.len = info.alloc = 0;
dfcffada
AM
711 tmppath = concat (ld_sysroot, "${prefix}/etc/ld.so.conf", NULL);
712 if (!gld${EMULATION_NAME}_parse_ld_so_conf (&info, tmppath))
713 {
714 free (tmppath);
715 tmppath = concat (ld_sysroot, "/etc/ld.so.conf", NULL);
716 gld${EMULATION_NAME}_parse_ld_so_conf (&info, tmppath);
717 }
d3989512 718 free (tmppath);
dfcffada 719
d3989512
JJ
720 if (info.path)
721 {
722 char *d = gld${EMULATION_NAME}_add_sysroot (info.path);
723 free (info.path);
724 ld_so_conf = d;
04925e1e 725 }
b34976b6 726 initialized = TRUE;
04925e1e 727 }
49e56c49 728
04925e1e 729 if (ld_so_conf == NULL)
b34976b6 730 return FALSE;
252b5132 731
e56f61be
L
732
733 needed.by = NULL;
734 needed.name = name;
735 return gld${EMULATION_NAME}_search_needed (ld_so_conf, &needed, force);
252b5132
RH
736}
737
04925e1e 738EOF
9c8ebd6a
DJ
739 # Linux
740 ;;
04925e1e
AM
741 esac
742fi
743cat >>e${EMULATION_NAME}.c <<EOF
744
252b5132
RH
745/* See if an input file matches a DT_NEEDED entry by name. */
746
747static void
0c7a8e5a 748gld${EMULATION_NAME}_check_needed (lang_input_statement_type *s)
252b5132
RH
749{
750 if (global_found)
751 return;
752
7cedef86
AM
753 /* If this input file was an as-needed entry, and wasn't found to be
754 needed at the stage it was linked, then don't say we have loaded it. */
755 if (s->as_needed
756 && (s->the_bfd == NULL
757 || (bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0))
758 return;
759
577a0623 760 if (s->filename != NULL)
252b5132 761 {
577a0623
AM
762 const char *f;
763
764 if (strcmp (s->filename, global_needed->name) == 0)
765 {
b34976b6 766 global_found = TRUE;
577a0623
AM
767 return;
768 }
769
770 if (s->search_dirs_flag)
771 {
772 f = strrchr (s->filename, '/');
773 if (f != NULL
774 && strcmp (f + 1, global_needed->name) == 0)
775 {
b34976b6 776 global_found = TRUE;
577a0623
AM
777 return;
778 }
779 }
252b5132
RH
780 }
781
782 if (s->the_bfd != NULL)
783 {
784 const char *soname;
785
786 soname = bfd_elf_get_dt_soname (s->the_bfd);
787 if (soname != NULL
788 && strcmp (soname, global_needed->name) == 0)
789 {
b34976b6 790 global_found = TRUE;
252b5132
RH
791 return;
792 }
793 }
252b5132
RH
794}
795
41392f03
AM
796EOF
797
798if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
799cat >>e${EMULATION_NAME}.c <<EOF
04925e1e
AM
800
801/* This is called after all the input files have been opened. */
252b5132
RH
802
803static void
0c7a8e5a 804gld${EMULATION_NAME}_after_open (void)
252b5132 805{
04925e1e 806 struct bfd_link_needed_list *needed, *l;
252b5132 807
04925e1e 808 /* We only need to worry about this when doing a final link. */
1049f94e 809 if (link_info.relocatable || !link_info.executable)
252b5132
RH
810 return;
811
04925e1e
AM
812 /* Get the list of files which appear in DT_NEEDED entries in
813 dynamic objects included in the link (often there will be none).
814 For each such file, we want to track down the corresponding
815 library, and include the symbol table in the link. This is what
816 the runtime dynamic linker will do. Tracking the files down here
817 permits one dynamic object to include another without requiring
818 special action by the person doing the link. Note that the
819 needed list can actually grow while we are stepping through this
820 loop. */
821 needed = bfd_elf_get_needed_list (output_bfd, &link_info);
822 for (l = needed; l != NULL; l = l->next)
252b5132 823 {
04925e1e 824 struct bfd_link_needed_list *ll;
e56f61be 825 struct dt_needed n, nn;
04925e1e 826 int force;
252b5132 827
7e9f0867
AM
828 /* If the lib that needs this one was --as-needed and wasn't
829 found to be needed, then this lib isn't needed either. */
830 if (l->by != NULL
831 && (bfd_elf_get_dyn_lib_class (l->by) & DYN_AS_NEEDED) != 0)
832 continue;
833
04925e1e
AM
834 /* If we've already seen this file, skip it. */
835 for (ll = needed; ll != l; ll = ll->next)
7e9f0867
AM
836 if ((ll->by == NULL
837 || (bfd_elf_get_dyn_lib_class (ll->by) & DYN_AS_NEEDED) == 0)
838 && strcmp (ll->name, l->name) == 0)
04925e1e
AM
839 break;
840 if (ll != l)
841 continue;
252b5132 842
04925e1e
AM
843 /* See if this file was included in the link explicitly. */
844 global_needed = l;
b34976b6 845 global_found = FALSE;
04925e1e
AM
846 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
847 if (global_found)
848 continue;
252b5132 849
e56f61be
L
850 n.by = l->by;
851 n.name = l->name;
852 nn.by = l->by;
ec4eb78a
L
853 if (trace_file_tries)
854 info_msg (_("%s needed by %B\n"), l->name, l->by);
855
04925e1e
AM
856 /* We need to find this file and include the symbol table. We
857 want to search for the file in the same way that the dynamic
858 linker will search. That means that we want to use
859 rpath_link, rpath, then the environment variable
ec4eb78a
L
860 LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
861 entries (native only), then the linker script LIB_SEARCH_DIRS.
862 We do not search using the -L arguments.
252b5132 863
04925e1e
AM
864 We search twice. The first time, we skip objects which may
865 introduce version mismatches. The second time, we force
866 their use. See gld${EMULATION_NAME}_vercheck comment. */
867 for (force = 0; force < 2; force++)
868 {
04925e1e
AM
869 size_t len;
870 search_dirs_type *search;
6dd8c765 871EOF
ff925e69 872if [ "x${NATIVE}" = xyes ] ; then
6dd8c765 873cat >>e${EMULATION_NAME}.c <<EOF
dcb0bd0e 874 const char *lib_path;
ff925e69
KK
875EOF
876fi
877if [ "x${USE_LIBPATH}" = xyes ] ; then
878cat >>e${EMULATION_NAME}.c <<EOF
6dd8c765
L
879 struct bfd_link_needed_list *rp;
880 int found;
881EOF
6dd8c765
L
882fi
883cat >>e${EMULATION_NAME}.c <<EOF
252b5132 884
04925e1e 885 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
e56f61be 886 &n, force))
04925e1e 887 break;
dcb0bd0e 888EOF
9c8ebd6a 889if [ "x${USE_LIBPATH}" = xyes ] ; then
dcb0bd0e 890cat >>e${EMULATION_NAME}.c <<EOF
04925e1e 891 if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
e56f61be 892 &n, force))
04925e1e 893 break;
9c8ebd6a
DJ
894EOF
895fi
896if [ "x${NATIVE}" = xyes ] ; then
897cat >>e${EMULATION_NAME}.c <<EOF
04925e1e
AM
898 if (command_line.rpath_link == NULL
899 && command_line.rpath == NULL)
900 {
901 lib_path = (const char *) getenv ("LD_RUN_PATH");
e56f61be 902 if (gld${EMULATION_NAME}_search_needed (lib_path, &n,
04925e1e
AM
903 force))
904 break;
905 }
04925e1e 906 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
e56f61be 907 if (gld${EMULATION_NAME}_search_needed (lib_path, &n, force))
04925e1e 908 break;
9c8ebd6a
DJ
909EOF
910fi
911if [ "x${USE_LIBPATH}" = xyes ] ; then
912cat >>e${EMULATION_NAME}.c <<EOF
ec4eb78a 913 found = 0;
6dd8c765
L
914 rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
915 for (; !found && rp != NULL; rp = rp->next)
ec4eb78a 916 {
9c8ebd6a 917 char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
ec4eb78a 918 found = (rp->by == l->by
9c8ebd6a 919 && gld${EMULATION_NAME}_search_needed (tmpname,
e56f61be 920 &n,
ec4eb78a 921 force));
9c8ebd6a 922 free (tmpname);
ec4eb78a
L
923 }
924 if (found)
925 break;
926
04925e1e 927EOF
04925e1e 928fi
c1446dba
L
929if [ "x${USE_LIBPATH}" = xyes ] ; then
930 case ${target} in
931 *-*-linux-* | *-*-k*bsd*-*)
932 # Linux
933 cat >>e${EMULATION_NAME}.c <<EOF
934 if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
935 break;
936
937EOF
938 ;;
939 esac
940fi
04925e1e
AM
941cat >>e${EMULATION_NAME}.c <<EOF
942 len = strlen (l->name);
943 for (search = search_head; search != NULL; search = search->next)
944 {
945 char *filename;
252b5132 946
04925e1e
AM
947 if (search->cmdline)
948 continue;
949 filename = (char *) xmalloc (strlen (search->name) + len + 2);
950 sprintf (filename, "%s/%s", search->name, l->name);
e56f61be
L
951 nn.name = filename;
952 if (gld${EMULATION_NAME}_try_needed (&nn, force))
04925e1e
AM
953 break;
954 free (filename);
955 }
956 if (search != NULL)
957 break;
958EOF
04925e1e
AM
959cat >>e${EMULATION_NAME}.c <<EOF
960 }
252b5132 961
04925e1e
AM
962 if (force < 2)
963 continue;
252b5132 964
e374f1d9 965 einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
04925e1e
AM
966 l->name, l->by);
967 }
968}
252b5132 969
41392f03
AM
970EOF
971fi
972
973cat >>e${EMULATION_NAME}.c <<EOF
252b5132 974
04925e1e 975/* Look through an expression for an assignment statement. */
252b5132 976
04925e1e 977static void
0c7a8e5a 978gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
04925e1e 979{
4ea42fb7 980 bfd_boolean provide = FALSE;
04925e1e
AM
981
982 switch (exp->type.node_class)
252b5132 983 {
04925e1e 984 case etree_provide:
4ea42fb7
AM
985 provide = TRUE;
986 /* Fall thru */
987 case etree_assign:
04925e1e
AM
988 /* We call record_link_assignment even if the symbol is defined.
989 This is because if it is defined by a dynamic object, we
990 actually want to use the value defined by the linker script,
991 not the value from the dynamic object (because we are setting
992 symbols like etext). If the symbol is defined by a regular
993 object, then, as it happens, calling record_link_assignment
994 will do no harm. */
04925e1e 995 if (strcmp (exp->assign.dst, ".") != 0)
252b5132 996 {
fe21a8fc
L
997 if (!bfd_elf_record_link_assignment (output_bfd, &link_info,
998 exp->assign.dst, provide,
999 exp->assign.hidden))
04925e1e
AM
1000 einfo ("%P%F: failed to record assignment to %s: %E\n",
1001 exp->assign.dst);
252b5132 1002 }
04925e1e
AM
1003 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1004 break;
252b5132 1005
04925e1e
AM
1006 case etree_binary:
1007 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1008 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1009 break;
252b5132 1010
04925e1e
AM
1011 case etree_trinary:
1012 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1013 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1014 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1015 break;
252b5132 1016
04925e1e
AM
1017 case etree_unary:
1018 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1019 break;
252b5132 1020
04925e1e
AM
1021 default:
1022 break;
252b5132
RH
1023 }
1024}
1025
04925e1e
AM
1026
1027/* This is called by the before_allocation routine via
1028 lang_for_each_statement. It locates any assignment statements, and
1029 tells the ELF backend about them, in case they are assignments to
1030 symbols which are referred to by dynamic objects. */
1031
1032static void
0c7a8e5a 1033gld${EMULATION_NAME}_find_statement_assignment (lang_statement_union_type *s)
04925e1e
AM
1034{
1035 if (s->header.type == lang_assignment_statement_enum)
1036 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1037}
1038
41392f03
AM
1039EOF
1040
1041if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
57e6abd2
AO
1042 if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
1043 ELF_INTERPRETER_SET_DEFAULT="
1044 if (sinterp != NULL)
1045 {
5718918d
AM
1046 sinterp->contents = (unsigned char *) ${ELF_INTERPRETER_NAME};
1047 sinterp->size = strlen ((char *) sinterp->contents) + 1;
57e6abd2
AO
1048 }
1049
1050"
1051 else
1052 ELF_INTERPRETER_SET_DEFAULT=
1053 fi
41392f03 1054cat >>e${EMULATION_NAME}.c <<EOF
04925e1e 1055
252b5132
RH
1056/* This is called after the sections have been attached to output
1057 sections, but before any sizes or addresses have been set. */
1058
1059static void
0c7a8e5a 1060gld${EMULATION_NAME}_before_allocation (void)
252b5132
RH
1061{
1062 const char *rpath;
1063 asection *sinterp;
1064
fd574c46 1065 if (link_info.hash->type == bfd_link_elf_hash_table)
e1918d23
AM
1066 _bfd_elf_tls_setup (output_bfd, &link_info);
1067
252b5132
RH
1068 /* If we are going to make any variable assignments, we need to let
1069 the ELF backend know about them in case the variables are
1070 referred to by dynamic objects. */
1071 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
1072
1073 /* Let the ELF backend work out the sizes of any sections required
1074 by dynamic linking. */
1075 rpath = command_line.rpath;
1076 if (rpath == NULL)
1077 rpath = (const char *) getenv ("LD_RUN_PATH");
5a580b3a 1078 if (! (bfd_elf_size_dynamic_sections
0c7a8e5a 1079 (output_bfd, command_line.soname, rpath,
605d9b3a 1080 command_line.filter_shlib,
252b5132
RH
1081 (const char * const *) command_line.auxiliary_filters,
1082 &link_info, &sinterp, lang_elf_version_info)))
1083 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
8423293d 1084
57e6abd2 1085${ELF_INTERPRETER_SET_DEFAULT}
252b5132
RH
1086 /* Let the user override the dynamic linker we are using. */
1087 if (command_line.interpreter != NULL
1088 && sinterp != NULL)
1089 {
1090 sinterp->contents = (bfd_byte *) command_line.interpreter;
eea6121a 1091 sinterp->size = strlen (command_line.interpreter) + 1;
252b5132
RH
1092 }
1093
1094 /* Look for any sections named .gnu.warning. As a GNU extensions,
1095 we treat such sections as containing warning messages. We print
1096 out the warning message, and then zero out the section size so
1097 that it does not get copied into the output file. */
1098
1099 {
1100 LANG_FOR_EACH_INPUT_STATEMENT (is)
1101 {
1102 asection *s;
1103 bfd_size_type sz;
8c675694 1104 bfd_size_type prefix_len;
252b5132 1105 char *msg;
b34976b6 1106 bfd_boolean ret;
8c675694 1107 const char * gnu_warning_prefix = _("warning: ");
252b5132
RH
1108
1109 if (is->just_syms_flag)
1110 continue;
1111
1112 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
1113 if (s == NULL)
1114 continue;
1115
eea6121a 1116 sz = s->size;
8c675694
NC
1117 prefix_len = strlen (gnu_warning_prefix);
1118 msg = xmalloc ((size_t) (prefix_len + sz + 1));
1119 strcpy (msg, gnu_warning_prefix);
1120 if (! bfd_get_section_contents (is->the_bfd, s, msg + prefix_len,
1121 (file_ptr) 0, sz))
252b5132
RH
1122 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
1123 is->the_bfd);
8c675694 1124 msg[prefix_len + sz] = '\0';
252b5132
RH
1125 ret = link_info.callbacks->warning (&link_info, msg,
1126 (const char *) NULL,
1127 is->the_bfd, (asection *) NULL,
1128 (bfd_vma) 0);
1129 ASSERT (ret);
1130 free (msg);
1131
1132 /* Clobber the section size, so that we don't waste copying the
1133 warning into the output file. */
eea6121a 1134 s->size = 0;
11d2f718
AM
1135
1136 /* Also set SEC_EXCLUDE, so that symbols defined in the warning
1137 section don't get copied to the output. */
1138 s->flags |= SEC_EXCLUDE;
252b5132
RH
1139 }
1140 }
8423293d 1141
1e035701 1142 before_allocation_default ();
8423293d
AM
1143
1144 if (!bfd_elf_size_dynsym_hash_dynstr (output_bfd, &link_info))
1145 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
252b5132
RH
1146}
1147
41392f03
AM
1148EOF
1149fi
1150
1151if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
1152cat >>e${EMULATION_NAME}.c <<EOF
252b5132 1153
04925e1e
AM
1154/* Try to open a dynamic archive. This is where we know that ELF
1155 dynamic libraries have an extension of .so (or .sl on oddball systems
1156 like hpux). */
1157
b34976b6 1158static bfd_boolean
0c7a8e5a
AM
1159gld${EMULATION_NAME}_open_dynamic_archive
1160 (const char *arch, search_dirs_type *search, lang_input_statement_type *entry)
252b5132 1161{
04925e1e
AM
1162 const char *filename;
1163 char *string;
252b5132 1164
04925e1e 1165 if (! entry->is_archive)
b34976b6 1166 return FALSE;
252b5132 1167
04925e1e 1168 filename = entry->filename;
252b5132 1169
04925e1e
AM
1170 /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
1171 is defined, but it does not seem worth the headache to optimize
1172 away those two bytes of space. */
1173 string = (char *) xmalloc (strlen (search->name)
1174 + strlen (filename)
1175 + strlen (arch)
1176#ifdef EXTRA_SHLIB_EXTENSION
1177 + strlen (EXTRA_SHLIB_EXTENSION)
1178#endif
1179 + sizeof "/lib.so");
1180
1181 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
1182
1183#ifdef EXTRA_SHLIB_EXTENSION
1184 /* Try the .so extension first. If that fails build a new filename
1185 using EXTRA_SHLIB_EXTENSION. */
1186 if (! ldfile_try_open_bfd (string, entry))
1187 sprintf (string, "%s/lib%s%s%s", search->name,
1188 filename, arch, EXTRA_SHLIB_EXTENSION);
1189#endif
1190
1191 if (! ldfile_try_open_bfd (string, entry))
252b5132 1192 {
04925e1e 1193 free (string);
b34976b6 1194 return FALSE;
04925e1e 1195 }
252b5132 1196
04925e1e 1197 entry->filename = string;
252b5132 1198
04925e1e
AM
1199 /* We have found a dynamic object to include in the link. The ELF
1200 backend linker will create a DT_NEEDED entry in the .dynamic
1201 section naming this file. If this file includes a DT_SONAME
1202 entry, it will be used. Otherwise, the ELF linker will just use
1203 the name of the file. For an archive found by searching, like
1204 this one, the DT_NEEDED entry should consist of just the name of
1205 the file, without the path information used to find it. Note
1206 that we only need to do this if we have a dynamic object; an
1207 archive will never be referenced by a DT_NEEDED entry.
252b5132 1208
04925e1e
AM
1209 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
1210 very pretty. I haven't been able to think of anything that is
1211 pretty, though. */
1212 if (bfd_check_format (entry->the_bfd, bfd_object)
1213 && (entry->the_bfd->flags & DYNAMIC) != 0)
1214 {
04925e1e 1215 ASSERT (entry->is_archive && entry->search_dirs_flag);
252b5132 1216
04925e1e 1217 /* Rather than duplicating the logic above. Just use the
1c9acd94 1218 filename we recorded earlier. */
04925e1e 1219
fed2999d 1220 filename = lbasename (entry->filename);
1c9acd94 1221 bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
04925e1e
AM
1222 }
1223
b34976b6 1224 return TRUE;
04925e1e
AM
1225}
1226
41392f03
AM
1227EOF
1228fi
cde43e70
AM
1229
1230if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
41392f03
AM
1231cat >>e${EMULATION_NAME}.c <<EOF
1232
afd7a018 1233/* A variant of lang_output_section_find used by place_orphan. */
04925e1e 1234
04925e1e 1235static lang_output_section_statement_type *
2a36a117 1236output_rel_find (asection *sec, int isdyn)
04925e1e 1237{
04925e1e 1238 lang_output_section_statement_type *lookup;
ba493122 1239 lang_output_section_statement_type *last = NULL;
2a36a117 1240 lang_output_section_statement_type *last_alloc = NULL;
ba493122
AM
1241 lang_output_section_statement_type *last_rel = NULL;
1242 lang_output_section_statement_type *last_rel_alloc = NULL;
24cdb50a 1243 int rela = sec->name[4] == 'a';
04925e1e 1244
afd7a018
AM
1245 for (lookup = &lang_output_section_statement.head->output_section_statement;
1246 lookup != NULL;
1247 lookup = lookup->next)
04925e1e 1248 {
0841712e
JJ
1249 if (lookup->constraint != -1
1250 && strncmp (".rel", lookup->name, 4) == 0)
04925e1e 1251 {
24cdb50a 1252 int lookrela = lookup->name[4] == 'a';
ba493122 1253
2a36a117
AM
1254 /* .rel.dyn must come before all other reloc sections, to suit
1255 GNU ld.so. */
1256 if (isdyn)
1257 break;
1258
1259 /* Don't place after .rel.plt as doing so results in wrong
1260 dynamic tags. */
1261 if (strcmp (".plt", lookup->name + 4 + lookrela) == 0)
ba493122 1262 break;
2a36a117
AM
1263
1264 if (rela == lookrela || last_rel == NULL)
24cdb50a 1265 last_rel = lookup;
2a36a117
AM
1266 if ((rela == lookrela || last_rel_alloc == NULL)
1267 && lookup->bfd_section != NULL
ba493122
AM
1268 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1269 last_rel_alloc = lookup;
04925e1e 1270 }
2a36a117
AM
1271
1272 last = lookup;
1273 if (lookup->bfd_section != NULL
1274 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1275 last_alloc = lookup;
252b5132 1276 }
ba493122
AM
1277
1278 if (last_rel_alloc)
1279 return last_rel_alloc;
1280
1281 if (last_rel)
1282 return last_rel;
1283
2a36a117
AM
1284 if (last_alloc)
1285 return last_alloc;
1286
ba493122 1287 return last;
252b5132
RH
1288}
1289
1290/* Place an orphan section. We use this to put random SHF_ALLOC
1291 sections in the right segment. */
1292
b34976b6 1293static bfd_boolean
7b986e99 1294gld${EMULATION_NAME}_place_orphan (asection *s)
252b5132 1295{
afd7a018
AM
1296 static struct orphan_save hold[] =
1297 {
1298 { ".text",
1299 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1300 0, 0, 0, 0 },
1301 { ".rodata",
1302 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1303 0, 0, 0, 0 },
1304 { ".data",
1305 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1306 0, 0, 0, 0 },
1307 { ".bss",
1308 SEC_ALLOC,
1309 0, 0, 0, 0 },
1310 { 0,
1311 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1312 0, 0, 0, 0 },
1313 { ".interp",
1314 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1315 0, 0, 0, 0 },
1316 { ".sdata",
1317 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_SMALL_DATA,
1318 0, 0, 0, 0 }
1319 };
1320 enum orphan_save_index
1321 {
1322 orphan_text = 0,
1323 orphan_rodata,
1324 orphan_data,
1325 orphan_bss,
1326 orphan_rel,
1327 orphan_interp,
1328 orphan_sdata
1329 };
1330 static int orphan_init_done = 0;
6a345e87 1331 struct orphan_save *place;
a854a4a7 1332 const char *secname;
afd7a018 1333 lang_output_section_statement_type *after;
252b5132 1334 lang_output_section_statement_type *os;
24cdb50a 1335 int isdyn = 0;
ecca9871
L
1336 int iself = s->owner->xvec->flavour == bfd_target_elf_flavour;
1337 unsigned int sh_type = iself ? elf_section_type (s) : SHT_NULL;
252b5132 1338
aea4bd9d 1339 secname = bfd_get_section_name (s->owner, s);
9f61903d 1340
1049f94e 1341 if (! link_info.relocatable
24cdb50a 1342 && link_info.combreloc
ecca9871 1343 && (s->flags & SEC_ALLOC))
24cdb50a 1344 {
ecca9871
L
1345 if (iself)
1346 switch (sh_type)
1347 {
1348 case SHT_RELA:
1349 secname = ".rela.dyn";
1350 isdyn = 1;
1351 break;
1352 case SHT_REL:
1353 secname = ".rel.dyn";
1354 isdyn = 1;
1355 break;
1356 default:
1357 break;
1358 }
1359 else if (strncmp (secname, ".rel", 4) == 0)
1360 {
1361 secname = secname[4] == 'a' ? ".rela.dyn" : ".rel.dyn";
1362 isdyn = 1;
1363 }
24cdb50a 1364 }
aea4bd9d 1365
d0d6a25b 1366 if (isdyn || (!config.unique_orphan_sections && !unique_section_p (s)))
252b5132 1367 {
6d02a667 1368 /* Look through the script to see where to place this section. */
a854a4a7
AM
1369 os = lang_output_section_find (secname);
1370
1371 if (os != NULL
0f33d40b 1372 && (os->bfd_section == NULL
afd7a018 1373 || os->bfd_section->flags == 0
390fbbf1
AM
1374 || (_bfd_elf_match_sections_by_type (output_bfd,
1375 os->bfd_section,
1376 s->owner, s)
ecca9871
L
1377 && ((s->flags ^ os->bfd_section->flags)
1378 & (SEC_LOAD | SEC_ALLOC)) == 0)))
a854a4a7 1379 {
0f33d40b 1380 /* We already have an output section statement with this
afd7a018
AM
1381 name, and its bfd section, if any, has compatible flags.
1382 If the section already exists but does not have any flags
1383 set, then it has been created by the linker, probably as a
1384 result of a --section-start command line switch. */
7b986e99 1385 lang_add_section (&os->children, s, os);
b34976b6 1386 return TRUE;
a854a4a7 1387 }
252b5132
RH
1388 }
1389
afd7a018
AM
1390 if (!orphan_init_done)
1391 {
1392 struct orphan_save *ho;
1393 for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
1394 if (ho->name != NULL)
1395 {
1396 ho->os = lang_output_section_find (ho->name);
1397 if (ho->os != NULL && ho->os->flags == 0)
1398 ho->os->flags = ho->flags;
1399 }
1400 orphan_init_done = 1;
1401 }
252b5132
RH
1402
1403 /* If this is a final link, then always put .gnu.warning.SYMBOL
1404 sections into the .text section to get them out of the way. */
36af4a4e 1405 if (link_info.executable
1049f94e 1406 && ! link_info.relocatable
252b5132 1407 && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
afd7a018 1408 && hold[orphan_text].os != NULL)
252b5132 1409 {
afd7a018 1410 lang_add_section (&hold[orphan_text].os->children, s,
7b986e99 1411 hold[orphan_text].os);
b34976b6 1412 return TRUE;
252b5132
RH
1413 }
1414
1415 /* Decide which segment the section should go in based on the
1416 section name and section flags. We put loadable .note sections
1417 right after the .interp section, so that the PT_NOTE segment is
1418 stored right after the program headers where the OS can read it
1419 in the first page. */
aea4bd9d 1420
71bfc0ae
AM
1421 place = NULL;
1422 if ((s->flags & SEC_ALLOC) == 0)
1423 ;
252b5132 1424 else if ((s->flags & SEC_LOAD) != 0
ecca9871
L
1425 && ((iself && sh_type == SHT_NOTE)
1426 || (!iself && strncmp (secname, ".note", 5) == 0)))
afd7a018
AM
1427 place = &hold[orphan_interp];
1428 else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
1429 place = &hold[orphan_bss];
1430 else if ((s->flags & SEC_SMALL_DATA) != 0)
1431 place = &hold[orphan_sdata];
1432 else if ((s->flags & SEC_READONLY) == 0)
1433 place = &hold[orphan_data];
ecca9871
L
1434 else if (((iself && (sh_type == SHT_RELA || sh_type == SHT_REL))
1435 || (!iself && strncmp (secname, ".rel", 4) == 0))
afd7a018
AM
1436 && (s->flags & SEC_LOAD) != 0)
1437 place = &hold[orphan_rel];
1438 else if ((s->flags & SEC_CODE) == 0)
1439 place = &hold[orphan_rodata];
1440 else
1441 place = &hold[orphan_text];
71bfc0ae 1442
afd7a018 1443 after = NULL;
5ba47421 1444 if (place != NULL)
252b5132 1445 {
afd7a018 1446 if (place->os == NULL)
5ba47421 1447 {
afd7a018
AM
1448 if (place->name != NULL)
1449 place->os = lang_output_section_find (place->name);
1450 else
1451 place->os = output_rel_find (s, isdyn);
5ba47421 1452 }
afd7a018
AM
1453 after = place->os;
1454 if (after == NULL)
390fbbf1
AM
1455 after = lang_output_section_find_by_flags
1456 (s, &place->os, _bfd_elf_match_sections_by_type);
afd7a018
AM
1457 if (after == NULL)
1458 /* *ABS* is always the first output section statement. */
1459 after = &lang_output_section_statement.head->output_section_statement;
252b5132
RH
1460 }
1461
afd7a018
AM
1462 /* Choose a unique name for the section. This will be needed if the
1463 same section name appears in the input file with different
1464 loadable or allocatable characteristics. */
1465 if (bfd_get_section_by_name (output_bfd, secname) != NULL)
252b5132 1466 {
afd7a018
AM
1467 static int count = 1;
1468 secname = bfd_get_unique_section_name (output_bfd, secname, &count);
1469 if (secname == NULL)
1470 einfo ("%F%P: place_orphan failed: %E\n");
71bfc0ae 1471 }
5ba47421 1472
7b986e99 1473 lang_insert_orphan (s, secname, after, place, NULL, NULL);
252b5132 1474
b34976b6 1475 return TRUE;
252b5132 1476}
c56feb2b
AM
1477EOF
1478fi
1479
1480if test x"$LDEMUL_FINISH" != xgld"$EMULATION_NAME"_finish; then
1481cat >>e${EMULATION_NAME}.c <<EOF
252b5132 1482
deb04cdb
AM
1483static void
1484gld${EMULATION_NAME}_layout_sections_again (void)
1485{
1486 lang_reset_memory_regions ();
73d074b4 1487
deb04cdb 1488 /* Resize the sections. */
e9ee469a 1489 lang_size_sections (NULL, TRUE);
73d074b4 1490
deb04cdb
AM
1491 /* Redo special stuff. */
1492 ldemul_after_allocation ();
57316bff 1493
deb04cdb 1494 /* Do the assignments again. */
e9ee469a 1495 lang_do_assignments ();
deb04cdb
AM
1496}
1497
deb04cdb
AM
1498static void
1499gld${EMULATION_NAME}_finish (void)
1500{
1501 if (bfd_elf_discard_info (output_bfd, &link_info))
1502 gld${EMULATION_NAME}_layout_sections_again ();
81e1b023 1503
1e035701 1504 finish_default ();
73d074b4 1505}
41392f03
AM
1506EOF
1507fi
1508
1509if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1510cat >>e${EMULATION_NAME}.c <<EOF
252b5132
RH
1511
1512static char *
0c7a8e5a 1513gld${EMULATION_NAME}_get_script (int *isfile)
252b5132
RH
1514EOF
1515
1516if test -n "$COMPILE_IN"
1517then
1518# Scripts compiled in.
1519
1520# sed commands to quote an ld script as a C string.
597e2591 1521sc="-f stringify.sed"
252b5132
RH
1522
1523cat >>e${EMULATION_NAME}.c <<EOF
60bcf0fa 1524{
252b5132
RH
1525 *isfile = 0;
1526
1049f94e 1527 if (link_info.relocatable && config.build_constructors)
597e2591 1528 return
252b5132 1529EOF
afd7a018
AM
1530sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1531echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c
1532sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1533echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1534sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
61585df2 1535if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
afd7a018
AM
1536echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1537sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
db6751f2 1538fi
36af4a4e
JJ
1539if test -n "$GENERATE_PIE_SCRIPT" ; then
1540if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
8c37241b
JJ
1541echo ' ; else if (link_info.pie && link_info.combreloc' >> e${EMULATION_NAME}.c
1542echo ' && link_info.relro' >> e${EMULATION_NAME}.c
1543echo ' && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
afd7a018 1544sed $sc ldscripts/${EMULATION_NAME}.xdw >> e${EMULATION_NAME}.c
36af4a4e 1545echo ' ; else if (link_info.pie && link_info.combreloc) return' >> e${EMULATION_NAME}.c
afd7a018 1546sed $sc ldscripts/${EMULATION_NAME}.xdc >> e${EMULATION_NAME}.c
36af4a4e 1547fi
afd7a018
AM
1548echo ' ; else if (link_info.pie) return' >> e${EMULATION_NAME}.c
1549sed $sc ldscripts/${EMULATION_NAME}.xd >> e${EMULATION_NAME}.c
36af4a4e 1550fi
252b5132 1551if test -n "$GENERATE_SHLIB_SCRIPT" ; then
82434356 1552if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
8c37241b
JJ
1553echo ' ; else if (link_info.shared && link_info.combreloc' >> e${EMULATION_NAME}.c
1554echo ' && link_info.relro' >> e${EMULATION_NAME}.c
1555echo ' && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
afd7a018 1556sed $sc ldscripts/${EMULATION_NAME}.xsw >> e${EMULATION_NAME}.c
db6751f2 1557echo ' ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
afd7a018 1558sed $sc ldscripts/${EMULATION_NAME}.xsc >> e${EMULATION_NAME}.c
82434356 1559fi
afd7a018
AM
1560echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c
1561sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
252b5132 1562fi
82434356 1563if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
8c37241b
JJ
1564echo ' ; else if (link_info.combreloc && link_info.relro' >> e${EMULATION_NAME}.c
1565echo ' && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
afd7a018
AM
1566sed $sc ldscripts/${EMULATION_NAME}.xw >> e${EMULATION_NAME}.c
1567echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c
1568sed $sc ldscripts/${EMULATION_NAME}.xc >> e${EMULATION_NAME}.c
82434356 1569fi
afd7a018
AM
1570echo ' ; else return' >> e${EMULATION_NAME}.c
1571sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1572echo '; }' >> e${EMULATION_NAME}.c
252b5132
RH
1573
1574else
1575# Scripts read from the filesystem.
1576
1577cat >>e${EMULATION_NAME}.c <<EOF
60bcf0fa 1578{
252b5132
RH
1579 *isfile = 1;
1580
1049f94e 1581 if (link_info.relocatable && config.build_constructors)
252b5132 1582 return "ldscripts/${EMULATION_NAME}.xu";
1049f94e 1583 else if (link_info.relocatable)
252b5132
RH
1584 return "ldscripts/${EMULATION_NAME}.xr";
1585 else if (!config.text_read_only)
1586 return "ldscripts/${EMULATION_NAME}.xbn";
a060b769
AM
1587EOF
1588if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
1589else
1590cat >>e${EMULATION_NAME}.c <<EOF
252b5132
RH
1591 else if (!config.magic_demand_paged)
1592 return "ldscripts/${EMULATION_NAME}.xn";
a060b769
AM
1593EOF
1594fi
36af4a4e
JJ
1595if test -n "$GENERATE_PIE_SCRIPT" ; then
1596if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1597cat >>e${EMULATION_NAME}.c <<EOF
8c37241b
JJ
1598 else if (link_info.pie && link_info.combreloc
1599 && link_info.relro && (link_info.flags & DT_BIND_NOW))
1600 return "ldscripts/${EMULATION_NAME}.xdw";
36af4a4e
JJ
1601 else if (link_info.pie && link_info.combreloc)
1602 return "ldscripts/${EMULATION_NAME}.xdc";
1603EOF
1604fi
1605cat >>e${EMULATION_NAME}.c <<EOF
1606 else if (link_info.pie)
1607 return "ldscripts/${EMULATION_NAME}.xd";
1608EOF
1609fi
a060b769
AM
1610if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1611if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1612cat >>e${EMULATION_NAME}.c <<EOF
8c37241b
JJ
1613 else if (link_info.shared && link_info.combreloc
1614 && link_info.relro && (link_info.flags & DT_BIND_NOW))
1615 return "ldscripts/${EMULATION_NAME}.xsw";
a060b769
AM
1616 else if (link_info.shared && link_info.combreloc)
1617 return "ldscripts/${EMULATION_NAME}.xsc";
1618EOF
1619fi
1620cat >>e${EMULATION_NAME}.c <<EOF
252b5132
RH
1621 else if (link_info.shared)
1622 return "ldscripts/${EMULATION_NAME}.xs";
a060b769
AM
1623EOF
1624fi
1625if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1626cat >>e${EMULATION_NAME}.c <<EOF
8c37241b
JJ
1627 else if (link_info.combreloc && link_info.relro
1628 && (link_info.flags & DT_BIND_NOW))
1629 return "ldscripts/${EMULATION_NAME}.xw";
a060b769
AM
1630 else if (link_info.combreloc)
1631 return "ldscripts/${EMULATION_NAME}.xc";
1632EOF
1633fi
1634cat >>e${EMULATION_NAME}.c <<EOF
252b5132
RH
1635 else
1636 return "ldscripts/${EMULATION_NAME}.x";
1637}
252b5132 1638
3b108066 1639EOF
41392f03
AM
1640fi
1641fi
3b108066 1642
41392f03 1643if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
3b108066 1644
e0ee487b
L
1645if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1646cat >>e${EMULATION_NAME}.c <<EOF
1647 $PARSE_AND_LIST_PROLOGUE
1648EOF
1649fi
1650
e0ee487b
L
1651cat >>e${EMULATION_NAME}.c <<EOF
1652
6c1439be
L
1653#define OPTION_DISABLE_NEW_DTAGS (400)
1654#define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
a1ab1d2a 1655#define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
65765700 1656#define OPTION_EH_FRAME_HDR (OPTION_GROUP + 1)
b58f81ae
DJ
1657#define OPTION_EXCLUDE_LIBS (OPTION_EH_FRAME_HDR + 1)
1658
3bcf5557 1659static void
0c7a8e5a
AM
1660gld${EMULATION_NAME}_add_options
1661 (int ns, char **shortopts, int nl, struct option **longopts,
1662 int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
e0ee487b 1663{
3bcf5557
AM
1664 static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:";
1665 static const struct option xtra_long[] = {
e0ee487b 1666EOF
e0ee487b
L
1667
1668if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1669cat >>e${EMULATION_NAME}.c <<EOF
3bcf5557
AM
1670 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1671 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
1672 {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
b58f81ae 1673 {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
3bcf5557 1674 {"Bgroup", no_argument, NULL, OPTION_GROUP},
e0ee487b
L
1675EOF
1676fi
1677
1678if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
1679cat >>e${EMULATION_NAME}.c <<EOF
3bcf5557 1680 $PARSE_AND_LIST_LONGOPTS
e0ee487b
L
1681EOF
1682fi
1683
e0ee487b 1684cat >>e${EMULATION_NAME}.c <<EOF
3bcf5557
AM
1685 {NULL, no_argument, NULL, 0}
1686 };
1687
1688 *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
1689 memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
1690 *longopts = (struct option *)
1691 xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
1692 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
1693}
04925e1e 1694
3bcf5557 1695static bfd_boolean
0c7a8e5a 1696gld${EMULATION_NAME}_handle_option (int optc)
e0ee487b 1697{
e0ee487b
L
1698 switch (optc)
1699 {
1700 default:
3bcf5557 1701 return FALSE;
6c1439be 1702
e0ee487b 1703EOF
e0ee487b
L
1704
1705if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1706cat >>e${EMULATION_NAME}.c <<EOF
6c1439be 1707 case OPTION_DISABLE_NEW_DTAGS:
b34976b6 1708 link_info.new_dtags = FALSE;
6c1439be
L
1709 break;
1710
1711 case OPTION_ENABLE_NEW_DTAGS:
b34976b6 1712 link_info.new_dtags = TRUE;
6c1439be
L
1713 break;
1714
65765700 1715 case OPTION_EH_FRAME_HDR:
b34976b6 1716 link_info.eh_frame_hdr = TRUE;
65765700
JJ
1717 break;
1718
a1ab1d2a
UD
1719 case OPTION_GROUP:
1720 link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
1721 /* Groups must be self-contained. */
560e09e9
NC
1722 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
1723 link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
a1ab1d2a
UD
1724 break;
1725
b58f81ae
DJ
1726 case OPTION_EXCLUDE_LIBS:
1727 add_excluded_libs (optarg);
1728 break;
1729
e0ee487b
L
1730 case 'z':
1731 if (strcmp (optarg, "initfirst") == 0)
1732 link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
1733 else if (strcmp (optarg, "interpose") == 0)
1734 link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
1735 else if (strcmp (optarg, "loadfltr") == 0)
1736 link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
1737 else if (strcmp (optarg, "nodefaultlib") == 0)
1738 link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
1739 else if (strcmp (optarg, "nodelete") == 0)
1740 link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
1741 else if (strcmp (optarg, "nodlopen") == 0)
1742 link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
1743 else if (strcmp (optarg, "nodump") == 0)
1744 link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
1745 else if (strcmp (optarg, "now") == 0)
1746 {
1747 link_info.flags |= (bfd_vma) DF_BIND_NOW;
1748 link_info.flags_1 |= (bfd_vma) DF_1_NOW;
1749 }
1750 else if (strcmp (optarg, "origin") == 0)
1751 {
1752 link_info.flags |= (bfd_vma) DF_ORIGIN;
1753 link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
1754 }
a1ab1d2a 1755 else if (strcmp (optarg, "defs") == 0)
560e09e9 1756 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
aa713662 1757 else if (strcmp (optarg, "muldefs") == 0)
b34976b6 1758 link_info.allow_multiple_definition = TRUE;
db6751f2 1759 else if (strcmp (optarg, "combreloc") == 0)
b34976b6 1760 link_info.combreloc = TRUE;
db6751f2 1761 else if (strcmp (optarg, "nocombreloc") == 0)
b34976b6 1762 link_info.combreloc = FALSE;
8bd621d8 1763 else if (strcmp (optarg, "nocopyreloc") == 0)
0c7a8e5a 1764 link_info.nocopyreloc = TRUE;
9ee5e499
JJ
1765 else if (strcmp (optarg, "execstack") == 0)
1766 {
1767 link_info.execstack = TRUE;
1768 link_info.noexecstack = FALSE;
1769 }
1770 else if (strcmp (optarg, "noexecstack") == 0)
1771 {
1772 link_info.noexecstack = TRUE;
1773 link_info.execstack = FALSE;
1774 }
8c37241b
JJ
1775 else if (strcmp (optarg, "relro") == 0)
1776 link_info.relro = TRUE;
1777 else if (strcmp (optarg, "norelro") == 0)
1778 link_info.relro = FALSE;
e0ee487b 1779 /* What about the other Solaris -z options? FIXME. */
6c1439be 1780 break;
e0ee487b
L
1781EOF
1782fi
1783
1784if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
1785cat >>e${EMULATION_NAME}.c <<EOF
1786 $PARSE_AND_LIST_ARGS_CASES
1787EOF
1788fi
1789
e0ee487b
L
1790cat >>e${EMULATION_NAME}.c <<EOF
1791 }
1792
3bcf5557 1793 return TRUE;
e0ee487b
L
1794}
1795
41392f03 1796EOF
41392f03 1797
4b209b22 1798if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
41392f03
AM
1799cat >>e${EMULATION_NAME}.c <<EOF
1800
e0ee487b 1801static void
0c7a8e5a 1802gld${EMULATION_NAME}_list_options (FILE * file)
e0ee487b
L
1803{
1804EOF
e0ee487b
L
1805
1806if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1807cat >>e${EMULATION_NAME}.c <<EOF
a1ab1d2a 1808 fprintf (file, _(" -Bgroup\t\tSelects group name lookup rules for DSO\n"));
6c1439be
L
1809 fprintf (file, _(" --disable-new-dtags\tDisable new dynamic tags\n"));
1810 fprintf (file, _(" --enable-new-dtags\tEnable new dynamic tags\n"));
65765700 1811 fprintf (file, _(" --eh-frame-hdr\tCreate .eh_frame_hdr section\n"));
ec38dd05 1812 fprintf (file, _(" -z combreloc\t\tMerge dynamic relocs into one section and sort\n"));
560e09e9 1813 fprintf (file, _(" -z defs\t\tReport unresolved symbols in object files.\n"));
9ee5e499 1814 fprintf (file, _(" -z execstack\t\tMark executable as requiring executable stack\n"));
f813923c
HPN
1815 fprintf (file, _(" -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
1816 fprintf (file, _(" -z interpose\t\tMark object to interpose all DSOs but executable\n"));
e0ee487b 1817 fprintf (file, _(" -z loadfltr\t\tMark object requiring immediate process\n"));
aa713662 1818 fprintf (file, _(" -z muldefs\t\tAllow multiple definitions\n"));
146e7110
AM
1819 fprintf (file, _(" -z nocombreloc\tDon't merge dynamic relocs into one section\n"));
1820 fprintf (file, _(" -z nocopyreloc\tDon't create copy relocs\n"));
e0ee487b
L
1821 fprintf (file, _(" -z nodefaultlib\tMark object not to use default search paths\n"));
1822 fprintf (file, _(" -z nodelete\t\tMark DSO non-deletable at runtime\n"));
f813923c
HPN
1823 fprintf (file, _(" -z nodlopen\t\tMark DSO not available to dlopen\n"));
1824 fprintf (file, _(" -z nodump\t\tMark DSO not available to dldump\n"));
10b4329d 1825 fprintf (file, _(" -z noexecstack\tMark executable as not requiring executable stack\n"));
8c37241b 1826 fprintf (file, _(" -z norelro\t\tDon't create RELRO program header\n"));
e0ee487b 1827 fprintf (file, _(" -z now\t\tMark object non-lazy runtime binding\n"));
73e87d70 1828 fprintf (file, _(" -z origin\t\tMark object requiring immediate \$ORIGIN processing\n\t\t\t at runtime\n"));
8c37241b 1829 fprintf (file, _(" -z relro\t\tCreate RELRO program header\n"));
19e3be22 1830 fprintf (file, _(" -z KEYWORD\t\tIgnored for Solaris compatibility\n"));
e0ee487b
L
1831EOF
1832fi
1833
1834if test -n "$PARSE_AND_LIST_OPTIONS" ; then
1835cat >>e${EMULATION_NAME}.c <<EOF
1836 $PARSE_AND_LIST_OPTIONS
1837EOF
1838fi
1839
e0ee487b
L
1840cat >>e${EMULATION_NAME}.c <<EOF
1841}
1842EOF
e0ee487b
L
1843
1844if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
1845cat >>e${EMULATION_NAME}.c <<EOF
1846 $PARSE_AND_LIST_EPILOGUE
1847EOF
1848fi
41392f03
AM
1849fi
1850else
41392f03 1851cat >>e${EMULATION_NAME}.c <<EOF
3bcf5557
AM
1852#define gld${EMULATION_NAME}_add_options NULL
1853#define gld${EMULATION_NAME}_handle_option NULL
41392f03 1854EOF
4b209b22 1855if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
41392f03 1856cat >>e${EMULATION_NAME}.c <<EOF
4b209b22 1857#define gld${EMULATION_NAME}_list_options NULL
41392f03
AM
1858EOF
1859fi
1860fi
e0ee487b 1861
252b5132
RH
1862cat >>e${EMULATION_NAME}.c <<EOF
1863
60bcf0fa 1864struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
252b5132 1865{
41392f03
AM
1866 ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
1867 ${LDEMUL_SYSLIB-syslib_default},
1868 ${LDEMUL_HLL-hll_default},
1869 ${LDEMUL_AFTER_PARSE-after_parse_default},
1870 ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
1871 ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
1872 ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
1873 ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
1874 ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
1875 ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
252b5132
RH
1876 "${EMULATION_NAME}",
1877 "${OUTPUT_FORMAT}",
c56feb2b 1878 ${LDEMUL_FINISH-gld${EMULATION_NAME}_finish},
41392f03
AM
1879 ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
1880 ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
1881 ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
1882 ${LDEMUL_SET_SYMBOLS-NULL},
3bcf5557
AM
1883 ${LDEMUL_PARSE_ARGS-NULL},
1884 gld${EMULATION_NAME}_add_options,
1885 gld${EMULATION_NAME}_handle_option,
41392f03 1886 ${LDEMUL_UNRECOGNIZED_FILE-NULL},
4b209b22 1887 ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
4a43e768 1888 ${LDEMUL_RECOGNIZED_FILE-gld${EMULATION_NAME}_load_symbols},
41392f03 1889 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
fac1652d 1890 ${LDEMUL_NEW_VERS_PATTERN-NULL}
252b5132
RH
1891};
1892EOF