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