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