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