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