bfd/
[deliverable/binutils-gdb.git] / ld / emultempl / elf32.em
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.
5 test -z "${ELFSIZE}" && ELFSIZE=32
6 if [ -z "$MACHINE" ]; then
7 OUTPUT_ARCH=${ARCH}
8 else
9 OUTPUT_ARCH=${ARCH}:${MACHINE}
10 fi
11 cat >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 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 GLD, the Gnu Linker.
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 2 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, MA 02110-1301, USA. */
35
36 #define TARGET_IS_${EMULATION_NAME}
37
38 #include "config.h"
39 #include "bfd.h"
40 #include "sysdep.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. */
59 static void gld${EMULATION_NAME}_before_parse (void);
60 static void gld${EMULATION_NAME}_after_open (void);
61 static void gld${EMULATION_NAME}_before_allocation (void);
62 static bfd_boolean gld${EMULATION_NAME}_place_orphan (asection *s);
63 static void gld${EMULATION_NAME}_layout_sections_again (void);
64 static void gld${EMULATION_NAME}_finish (void) ATTRIBUTE_UNUSED;
65
66 EOF
67
68 if [ "x${USE_LIBPATH}" = xyes ] ; then
69 case ${target} in
70 *-*-linux-* | *-*-k*bsd*-*)
71 cat >>e${EMULATION_NAME}.c <<EOF
72 #ifdef HAVE_GLOB
73 #include <glob.h>
74 #endif
75 EOF
76 ;;
77 esac
78 fi
79
80 # Import any needed special functions and/or overrides.
81 #
82 if test -n "$EXTRA_EM_FILE" ; then
83 . ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
84 fi
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 #
92 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
93 cat >>e${EMULATION_NAME}.c <<EOF
94
95 static void
96 gld${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
103 EOF
104 fi
105
106 if test x"$LDEMUL_RECOGNIZED_FILE" != xgld"${EMULATION_NAME}"_load_symbols; then
107 cat >>e${EMULATION_NAME}.c <<EOF
108 /* Handle as_needed DT_NEEDED. */
109
110 static bfd_boolean
111 gld${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 }
141 EOF
142 fi
143
144 cat >>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
149 static struct bfd_link_needed_list *global_needed;
150 static struct stat global_stat;
151 static bfd_boolean global_found;
152 static struct bfd_link_needed_list *global_vercheck_needed;
153 static 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
173 static void
174 gld${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
225 static void
226 gld${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)
233 return;
234 if (s->the_bfd == NULL)
235 return;
236 if (s->as_needed
237 && (bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0)
238 return;
239
240 if (bfd_stat (s->the_bfd, &st) != 0)
241 {
242 einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
243 return;
244 }
245
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. */
253 if (st.st_dev == global_stat.st_dev
254 && st.st_ino == global_stat.st_ino
255 && st.st_ino != 0)
256 {
257 global_found = TRUE;
258 return;
259 }
260
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
265 heuristic test, and it will only work if the name looks like
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. */
269
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;
276
277 soname = bfd_elf_get_dt_soname (s->the_bfd);
278 if (soname == NULL)
279 soname = lbasename (s->filename);
280
281 if (strncmp (soname, global_needed->name, suffix - global_needed->name) == 0)
282 einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
283 global_needed->name, global_needed->by, soname);
284 }
285
286 struct dt_needed
287 {
288 bfd *by;
289 const char *name;
290 };
291
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
296 static bfd_boolean
297 gld${EMULATION_NAME}_try_needed (struct dt_needed *needed,
298 int force)
299 {
300 bfd *abfd;
301 const char *name = needed->name;
302 const char *soname;
303 int class;
304
305 abfd = bfd_openr (name, bfd_get_target (output_bfd));
306 if (abfd == NULL)
307 return FALSE;
308 if (! bfd_check_format (abfd, bfd_object))
309 {
310 bfd_close (abfd);
311 return FALSE;
312 }
313 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
314 {
315 bfd_close (abfd);
316 return FALSE;
317 }
318
319 /* For DT_NEEDED, they have to match. */
320 if (abfd->xvec != output_bfd->xvec)
321 {
322 bfd_close (abfd);
323 return FALSE;
324 }
325
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;
341 global_vercheck_failed = FALSE;
342 lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
343 if (global_vercheck_failed)
344 {
345 bfd_close (abfd);
346 /* Return FALSE to force the caller to move on to try
347 another file on the search path. */
348 return FALSE;
349 }
350
351 /* But wait! It gets much worse. On Linux, if a shared
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. */
357
358 EOF
359 case ${target} in
360 *-*-linux-* | *-*-k*bsd*-*)
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 {
370 bfd_close (abfd);
371 return FALSE;
372 }
373 }
374
375 EOF
376 ;;
377 esac
378 cat >>e${EMULATION_NAME}.c <<EOF
379 }
380 }
381
382 /* We've found a dynamic object matching the DT_NEEDED entry. */
383
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);
394
395 /* First strip off everything before the last '/'. */
396 soname = lbasename (abfd->filename);
397
398 if (trace_file_tries)
399 info_msg (_("found %s at %s\n"), soname, name);
400
401 global_found = FALSE;
402 lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
403 if (global_found)
404 {
405 /* Return TRUE to indicate that we found the file, even though
406 we aren't going to do anything with it. */
407 return TRUE;
408 }
409
410 /* Specify the soname to use. */
411 bfd_elf_set_dt_needed_name (abfd, soname);
412
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. */
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. */
421 if (needed->by != NULL
422 && (bfd_elf_get_dyn_lib_class (needed->by) & DYN_NO_ADD_NEEDED) != 0)
423 class |= DYN_NO_NEEDED | DYN_NO_ADD_NEEDED;
424
425 bfd_elf_set_dyn_lib_class (abfd, class);
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
431 return TRUE;
432 }
433
434
435 /* Search for a needed file in a path. */
436
437 static bfd_boolean
438 gld${EMULATION_NAME}_search_needed (const char *path,
439 struct dt_needed *n, int force)
440 {
441 const char *s;
442 const char *name = n->name;
443 size_t len;
444 struct dt_needed needed;
445
446 if (name[0] == '/')
447 return gld${EMULATION_NAME}_try_needed (n, force);
448
449 if (path == NULL || *path == '\0')
450 return FALSE;
451
452 needed.by = n->by;
453 needed.name = n->name;
454
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
475 needed.name = filename;
476 if (gld${EMULATION_NAME}_try_needed (&needed, force))
477 return TRUE;
478
479 free (filename);
480
481 if (*s == '\0')
482 break;
483 path = s + 1;
484 }
485
486 return FALSE;
487 }
488
489 EOF
490 if [ "x${USE_LIBPATH}" = xyes ] ; then
491 cat >>e${EMULATION_NAME}.c <<EOF
492
493 /* Add the sysroot to every entry in a colon-separated path. */
494
495 static char *
496 gld${EMULATION_NAME}_add_sysroot (const char *path)
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
511 len = len + (colons + 1) * strlen (ld_sysroot);
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 {
519 *p++ = path[i++];
520 strcpy (p, ld_sysroot);
521 p = p + strlen (p);
522 }
523 else
524 *p++ = path[i++];
525
526 *p = 0;
527 return ret;
528 }
529
530 EOF
531 case ${target} in
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
541 static bfd_boolean
542 gld${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 }
590 EOF
591 # FreeBSD
592 ;;
593
594 *-*-linux-* | *-*-k*bsd*-*)
595 cat >>e${EMULATION_NAME}.c <<EOF
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
598 only meaningful on Linux. */
599
600 struct gld${EMULATION_NAME}_ld_so_conf
601 {
602 char *path;
603 size_t len, alloc;
604 };
605
606 static bfd_boolean
607 gld${EMULATION_NAME}_parse_ld_so_conf
608 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename);
609
610 static void
611 gld${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;
616 #ifdef HAVE_GLOB
617 glob_t gl;
618 #endif
619
620 if (pattern[0] != '/')
621 {
622 char *p = strrchr (filename, '/');
623 size_t patlen = strlen (pattern) + 1;
624
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 }
630
631 #ifdef HAVE_GLOB
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 }
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
644
645 if (newp)
646 free (newp);
647 }
648
649 static bfd_boolean
650 gld${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);
654 char *line;
655 size_t linelen;
656
657 if (f == NULL)
658 return FALSE;
659
660 linelen = 256;
661 line = xmalloc (linelen);
662 do
663 {
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;
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;
698
699 if (!strncmp (p, "include", 7) && (p[7] == ' ' || p[7] == '\t'))
700 {
701 char *dir, c;
702 p += 8;
703 do
704 {
705 while (*p == ' ' || *p == '\t')
706 ++p;
707
708 if (*p == '\0')
709 break;
710
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 }
739 else
740 {
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++] = ':';
747 }
748 memcpy (info->path + info->len, dir, p - dir);
749 info->len += p - dir;
750 info->path[info->len] = '\0';
751 }
752 }
753 while (! feof (f));
754 free (line);
755 fclose (f);
756 return TRUE;
757 }
758
759 static bfd_boolean
760 gld${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;
765
766 if (! initialized)
767 {
768 char *tmppath;
769 struct gld${EMULATION_NAME}_ld_so_conf info;
770
771 info.path = NULL;
772 info.len = info.alloc = 0;
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 }
780 free (tmppath);
781
782 if (info.path)
783 {
784 char *d = gld${EMULATION_NAME}_add_sysroot (info.path);
785 free (info.path);
786 ld_so_conf = d;
787 }
788 initialized = TRUE;
789 }
790
791 if (ld_so_conf == NULL)
792 return FALSE;
793
794
795 needed.by = NULL;
796 needed.name = name;
797 return gld${EMULATION_NAME}_search_needed (ld_so_conf, &needed, force);
798 }
799
800 EOF
801 # Linux
802 ;;
803 esac
804 fi
805 cat >>e${EMULATION_NAME}.c <<EOF
806
807 /* See if an input file matches a DT_NEEDED entry by name. */
808
809 static void
810 gld${EMULATION_NAME}_check_needed (lang_input_statement_type *s)
811 {
812 if (global_found)
813 return;
814
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
822 if (s->filename != NULL)
823 {
824 const char *f;
825
826 if (strcmp (s->filename, global_needed->name) == 0)
827 {
828 global_found = TRUE;
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 {
838 global_found = TRUE;
839 return;
840 }
841 }
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 {
852 global_found = TRUE;
853 return;
854 }
855 }
856 }
857
858 EOF
859
860 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
861 cat >>e${EMULATION_NAME}.c <<EOF
862
863 /* This is called after all the input files have been opened. */
864
865 static void
866 gld${EMULATION_NAME}_after_open (void)
867 {
868 struct bfd_link_needed_list *needed, *l;
869
870 /* We only need to worry about this when doing a final link. */
871 if (link_info.relocatable || !link_info.executable)
872 return;
873
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)
885 {
886 struct bfd_link_needed_list *ll;
887 struct dt_needed n, nn;
888 int force;
889
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
896 /* If we've already seen this file, skip it. */
897 for (ll = needed; ll != l; ll = ll->next)
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)
901 break;
902 if (ll != l)
903 continue;
904
905 /* See if this file was included in the link explicitly. */
906 global_needed = l;
907 global_found = FALSE;
908 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
909 if (global_found)
910 continue;
911
912 n.by = l->by;
913 n.name = l->name;
914 nn.by = l->by;
915 if (trace_file_tries)
916 info_msg (_("%s needed by %B\n"), l->name, l->by);
917
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
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.
925
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 {
931 size_t len;
932 search_dirs_type *search;
933 EOF
934 if [ "x${NATIVE}" = xyes ] ; then
935 cat >>e${EMULATION_NAME}.c <<EOF
936 const char *lib_path;
937 EOF
938 fi
939 if [ "x${USE_LIBPATH}" = xyes ] ; then
940 cat >>e${EMULATION_NAME}.c <<EOF
941 struct bfd_link_needed_list *rp;
942 int found;
943 EOF
944 fi
945 cat >>e${EMULATION_NAME}.c <<EOF
946
947 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
948 &n, force))
949 break;
950 EOF
951 if [ "x${USE_LIBPATH}" = xyes ] ; then
952 cat >>e${EMULATION_NAME}.c <<EOF
953 if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
954 &n, force))
955 break;
956 EOF
957 fi
958 if [ "x${NATIVE}" = xyes ] ; then
959 cat >>e${EMULATION_NAME}.c <<EOF
960 if (command_line.rpath_link == NULL
961 && command_line.rpath == NULL)
962 {
963 lib_path = (const char *) getenv ("LD_RUN_PATH");
964 if (gld${EMULATION_NAME}_search_needed (lib_path, &n,
965 force))
966 break;
967 }
968 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
969 if (gld${EMULATION_NAME}_search_needed (lib_path, &n, force))
970 break;
971 EOF
972 fi
973 if [ "x${USE_LIBPATH}" = xyes ] ; then
974 cat >>e${EMULATION_NAME}.c <<EOF
975 found = 0;
976 rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
977 for (; !found && rp != NULL; rp = rp->next)
978 {
979 char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
980 found = (rp->by == l->by
981 && gld${EMULATION_NAME}_search_needed (tmpname,
982 &n,
983 force));
984 free (tmpname);
985 }
986 if (found)
987 break;
988
989 EOF
990 fi
991 if [ "x${USE_LIBPATH}" = xyes ] ; then
992 case ${target} in
993 *-*-freebsd* | *-*-dragonfly*)
994 cat >>e${EMULATION_NAME}.c <<EOF
995 if (gld${EMULATION_NAME}_check_ld_elf_hints (l->name, force))
996 break;
997 EOF
998 # FreeBSD
999 ;;
1000
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
1007 EOF
1008 ;;
1009 esac
1010 fi
1011 cat >>e${EMULATION_NAME}.c <<EOF
1012 len = strlen (l->name);
1013 for (search = search_head; search != NULL; search = search->next)
1014 {
1015 char *filename;
1016
1017 if (search->cmdline)
1018 continue;
1019 filename = (char *) xmalloc (strlen (search->name) + len + 2);
1020 sprintf (filename, "%s/%s", search->name, l->name);
1021 nn.name = filename;
1022 if (gld${EMULATION_NAME}_try_needed (&nn, force))
1023 break;
1024 free (filename);
1025 }
1026 if (search != NULL)
1027 break;
1028 EOF
1029 cat >>e${EMULATION_NAME}.c <<EOF
1030 }
1031
1032 if (force < 2)
1033 continue;
1034
1035 einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
1036 l->name, l->by);
1037 }
1038 }
1039
1040 EOF
1041 fi
1042
1043 cat >>e${EMULATION_NAME}.c <<EOF
1044
1045 /* Look through an expression for an assignment statement. */
1046
1047 static void
1048 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
1049 {
1050 bfd_boolean provide = FALSE;
1051
1052 switch (exp->type.node_class)
1053 {
1054 case etree_provide:
1055 provide = TRUE;
1056 /* Fall thru */
1057 case etree_assign:
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. */
1065 if (strcmp (exp->assign.dst, ".") != 0)
1066 {
1067 if (!bfd_elf_record_link_assignment (output_bfd, &link_info,
1068 exp->assign.dst, provide,
1069 exp->assign.hidden))
1070 einfo ("%P%F: failed to record assignment to %s: %E\n",
1071 exp->assign.dst);
1072 }
1073 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1074 break;
1075
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;
1080
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;
1086
1087 case etree_unary:
1088 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1089 break;
1090
1091 default:
1092 break;
1093 }
1094 }
1095
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
1102 static void
1103 gld${EMULATION_NAME}_find_statement_assignment (lang_statement_union_type *s)
1104 {
1105 if (s->header.type == lang_assignment_statement_enum)
1106 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1107 }
1108
1109 EOF
1110
1111 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
1112 if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
1113 ELF_INTERPRETER_SET_DEFAULT="
1114 if (sinterp != NULL)
1115 {
1116 sinterp->contents = (unsigned char *) ${ELF_INTERPRETER_NAME};
1117 sinterp->size = strlen ((char *) sinterp->contents) + 1;
1118 }
1119
1120 "
1121 else
1122 ELF_INTERPRETER_SET_DEFAULT=
1123 fi
1124 cat >>e${EMULATION_NAME}.c <<EOF
1125
1126 /* This is called after the sections have been attached to output
1127 sections, but before any sizes or addresses have been set. */
1128
1129 static void
1130 gld${EMULATION_NAME}_before_allocation (void)
1131 {
1132 const char *rpath;
1133 asection *sinterp;
1134
1135 if (link_info.hash->type == bfd_link_elf_hash_table)
1136 _bfd_elf_tls_setup (output_bfd, &link_info);
1137
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");
1148 if (! (bfd_elf_size_dynamic_sections
1149 (output_bfd, command_line.soname, rpath,
1150 command_line.filter_shlib,
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");
1154
1155 ${ELF_INTERPRETER_SET_DEFAULT}
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;
1161 sinterp->size = strlen (command_line.interpreter) + 1;
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;
1174 bfd_size_type prefix_len;
1175 char *msg;
1176 bfd_boolean ret;
1177 const char * gnu_warning_prefix = _("warning: ");
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
1186 sz = s->size;
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))
1192 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
1193 is->the_bfd);
1194 msg[prefix_len + sz] = '\0';
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. */
1204 s->size = 0;
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;
1209 }
1210 }
1211
1212 before_allocation_default ();
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");
1216 }
1217
1218 EOF
1219 fi
1220
1221 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
1222 cat >>e${EMULATION_NAME}.c <<EOF
1223
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
1228 static bfd_boolean
1229 gld${EMULATION_NAME}_open_dynamic_archive
1230 (const char *arch, search_dirs_type *search, lang_input_statement_type *entry)
1231 {
1232 const char *filename;
1233 char *string;
1234
1235 if (! entry->is_archive)
1236 return FALSE;
1237
1238 filename = entry->filename;
1239
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))
1262 {
1263 free (string);
1264 return FALSE;
1265 }
1266
1267 entry->filename = string;
1268
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.
1278
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 {
1285 ASSERT (entry->is_archive && entry->search_dirs_flag);
1286
1287 /* Rather than duplicating the logic above. Just use the
1288 filename we recorded earlier. */
1289
1290 filename = lbasename (entry->filename);
1291 bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
1292 }
1293
1294 return TRUE;
1295 }
1296
1297 EOF
1298 fi
1299
1300 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
1301 cat >>e${EMULATION_NAME}.c <<EOF
1302
1303 /* A variant of lang_output_section_find used by place_orphan. */
1304
1305 static lang_output_section_statement_type *
1306 output_rel_find (asection *sec, int isdyn)
1307 {
1308 lang_output_section_statement_type *lookup;
1309 lang_output_section_statement_type *last = NULL;
1310 lang_output_section_statement_type *last_alloc = NULL;
1311 lang_output_section_statement_type *last_rel = NULL;
1312 lang_output_section_statement_type *last_rel_alloc = NULL;
1313 int rela = sec->name[4] == 'a';
1314
1315 for (lookup = &lang_output_section_statement.head->output_section_statement;
1316 lookup != NULL;
1317 lookup = lookup->next)
1318 {
1319 if (lookup->constraint != -1
1320 && strncmp (".rel", lookup->name, 4) == 0)
1321 {
1322 int lookrela = lookup->name[4] == 'a';
1323
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)
1332 break;
1333
1334 if (rela == lookrela || last_rel == NULL)
1335 last_rel = lookup;
1336 if ((rela == lookrela || last_rel_alloc == NULL)
1337 && lookup->bfd_section != NULL
1338 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1339 last_rel_alloc = lookup;
1340 }
1341
1342 last = lookup;
1343 if (lookup->bfd_section != NULL
1344 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1345 last_alloc = lookup;
1346 }
1347
1348 if (last_rel_alloc)
1349 return last_rel_alloc;
1350
1351 if (last_rel)
1352 return last_rel;
1353
1354 if (last_alloc)
1355 return last_alloc;
1356
1357 return last;
1358 }
1359
1360 /* Place an orphan section. We use this to put random SHF_ALLOC
1361 sections in the right segment. */
1362
1363 static bfd_boolean
1364 gld${EMULATION_NAME}_place_orphan (asection *s)
1365 {
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;
1401 struct orphan_save *place;
1402 const char *secname;
1403 lang_output_section_statement_type *after;
1404 lang_output_section_statement_type *os;
1405 int isdyn = 0;
1406 int iself = s->owner->xvec->flavour == bfd_target_elf_flavour;
1407 unsigned int sh_type = iself ? elf_section_type (s) : SHT_NULL;
1408
1409 secname = bfd_get_section_name (s->owner, s);
1410
1411 if (! link_info.relocatable
1412 && link_info.combreloc
1413 && (s->flags & SEC_ALLOC))
1414 {
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 }
1434 }
1435
1436 if (isdyn || (!config.unique_orphan_sections && !unique_section_p (s)))
1437 {
1438 /* Look through the script to see where to place this section. */
1439 os = lang_output_section_find (secname);
1440
1441 if (os != NULL
1442 && (os->bfd_section == NULL
1443 || os->bfd_section->flags == 0
1444 || (_bfd_elf_match_sections_by_type (output_bfd,
1445 os->bfd_section,
1446 s->owner, s)
1447 && ((s->flags ^ os->bfd_section->flags)
1448 & (SEC_LOAD | SEC_ALLOC)) == 0)))
1449 {
1450 /* We already have an output section statement with this
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. */
1455 lang_add_section (&os->children, s, os);
1456 return TRUE;
1457 }
1458 }
1459
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 }
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. */
1475 if (link_info.executable
1476 && ! link_info.relocatable
1477 && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
1478 && hold[orphan_text].os != NULL)
1479 {
1480 lang_add_section (&hold[orphan_text].os->children, s,
1481 hold[orphan_text].os);
1482 return TRUE;
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. */
1490
1491 place = NULL;
1492 if ((s->flags & SEC_ALLOC) == 0)
1493 ;
1494 else if ((s->flags & SEC_LOAD) != 0
1495 && ((iself && sh_type == SHT_NOTE)
1496 || (!iself && strncmp (secname, ".note", 5) == 0)))
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];
1504 else if (((iself && (sh_type == SHT_RELA || sh_type == SHT_REL))
1505 || (!iself && strncmp (secname, ".rel", 4) == 0))
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];
1512
1513 after = NULL;
1514 if (place != NULL)
1515 {
1516 if (place->os == NULL)
1517 {
1518 if (place->name != NULL)
1519 place->os = lang_output_section_find (place->name);
1520 else
1521 place->os = output_rel_find (s, isdyn);
1522 }
1523 after = place->os;
1524 if (after == NULL)
1525 after = lang_output_section_find_by_flags
1526 (s, &place->os, _bfd_elf_match_sections_by_type);
1527 if (after == NULL)
1528 /* *ABS* is always the first output section statement. */
1529 after = &lang_output_section_statement.head->output_section_statement;
1530 }
1531
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)
1536 {
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");
1541 }
1542
1543 lang_insert_orphan (s, secname, after, place, NULL, NULL);
1544
1545 return TRUE;
1546 }
1547 EOF
1548 fi
1549
1550 if test x"$LDEMUL_FINISH" != xgld"$EMULATION_NAME"_finish; then
1551 cat >>e${EMULATION_NAME}.c <<EOF
1552
1553 static void
1554 gld${EMULATION_NAME}_layout_sections_again (void)
1555 {
1556 lang_reset_memory_regions ();
1557
1558 /* Resize the sections. */
1559 lang_size_sections (NULL, TRUE);
1560
1561 /* Redo special stuff. */
1562 ldemul_after_allocation ();
1563
1564 /* Do the assignments again. */
1565 lang_do_assignments ();
1566 }
1567
1568 static void
1569 gld${EMULATION_NAME}_finish (void)
1570 {
1571 if (bfd_elf_discard_info (output_bfd, &link_info))
1572 gld${EMULATION_NAME}_layout_sections_again ();
1573
1574 finish_default ();
1575 }
1576 EOF
1577 fi
1578
1579 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1580 cat >>e${EMULATION_NAME}.c <<EOF
1581
1582 static char *
1583 gld${EMULATION_NAME}_get_script (int *isfile)
1584 EOF
1585
1586 if test -n "$COMPILE_IN"
1587 then
1588 # Scripts compiled in.
1589
1590 # sed commands to quote an ld script as a C string.
1591 sc="-f stringify.sed"
1592
1593 cat >>e${EMULATION_NAME}.c <<EOF
1594 {
1595 *isfile = 0;
1596
1597 if (link_info.relocatable && config.build_constructors)
1598 return
1599 EOF
1600 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1601 echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c
1602 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1603 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1604 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1605 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
1606 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1607 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1608 fi
1609 if test -n "$GENERATE_PIE_SCRIPT" ; then
1610 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1611 echo ' ; else if (link_info.pie && link_info.combreloc' >> e${EMULATION_NAME}.c
1612 echo ' && link_info.relro' >> e${EMULATION_NAME}.c
1613 echo ' && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1614 sed $sc ldscripts/${EMULATION_NAME}.xdw >> e${EMULATION_NAME}.c
1615 echo ' ; else if (link_info.pie && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1616 sed $sc ldscripts/${EMULATION_NAME}.xdc >> e${EMULATION_NAME}.c
1617 fi
1618 echo ' ; else if (link_info.pie) return' >> e${EMULATION_NAME}.c
1619 sed $sc ldscripts/${EMULATION_NAME}.xd >> e${EMULATION_NAME}.c
1620 fi
1621 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1622 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1623 echo ' ; else if (link_info.shared && link_info.combreloc' >> e${EMULATION_NAME}.c
1624 echo ' && link_info.relro' >> e${EMULATION_NAME}.c
1625 echo ' && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1626 sed $sc ldscripts/${EMULATION_NAME}.xsw >> e${EMULATION_NAME}.c
1627 echo ' ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
1628 sed $sc ldscripts/${EMULATION_NAME}.xsc >> e${EMULATION_NAME}.c
1629 fi
1630 echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c
1631 sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
1632 fi
1633 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1634 echo ' ; else if (link_info.combreloc && link_info.relro' >> e${EMULATION_NAME}.c
1635 echo ' && (link_info.flags & DT_BIND_NOW)) return' >> e${EMULATION_NAME}.c
1636 sed $sc ldscripts/${EMULATION_NAME}.xw >> e${EMULATION_NAME}.c
1637 echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c
1638 sed $sc ldscripts/${EMULATION_NAME}.xc >> e${EMULATION_NAME}.c
1639 fi
1640 echo ' ; else return' >> e${EMULATION_NAME}.c
1641 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1642 echo '; }' >> e${EMULATION_NAME}.c
1643
1644 else
1645 # Scripts read from the filesystem.
1646
1647 cat >>e${EMULATION_NAME}.c <<EOF
1648 {
1649 *isfile = 1;
1650
1651 if (link_info.relocatable && config.build_constructors)
1652 return "ldscripts/${EMULATION_NAME}.xu";
1653 else if (link_info.relocatable)
1654 return "ldscripts/${EMULATION_NAME}.xr";
1655 else if (!config.text_read_only)
1656 return "ldscripts/${EMULATION_NAME}.xbn";
1657 EOF
1658 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
1659 else
1660 cat >>e${EMULATION_NAME}.c <<EOF
1661 else if (!config.magic_demand_paged)
1662 return "ldscripts/${EMULATION_NAME}.xn";
1663 EOF
1664 fi
1665 if test -n "$GENERATE_PIE_SCRIPT" ; then
1666 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1667 cat >>e${EMULATION_NAME}.c <<EOF
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";
1671 else if (link_info.pie && link_info.combreloc)
1672 return "ldscripts/${EMULATION_NAME}.xdc";
1673 EOF
1674 fi
1675 cat >>e${EMULATION_NAME}.c <<EOF
1676 else if (link_info.pie)
1677 return "ldscripts/${EMULATION_NAME}.xd";
1678 EOF
1679 fi
1680 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1681 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1682 cat >>e${EMULATION_NAME}.c <<EOF
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";
1686 else if (link_info.shared && link_info.combreloc)
1687 return "ldscripts/${EMULATION_NAME}.xsc";
1688 EOF
1689 fi
1690 cat >>e${EMULATION_NAME}.c <<EOF
1691 else if (link_info.shared)
1692 return "ldscripts/${EMULATION_NAME}.xs";
1693 EOF
1694 fi
1695 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
1696 cat >>e${EMULATION_NAME}.c <<EOF
1697 else if (link_info.combreloc && link_info.relro
1698 && (link_info.flags & DT_BIND_NOW))
1699 return "ldscripts/${EMULATION_NAME}.xw";
1700 else if (link_info.combreloc)
1701 return "ldscripts/${EMULATION_NAME}.xc";
1702 EOF
1703 fi
1704 cat >>e${EMULATION_NAME}.c <<EOF
1705 else
1706 return "ldscripts/${EMULATION_NAME}.x";
1707 }
1708
1709 EOF
1710 fi
1711 fi
1712
1713 if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1714
1715 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1716 cat >>e${EMULATION_NAME}.c <<EOF
1717 $PARSE_AND_LIST_PROLOGUE
1718 EOF
1719 fi
1720
1721 cat >>e${EMULATION_NAME}.c <<EOF
1722
1723 #define OPTION_DISABLE_NEW_DTAGS (400)
1724 #define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
1725 #define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
1726 #define OPTION_EH_FRAME_HDR (OPTION_GROUP + 1)
1727 #define OPTION_EXCLUDE_LIBS (OPTION_EH_FRAME_HDR + 1)
1728
1729 static void
1730 gld${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)
1733 {
1734 static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:";
1735 static const struct option xtra_long[] = {
1736 EOF
1737
1738 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1739 cat >>e${EMULATION_NAME}.c <<EOF
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},
1743 {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
1744 {"Bgroup", no_argument, NULL, OPTION_GROUP},
1745 EOF
1746 fi
1747
1748 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
1749 cat >>e${EMULATION_NAME}.c <<EOF
1750 $PARSE_AND_LIST_LONGOPTS
1751 EOF
1752 fi
1753
1754 cat >>e${EMULATION_NAME}.c <<EOF
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 }
1764
1765 static bfd_boolean
1766 gld${EMULATION_NAME}_handle_option (int optc)
1767 {
1768 switch (optc)
1769 {
1770 default:
1771 return FALSE;
1772
1773 EOF
1774
1775 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1776 cat >>e${EMULATION_NAME}.c <<EOF
1777 case OPTION_DISABLE_NEW_DTAGS:
1778 link_info.new_dtags = FALSE;
1779 break;
1780
1781 case OPTION_ENABLE_NEW_DTAGS:
1782 link_info.new_dtags = TRUE;
1783 break;
1784
1785 case OPTION_EH_FRAME_HDR:
1786 link_info.eh_frame_hdr = TRUE;
1787 break;
1788
1789 case OPTION_GROUP:
1790 link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
1791 /* Groups must be self-contained. */
1792 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
1793 link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
1794 break;
1795
1796 case OPTION_EXCLUDE_LIBS:
1797 add_excluded_libs (optarg);
1798 break;
1799
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 }
1825 else if (strcmp (optarg, "defs") == 0)
1826 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
1827 else if (strcmp (optarg, "muldefs") == 0)
1828 link_info.allow_multiple_definition = TRUE;
1829 else if (strcmp (optarg, "combreloc") == 0)
1830 link_info.combreloc = TRUE;
1831 else if (strcmp (optarg, "nocombreloc") == 0)
1832 link_info.combreloc = FALSE;
1833 else if (strcmp (optarg, "nocopyreloc") == 0)
1834 link_info.nocopyreloc = TRUE;
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 }
1845 else if (strcmp (optarg, "relro") == 0)
1846 link_info.relro = TRUE;
1847 else if (strcmp (optarg, "norelro") == 0)
1848 link_info.relro = FALSE;
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 }
1865 /* What about the other Solaris -z options? FIXME. */
1866 break;
1867 EOF
1868 fi
1869
1870 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
1871 cat >>e${EMULATION_NAME}.c <<EOF
1872 $PARSE_AND_LIST_ARGS_CASES
1873 EOF
1874 fi
1875
1876 cat >>e${EMULATION_NAME}.c <<EOF
1877 }
1878
1879 return TRUE;
1880 }
1881
1882 EOF
1883
1884 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1885 cat >>e${EMULATION_NAME}.c <<EOF
1886
1887 static void
1888 gld${EMULATION_NAME}_list_options (FILE * file)
1889 {
1890 EOF
1891
1892 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1893 cat >>e${EMULATION_NAME}.c <<EOF
1894 fprintf (file, _(" -Bgroup\t\tSelects group name lookup rules for DSO\n"));
1895 fprintf (file, _(" --disable-new-dtags\tDisable new dynamic tags\n"));
1896 fprintf (file, _(" --enable-new-dtags\tEnable new dynamic tags\n"));
1897 fprintf (file, _(" --eh-frame-hdr\tCreate .eh_frame_hdr section\n"));
1898 fprintf (file, _(" -z combreloc\t\tMerge dynamic relocs into one section and sort\n"));
1899 fprintf (file, _(" -z defs\t\tReport unresolved symbols in object files.\n"));
1900 fprintf (file, _(" -z execstack\t\tMark executable as requiring executable stack\n"));
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"));
1903 fprintf (file, _(" -z loadfltr\t\tMark object requiring immediate process\n"));
1904 fprintf (file, _(" -z muldefs\t\tAllow multiple definitions\n"));
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"));
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"));
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"));
1911 fprintf (file, _(" -z noexecstack\tMark executable as not requiring executable stack\n"));
1912 fprintf (file, _(" -z norelro\t\tDon't create RELRO program header\n"));
1913 fprintf (file, _(" -z now\t\tMark object non-lazy runtime binding\n"));
1914 fprintf (file, _(" -z origin\t\tMark object requiring immediate \$ORIGIN processing\n\t\t\t at runtime\n"));
1915 fprintf (file, _(" -z relro\t\tCreate RELRO program header\n"));
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"));
1918 fprintf (file, _(" -z KEYWORD\t\tIgnored for Solaris compatibility\n"));
1919 EOF
1920 fi
1921
1922 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
1923 cat >>e${EMULATION_NAME}.c <<EOF
1924 $PARSE_AND_LIST_OPTIONS
1925 EOF
1926 fi
1927
1928 cat >>e${EMULATION_NAME}.c <<EOF
1929 }
1930 EOF
1931
1932 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
1933 cat >>e${EMULATION_NAME}.c <<EOF
1934 $PARSE_AND_LIST_EPILOGUE
1935 EOF
1936 fi
1937 fi
1938 else
1939 cat >>e${EMULATION_NAME}.c <<EOF
1940 #define gld${EMULATION_NAME}_add_options NULL
1941 #define gld${EMULATION_NAME}_handle_option NULL
1942 EOF
1943 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
1944 cat >>e${EMULATION_NAME}.c <<EOF
1945 #define gld${EMULATION_NAME}_list_options NULL
1946 EOF
1947 fi
1948 fi
1949
1950 cat >>e${EMULATION_NAME}.c <<EOF
1951
1952 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1953 {
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},
1964 "${EMULATION_NAME}",
1965 "${OUTPUT_FORMAT}",
1966 ${LDEMUL_FINISH-gld${EMULATION_NAME}_finish},
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},
1971 ${LDEMUL_PARSE_ARGS-NULL},
1972 gld${EMULATION_NAME}_add_options,
1973 gld${EMULATION_NAME}_handle_option,
1974 ${LDEMUL_UNRECOGNIZED_FILE-NULL},
1975 ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
1976 ${LDEMUL_RECOGNIZED_FILE-gld${EMULATION_NAME}_load_symbols},
1977 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
1978 ${LDEMUL_NEW_VERS_PATTERN-NULL}
1979 };
1980 EOF
This page took 0.114818 seconds and 4 git commands to generate.