* linux-low.c (linux_wait_1): Move non-debugging code out of
[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
92b93329 11fragment <<EOF
252b5132
RH
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,
aa820537
AM
16 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
17 Free Software Foundation, Inc.
252b5132
RH
18 Written by Steve Chamberlain <sac@cygnus.com>
19 ELF support by Ian Lance Taylor <ian@cygnus.com>
20
f96b4a7b
NC
21 This file is part of the GNU Binutils.
22
23 This program is free software; you can redistribute it and/or modify
24 it under the terms of the GNU General Public License as published by
25 the Free Software Foundation; either version 3 of the License, or
26 (at your option) any later version.
27
28 This program is distributed in the hope that it will be useful,
29 but WITHOUT ANY WARRANTY; without even the implied warranty of
30 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
31 GNU General Public License for more details.
32
33 You should have received a copy of the GNU General Public License
34 along with this program; if not, write to the Free Software
35 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
36 MA 02110-1301, USA. */
252b5132
RH
37
38#define TARGET_IS_${EMULATION_NAME}
39
252b5132 40#include "sysdep.h"
3db64b00 41#include "bfd.h"
1c9acd94 42#include "libiberty.h"
3882b010 43#include "safe-ctype.h"
fcf65871 44#include "getopt.h"
24382dca
RM
45#include "md5.h"
46#include "sha1.h"
47#include <fcntl.h>
252b5132
RH
48
49#include "bfdlink.h"
50
51#include "ld.h"
52#include "ldmain.h"
252b5132
RH
53#include "ldmisc.h"
54#include "ldexp.h"
55#include "ldlang.h"
b71e2778
AM
56#include "ldfile.h"
57#include "ldemul.h"
df2a7313 58#include <ldgram.h>
e0ee487b 59#include "elf/common.h"
ecca9871 60#include "elf-bfd.h"
07f1e47a 61#include "filenames.h"
252b5132 62
0c7a8e5a
AM
63/* Declare functions used by various EXTRA_EM_FILEs. */
64static void gld${EMULATION_NAME}_before_parse (void);
65static void gld${EMULATION_NAME}_after_open (void);
66static void gld${EMULATION_NAME}_before_allocation (void);
eaeb0a9d 67static void gld${EMULATION_NAME}_after_allocation (void);
c2edb4b8 68static lang_output_section_statement_type *gld${EMULATION_NAME}_place_orphan
8a99a385 69 (asection *, const char *, int);
41392f03
AM
70EOF
71
d3989512
JJ
72if [ "x${USE_LIBPATH}" = xyes ] ; then
73 case ${target} in
711c0baa 74 *-*-linux-* | *-*-k*bsd*-*)
92b93329 75 fragment <<EOF
0b48acfe 76#ifdef HAVE_GLOB
d3989512 77#include <glob.h>
0b48acfe 78#endif
d3989512
JJ
79EOF
80 ;;
81 esac
82fi
83
41392f03
AM
84# Import any needed special functions and/or overrides.
85#
92b93329 86source_em ${srcdir}/emultempl/elf-generic.em
41392f03 87if test -n "$EXTRA_EM_FILE" ; then
92b93329 88 source_em ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
41392f03
AM
89fi
90
f813923c 91# Functions in this file can be overridden by setting the LDEMUL_* shell
41392f03
AM
92# variables. If the name of the overriding function is the same as is
93# defined in this file, then don't output this file's version.
94# If a different overriding name is given then output the standard function
95# as presumably it is called from the overriding function.
96#
97if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
92b93329 98fragment <<EOF
41392f03 99
252b5132 100static void
0c7a8e5a 101gld${EMULATION_NAME}_before_parse (void)
252b5132 102{
5e2f1575 103 ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
b34976b6
AM
104 config.dynamic_link = ${DYNAMIC_LINK-TRUE};
105 config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
252b5132
RH
106}
107
41392f03
AM
108EOF
109fi
110
4a43e768 111if test x"$LDEMUL_RECOGNIZED_FILE" != xgld"${EMULATION_NAME}"_load_symbols; then
92b93329 112fragment <<EOF
ddbb8a31 113/* Handle the generation of DT_NEEDED tags. */
4a43e768
AM
114
115static bfd_boolean
116gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *entry)
117{
96d56e9f 118 int link_class = 0;
4a43e768
AM
119
120 /* Tell the ELF linker that we don't want the output file to have a
121 DT_NEEDED entry for this file, unless it is used to resolve
122 references in a regular object. */
ddbb8a31 123 if (entry->add_DT_NEEDED_for_regular)
96d56e9f 124 link_class = DYN_AS_NEEDED;
e56f61be
L
125
126 /* Tell the ELF linker that we don't want the output file to have a
127 DT_NEEDED entry for any dynamic library in DT_NEEDED tags from
128 this file at all. */
ddbb8a31 129 if (!entry->add_DT_NEEDED_for_dynamic)
96d56e9f 130 link_class |= DYN_NO_ADD_NEEDED;
e56f61be 131
12b9ff6c
L
132 if (entry->just_syms_flag
133 && (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) != 0)
134 einfo (_("%P%F: --just-symbols may not be used on DSO: %B\n"),
135 entry->the_bfd);
136
ddbb8a31 137 if (link_class == 0
e56f61be
L
138 || (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) == 0)
139 return FALSE;
140
1e9cc1c2
NC
141 bfd_elf_set_dyn_lib_class (entry->the_bfd,
142 (enum dynamic_lib_link_class) link_class);
4a43e768
AM
143
144 /* Continue on with normal load_symbols processing. */
145 return FALSE;
146}
147EOF
148fi
149
92b93329 150fragment <<EOF
252b5132
RH
151
152/* These variables are required to pass information back and forth
153 between after_open and check_needed and stat_needed and vercheck. */
154
155static struct bfd_link_needed_list *global_needed;
156static struct stat global_stat;
e13629bc 157static lang_input_statement_type *global_found;
252b5132 158static struct bfd_link_needed_list *global_vercheck_needed;
b34976b6 159static bfd_boolean global_vercheck_failed;
252b5132 160
7ee314fa
AM
161/* These variables are used to implement target options */
162
163static char *audit; /* colon (typically) separated list of libs */
164static char *depaudit; /* colon (typically) separated list of libs */
252b5132 165
04925e1e
AM
166/* On Linux, it's possible to have different versions of the same
167 shared library linked against different versions of libc. The
168 dynamic linker somehow tags which libc version to use in
169 /etc/ld.so.cache, and, based on the libc that it sees in the
170 executable, chooses which version of the shared library to use.
252b5132 171
04925e1e
AM
172 We try to do a similar check here by checking whether this shared
173 library needs any other shared libraries which may conflict with
174 libraries we have already included in the link. If it does, we
175 skip it, and try to find another shared library farther on down the
176 link path.
252b5132 177
04925e1e
AM
178 This is called via lang_for_each_input_file.
179 GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
f813923c 180 which we are checking. This sets GLOBAL_VERCHECK_FAILED if we find
04925e1e 181 a conflicting version. */
252b5132 182
04925e1e 183static void
0c7a8e5a 184gld${EMULATION_NAME}_vercheck (lang_input_statement_type *s)
04925e1e 185{
1c9acd94 186 const char *soname;
04925e1e 187 struct bfd_link_needed_list *l;
252b5132 188
04925e1e
AM
189 if (global_vercheck_failed)
190 return;
191 if (s->the_bfd == NULL
192 || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
193 return;
252b5132 194
04925e1e
AM
195 soname = bfd_elf_get_dt_soname (s->the_bfd);
196 if (soname == NULL)
fed2999d 197 soname = lbasename (bfd_get_filename (s->the_bfd));
04925e1e
AM
198
199 for (l = global_vercheck_needed; l != NULL; l = l->next)
200 {
201 const char *suffix;
202
1c9acd94 203 if (strcmp (soname, l->name) == 0)
04925e1e
AM
204 {
205 /* Probably can't happen, but it's an easy check. */
206 continue;
252b5132
RH
207 }
208
04925e1e 209 if (strchr (l->name, '/') != NULL)
252b5132
RH
210 continue;
211
04925e1e
AM
212 suffix = strstr (l->name, ".so.");
213 if (suffix == NULL)
214 continue;
215
216 suffix += sizeof ".so." - 1;
217
1c9acd94 218 if (strncmp (soname, l->name, suffix - l->name) == 0)
04925e1e
AM
219 {
220 /* Here we know that S is a dynamic object FOO.SO.VER1, and
0c7a8e5a
AM
221 the object we are considering needs a dynamic object
222 FOO.SO.VER2, and VER1 and VER2 are different. This
223 appears to be a version mismatch, so we tell the caller
224 to try a different version of this library. */
b34976b6 225 global_vercheck_failed = TRUE;
04925e1e
AM
226 return;
227 }
252b5132
RH
228 }
229}
230
252b5132 231
04925e1e
AM
232/* See if an input file matches a DT_NEEDED entry by running stat on
233 the file. */
234
235static void
0c7a8e5a 236gld${EMULATION_NAME}_stat_needed (lang_input_statement_type *s)
252b5132 237{
04925e1e
AM
238 struct stat st;
239 const char *suffix;
240 const char *soname;
252b5132 241
e13629bc 242 if (global_found != NULL)
04925e1e
AM
243 return;
244 if (s->the_bfd == NULL)
245 return;
e13629bc
AM
246
247 /* If this input file was an as-needed entry, and wasn't found to be
248 needed at the stage it was linked, then don't say we have loaded it. */
249 if ((bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0)
7cedef86 250 return;
04925e1e
AM
251
252 if (bfd_stat (s->the_bfd, &st) != 0)
252b5132 253 {
04925e1e
AM
254 einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
255 return;
256 }
252b5132 257
9eabd475
ZW
258 /* Some operating systems, e.g. Windows, do not provide a meaningful
259 st_ino; they always set it to zero. (Windows does provide a
260 meaningful st_dev.) Do not indicate a duplicate library in that
261 case. While there is no guarantee that a system that provides
262 meaningful inode numbers will never set st_ino to zero, this is
263 merely an optimization, so we do not need to worry about false
264 negatives. */
04925e1e 265 if (st.st_dev == global_stat.st_dev
9eabd475
ZW
266 && st.st_ino == global_stat.st_ino
267 && st.st_ino != 0)
04925e1e 268 {
e13629bc 269 global_found = s;
04925e1e
AM
270 return;
271 }
252b5132 272
04925e1e
AM
273 /* We issue a warning if it looks like we are including two
274 different versions of the same shared library. For example,
275 there may be a problem if -lc picks up libc.so.6 but some other
276 shared library has a DT_NEEDED entry of libc.so.5. This is a
f813923c 277 heuristic test, and it will only work if the name looks like
04925e1e
AM
278 NAME.so.VERSION. FIXME: Depending on file names is error-prone.
279 If we really want to issue warnings about mixing version numbers
280 of shared libraries, we need to find a better way. */
252b5132 281
04925e1e
AM
282 if (strchr (global_needed->name, '/') != NULL)
283 return;
284 suffix = strstr (global_needed->name, ".so.");
285 if (suffix == NULL)
286 return;
287 suffix += sizeof ".so." - 1;
252b5132 288
04925e1e
AM
289 soname = bfd_elf_get_dt_soname (s->the_bfd);
290 if (soname == NULL)
fed2999d 291 soname = lbasename (s->filename);
252b5132 292
cde43e70 293 if (strncmp (soname, global_needed->name, suffix - global_needed->name) == 0)
04925e1e 294 einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
1c9acd94 295 global_needed->name, global_needed->by, soname);
252b5132
RH
296}
297
e56f61be
L
298struct dt_needed
299{
300 bfd *by;
301 const char *name;
302};
04925e1e 303
252b5132
RH
304/* This function is called for each possible name for a dynamic object
305 named by a DT_NEEDED entry. The FORCE parameter indicates whether
306 to skip the check for a conflicting version. */
307
b34976b6 308static bfd_boolean
e56f61be
L
309gld${EMULATION_NAME}_try_needed (struct dt_needed *needed,
310 int force)
252b5132
RH
311{
312 bfd *abfd;
e56f61be 313 const char *name = needed->name;
ec4eb78a 314 const char *soname;
96d56e9f 315 int link_class;
252b5132 316
f13a99db 317 abfd = bfd_openr (name, bfd_get_target (link_info.output_bfd));
252b5132 318 if (abfd == NULL)
b34976b6 319 return FALSE;
252b5132
RH
320 if (! bfd_check_format (abfd, bfd_object))
321 {
cde43e70 322 bfd_close (abfd);
b34976b6 323 return FALSE;
252b5132
RH
324 }
325 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
326 {
cde43e70 327 bfd_close (abfd);
b34976b6 328 return FALSE;
252b5132
RH
329 }
330
c4bb8067 331 /* For DT_NEEDED, they have to match. */
f13a99db 332 if (abfd->xvec != link_info.output_bfd->xvec)
c4bb8067
L
333 {
334 bfd_close (abfd);
b34976b6 335 return FALSE;
c4bb8067
L
336 }
337
252b5132
RH
338 /* Check whether this object would include any conflicting library
339 versions. If FORCE is set, then we skip this check; we use this
340 the second time around, if we couldn't find any compatible
341 instance of the shared library. */
342
343 if (! force)
344 {
91d6fa6a 345 struct bfd_link_needed_list *needs;
252b5132 346
91d6fa6a 347 if (! bfd_elf_get_bfd_needed_list (abfd, &needs))
252b5132
RH
348 einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
349
91d6fa6a 350 if (needs != NULL)
252b5132 351 {
91d6fa6a 352 global_vercheck_needed = needs;
b34976b6 353 global_vercheck_failed = FALSE;
252b5132
RH
354 lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
355 if (global_vercheck_failed)
356 {
cde43e70 357 bfd_close (abfd);
b34976b6 358 /* Return FALSE to force the caller to move on to try
0c7a8e5a 359 another file on the search path. */
b34976b6 360 return FALSE;
252b5132
RH
361 }
362
363 /* But wait! It gets much worse. On Linux, if a shared
0c7a8e5a
AM
364 library does not use libc at all, we are supposed to skip
365 it the first time around in case we encounter a shared
366 library later on with the same name which does use the
367 version of libc that we want. This is much too horrible
368 to use on any system other than Linux. */
252b5132
RH
369
370EOF
371case ${target} in
711c0baa 372 *-*-linux-* | *-*-k*bsd*-*)
92b93329 373 fragment <<EOF
252b5132
RH
374 {
375 struct bfd_link_needed_list *l;
376
91d6fa6a 377 for (l = needs; l != NULL; l = l->next)
0112cd26 378 if (CONST_STRNEQ (l->name, "libc.so"))
252b5132
RH
379 break;
380 if (l == NULL)
381 {
cde43e70 382 bfd_close (abfd);
b34976b6 383 return FALSE;
252b5132
RH
384 }
385 }
386
387EOF
388 ;;
389esac
92b93329 390fragment <<EOF
252b5132
RH
391 }
392 }
393
394 /* We've found a dynamic object matching the DT_NEEDED entry. */
395
04925e1e
AM
396 /* We have already checked that there is no other input file of the
397 same name. We must now check again that we are not including the
398 same file twice. We need to do this because on many systems
399 libc.so is a symlink to, e.g., libc.so.1. The SONAME entry will
400 reference libc.so.1. If we have already included libc.so, we
401 don't want to include libc.so.1 if they are the same file, and we
402 can only check that using stat. */
403
404 if (bfd_stat (abfd, &global_stat) != 0)
405 einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
ec4eb78a
L
406
407 /* First strip off everything before the last '/'. */
fed2999d 408 soname = lbasename (abfd->filename);
ec4eb78a
L
409
410 if (trace_file_tries)
411 info_msg (_("found %s at %s\n"), soname, name);
412
e13629bc 413 global_found = NULL;
04925e1e 414 lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
e13629bc 415 if (global_found != NULL)
04925e1e 416 {
b34976b6 417 /* Return TRUE to indicate that we found the file, even though
0c7a8e5a 418 we aren't going to do anything with it. */
b34976b6 419 return TRUE;
04925e1e
AM
420 }
421
4a43e768
AM
422 /* Specify the soname to use. */
423 bfd_elf_set_dt_needed_name (abfd, soname);
04925e1e 424
4a43e768
AM
425 /* Tell the ELF linker that we don't want the output file to have a
426 DT_NEEDED entry for this file, unless it is used to resolve
427 references in a regular object. */
96d56e9f 428 link_class = DYN_DT_NEEDED;
e56f61be
L
429
430 /* Tell the ELF linker that we don't want the output file to have a
431 DT_NEEDED entry for this file at all if the entry is from a file
432 with DYN_NO_ADD_NEEDED. */
7e9f0867
AM
433 if (needed->by != NULL
434 && (bfd_elf_get_dyn_lib_class (needed->by) & DYN_NO_ADD_NEEDED) != 0)
96d56e9f 435 link_class |= DYN_NO_NEEDED | DYN_NO_ADD_NEEDED;
e56f61be 436
1e9cc1c2 437 bfd_elf_set_dyn_lib_class (abfd, (enum dynamic_lib_link_class) link_class);
04925e1e
AM
438
439 /* Add this file into the symbol table. */
440 if (! bfd_link_add_symbols (abfd, &link_info))
441 einfo ("%F%B: could not read symbols: %E\n", abfd);
442
b34976b6 443 return TRUE;
04925e1e
AM
444}
445
446
447/* Search for a needed file in a path. */
448
b34976b6 449static bfd_boolean
e56f61be
L
450gld${EMULATION_NAME}_search_needed (const char *path,
451 struct dt_needed *n, int force)
04925e1e
AM
452{
453 const char *s;
e56f61be 454 const char *name = n->name;
04925e1e 455 size_t len;
e56f61be 456 struct dt_needed needed;
04925e1e 457
cc5ce052 458 if (name[0] == '/')
e56f61be 459 return gld${EMULATION_NAME}_try_needed (n, force);
cc5ce052 460
04925e1e 461 if (path == NULL || *path == '\0')
b34976b6 462 return FALSE;
e56f61be
L
463
464 needed.by = n->by;
465 needed.name = n->name;
466
04925e1e
AM
467 len = strlen (name);
468 while (1)
469 {
470 char *filename, *sset;
471
c76308d2 472 s = strchr (path, config.rpath_separator);
04925e1e
AM
473 if (s == NULL)
474 s = path + strlen (path);
475
07f1e47a
AM
476#if HAVE_DOS_BASED_FILE_SYSTEM
477 /* Assume a match on the second char is part of drive specifier. */
478 else if (config.rpath_separator == ':'
479 && s == path + 1
480 && ISALPHA (*path))
481 {
482 s = strchr (s + 1, config.rpath_separator);
483 if (s == NULL)
484 s = path + strlen (path);
485 }
486#endif
04925e1e
AM
487 filename = (char *) xmalloc (s - path + len + 2);
488 if (s == path)
489 sset = filename;
490 else
491 {
492 memcpy (filename, path, s - path);
493 filename[s - path] = '/';
494 sset = filename + (s - path) + 1;
495 }
496 strcpy (sset, name);
497
e56f61be
L
498 needed.name = filename;
499 if (gld${EMULATION_NAME}_try_needed (&needed, force))
b34976b6 500 return TRUE;
04925e1e
AM
501
502 free (filename);
503
504 if (*s == '\0')
505 break;
506 path = s + 1;
507 }
508
b34976b6 509 return FALSE;
04925e1e
AM
510}
511
512EOF
9c8ebd6a 513if [ "x${USE_LIBPATH}" = xyes ] ; then
92b93329 514 fragment <<EOF
9c8ebd6a 515
c76308d2
RS
516/* Add the sysroot to every entry in a path separated by
517 config.rpath_separator. */
9c8ebd6a
DJ
518
519static char *
0c7a8e5a 520gld${EMULATION_NAME}_add_sysroot (const char *path)
9c8ebd6a
DJ
521{
522 int len, colons, i;
523 char *ret, *p;
524
525 len = strlen (path);
526 colons = 0;
527 i = 0;
528 while (path[i])
c76308d2 529 if (path[i++] == config.rpath_separator)
9c8ebd6a
DJ
530 colons++;
531
532 if (path[i])
533 colons++;
534
42644a89 535 len = len + (colons + 1) * strlen (ld_sysroot);
9c8ebd6a
DJ
536 ret = xmalloc (len + 1);
537 strcpy (ret, ld_sysroot);
538 p = ret + strlen (ret);
539 i = 0;
540 while (path[i])
c76308d2 541 if (path[i] == config.rpath_separator)
9c8ebd6a 542 {
0c7a8e5a 543 *p++ = path[i++];
9c8ebd6a
DJ
544 strcpy (p, ld_sysroot);
545 p = p + strlen (p);
9c8ebd6a
DJ
546 }
547 else
548 *p++ = path[i++];
549
550 *p = 0;
551 return ret;
552}
04925e1e 553
3dc16cab
DJ
554EOF
555 case ${target} in
ebe1fac1 556 *-*-freebsd* | *-*-dragonfly*)
92b93329 557 fragment <<EOF
ebe1fac1
NC
558/* Read the system search path the FreeBSD way rather than the Linux way. */
559#ifdef HAVE_ELF_HINTS_H
560#include <elf-hints.h>
561#else
562#include "elf-hints-local.h"
563#endif
564
565static bfd_boolean
566gld${EMULATION_NAME}_check_ld_elf_hints (const char *name, int force)
567{
568 static bfd_boolean initialized;
569 static char *ld_elf_hints;
570 struct dt_needed needed;
571
572 if (!initialized)
573 {
574 FILE *f;
575 char *tmppath;
576
ff7a0acf 577 tmppath = concat (ld_sysroot, _PATH_ELF_HINTS, (const char *) NULL);
ebe1fac1
NC
578 f = fopen (tmppath, FOPEN_RB);
579 free (tmppath);
580 if (f != NULL)
581 {
582 struct elfhints_hdr hdr;
583
584 if (fread (&hdr, 1, sizeof (hdr), f) == sizeof (hdr)
585 && hdr.magic == ELFHINTS_MAGIC
586 && hdr.version == 1)
587 {
588 if (fseek (f, hdr.strtab + hdr.dirlist, SEEK_SET) != -1)
589 {
590 char *b;
591
592 b = xmalloc (hdr.dirlistlen + 1);
593 if (fread (b, 1, hdr.dirlistlen + 1, f) ==
594 hdr.dirlistlen + 1)
595 ld_elf_hints = gld${EMULATION_NAME}_add_sysroot (b);
e13629bc 596
ebe1fac1
NC
597 free (b);
598 }
599 }
600 fclose (f);
601 }
602
603 initialized = TRUE;
604 }
605
606 if (ld_elf_hints == NULL)
607 return FALSE;
608
609 needed.by = NULL;
610 needed.name = name;
611 return gld${EMULATION_NAME}_search_needed (ld_elf_hints, & needed,
e13629bc 612 force);
ebe1fac1
NC
613}
614EOF
615 # FreeBSD
616 ;;
617
711c0baa 618 *-*-linux-* | *-*-k*bsd*-*)
92b93329 619 fragment <<EOF
04925e1e
AM
620/* For a native linker, check the file /etc/ld.so.conf for directories
621 in which we may find shared libraries. /etc/ld.so.conf is really
482e8b32 622 only meaningful on Linux. */
04925e1e 623
d3989512 624struct gld${EMULATION_NAME}_ld_so_conf
04925e1e 625{
d3989512
JJ
626 char *path;
627 size_t len, alloc;
628};
04925e1e 629
dfcffada 630static bfd_boolean
d3989512
JJ
631gld${EMULATION_NAME}_parse_ld_so_conf
632 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename);
633
634static void
635gld${EMULATION_NAME}_parse_ld_so_conf_include
636 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename,
637 const char *pattern)
638{
639 char *newp = NULL;
0b48acfe 640#ifdef HAVE_GLOB
d3989512 641 glob_t gl;
0b48acfe 642#endif
d3989512
JJ
643
644 if (pattern[0] != '/')
04925e1e 645 {
d3989512
JJ
646 char *p = strrchr (filename, '/');
647 size_t patlen = strlen (pattern) + 1;
04925e1e 648
d3989512
JJ
649 newp = xmalloc (p - filename + 1 + patlen);
650 memcpy (newp, filename, p - filename + 1);
651 memcpy (newp + (p - filename + 1), pattern, patlen);
652 pattern = newp;
653 }
04925e1e 654
0b48acfe 655#ifdef HAVE_GLOB
d3989512
JJ
656 if (glob (pattern, 0, NULL, &gl) == 0)
657 {
658 size_t i;
659
660 for (i = 0; i < gl.gl_pathc; ++i)
661 gld${EMULATION_NAME}_parse_ld_so_conf (info, gl.gl_pathv[i]);
662 globfree (&gl);
663 }
0b48acfe
MM
664#else
665 /* If we do not have glob, treat the pattern as a literal filename. */
666 gld${EMULATION_NAME}_parse_ld_so_conf (info, pattern);
667#endif
d3989512
JJ
668
669 if (newp)
670 free (newp);
671}
672
dfcffada 673static bfd_boolean
d3989512
JJ
674gld${EMULATION_NAME}_parse_ld_so_conf
675 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename)
676{
677 FILE *f = fopen (filename, FOPEN_RT);
563f4125
JJ
678 char *line;
679 size_t linelen;
d3989512
JJ
680
681 if (f == NULL)
dfcffada 682 return FALSE;
d3989512 683
563f4125
JJ
684 linelen = 256;
685 line = xmalloc (linelen);
686 do
d3989512 687 {
563f4125
JJ
688 char *p = line, *q;
689
690 /* Normally this would use getline(3), but we need to be portable. */
691 while ((q = fgets (p, linelen - (p - line), f)) != NULL
692 && strlen (q) == linelen - (p - line) - 1
693 && line[linelen - 2] != '\n')
694 {
695 line = xrealloc (line, 2 * linelen);
696 p = line + linelen - 1;
697 linelen += linelen;
698 }
699
700 if (q == NULL && p == line)
701 break;
d3989512
JJ
702
703 p = strchr (line, '\n');
704 if (p)
705 *p = '\0';
706
707 /* Because the file format does not know any form of quoting we
708 can search forward for the next '#' character and if found
709 make it terminating the line. */
710 p = strchr (line, '#');
711 if (p)
712 *p = '\0';
713
714 /* Remove leading whitespace. NUL is no whitespace character. */
715 p = line;
716 while (*p == ' ' || *p == '\f' || *p == '\r' || *p == '\t' || *p == '\v')
717 ++p;
718
719 /* If the line is blank it is ignored. */
720 if (p[0] == '\0')
721 continue;
04925e1e 722
0112cd26 723 if (CONST_STRNEQ (p, "include") && (p[7] == ' ' || p[7] == '\t'))
d3989512
JJ
724 {
725 char *dir, c;
726 p += 8;
727 do
04925e1e 728 {
d3989512
JJ
729 while (*p == ' ' || *p == '\t')
730 ++p;
04925e1e 731
d3989512
JJ
732 if (*p == '\0')
733 break;
252b5132 734
d3989512
JJ
735 dir = p;
736
737 while (*p != ' ' && *p != '\t' && *p)
738 ++p;
739
740 c = *p;
741 *p++ = '\0';
742 if (dir[0] != '\0')
743 gld${EMULATION_NAME}_parse_ld_so_conf_include (info, filename,
744 dir);
745 }
746 while (c != '\0');
747 }
748 else
749 {
750 char *dir = p;
751 while (*p && *p != '=' && *p != ' ' && *p != '\t' && *p != '\f'
752 && *p != '\r' && *p != '\v')
753 ++p;
754
755 while (p != dir && p[-1] == '/')
756 --p;
757 if (info->path == NULL)
758 {
759 info->alloc = p - dir + 1 + 256;
760 info->path = xmalloc (info->alloc);
761 info->len = 0;
762 }
04925e1e
AM
763 else
764 {
d3989512
JJ
765 if (info->len + 1 + (p - dir) >= info->alloc)
766 {
767 info->alloc += p - dir + 256;
768 info->path = xrealloc (info->path, info->alloc);
769 }
c76308d2 770 info->path[info->len++] = config.rpath_separator;
04925e1e 771 }
d3989512
JJ
772 memcpy (info->path + info->len, dir, p - dir);
773 info->len += p - dir;
774 info->path[info->len] = '\0';
775 }
776 }
563f4125 777 while (! feof (f));
d3989512
JJ
778 free (line);
779 fclose (f);
dfcffada 780 return TRUE;
d3989512 781}
252b5132 782
d3989512
JJ
783static bfd_boolean
784gld${EMULATION_NAME}_check_ld_so_conf (const char *name, int force)
785{
786 static bfd_boolean initialized;
787 static char *ld_so_conf;
788 struct dt_needed needed;
252b5132 789
d3989512
JJ
790 if (! initialized)
791 {
792 char *tmppath;
793 struct gld${EMULATION_NAME}_ld_so_conf info;
9c8ebd6a 794
d3989512
JJ
795 info.path = NULL;
796 info.len = info.alloc = 0;
ff7a0acf
AM
797 tmppath = concat (ld_sysroot, "${prefix}/etc/ld.so.conf",
798 (const char *) NULL);
dfcffada
AM
799 if (!gld${EMULATION_NAME}_parse_ld_so_conf (&info, tmppath))
800 {
801 free (tmppath);
ff7a0acf
AM
802 tmppath = concat (ld_sysroot, "/etc/ld.so.conf",
803 (const char *) NULL);
dfcffada
AM
804 gld${EMULATION_NAME}_parse_ld_so_conf (&info, tmppath);
805 }
d3989512 806 free (tmppath);
dfcffada 807
d3989512
JJ
808 if (info.path)
809 {
810 char *d = gld${EMULATION_NAME}_add_sysroot (info.path);
811 free (info.path);
812 ld_so_conf = d;
04925e1e 813 }
b34976b6 814 initialized = TRUE;
04925e1e 815 }
49e56c49 816
04925e1e 817 if (ld_so_conf == NULL)
b34976b6 818 return FALSE;
252b5132 819
e56f61be
L
820
821 needed.by = NULL;
822 needed.name = name;
823 return gld${EMULATION_NAME}_search_needed (ld_so_conf, &needed, force);
252b5132
RH
824}
825
04925e1e 826EOF
9c8ebd6a
DJ
827 # Linux
828 ;;
04925e1e
AM
829 esac
830fi
92b93329 831fragment <<EOF
04925e1e 832
252b5132
RH
833/* See if an input file matches a DT_NEEDED entry by name. */
834
835static void
0c7a8e5a 836gld${EMULATION_NAME}_check_needed (lang_input_statement_type *s)
252b5132 837{
e13629bc
AM
838 const char *soname;
839
840 /* Stop looking if we've found a loaded lib. */
841 if (global_found != NULL
842 && (bfd_elf_get_dyn_lib_class (global_found->the_bfd)
843 & DYN_AS_NEEDED) == 0)
252b5132
RH
844 return;
845
e13629bc
AM
846 if (s->filename == NULL || s->the_bfd == NULL)
847 return;
848
849 /* Don't look for a second non-loaded as-needed lib. */
850 if (global_found != NULL
851 && (bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0)
7cedef86
AM
852 return;
853
e13629bc 854 if (strcmp (s->filename, global_needed->name) == 0)
252b5132 855 {
e13629bc
AM
856 global_found = s;
857 return;
858 }
577a0623 859
e13629bc
AM
860 if (s->search_dirs_flag)
861 {
862 const char *f = strrchr (s->filename, '/');
863 if (f != NULL
864 && strcmp (f + 1, global_needed->name) == 0)
577a0623 865 {
e13629bc 866 global_found = s;
577a0623
AM
867 return;
868 }
252b5132
RH
869 }
870
e13629bc
AM
871 soname = bfd_elf_get_dt_soname (s->the_bfd);
872 if (soname != NULL
873 && strcmp (soname, global_needed->name) == 0)
252b5132 874 {
e13629bc
AM
875 global_found = s;
876 return;
252b5132 877 }
252b5132
RH
878}
879
41392f03
AM
880EOF
881
882if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
92b93329 883fragment <<EOF
04925e1e 884
24382dca
RM
885static bfd_size_type
886gld${EMULATION_NAME}_id_note_section_size (bfd *abfd,
91d6fa6a 887 struct bfd_link_info *linfo)
24382dca 888{
91d6fa6a 889 const char *style = linfo->emit_note_gnu_build_id;
24382dca
RM
890 bfd_size_type size;
891
892 abfd = abfd;
893
894 size = offsetof (Elf_External_Note, name[sizeof "GNU"]);
895 size = (size + 3) & -(bfd_size_type) 4;
896
897 if (!strcmp (style, "md5") || !strcmp (style, "uuid"))
898 size += 128 / 8;
899 else if (!strcmp (style, "sha1"))
900 size += 160 / 8;
901 else if (!strncmp (style, "0x", 2))
902 {
903 /* ID is in string form (hex). Convert to bits. */
904 const char *id = style + 2;
905 do
906 {
907 if (ISXDIGIT (id[0]) && ISXDIGIT (id[1]))
908 {
909 ++size;
910 id += 2;
911 }
912 else if (*id == '-' || *id == ':')
913 ++id;
914 else
915 {
916 size = 0;
917 break;
918 }
919 } while (*id != '\0');
920 }
921 else
922 size = 0;
923
924 return size;
925}
926
927static unsigned char
928read_hex (const char xdigit)
929{
930 if (ISDIGIT (xdigit))
931 return xdigit - '0';
932 if (ISUPPER (xdigit))
933 return xdigit - 'A' + 0xa;
934 if (ISLOWER (xdigit))
935 return xdigit - 'a' + 0xa;
936 abort ();
937 return 0;
938}
939
940struct build_id_info
941{
942 const char *style;
943 asection *sec;
944};
945
946static bfd_boolean
947gld${EMULATION_NAME}_write_build_id_section (bfd *abfd)
948{
949 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
1e9cc1c2 950 struct build_id_info *info = (struct build_id_info *)
24382dca
RM
951 elf_tdata (abfd)->after_write_object_contents_info;
952 asection *asec;
953 Elf_Internal_Shdr *i_shdr;
954 unsigned char *contents, *id_bits;
955 bfd_size_type size;
956 Elf_External_Note *e_note;
957
958 asec = info->sec;
83e4970b 959 if (bfd_is_abs_section (asec->output_section))
24382dca 960 {
83e4970b
AM
961 einfo (_("%P: warning: .note.gnu.build-id section discarded,"
962 " --build-id ignored.\n"));
963 return TRUE;
24382dca
RM
964 }
965 i_shdr = &elf_section_data (asec->output_section)->this_hdr;
966
967 if (i_shdr->contents == NULL)
968 {
b2ff8454 969 if (asec->contents == NULL)
1e9cc1c2 970 asec->contents = (unsigned char *) xmalloc (asec->size);
b2ff8454 971 contents = asec->contents;
24382dca 972 }
b2ff8454
RM
973 else
974 contents = i_shdr->contents + asec->output_offset;
24382dca 975
1e9cc1c2 976 e_note = (Elf_External_Note *) contents;
24382dca
RM
977 size = offsetof (Elf_External_Note, name[sizeof "GNU"]);
978 size = (size + 3) & -(bfd_size_type) 4;
979 id_bits = contents + size;
980 size = asec->size - size;
981
982 bfd_h_put_32 (abfd, sizeof "GNU", &e_note->namesz);
983 bfd_h_put_32 (abfd, size, &e_note->descsz);
984 bfd_h_put_32 (abfd, NT_GNU_BUILD_ID, &e_note->type);
985 memcpy (e_note->name, "GNU", sizeof "GNU");
986
987 if (!strcmp (info->style, "md5"))
988 {
989 struct md5_ctx ctx;
990 md5_init_ctx (&ctx);
991 if (bed->s->checksum_contents (abfd,
992 (void (*) (const void *, size_t, void *))
993 &md5_process_bytes,
994 &ctx))
995 md5_finish_ctx (&ctx, id_bits);
996 else
997 return FALSE;
998 }
999 else if (!strcmp (info->style, "sha1"))
1000 {
1001 struct sha1_ctx ctx;
1002 sha1_init_ctx (&ctx);
1003 if (bed->s->checksum_contents (abfd,
1004 (void (*) (const void *, size_t, void *))
1005 &sha1_process_bytes,
1006 &ctx))
1007 sha1_finish_ctx (&ctx, id_bits);
1008 else
1009 return FALSE;
1010 }
1011 else if (!strcmp (info->style, "uuid"))
1012 {
1013 int n;
1014 int fd = open ("/dev/urandom", O_RDONLY);
1015 if (fd < 0)
1016 return FALSE;
1017 n = read (fd, id_bits, size);
1018 close (fd);
1019 if (n < (int) size)
1020 return FALSE;
1021 }
1022 else if (!strncmp (info->style, "0x", 2))
1023 {
1024 /* ID is in string form (hex). Convert to bits. */
1025 const char *id = info->style + 2;
1026 size_t n = 0;
1027 do
1028 {
1029 if (ISXDIGIT (id[0]) && ISXDIGIT (id[1]))
1030 {
1031 id_bits[n] = read_hex (*id++) << 4;
1032 id_bits[n++] |= read_hex (*id++);
1033 }
1034 else if (*id == '-' || *id == ':')
1035 ++id;
1036 else
1037 abort (); /* Should have been validated earlier. */
1038 } while (*id != '\0');
1039 }
1040 else
1041 abort (); /* Should have been validated earlier. */
1042
b2ff8454
RM
1043 size = asec->size;
1044 return (bfd_seek (abfd,
1045 i_shdr->sh_offset + asec->output_offset, SEEK_SET) == 0
1046 && bfd_bwrite (contents, size, abfd) == size);
24382dca
RM
1047}
1048
1049
04925e1e 1050/* This is called after all the input files have been opened. */
252b5132
RH
1051
1052static void
0c7a8e5a 1053gld${EMULATION_NAME}_after_open (void)
252b5132 1054{
04925e1e 1055 struct bfd_link_needed_list *needed, *l;
d10e7fcc
AM
1056 struct elf_link_hash_table *htab;
1057
1058 htab = elf_hash_table (&link_info);
1059 if (!is_elf_hash_table (htab))
1060 return;
252b5132 1061
c0065db7
RM
1062 if (link_info.emit_note_gnu_build_id)
1063 {
1064 bfd *abfd;
1065 asection *s;
1066 bfd_size_type size;
1067
a654efd6
L
1068 /* Find an ELF input. */
1069 for (abfd = link_info.input_bfds;
1070 abfd != (bfd *) NULL; abfd = abfd->link_next)
1071 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1072 break;
c0065db7 1073
e9e0a58e 1074 if (abfd == NULL)
c0065db7 1075 {
e9e0a58e
NC
1076 /* PR 10555: If there are no input files do not
1077 try to create a .note.gnu-build-id section. */
c0065db7
RM
1078 free (link_info.emit_note_gnu_build_id);
1079 link_info.emit_note_gnu_build_id = NULL;
1080 }
1081 else
1082 {
e9e0a58e
NC
1083 size = gld${EMULATION_NAME}_id_note_section_size (abfd, &link_info);
1084 if (size == 0)
c0065db7 1085 {
e9e0a58e
NC
1086 einfo ("%P: warning: unrecognized --build-id style ignored.\n");
1087 free (link_info.emit_note_gnu_build_id);
1088 link_info.emit_note_gnu_build_id = NULL;
c0065db7
RM
1089 }
1090 else
1091 {
e9e0a58e
NC
1092 s = bfd_make_section_with_flags (abfd, ".note.gnu.build-id",
1093 SEC_ALLOC | SEC_LOAD
1094 | SEC_IN_MEMORY | SEC_LINKER_CREATED
1095 | SEC_READONLY | SEC_DATA);
1096 if (s != NULL && bfd_set_section_alignment (abfd, s, 2))
1097 {
1098 struct elf_obj_tdata *t = elf_tdata (link_info.output_bfd);
1e9cc1c2
NC
1099 struct build_id_info *b =
1100 (struct build_id_info *) xmalloc (sizeof *b);
e9e0a58e
NC
1101
1102 b->style = link_info.emit_note_gnu_build_id;
1103 b->sec = s;
1104 elf_section_type (s) = SHT_NOTE;
1105 s->size = size;
1106 t->after_write_object_contents
1107 = &gld${EMULATION_NAME}_write_build_id_section;
1108 t->after_write_object_contents_info = b;
1109 }
1110 else
1111 {
1112 einfo ("%P: warning: Cannot create .note.gnu.build-id section,"
1113 " --build-id ignored.\n");
1114 free (link_info.emit_note_gnu_build_id);
1115 link_info.emit_note_gnu_build_id = NULL;
1116 }
c0065db7
RM
1117 }
1118 }
1119 }
1120
d10e7fcc
AM
1121 if (link_info.relocatable)
1122 return;
1123
eb3d5f3b 1124 if (link_info.eh_frame_hdr
d10e7fcc 1125 && !link_info.traditional_format)
eb3d5f3b 1126 {
a654efd6
L
1127 bfd *abfd, *elfbfd = NULL;
1128 bfd_boolean warn_eh_frame = FALSE;
d10e7fcc 1129 asection *s;
eb3d5f3b 1130
d10e7fcc 1131 for (abfd = link_info.input_bfds; abfd; abfd = abfd->link_next)
eb3d5f3b 1132 {
a654efd6
L
1133 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1134 elfbfd = abfd;
4440bb77
L
1135 if (!warn_eh_frame)
1136 {
1137 s = bfd_get_section_by_name (abfd, ".eh_frame");
1138 warn_eh_frame
1139 = (s
1140 && s->size > 8
1141 && !bfd_is_abs_section (s->output_section));
1142 }
1143 if (elfbfd && warn_eh_frame)
1144 break;
d10e7fcc 1145 }
a654efd6 1146 if (elfbfd)
d10e7fcc
AM
1147 {
1148 const struct elf_backend_data *bed;
1149
a654efd6
L
1150 bed = get_elf_backend_data (elfbfd);
1151 s = bfd_make_section_with_flags (elfbfd, ".eh_frame_hdr",
1152 bed->dynamic_sec_flags
1153 | SEC_READONLY);
d10e7fcc 1154 if (s != NULL
a654efd6
L
1155 && bfd_set_section_alignment (elfbfd, s, 2))
1156 {
1157 htab->eh_info.hdr_sec = s;
1158 warn_eh_frame = FALSE;
1159 }
eb3d5f3b 1160 }
a654efd6
L
1161 if (warn_eh_frame)
1162 einfo ("%P: warning: Cannot create .eh_frame_hdr section,"
1163 " --eh-frame-hdr ignored.\n");
eb3d5f3b
JB
1164 }
1165
04925e1e
AM
1166 /* Get the list of files which appear in DT_NEEDED entries in
1167 dynamic objects included in the link (often there will be none).
1168 For each such file, we want to track down the corresponding
1169 library, and include the symbol table in the link. This is what
1170 the runtime dynamic linker will do. Tracking the files down here
1171 permits one dynamic object to include another without requiring
1172 special action by the person doing the link. Note that the
1173 needed list can actually grow while we are stepping through this
1174 loop. */
d10e7fcc
AM
1175 if (!link_info.executable)
1176 return;
f13a99db 1177 needed = bfd_elf_get_needed_list (link_info.output_bfd, &link_info);
04925e1e 1178 for (l = needed; l != NULL; l = l->next)
252b5132 1179 {
04925e1e 1180 struct bfd_link_needed_list *ll;
e56f61be 1181 struct dt_needed n, nn;
04925e1e 1182 int force;
252b5132 1183
7e9f0867
AM
1184 /* If the lib that needs this one was --as-needed and wasn't
1185 found to be needed, then this lib isn't needed either. */
1186 if (l->by != NULL
1187 && (bfd_elf_get_dyn_lib_class (l->by) & DYN_AS_NEEDED) != 0)
1188 continue;
1189
04925e1e
AM
1190 /* If we've already seen this file, skip it. */
1191 for (ll = needed; ll != l; ll = ll->next)
7e9f0867
AM
1192 if ((ll->by == NULL
1193 || (bfd_elf_get_dyn_lib_class (ll->by) & DYN_AS_NEEDED) == 0)
1194 && strcmp (ll->name, l->name) == 0)
04925e1e
AM
1195 break;
1196 if (ll != l)
1197 continue;
252b5132 1198
04925e1e
AM
1199 /* See if this file was included in the link explicitly. */
1200 global_needed = l;
e13629bc 1201 global_found = NULL;
04925e1e 1202 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
e13629bc
AM
1203 if (global_found != NULL
1204 && (bfd_elf_get_dyn_lib_class (global_found->the_bfd)
1205 & DYN_AS_NEEDED) == 0)
04925e1e 1206 continue;
252b5132 1207
e56f61be
L
1208 n.by = l->by;
1209 n.name = l->name;
1210 nn.by = l->by;
ec4eb78a
L
1211 if (trace_file_tries)
1212 info_msg (_("%s needed by %B\n"), l->name, l->by);
1213
e13629bc
AM
1214 /* As-needed libs specified on the command line (or linker script)
1215 take priority over libs found in search dirs. */
1216 if (global_found != NULL)
1217 {
1218 nn.name = global_found->filename;
1219 if (gld${EMULATION_NAME}_try_needed (&nn, TRUE))
1220 continue;
1221 }
1222
04925e1e
AM
1223 /* We need to find this file and include the symbol table. We
1224 want to search for the file in the same way that the dynamic
1225 linker will search. That means that we want to use
1226 rpath_link, rpath, then the environment variable
ec4eb78a
L
1227 LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
1228 entries (native only), then the linker script LIB_SEARCH_DIRS.
1229 We do not search using the -L arguments.
252b5132 1230
04925e1e
AM
1231 We search twice. The first time, we skip objects which may
1232 introduce version mismatches. The second time, we force
1233 their use. See gld${EMULATION_NAME}_vercheck comment. */
1234 for (force = 0; force < 2; force++)
1235 {
04925e1e
AM
1236 size_t len;
1237 search_dirs_type *search;
6dd8c765 1238EOF
ff925e69 1239if [ "x${NATIVE}" = xyes ] ; then
92b93329 1240fragment <<EOF
dcb0bd0e 1241 const char *lib_path;
ff925e69
KK
1242EOF
1243fi
1244if [ "x${USE_LIBPATH}" = xyes ] ; then
92b93329 1245fragment <<EOF
6dd8c765
L
1246 struct bfd_link_needed_list *rp;
1247 int found;
1248EOF
6dd8c765 1249fi
92b93329 1250fragment <<EOF
252b5132 1251
04925e1e 1252 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
e56f61be 1253 &n, force))
04925e1e 1254 break;
dcb0bd0e 1255EOF
9c8ebd6a 1256if [ "x${USE_LIBPATH}" = xyes ] ; then
92b93329 1257fragment <<EOF
04925e1e 1258 if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
e56f61be 1259 &n, force))
04925e1e 1260 break;
9c8ebd6a
DJ
1261EOF
1262fi
1263if [ "x${NATIVE}" = xyes ] ; then
92b93329 1264fragment <<EOF
04925e1e
AM
1265 if (command_line.rpath_link == NULL
1266 && command_line.rpath == NULL)
1267 {
1268 lib_path = (const char *) getenv ("LD_RUN_PATH");
e56f61be 1269 if (gld${EMULATION_NAME}_search_needed (lib_path, &n,
04925e1e
AM
1270 force))
1271 break;
1272 }
04925e1e 1273 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
e56f61be 1274 if (gld${EMULATION_NAME}_search_needed (lib_path, &n, force))
04925e1e 1275 break;
9c8ebd6a
DJ
1276EOF
1277fi
1278if [ "x${USE_LIBPATH}" = xyes ] ; then
92b93329 1279fragment <<EOF
ec4eb78a 1280 found = 0;
f13a99db 1281 rp = bfd_elf_get_runpath_list (link_info.output_bfd, &link_info);
6dd8c765 1282 for (; !found && rp != NULL; rp = rp->next)
ec4eb78a 1283 {
9c8ebd6a 1284 char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
ec4eb78a 1285 found = (rp->by == l->by
9c8ebd6a 1286 && gld${EMULATION_NAME}_search_needed (tmpname,
e56f61be 1287 &n,
ec4eb78a 1288 force));
9c8ebd6a 1289 free (tmpname);
ec4eb78a
L
1290 }
1291 if (found)
1292 break;
1293
04925e1e 1294EOF
04925e1e 1295fi
c1446dba
L
1296if [ "x${USE_LIBPATH}" = xyes ] ; then
1297 case ${target} in
ebe1fac1 1298 *-*-freebsd* | *-*-dragonfly*)
92b93329 1299 fragment <<EOF
ebe1fac1
NC
1300 if (gld${EMULATION_NAME}_check_ld_elf_hints (l->name, force))
1301 break;
1302EOF
1303 # FreeBSD
1304 ;;
1305
c1446dba
L
1306 *-*-linux-* | *-*-k*bsd*-*)
1307 # Linux
92b93329 1308 fragment <<EOF
c1446dba
L
1309 if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
1310 break;
1311
1312EOF
1313 ;;
1314 esac
1315fi
92b93329 1316fragment <<EOF
04925e1e
AM
1317 len = strlen (l->name);
1318 for (search = search_head; search != NULL; search = search->next)
1319 {
1320 char *filename;
252b5132 1321
04925e1e
AM
1322 if (search->cmdline)
1323 continue;
1324 filename = (char *) xmalloc (strlen (search->name) + len + 2);
1325 sprintf (filename, "%s/%s", search->name, l->name);
e56f61be
L
1326 nn.name = filename;
1327 if (gld${EMULATION_NAME}_try_needed (&nn, force))
04925e1e
AM
1328 break;
1329 free (filename);
1330 }
1331 if (search != NULL)
1332 break;
1333EOF
92b93329 1334fragment <<EOF
04925e1e 1335 }
252b5132 1336
04925e1e
AM
1337 if (force < 2)
1338 continue;
252b5132 1339
e374f1d9 1340 einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
04925e1e
AM
1341 l->name, l->by);
1342 }
1343}
252b5132 1344
41392f03
AM
1345EOF
1346fi
1347
92b93329 1348fragment <<EOF
252b5132 1349
04925e1e 1350/* Look through an expression for an assignment statement. */
252b5132 1351
04925e1e 1352static void
0c7a8e5a 1353gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
04925e1e 1354{
4ea42fb7 1355 bfd_boolean provide = FALSE;
04925e1e
AM
1356
1357 switch (exp->type.node_class)
252b5132 1358 {
04925e1e 1359 case etree_provide:
bded3693 1360 case etree_provided:
4ea42fb7
AM
1361 provide = TRUE;
1362 /* Fall thru */
1363 case etree_assign:
04925e1e
AM
1364 /* We call record_link_assignment even if the symbol is defined.
1365 This is because if it is defined by a dynamic object, we
1366 actually want to use the value defined by the linker script,
1367 not the value from the dynamic object (because we are setting
1368 symbols like etext). If the symbol is defined by a regular
1369 object, then, as it happens, calling record_link_assignment
1370 will do no harm. */
04925e1e 1371 if (strcmp (exp->assign.dst, ".") != 0)
252b5132 1372 {
f13a99db
AM
1373 if (!bfd_elf_record_link_assignment (link_info.output_bfd,
1374 &link_info,
fe21a8fc
L
1375 exp->assign.dst, provide,
1376 exp->assign.hidden))
04925e1e
AM
1377 einfo ("%P%F: failed to record assignment to %s: %E\n",
1378 exp->assign.dst);
252b5132 1379 }
04925e1e
AM
1380 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1381 break;
252b5132 1382
04925e1e
AM
1383 case etree_binary:
1384 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1385 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1386 break;
252b5132 1387
04925e1e
AM
1388 case etree_trinary:
1389 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1390 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1391 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1392 break;
252b5132 1393
04925e1e
AM
1394 case etree_unary:
1395 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1396 break;
252b5132 1397
04925e1e
AM
1398 default:
1399 break;
252b5132
RH
1400 }
1401}
1402
04925e1e
AM
1403
1404/* This is called by the before_allocation routine via
1405 lang_for_each_statement. It locates any assignment statements, and
1406 tells the ELF backend about them, in case they are assignments to
1407 symbols which are referred to by dynamic objects. */
1408
1409static void
0c7a8e5a 1410gld${EMULATION_NAME}_find_statement_assignment (lang_statement_union_type *s)
04925e1e
AM
1411{
1412 if (s->header.type == lang_assignment_statement_enum)
1413 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1414}
1415
41392f03
AM
1416EOF
1417
1418if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
57e6abd2
AO
1419 if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
1420 ELF_INTERPRETER_SET_DEFAULT="
1421 if (sinterp != NULL)
1422 {
5718918d
AM
1423 sinterp->contents = (unsigned char *) ${ELF_INTERPRETER_NAME};
1424 sinterp->size = strlen ((char *) sinterp->contents) + 1;
57e6abd2
AO
1425 }
1426
1427"
1428 else
1429 ELF_INTERPRETER_SET_DEFAULT=
1430 fi
92b93329 1431fragment <<EOF
04925e1e 1432
7ee314fa
AM
1433/* used by before_allocation and handle_option. */
1434static void
91d6fa6a 1435gld${EMULATION_NAME}_append_to_separated_string (char **to, char *op_arg)
7ee314fa
AM
1436{
1437 if (*to == NULL)
91d6fa6a 1438 *to = xstrdup (op_arg);
7ee314fa
AM
1439 else
1440 {
1441 size_t to_len = strlen (*to);
91d6fa6a 1442 size_t op_arg_len = strlen (op_arg);
7ee314fa
AM
1443 char *buf;
1444 char *cp = *to;
1445
1446 /* First see whether OPTARG is already in the path. */
1447 do
1448 {
91d6fa6a
NC
1449 if (strncmp (op_arg, cp, op_arg_len) == 0
1450 && (cp[op_arg_len] == 0
1451 || cp[op_arg_len] == config.rpath_separator))
7ee314fa
AM
1452 /* We found it. */
1453 break;
1454
1455 /* Not yet found. */
1456 cp = strchr (cp, config.rpath_separator);
1457 if (cp != NULL)
1458 ++cp;
1459 }
1460 while (cp != NULL);
1461
1462 if (cp == NULL)
1463 {
91d6fa6a 1464 buf = xmalloc (to_len + op_arg_len + 2);
7ee314fa 1465 sprintf (buf, "%s%c%s", *to,
91d6fa6a 1466 config.rpath_separator, op_arg);
7ee314fa
AM
1467 free (*to);
1468 *to = buf;
1469 }
1470 }
1471}
1472
252b5132
RH
1473/* This is called after the sections have been attached to output
1474 sections, but before any sizes or addresses have been set. */
1475
1476static void
0c7a8e5a 1477gld${EMULATION_NAME}_before_allocation (void)
252b5132
RH
1478{
1479 const char *rpath;
1480 asection *sinterp;
7ee314fa 1481 bfd *abfd;
252b5132 1482
fd574c46 1483 if (link_info.hash->type == bfd_link_elf_hash_table)
f13a99db 1484 _bfd_elf_tls_setup (link_info.output_bfd, &link_info);
e1918d23 1485
252b5132
RH
1486 /* If we are going to make any variable assignments, we need to let
1487 the ELF backend know about them in case the variables are
1488 referred to by dynamic objects. */
1489 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
1490
1491 /* Let the ELF backend work out the sizes of any sections required
1492 by dynamic linking. */
1493 rpath = command_line.rpath;
1494 if (rpath == NULL)
1495 rpath = (const char *) getenv ("LD_RUN_PATH");
7ee314fa
AM
1496
1497 for (abfd = link_info.input_bfds; abfd; abfd = abfd->link_next)
1498 {
1499 const char *audit_libs = elf_dt_audit (abfd);
1500
1501 /* If the input bfd contains an audit entry, we need to add it as
1502 a dep audit entry. */
1503 if (audit_libs && *audit_libs != '\0')
1504 {
1505 char *cp = xstrdup (audit_libs);
1506 do
1507 {
1508 int more = 0;
1509 char *cp2 = strchr (cp, config.rpath_separator);
1510
1511 if (cp2)
1512 {
1513 *cp2 = '\0';
1514 more = 1;
1515 }
1516
1517 if (cp != NULL && *cp != '\0')
1518 gld${EMULATION_NAME}_append_to_separated_string (&depaudit, cp);
1519
1520 cp = more ? ++cp2 : NULL;
1521 }
1522 while (cp != NULL);
1523 }
1524 }
1525
5a580b3a 1526 if (! (bfd_elf_size_dynamic_sections
f13a99db 1527 (link_info.output_bfd, command_line.soname, rpath,
7ee314fa 1528 command_line.filter_shlib, audit, depaudit,
252b5132
RH
1529 (const char * const *) command_line.auxiliary_filters,
1530 &link_info, &sinterp, lang_elf_version_info)))
1531 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
8423293d 1532
57e6abd2 1533${ELF_INTERPRETER_SET_DEFAULT}
252b5132
RH
1534 /* Let the user override the dynamic linker we are using. */
1535 if (command_line.interpreter != NULL
1536 && sinterp != NULL)
1537 {
1538 sinterp->contents = (bfd_byte *) command_line.interpreter;
eea6121a 1539 sinterp->size = strlen (command_line.interpreter) + 1;
252b5132
RH
1540 }
1541
1542 /* Look for any sections named .gnu.warning. As a GNU extensions,
1543 we treat such sections as containing warning messages. We print
1544 out the warning message, and then zero out the section size so
1545 that it does not get copied into the output file. */
1546
1547 {
1548 LANG_FOR_EACH_INPUT_STATEMENT (is)
1549 {
1550 asection *s;
1551 bfd_size_type sz;
1552 char *msg;
b34976b6 1553 bfd_boolean ret;
252b5132
RH
1554
1555 if (is->just_syms_flag)
1556 continue;
1557
1558 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
1559 if (s == NULL)
1560 continue;
1561
eea6121a 1562 sz = s->size;
1e9cc1c2 1563 msg = (char *) xmalloc ((size_t) (sz + 1));
bc251d50 1564 if (! bfd_get_section_contents (is->the_bfd, s, msg,
8c675694 1565 (file_ptr) 0, sz))
252b5132
RH
1566 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
1567 is->the_bfd);
bc251d50 1568 msg[sz] = '\0';
252b5132
RH
1569 ret = link_info.callbacks->warning (&link_info, msg,
1570 (const char *) NULL,
1571 is->the_bfd, (asection *) NULL,
1572 (bfd_vma) 0);
1573 ASSERT (ret);
1574 free (msg);
1575
9e3be61d
AM
1576 /* Clobber the section size, so that we don't waste space
1577 copying the warning into the output file. If we've already
1578 sized the output section, adjust its size. The adjustment
1579 is on rawsize because targets that size sections early will
1580 have called lang_reset_memory_regions after sizing. */
1581 if (s->output_section != NULL
1582 && s->output_section->rawsize >= s->size)
1583 s->output_section->rawsize -= s->size;
1584
eea6121a 1585 s->size = 0;
11d2f718 1586
9e3be61d
AM
1587 /* Also set SEC_EXCLUDE, so that local symbols defined in the
1588 warning section don't get copied to the output. */
a14a5de3 1589 s->flags |= SEC_EXCLUDE | SEC_KEEP;
252b5132
RH
1590 }
1591 }
8423293d 1592
1e035701 1593 before_allocation_default ();
8423293d 1594
f13a99db 1595 if (!bfd_elf_size_dynsym_hash_dynstr (link_info.output_bfd, &link_info))
8423293d 1596 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
252b5132
RH
1597}
1598
41392f03
AM
1599EOF
1600fi
1601
1602if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
92b93329 1603fragment <<EOF
252b5132 1604
04925e1e
AM
1605/* Try to open a dynamic archive. This is where we know that ELF
1606 dynamic libraries have an extension of .so (or .sl on oddball systems
1607 like hpux). */
1608
b34976b6 1609static bfd_boolean
0c7a8e5a
AM
1610gld${EMULATION_NAME}_open_dynamic_archive
1611 (const char *arch, search_dirs_type *search, lang_input_statement_type *entry)
252b5132 1612{
04925e1e
AM
1613 const char *filename;
1614 char *string;
252b5132 1615
04925e1e 1616 if (! entry->is_archive)
b34976b6 1617 return FALSE;
252b5132 1618
04925e1e 1619 filename = entry->filename;
252b5132 1620
04925e1e
AM
1621 /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
1622 is defined, but it does not seem worth the headache to optimize
1623 away those two bytes of space. */
1624 string = (char *) xmalloc (strlen (search->name)
1625 + strlen (filename)
1626 + strlen (arch)
1627#ifdef EXTRA_SHLIB_EXTENSION
1628 + strlen (EXTRA_SHLIB_EXTENSION)
1629#endif
1630 + sizeof "/lib.so");
1631
1632 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
1633
1634#ifdef EXTRA_SHLIB_EXTENSION
1635 /* Try the .so extension first. If that fails build a new filename
1636 using EXTRA_SHLIB_EXTENSION. */
1637 if (! ldfile_try_open_bfd (string, entry))
a26cc967
AM
1638 {
1639 sprintf (string, "%s/lib%s%s%s", search->name,
1640 filename, arch, EXTRA_SHLIB_EXTENSION);
04925e1e
AM
1641#endif
1642
1643 if (! ldfile_try_open_bfd (string, entry))
252b5132 1644 {
04925e1e 1645 free (string);
b34976b6 1646 return FALSE;
04925e1e 1647 }
a26cc967
AM
1648#ifdef EXTRA_SHLIB_EXTENSION
1649 }
1650#endif
252b5132 1651
04925e1e 1652 entry->filename = string;
252b5132 1653
04925e1e
AM
1654 /* We have found a dynamic object to include in the link. The ELF
1655 backend linker will create a DT_NEEDED entry in the .dynamic
1656 section naming this file. If this file includes a DT_SONAME
1657 entry, it will be used. Otherwise, the ELF linker will just use
1658 the name of the file. For an archive found by searching, like
1659 this one, the DT_NEEDED entry should consist of just the name of
1660 the file, without the path information used to find it. Note
1661 that we only need to do this if we have a dynamic object; an
1662 archive will never be referenced by a DT_NEEDED entry.
252b5132 1663
04925e1e
AM
1664 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
1665 very pretty. I haven't been able to think of anything that is
1666 pretty, though. */
1667 if (bfd_check_format (entry->the_bfd, bfd_object)
1668 && (entry->the_bfd->flags & DYNAMIC) != 0)
1669 {
04925e1e 1670 ASSERT (entry->is_archive && entry->search_dirs_flag);
252b5132 1671
04925e1e 1672 /* Rather than duplicating the logic above. Just use the
1c9acd94 1673 filename we recorded earlier. */
04925e1e 1674
fed2999d 1675 filename = lbasename (entry->filename);
1c9acd94 1676 bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
04925e1e
AM
1677 }
1678
b34976b6 1679 return TRUE;
04925e1e
AM
1680}
1681
41392f03
AM
1682EOF
1683fi
cde43e70
AM
1684
1685if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
92b93329 1686fragment <<EOF
41392f03 1687
afd7a018 1688/* A variant of lang_output_section_find used by place_orphan. */
04925e1e 1689
04925e1e 1690static lang_output_section_statement_type *
2a36a117 1691output_rel_find (asection *sec, int isdyn)
04925e1e 1692{
04925e1e 1693 lang_output_section_statement_type *lookup;
ba493122 1694 lang_output_section_statement_type *last = NULL;
2a36a117 1695 lang_output_section_statement_type *last_alloc = NULL;
48f2ff54 1696 lang_output_section_statement_type *last_ro_alloc = NULL;
ba493122
AM
1697 lang_output_section_statement_type *last_rel = NULL;
1698 lang_output_section_statement_type *last_rel_alloc = NULL;
24cdb50a 1699 int rela = sec->name[4] == 'a';
04925e1e 1700
afd7a018
AM
1701 for (lookup = &lang_output_section_statement.head->output_section_statement;
1702 lookup != NULL;
1703 lookup = lookup->next)
04925e1e 1704 {
66c103b7 1705 if (lookup->constraint >= 0
0112cd26 1706 && CONST_STRNEQ (lookup->name, ".rel"))
04925e1e 1707 {
24cdb50a 1708 int lookrela = lookup->name[4] == 'a';
ba493122 1709
2a36a117
AM
1710 /* .rel.dyn must come before all other reloc sections, to suit
1711 GNU ld.so. */
1712 if (isdyn)
1713 break;
1714
1715 /* Don't place after .rel.plt as doing so results in wrong
1716 dynamic tags. */
1717 if (strcmp (".plt", lookup->name + 4 + lookrela) == 0)
ba493122 1718 break;
2a36a117
AM
1719
1720 if (rela == lookrela || last_rel == NULL)
24cdb50a 1721 last_rel = lookup;
2a36a117
AM
1722 if ((rela == lookrela || last_rel_alloc == NULL)
1723 && lookup->bfd_section != NULL
ba493122
AM
1724 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1725 last_rel_alloc = lookup;
04925e1e 1726 }
2a36a117
AM
1727
1728 last = lookup;
1729 if (lookup->bfd_section != NULL
1730 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
48f2ff54
AM
1731 {
1732 last_alloc = lookup;
1733 if ((lookup->bfd_section->flags & SEC_READONLY) != 0)
1734 last_ro_alloc = lookup;
1735 }
252b5132 1736 }
ba493122
AM
1737
1738 if (last_rel_alloc)
1739 return last_rel_alloc;
1740
1741 if (last_rel)
1742 return last_rel;
1743
48f2ff54
AM
1744 if (last_ro_alloc)
1745 return last_ro_alloc;
1746
2a36a117
AM
1747 if (last_alloc)
1748 return last_alloc;
1749
ba493122 1750 return last;
252b5132
RH
1751}
1752
1753/* Place an orphan section. We use this to put random SHF_ALLOC
1754 sections in the right segment. */
1755
c2edb4b8 1756static lang_output_section_statement_type *
8a99a385
AM
1757gld${EMULATION_NAME}_place_orphan (asection *s,
1758 const char *secname,
1759 int constraint)
252b5132 1760{
afd7a018
AM
1761 static struct orphan_save hold[] =
1762 {
1763 { ".text",
1764 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1765 0, 0, 0, 0 },
1766 { ".rodata",
1767 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1768 0, 0, 0, 0 },
1769 { ".data",
1770 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1771 0, 0, 0, 0 },
1772 { ".bss",
1773 SEC_ALLOC,
1774 0, 0, 0, 0 },
1775 { 0,
1776 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1777 0, 0, 0, 0 },
1778 { ".interp",
1779 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1780 0, 0, 0, 0 },
1781 { ".sdata",
1782 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_SMALL_DATA,
07890c07
AM
1783 0, 0, 0, 0 },
1784 { 0,
1785 SEC_HAS_CONTENTS,
1786 0, 0, 0, 0 },
afd7a018
AM
1787 };
1788 enum orphan_save_index
1789 {
1790 orphan_text = 0,
1791 orphan_rodata,
1792 orphan_data,
1793 orphan_bss,
1794 orphan_rel,
1795 orphan_interp,
07890c07
AM
1796 orphan_sdata,
1797 orphan_nonalloc
afd7a018
AM
1798 };
1799 static int orphan_init_done = 0;
6a345e87 1800 struct orphan_save *place;
afd7a018 1801 lang_output_section_statement_type *after;
252b5132 1802 lang_output_section_statement_type *os;
b5f14a6d 1803 lang_output_section_statement_type *match_by_name = NULL;
24cdb50a 1804 int isdyn = 0;
ecca9871
L
1805 int iself = s->owner->xvec->flavour == bfd_target_elf_flavour;
1806 unsigned int sh_type = iself ? elf_section_type (s) : SHT_NULL;
252b5132 1807
1049f94e 1808 if (! link_info.relocatable
24cdb50a 1809 && link_info.combreloc
ecca9871 1810 && (s->flags & SEC_ALLOC))
24cdb50a 1811 {
ecca9871
L
1812 if (iself)
1813 switch (sh_type)
1814 {
1815 case SHT_RELA:
1816 secname = ".rela.dyn";
1817 isdyn = 1;
1818 break;
1819 case SHT_REL:
1820 secname = ".rel.dyn";
1821 isdyn = 1;
1822 break;
1823 default:
1824 break;
1825 }
0112cd26 1826 else if (CONST_STRNEQ (secname, ".rel"))
ecca9871
L
1827 {
1828 secname = secname[4] == 'a' ? ".rela.dyn" : ".rel.dyn";
1829 isdyn = 1;
1830 }
24cdb50a 1831 }
aea4bd9d 1832
bcacc0f5 1833 /* Look through the script to see where to place this section. */
d127ecce
AM
1834 if (constraint == 0)
1835 for (os = lang_output_section_find (secname);
1836 os != NULL;
1837 os = next_matching_output_section_statement (os, 0))
1838 {
1839 /* If we don't match an existing output section, tell
1840 lang_insert_orphan to create a new output section. */
1841 constraint = SPECIAL;
1842
1843 if (os->bfd_section != NULL
1844 && (os->bfd_section->flags == 0
1845 || (_bfd_elf_match_sections_by_type (link_info.output_bfd,
1846 os->bfd_section,
1847 s->owner, s)
1848 && ((s->flags ^ os->bfd_section->flags)
1849 & (SEC_LOAD | SEC_ALLOC)) == 0)))
1850 {
1851 /* We already have an output section statement with this
1852 name, and its bfd section has compatible flags.
1853 If the section already exists but does not have any flags
1854 set, then it has been created by the linker, probably as a
1855 result of a --section-start command line switch. */
1856 lang_add_section (&os->children, s, os);
1857 return os;
1858 }
b5f14a6d
DD
1859
1860 /* Save unused output sections in case we can match them
1861 against orphans later. */
1862 if (os->bfd_section == NULL)
1863 match_by_name = os;
d127ecce 1864 }
252b5132 1865
b5f14a6d
DD
1866 /* If we didn't match an active output section, see if we matched an
1867 unused one and use that. */
1868 if (match_by_name)
1869 {
1870 lang_add_section (&match_by_name->children, s, match_by_name);
1871 return match_by_name;
1872 }
1873
afd7a018
AM
1874 if (!orphan_init_done)
1875 {
07890c07 1876 lang_output_section_statement_type *lookup;
afd7a018 1877 struct orphan_save *ho;
07890c07 1878
afd7a018
AM
1879 for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
1880 if (ho->name != NULL)
1881 {
1882 ho->os = lang_output_section_find (ho->name);
1883 if (ho->os != NULL && ho->os->flags == 0)
1884 ho->os->flags = ho->flags;
1885 }
07890c07
AM
1886 lookup = hold[orphan_bss].os;
1887 if (lookup == NULL)
1888 lookup = &lang_output_section_statement.head->output_section_statement;
1889 for (; lookup != NULL; lookup = lookup->next)
1890 if ((lookup->bfd_section != NULL
1891 && (lookup->bfd_section->flags & SEC_DEBUGGING) != 0)
1892 || strcmp (lookup->name, ".comment") == 0)
1893 break;
1894 hold[orphan_nonalloc].os = lookup ? lookup->prev : NULL;
1895 hold[orphan_nonalloc].name = ".comment";
afd7a018
AM
1896 orphan_init_done = 1;
1897 }
252b5132
RH
1898
1899 /* If this is a final link, then always put .gnu.warning.SYMBOL
1900 sections into the .text section to get them out of the way. */
36af4a4e 1901 if (link_info.executable
1049f94e 1902 && ! link_info.relocatable
bcacc0f5 1903 && CONST_STRNEQ (s->name, ".gnu.warning.")
afd7a018 1904 && hold[orphan_text].os != NULL)
252b5132 1905 {
c2edb4b8
AM
1906 os = hold[orphan_text].os;
1907 lang_add_section (&os->children, s, os);
1908 return os;
252b5132
RH
1909 }
1910
1911 /* Decide which segment the section should go in based on the
1912 section name and section flags. We put loadable .note sections
1913 right after the .interp section, so that the PT_NOTE segment is
1914 stored right after the program headers where the OS can read it
1915 in the first page. */
aea4bd9d 1916
71bfc0ae 1917 place = NULL;
07890c07
AM
1918 if ((s->flags & (SEC_ALLOC | SEC_DEBUGGING)) == 0)
1919 place = &hold[orphan_nonalloc];
1920 else if ((s->flags & SEC_ALLOC) == 0)
71bfc0ae 1921 ;
252b5132 1922 else if ((s->flags & SEC_LOAD) != 0
ecca9871 1923 && ((iself && sh_type == SHT_NOTE)
0112cd26 1924 || (!iself && CONST_STRNEQ (secname, ".note"))))
afd7a018
AM
1925 place = &hold[orphan_interp];
1926 else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
1927 place = &hold[orphan_bss];
1928 else if ((s->flags & SEC_SMALL_DATA) != 0)
1929 place = &hold[orphan_sdata];
1930 else if ((s->flags & SEC_READONLY) == 0)
1931 place = &hold[orphan_data];
ecca9871 1932 else if (((iself && (sh_type == SHT_RELA || sh_type == SHT_REL))
0112cd26 1933 || (!iself && CONST_STRNEQ (secname, ".rel")))
afd7a018
AM
1934 && (s->flags & SEC_LOAD) != 0)
1935 place = &hold[orphan_rel];
1936 else if ((s->flags & SEC_CODE) == 0)
1937 place = &hold[orphan_rodata];
1938 else
1939 place = &hold[orphan_text];
71bfc0ae 1940
afd7a018 1941 after = NULL;
5ba47421 1942 if (place != NULL)
252b5132 1943 {
afd7a018 1944 if (place->os == NULL)
5ba47421 1945 {
afd7a018
AM
1946 if (place->name != NULL)
1947 place->os = lang_output_section_find (place->name);
1948 else
1949 place->os = output_rel_find (s, isdyn);
5ba47421 1950 }
afd7a018
AM
1951 after = place->os;
1952 if (after == NULL)
390fbbf1
AM
1953 after = lang_output_section_find_by_flags
1954 (s, &place->os, _bfd_elf_match_sections_by_type);
afd7a018
AM
1955 if (after == NULL)
1956 /* *ABS* is always the first output section statement. */
1957 after = &lang_output_section_statement.head->output_section_statement;
252b5132
RH
1958 }
1959
c2edb4b8 1960 return lang_insert_orphan (s, secname, constraint, after, place, NULL, NULL);
252b5132 1961}
c56feb2b
AM
1962EOF
1963fi
1964
eaeb0a9d 1965if test x"$LDEMUL_AFTER_ALLOCATION" != xgld"$EMULATION_NAME"_after_allocation; then
92b93329 1966fragment <<EOF
252b5132 1967
deb04cdb 1968static void
eaeb0a9d 1969gld${EMULATION_NAME}_after_allocation (void)
deb04cdb 1970{
f13a99db
AM
1971 bfd_boolean need_layout = bfd_elf_discard_info (link_info.output_bfd,
1972 &link_info);
8ded5a0f 1973 gld${EMULATION_NAME}_map_segments (need_layout);
73d074b4 1974}
41392f03
AM
1975EOF
1976fi
1977
1978if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
92b93329 1979fragment <<EOF
252b5132
RH
1980
1981static char *
0c7a8e5a 1982gld${EMULATION_NAME}_get_script (int *isfile)
252b5132
RH
1983EOF
1984
1985if test -n "$COMPILE_IN"
1986then
1987# Scripts compiled in.
1988
1989# sed commands to quote an ld script as a C string.
597e2591 1990sc="-f stringify.sed"
252b5132 1991
92b93329 1992fragment <<EOF
60bcf0fa 1993{
252b5132
RH
1994 *isfile = 0;
1995
1049f94e 1996 if (link_info.relocatable && config.build_constructors)
597e2591 1997 return
252b5132 1998EOF
afd7a018
AM
1999sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
2000echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c
2001sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
2002echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
2003sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
61585df2 2004if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
afd7a018
AM
2005echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
2006sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
db6751f2 2007fi
36af4a4e
JJ
2008if test -n "$GENERATE_PIE_SCRIPT" ; then
2009if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
8c37241b
JJ
2010echo ' ; else if (link_info.pie && link_info.combreloc' >> e${EMULATION_NAME}.c
2011echo ' && link_info.relro' >> e${EMULATION_NAME}.c
fbfca19e 2012echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
afd7a018 2013sed $sc ldscripts/${EMULATION_NAME}.xdw >> e${EMULATION_NAME}.c
36af4a4e 2014echo ' ; else if (link_info.pie && link_info.combreloc) return' >> e${EMULATION_NAME}.c
afd7a018 2015sed $sc ldscripts/${EMULATION_NAME}.xdc >> e${EMULATION_NAME}.c
36af4a4e 2016fi
afd7a018
AM
2017echo ' ; else if (link_info.pie) return' >> e${EMULATION_NAME}.c
2018sed $sc ldscripts/${EMULATION_NAME}.xd >> e${EMULATION_NAME}.c
36af4a4e 2019fi
252b5132 2020if test -n "$GENERATE_SHLIB_SCRIPT" ; then
82434356 2021if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
8c37241b
JJ
2022echo ' ; else if (link_info.shared && link_info.combreloc' >> e${EMULATION_NAME}.c
2023echo ' && link_info.relro' >> e${EMULATION_NAME}.c
fbfca19e 2024echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
afd7a018 2025sed $sc ldscripts/${EMULATION_NAME}.xsw >> e${EMULATION_NAME}.c
db6751f2 2026echo ' ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
afd7a018 2027sed $sc ldscripts/${EMULATION_NAME}.xsc >> e${EMULATION_NAME}.c
82434356 2028fi
afd7a018
AM
2029echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c
2030sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
252b5132 2031fi
82434356 2032if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
8c37241b 2033echo ' ; else if (link_info.combreloc && link_info.relro' >> e${EMULATION_NAME}.c
fbfca19e 2034echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
afd7a018
AM
2035sed $sc ldscripts/${EMULATION_NAME}.xw >> e${EMULATION_NAME}.c
2036echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c
2037sed $sc ldscripts/${EMULATION_NAME}.xc >> e${EMULATION_NAME}.c
82434356 2038fi
afd7a018
AM
2039echo ' ; else return' >> e${EMULATION_NAME}.c
2040sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
2041echo '; }' >> e${EMULATION_NAME}.c
252b5132
RH
2042
2043else
2044# Scripts read from the filesystem.
2045
92b93329 2046fragment <<EOF
60bcf0fa 2047{
252b5132
RH
2048 *isfile = 1;
2049
1049f94e 2050 if (link_info.relocatable && config.build_constructors)
252b5132 2051 return "ldscripts/${EMULATION_NAME}.xu";
1049f94e 2052 else if (link_info.relocatable)
252b5132
RH
2053 return "ldscripts/${EMULATION_NAME}.xr";
2054 else if (!config.text_read_only)
2055 return "ldscripts/${EMULATION_NAME}.xbn";
a060b769
AM
2056EOF
2057if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
2058else
92b93329 2059fragment <<EOF
252b5132
RH
2060 else if (!config.magic_demand_paged)
2061 return "ldscripts/${EMULATION_NAME}.xn";
a060b769
AM
2062EOF
2063fi
36af4a4e
JJ
2064if test -n "$GENERATE_PIE_SCRIPT" ; then
2065if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
92b93329 2066fragment <<EOF
8c37241b 2067 else if (link_info.pie && link_info.combreloc
fbfca19e 2068 && link_info.relro && (link_info.flags & DF_BIND_NOW))
8c37241b 2069 return "ldscripts/${EMULATION_NAME}.xdw";
36af4a4e
JJ
2070 else if (link_info.pie && link_info.combreloc)
2071 return "ldscripts/${EMULATION_NAME}.xdc";
2072EOF
2073fi
92b93329 2074fragment <<EOF
36af4a4e
JJ
2075 else if (link_info.pie)
2076 return "ldscripts/${EMULATION_NAME}.xd";
2077EOF
2078fi
a060b769
AM
2079if test -n "$GENERATE_SHLIB_SCRIPT" ; then
2080if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
92b93329 2081fragment <<EOF
8c37241b 2082 else if (link_info.shared && link_info.combreloc
fbfca19e 2083 && link_info.relro && (link_info.flags & DF_BIND_NOW))
8c37241b 2084 return "ldscripts/${EMULATION_NAME}.xsw";
a060b769
AM
2085 else if (link_info.shared && link_info.combreloc)
2086 return "ldscripts/${EMULATION_NAME}.xsc";
2087EOF
2088fi
92b93329 2089fragment <<EOF
252b5132
RH
2090 else if (link_info.shared)
2091 return "ldscripts/${EMULATION_NAME}.xs";
a060b769
AM
2092EOF
2093fi
2094if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
92b93329 2095fragment <<EOF
8c37241b 2096 else if (link_info.combreloc && link_info.relro
fbfca19e 2097 && (link_info.flags & DF_BIND_NOW))
8c37241b 2098 return "ldscripts/${EMULATION_NAME}.xw";
a060b769
AM
2099 else if (link_info.combreloc)
2100 return "ldscripts/${EMULATION_NAME}.xc";
2101EOF
2102fi
92b93329 2103fragment <<EOF
252b5132
RH
2104 else
2105 return "ldscripts/${EMULATION_NAME}.x";
2106}
252b5132 2107
3b108066 2108EOF
41392f03
AM
2109fi
2110fi
3b108066 2111
41392f03 2112if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
3b108066 2113
e0ee487b 2114if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
92b93329 2115fragment <<EOF
e0ee487b
L
2116 $PARSE_AND_LIST_PROLOGUE
2117EOF
2118fi
2119
92b93329 2120fragment <<EOF
e0ee487b 2121
6c1439be
L
2122#define OPTION_DISABLE_NEW_DTAGS (400)
2123#define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
a1ab1d2a 2124#define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
65765700 2125#define OPTION_EH_FRAME_HDR (OPTION_GROUP + 1)
b58f81ae 2126#define OPTION_EXCLUDE_LIBS (OPTION_EH_FRAME_HDR + 1)
fdc90cb4 2127#define OPTION_HASH_STYLE (OPTION_EXCLUDE_LIBS + 1)
c0065db7 2128#define OPTION_BUILD_ID (OPTION_HASH_STYLE + 1)
7ee314fa 2129#define OPTION_AUDIT (OPTION_BUILD_ID + 1)
e13629bc 2130
3bcf5557 2131static void
0c7a8e5a
AM
2132gld${EMULATION_NAME}_add_options
2133 (int ns, char **shortopts, int nl, struct option **longopts,
2134 int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
e0ee487b 2135{
7ee314fa 2136 static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:P:";
3bcf5557 2137 static const struct option xtra_long[] = {
c0065db7 2138 {"build-id", optional_argument, NULL, OPTION_BUILD_ID},
7ee314fa
AM
2139 {"audit", required_argument, NULL, OPTION_AUDIT},
2140 {"depaudit", required_argument, NULL, 'P'},
e0ee487b 2141EOF
e0ee487b
L
2142
2143if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
92b93329 2144fragment <<EOF
3bcf5557
AM
2145 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
2146 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
2147 {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
b58f81ae 2148 {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
fdc90cb4 2149 {"hash-style", required_argument, NULL, OPTION_HASH_STYLE},
3bcf5557 2150 {"Bgroup", no_argument, NULL, OPTION_GROUP},
e0ee487b
L
2151EOF
2152fi
2153
2154if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
92b93329 2155fragment <<EOF
3bcf5557 2156 $PARSE_AND_LIST_LONGOPTS
e0ee487b
L
2157EOF
2158fi
2159
92b93329 2160fragment <<EOF
3bcf5557
AM
2161 {NULL, no_argument, NULL, 0}
2162 };
2163
2164 *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
2165 memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
2166 *longopts = (struct option *)
2167 xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
2168 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
2169}
04925e1e 2170
24382dca 2171#define DEFAULT_BUILD_ID_STYLE "sha1"
c0065db7 2172
3bcf5557 2173static bfd_boolean
0c7a8e5a 2174gld${EMULATION_NAME}_handle_option (int optc)
e0ee487b 2175{
e0ee487b
L
2176 switch (optc)
2177 {
2178 default:
3bcf5557 2179 return FALSE;
6c1439be 2180
c0065db7
RM
2181 case OPTION_BUILD_ID:
2182 if (link_info.emit_note_gnu_build_id != NULL)
2183 {
2184 free (link_info.emit_note_gnu_build_id);
2185 link_info.emit_note_gnu_build_id = NULL;
2186 }
2187 if (optarg == NULL)
2188 optarg = DEFAULT_BUILD_ID_STYLE;
2189 if (strcmp (optarg, "none"))
2190 link_info.emit_note_gnu_build_id = xstrdup (optarg);
2191 break;
7ee314fa
AM
2192 case OPTION_AUDIT:
2193 gld${EMULATION_NAME}_append_to_separated_string (&audit, optarg);
2194 break;
2195 case 'P':
2196 gld${EMULATION_NAME}_append_to_separated_string (&depaudit, optarg);
2197 break;
c0065db7 2198
e0ee487b 2199EOF
e0ee487b
L
2200
2201if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
92b93329 2202fragment <<EOF
6c1439be 2203 case OPTION_DISABLE_NEW_DTAGS:
b34976b6 2204 link_info.new_dtags = FALSE;
6c1439be
L
2205 break;
2206
2207 case OPTION_ENABLE_NEW_DTAGS:
b34976b6 2208 link_info.new_dtags = TRUE;
6c1439be
L
2209 break;
2210
65765700 2211 case OPTION_EH_FRAME_HDR:
b34976b6 2212 link_info.eh_frame_hdr = TRUE;
65765700
JJ
2213 break;
2214
a1ab1d2a
UD
2215 case OPTION_GROUP:
2216 link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
2217 /* Groups must be self-contained. */
560e09e9
NC
2218 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2219 link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
a1ab1d2a
UD
2220 break;
2221
b58f81ae
DJ
2222 case OPTION_EXCLUDE_LIBS:
2223 add_excluded_libs (optarg);
2224 break;
2225
fdc90cb4
JJ
2226 case OPTION_HASH_STYLE:
2227 link_info.emit_hash = FALSE;
2228 link_info.emit_gnu_hash = FALSE;
2229 if (strcmp (optarg, "sysv") == 0)
2230 link_info.emit_hash = TRUE;
2231 else if (strcmp (optarg, "gnu") == 0)
2232 link_info.emit_gnu_hash = TRUE;
2233 else if (strcmp (optarg, "both") == 0)
2234 {
2235 link_info.emit_hash = TRUE;
2236 link_info.emit_gnu_hash = TRUE;
2237 }
2238 else
2239 einfo (_("%P%F: invalid hash style \`%s'\n"), optarg);
2240 break;
2241
e0ee487b
L
2242 case 'z':
2243 if (strcmp (optarg, "initfirst") == 0)
2244 link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
2245 else if (strcmp (optarg, "interpose") == 0)
2246 link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
2247 else if (strcmp (optarg, "loadfltr") == 0)
2248 link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
2249 else if (strcmp (optarg, "nodefaultlib") == 0)
2250 link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
2251 else if (strcmp (optarg, "nodelete") == 0)
2252 link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
2253 else if (strcmp (optarg, "nodlopen") == 0)
2254 link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
2255 else if (strcmp (optarg, "nodump") == 0)
2256 link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
2257 else if (strcmp (optarg, "now") == 0)
2258 {
2259 link_info.flags |= (bfd_vma) DF_BIND_NOW;
2260 link_info.flags_1 |= (bfd_vma) DF_1_NOW;
2261 }
5fa222e4
AM
2262 else if (strcmp (optarg, "lazy") == 0)
2263 {
2264 link_info.flags &= ~(bfd_vma) DF_BIND_NOW;
2265 link_info.flags_1 &= ~(bfd_vma) DF_1_NOW;
2266 }
e0ee487b
L
2267 else if (strcmp (optarg, "origin") == 0)
2268 {
2269 link_info.flags |= (bfd_vma) DF_ORIGIN;
2270 link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
2271 }
a1ab1d2a 2272 else if (strcmp (optarg, "defs") == 0)
560e09e9 2273 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
aa713662 2274 else if (strcmp (optarg, "muldefs") == 0)
b34976b6 2275 link_info.allow_multiple_definition = TRUE;
db6751f2 2276 else if (strcmp (optarg, "combreloc") == 0)
b34976b6 2277 link_info.combreloc = TRUE;
db6751f2 2278 else if (strcmp (optarg, "nocombreloc") == 0)
b34976b6 2279 link_info.combreloc = FALSE;
8bd621d8 2280 else if (strcmp (optarg, "nocopyreloc") == 0)
0c7a8e5a 2281 link_info.nocopyreloc = TRUE;
9ee5e499
JJ
2282 else if (strcmp (optarg, "execstack") == 0)
2283 {
2284 link_info.execstack = TRUE;
2285 link_info.noexecstack = FALSE;
2286 }
2287 else if (strcmp (optarg, "noexecstack") == 0)
2288 {
2289 link_info.noexecstack = TRUE;
2290 link_info.execstack = FALSE;
2291 }
88b882e9
L
2292EOF
2293
2294 if test -n "$COMMONPAGESIZE"; then
92b93329 2295fragment <<EOF
8c37241b
JJ
2296 else if (strcmp (optarg, "relro") == 0)
2297 link_info.relro = TRUE;
2298 else if (strcmp (optarg, "norelro") == 0)
2299 link_info.relro = FALSE;
88b882e9
L
2300EOF
2301 fi
2302
92b93329 2303fragment <<EOF
0112cd26 2304 else if (CONST_STRNEQ (optarg, "max-page-size="))
24718e3b
L
2305 {
2306 char *end;
0112cd26 2307
24718e3b 2308 config.maxpagesize = strtoul (optarg + 14, &end, 0);
b8142865 2309 if (*end || (config.maxpagesize & (config.maxpagesize - 1)) != 0)
24718e3b
L
2310 einfo (_("%P%F: invalid maxium page size \`%s'\n"),
2311 optarg + 14);
2312 }
0112cd26 2313 else if (CONST_STRNEQ (optarg, "common-page-size="))
24718e3b
L
2314 {
2315 char *end;
2316 config.commonpagesize = strtoul (optarg + 17, &end, 0);
b8142865
L
2317 if (*end
2318 || (config.commonpagesize & (config.commonpagesize - 1)) != 0)
24718e3b
L
2319 einfo (_("%P%F: invalid common page size \`%s'\n"),
2320 optarg + 17);
2321 }
e0ee487b 2322 /* What about the other Solaris -z options? FIXME. */
6c1439be 2323 break;
e0ee487b
L
2324EOF
2325fi
2326
2327if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
92b93329 2328fragment <<EOF
e0ee487b
L
2329 $PARSE_AND_LIST_ARGS_CASES
2330EOF
2331fi
2332
92b93329 2333fragment <<EOF
e0ee487b
L
2334 }
2335
3bcf5557 2336 return TRUE;
e0ee487b
L
2337}
2338
41392f03 2339EOF
41392f03 2340
4b209b22 2341if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
92b93329 2342fragment <<EOF
41392f03 2343
e0ee487b 2344static void
0c7a8e5a 2345gld${EMULATION_NAME}_list_options (FILE * file)
e0ee487b 2346{
442996ee
AM
2347 fprintf (file, _("\
2348 --build-id[=STYLE] Generate build ID note\n"));
7ee314fa
AM
2349 fprintf (file, _("\
2350 --audit=AUDITLIB Specify a library to use for auditing\n"));
2351 fprintf (file, _("\
2352 -P AUDITLIB, --depaudit=AUDITLIB\n" "\
2353 Specify a library to use for auditing dependencies\n"));
e0ee487b 2354EOF
e0ee487b
L
2355
2356if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
92b93329 2357fragment <<EOF
442996ee
AM
2358 fprintf (file, _("\
2359 -Bgroup Selects group name lookup rules for DSO\n"));
2360 fprintf (file, _("\
2361 --disable-new-dtags Disable new dynamic tags\n"));
2362 fprintf (file, _("\
2363 --enable-new-dtags Enable new dynamic tags\n"));
2364 fprintf (file, _("\
2365 --eh-frame-hdr Create .eh_frame_hdr section\n"));
2366 fprintf (file, _("\
2367 --hash-style=STYLE Set hash style to sysv, gnu or both\n"));
2368 fprintf (file, _("\
2369 -z combreloc Merge dynamic relocs into one section and sort\n"));
2370 fprintf (file, _("\
2371 -z defs Report unresolved symbols in object files.\n"));
2372 fprintf (file, _("\
2373 -z execstack Mark executable as requiring executable stack\n"));
2374 fprintf (file, _("\
2375 -z initfirst Mark DSO to be initialized first at runtime\n"));
2376 fprintf (file, _("\
2377 -z interpose Mark object to interpose all DSOs but executable\n"));
2378 fprintf (file, _("\
2379 -z lazy Mark object lazy runtime binding (default)\n"));
2380 fprintf (file, _("\
2381 -z loadfltr Mark object requiring immediate process\n"));
2382 fprintf (file, _("\
2383 -z muldefs Allow multiple definitions\n"));
2384 fprintf (file, _("\
2385 -z nocombreloc Don't merge dynamic relocs into one section\n"));
2386 fprintf (file, _("\
2387 -z nocopyreloc Don't create copy relocs\n"));
2388 fprintf (file, _("\
2389 -z nodefaultlib Mark object not to use default search paths\n"));
2390 fprintf (file, _("\
2391 -z nodelete Mark DSO non-deletable at runtime\n"));
2392 fprintf (file, _("\
2393 -z nodlopen Mark DSO not available to dlopen\n"));
2394 fprintf (file, _("\
2395 -z nodump Mark DSO not available to dldump\n"));
2396 fprintf (file, _("\
2397 -z noexecstack Mark executable as not requiring executable stack\n"));
88b882e9
L
2398EOF
2399
2400 if test -n "$COMMONPAGESIZE"; then
92b93329 2401fragment <<EOF
442996ee
AM
2402 fprintf (file, _("\
2403 -z norelro Don't create RELRO program header\n"));
88b882e9
L
2404EOF
2405 fi
2406
92b93329 2407fragment <<EOF
442996ee
AM
2408 fprintf (file, _("\
2409 -z now Mark object non-lazy runtime binding\n"));
2410 fprintf (file, _("\
2411 -z origin Mark object requiring immediate \$ORIGIN\n\
2412 processing at runtime\n"));
88b882e9
L
2413EOF
2414
2415 if test -n "$COMMONPAGESIZE"; then
92b93329 2416fragment <<EOF
442996ee
AM
2417 fprintf (file, _("\
2418 -z relro Create RELRO program header\n"));
88b882e9
L
2419EOF
2420 fi
2421
92b93329 2422fragment <<EOF
442996ee
AM
2423 fprintf (file, _("\
2424 -z max-page-size=SIZE Set maximum page size to SIZE\n"));
2425 fprintf (file, _("\
2426 -z common-page-size=SIZE Set common page size to SIZE\n"));
2427 fprintf (file, _("\
2428 -z KEYWORD Ignored for Solaris compatibility\n"));
e0ee487b
L
2429EOF
2430fi
2431
2432if test -n "$PARSE_AND_LIST_OPTIONS" ; then
92b93329 2433fragment <<EOF
e0ee487b
L
2434 $PARSE_AND_LIST_OPTIONS
2435EOF
2436fi
2437
92b93329 2438fragment <<EOF
e0ee487b
L
2439}
2440EOF
e0ee487b
L
2441
2442if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
92b93329 2443fragment <<EOF
e0ee487b
L
2444 $PARSE_AND_LIST_EPILOGUE
2445EOF
2446fi
41392f03
AM
2447fi
2448else
92b93329 2449fragment <<EOF
3bcf5557
AM
2450#define gld${EMULATION_NAME}_add_options NULL
2451#define gld${EMULATION_NAME}_handle_option NULL
41392f03 2452EOF
4b209b22 2453if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
92b93329 2454fragment <<EOF
4b209b22 2455#define gld${EMULATION_NAME}_list_options NULL
41392f03
AM
2456EOF
2457fi
2458fi
e0ee487b 2459
92b93329 2460fragment <<EOF
252b5132 2461
60bcf0fa 2462struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
252b5132 2463{
41392f03
AM
2464 ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
2465 ${LDEMUL_SYSLIB-syslib_default},
2466 ${LDEMUL_HLL-hll_default},
2467 ${LDEMUL_AFTER_PARSE-after_parse_default},
2468 ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
eaeb0a9d 2469 ${LDEMUL_AFTER_ALLOCATION-gld${EMULATION_NAME}_after_allocation},
41392f03
AM
2470 ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
2471 ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
2472 ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
2473 ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
252b5132
RH
2474 "${EMULATION_NAME}",
2475 "${OUTPUT_FORMAT}",
eaeb0a9d 2476 ${LDEMUL_FINISH-finish_default},
41392f03
AM
2477 ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
2478 ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
2479 ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
2480 ${LDEMUL_SET_SYMBOLS-NULL},
3bcf5557
AM
2481 ${LDEMUL_PARSE_ARGS-NULL},
2482 gld${EMULATION_NAME}_add_options,
2483 gld${EMULATION_NAME}_handle_option,
41392f03 2484 ${LDEMUL_UNRECOGNIZED_FILE-NULL},
4b209b22 2485 ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
4a43e768 2486 ${LDEMUL_RECOGNIZED_FILE-gld${EMULATION_NAME}_load_symbols},
41392f03 2487 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
fac1652d 2488 ${LDEMUL_NEW_VERS_PATTERN-NULL}
252b5132
RH
2489};
2490EOF
This page took 0.662318 seconds and 4 git commands to generate.