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