* hppaelf.em (group_size): Change default back to 1.
[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 442if [ "x${USE_LIBPATH}" = xyes ] ; then
3dc16cab 443 cat >>e${EMULATION_NAME}.c <<EOF
9c8ebd6a
DJ
444
445/* Add the sysroot to every entry in a colon-separated path. */
446
447static char *
448gld${EMULATION_NAME}_add_sysroot (path)
449 const char *path;
450{
451 int len, colons, i;
452 char *ret, *p;
453
454 len = strlen (path);
455 colons = 0;
456 i = 0;
457 while (path[i])
458 if (path[i++] == ':')
459 colons++;
460
461 if (path[i])
462 colons++;
463
464 len = len + colons * strlen (ld_sysroot);
465 ret = xmalloc (len + 1);
466 strcpy (ret, ld_sysroot);
467 p = ret + strlen (ret);
468 i = 0;
469 while (path[i])
470 if (path[i] == ':')
471 {
ae42d3a9 472 *p++ = path[i++];
9c8ebd6a
DJ
473 strcpy (p, ld_sysroot);
474 p = p + strlen (p);
9c8ebd6a
DJ
475 }
476 else
477 *p++ = path[i++];
478
479 *p = 0;
480 return ret;
481}
04925e1e 482
3dc16cab
DJ
483EOF
484 case ${target} in
485 *-*-linux-gnu*)
486 cat >>e${EMULATION_NAME}.c <<EOF
04925e1e
AM
487/* For a native linker, check the file /etc/ld.so.conf for directories
488 in which we may find shared libraries. /etc/ld.so.conf is really
482e8b32 489 only meaningful on Linux. */
04925e1e 490
b34976b6 491static bfd_boolean gld${EMULATION_NAME}_check_ld_so_conf
04925e1e
AM
492 PARAMS ((const char *, int));
493
b34976b6 494static bfd_boolean
04925e1e
AM
495gld${EMULATION_NAME}_check_ld_so_conf (name, force)
496 const char *name;
497 int force;
498{
b34976b6 499 static bfd_boolean initialized;
04925e1e
AM
500 static char *ld_so_conf;
501
502 if (! initialized)
503 {
504 FILE *f;
9c8ebd6a 505 char *tmppath;
04925e1e 506
9c8ebd6a
DJ
507 tmppath = concat (ld_sysroot, "/etc/ld.so.conf", NULL);
508 f = fopen (tmppath, FOPEN_RT);
509 free (tmppath);
04925e1e
AM
510 if (f != NULL)
511 {
512 char *b;
513 size_t len, alloc;
514 int c;
515
516 len = 0;
517 alloc = 100;
518 b = (char *) xmalloc (alloc);
519
520 while ((c = getc (f)) != EOF)
521 {
522 if (len + 1 >= alloc)
523 {
524 alloc *= 2;
525 b = (char *) xrealloc (b, alloc);
526 }
527 if (c != ':'
528 && c != ' '
529 && c != '\t'
530 && c != '\n'
531 && c != ',')
532 {
533 b[len] = c;
534 ++len;
535 }
536 else
537 {
538 if (len > 0 && b[len - 1] != ':')
539 {
540 b[len] = ':';
541 ++len;
542 }
543 }
544 }
545
546 if (len > 0 && b[len - 1] == ':')
547 --len;
252b5132 548
04925e1e
AM
549 if (len > 0)
550 b[len] = '\0';
551 else
552 {
553 free (b);
554 b = NULL;
555 }
252b5132 556
04925e1e 557 fclose (f);
252b5132 558
9c8ebd6a
DJ
559 if (b)
560 {
561 char *d = gld${EMULATION_NAME}_add_sysroot (b);
562 free (b);
563 b = d;
564 }
565
04925e1e
AM
566 ld_so_conf = b;
567 }
49e56c49 568
b34976b6 569 initialized = TRUE;
04925e1e 570 }
49e56c49 571
04925e1e 572 if (ld_so_conf == NULL)
b34976b6 573 return FALSE;
252b5132 574
04925e1e 575 return gld${EMULATION_NAME}_search_needed (ld_so_conf, name, force);
252b5132
RH
576}
577
04925e1e 578EOF
9c8ebd6a
DJ
579 # Linux
580 ;;
04925e1e
AM
581 esac
582fi
583cat >>e${EMULATION_NAME}.c <<EOF
584
252b5132
RH
585/* See if an input file matches a DT_NEEDED entry by name. */
586
587static void
588gld${EMULATION_NAME}_check_needed (s)
589 lang_input_statement_type *s;
590{
591 if (global_found)
592 return;
593
577a0623 594 if (s->filename != NULL)
252b5132 595 {
577a0623
AM
596 const char *f;
597
598 if (strcmp (s->filename, global_needed->name) == 0)
599 {
b34976b6 600 global_found = TRUE;
577a0623
AM
601 return;
602 }
603
604 if (s->search_dirs_flag)
605 {
606 f = strrchr (s->filename, '/');
607 if (f != NULL
608 && strcmp (f + 1, global_needed->name) == 0)
609 {
b34976b6 610 global_found = TRUE;
577a0623
AM
611 return;
612 }
613 }
252b5132
RH
614 }
615
616 if (s->the_bfd != NULL)
617 {
618 const char *soname;
619
620 soname = bfd_elf_get_dt_soname (s->the_bfd);
621 if (soname != NULL
622 && strcmp (soname, global_needed->name) == 0)
623 {
b34976b6 624 global_found = TRUE;
252b5132
RH
625 return;
626 }
627 }
252b5132
RH
628}
629
41392f03
AM
630EOF
631
632if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
633cat >>e${EMULATION_NAME}.c <<EOF
04925e1e
AM
634
635/* This is called after all the input files have been opened. */
252b5132
RH
636
637static void
04925e1e 638gld${EMULATION_NAME}_after_open ()
252b5132 639{
04925e1e 640 struct bfd_link_needed_list *needed, *l;
252b5132 641
04925e1e
AM
642 /* We only need to worry about this when doing a final link. */
643 if (link_info.relocateable || link_info.shared)
252b5132
RH
644 return;
645
04925e1e
AM
646 /* Get the list of files which appear in DT_NEEDED entries in
647 dynamic objects included in the link (often there will be none).
648 For each such file, we want to track down the corresponding
649 library, and include the symbol table in the link. This is what
650 the runtime dynamic linker will do. Tracking the files down here
651 permits one dynamic object to include another without requiring
652 special action by the person doing the link. Note that the
653 needed list can actually grow while we are stepping through this
654 loop. */
655 needed = bfd_elf_get_needed_list (output_bfd, &link_info);
656 for (l = needed; l != NULL; l = l->next)
252b5132 657 {
04925e1e
AM
658 struct bfd_link_needed_list *ll;
659 int force;
252b5132 660
04925e1e
AM
661 /* If we've already seen this file, skip it. */
662 for (ll = needed; ll != l; ll = ll->next)
663 if (strcmp (ll->name, l->name) == 0)
664 break;
665 if (ll != l)
666 continue;
252b5132 667
04925e1e
AM
668 /* See if this file was included in the link explicitly. */
669 global_needed = l;
b34976b6 670 global_found = FALSE;
04925e1e
AM
671 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
672 if (global_found)
673 continue;
252b5132 674
ec4eb78a
L
675 if (trace_file_tries)
676 info_msg (_("%s needed by %B\n"), l->name, l->by);
677
04925e1e
AM
678 /* We need to find this file and include the symbol table. We
679 want to search for the file in the same way that the dynamic
680 linker will search. That means that we want to use
681 rpath_link, rpath, then the environment variable
ec4eb78a
L
682 LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
683 entries (native only), then the linker script LIB_SEARCH_DIRS.
684 We do not search using the -L arguments.
252b5132 685
04925e1e
AM
686 We search twice. The first time, we skip objects which may
687 introduce version mismatches. The second time, we force
688 their use. See gld${EMULATION_NAME}_vercheck comment. */
689 for (force = 0; force < 2; force++)
690 {
04925e1e
AM
691 size_t len;
692 search_dirs_type *search;
6dd8c765 693EOF
9c8ebd6a 694if [ "x${USE_LIBPATH}" = xyes ] ; then
6dd8c765 695cat >>e${EMULATION_NAME}.c <<EOF
dcb0bd0e 696 const char *lib_path;
6dd8c765
L
697 struct bfd_link_needed_list *rp;
698 int found;
699EOF
6dd8c765
L
700fi
701cat >>e${EMULATION_NAME}.c <<EOF
252b5132 702
04925e1e
AM
703 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
704 l->name, force))
705 break;
dcb0bd0e 706EOF
9c8ebd6a 707if [ "x${USE_LIBPATH}" = xyes ] ; then
dcb0bd0e 708cat >>e${EMULATION_NAME}.c <<EOF
04925e1e
AM
709 if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
710 l->name, force))
711 break;
9c8ebd6a
DJ
712EOF
713fi
714if [ "x${NATIVE}" = xyes ] ; then
715cat >>e${EMULATION_NAME}.c <<EOF
04925e1e
AM
716 if (command_line.rpath_link == NULL
717 && command_line.rpath == NULL)
718 {
719 lib_path = (const char *) getenv ("LD_RUN_PATH");
720 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name,
721 force))
722 break;
723 }
04925e1e
AM
724 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
725 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, force))
726 break;
9c8ebd6a
DJ
727EOF
728fi
729if [ "x${USE_LIBPATH}" = xyes ] ; then
730cat >>e${EMULATION_NAME}.c <<EOF
ec4eb78a 731 found = 0;
6dd8c765
L
732 rp = bfd_elf_get_runpath_list (output_bfd, &link_info);
733 for (; !found && rp != NULL; rp = rp->next)
ec4eb78a 734 {
9c8ebd6a 735 char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
ec4eb78a 736 found = (rp->by == l->by
9c8ebd6a 737 && gld${EMULATION_NAME}_search_needed (tmpname,
ec4eb78a
L
738 l->name,
739 force));
9c8ebd6a 740 free (tmpname);
ec4eb78a
L
741 }
742 if (found)
743 break;
744
04925e1e 745EOF
04925e1e
AM
746fi
747cat >>e${EMULATION_NAME}.c <<EOF
748 len = strlen (l->name);
749 for (search = search_head; search != NULL; search = search->next)
750 {
751 char *filename;
252b5132 752
04925e1e
AM
753 if (search->cmdline)
754 continue;
755 filename = (char *) xmalloc (strlen (search->name) + len + 2);
756 sprintf (filename, "%s/%s", search->name, l->name);
757 if (gld${EMULATION_NAME}_try_needed (filename, force))
758 break;
759 free (filename);
760 }
761 if (search != NULL)
762 break;
763EOF
9c8ebd6a
DJ
764if [ "x${USE_LIBPATH}" = xyes ] ; then
765 case ${target} in
766 *-*-linux-gnu*)
767 cat >>e${EMULATION_NAME}.c <<EOF
04925e1e
AM
768 if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
769 break;
770EOF
9c8ebd6a
DJ
771 # Linux
772 ;;
04925e1e
AM
773 esac
774fi
775cat >>e${EMULATION_NAME}.c <<EOF
776 }
252b5132 777
04925e1e
AM
778 if (force < 2)
779 continue;
252b5132 780
e374f1d9 781 einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
04925e1e
AM
782 l->name, l->by);
783 }
784}
252b5132 785
41392f03
AM
786EOF
787fi
788
789cat >>e${EMULATION_NAME}.c <<EOF
252b5132 790
04925e1e 791/* Look through an expression for an assignment statement. */
252b5132 792
04925e1e
AM
793static void
794gld${EMULATION_NAME}_find_exp_assignment (exp)
795 etree_type *exp;
796{
797 struct bfd_link_hash_entry *h;
798
799 switch (exp->type.node_class)
252b5132 800 {
04925e1e
AM
801 case etree_provide:
802 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
b34976b6 803 FALSE, FALSE, FALSE);
04925e1e
AM
804 if (h == NULL)
805 break;
252b5132 806
04925e1e
AM
807 /* We call record_link_assignment even if the symbol is defined.
808 This is because if it is defined by a dynamic object, we
809 actually want to use the value defined by the linker script,
810 not the value from the dynamic object (because we are setting
811 symbols like etext). If the symbol is defined by a regular
812 object, then, as it happens, calling record_link_assignment
813 will do no harm. */
814
815 /* Fall through. */
816 case etree_assign:
817 if (strcmp (exp->assign.dst, ".") != 0)
252b5132 818 {
04925e1e
AM
819 if (! (bfd_elf${ELFSIZE}_record_link_assignment
820 (output_bfd, &link_info, exp->assign.dst,
b34976b6 821 exp->type.node_class == etree_provide ? TRUE : FALSE)))
04925e1e
AM
822 einfo ("%P%F: failed to record assignment to %s: %E\n",
823 exp->assign.dst);
252b5132 824 }
04925e1e
AM
825 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
826 break;
252b5132 827
04925e1e
AM
828 case etree_binary:
829 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
830 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
831 break;
252b5132 832
04925e1e
AM
833 case etree_trinary:
834 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
835 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
836 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
837 break;
252b5132 838
04925e1e
AM
839 case etree_unary:
840 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
841 break;
252b5132 842
04925e1e
AM
843 default:
844 break;
252b5132
RH
845 }
846}
847
04925e1e
AM
848
849/* This is called by the before_allocation routine via
850 lang_for_each_statement. It locates any assignment statements, and
851 tells the ELF backend about them, in case they are assignments to
852 symbols which are referred to by dynamic objects. */
853
854static void
855gld${EMULATION_NAME}_find_statement_assignment (s)
856 lang_statement_union_type *s;
857{
858 if (s->header.type == lang_assignment_statement_enum)
859 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
860}
861
41392f03
AM
862EOF
863
864if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
57e6abd2
AO
865 if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
866 ELF_INTERPRETER_SET_DEFAULT="
867 if (sinterp != NULL)
868 {
869 sinterp->contents = ${ELF_INTERPRETER_NAME};
870 sinterp->_raw_size = strlen (sinterp->contents) + 1;
871 }
872
873"
874 else
875 ELF_INTERPRETER_SET_DEFAULT=
876 fi
41392f03 877cat >>e${EMULATION_NAME}.c <<EOF
04925e1e 878
252b5132
RH
879/* This is called after the sections have been attached to output
880 sections, but before any sizes or addresses have been set. */
881
882static void
883gld${EMULATION_NAME}_before_allocation ()
884{
885 const char *rpath;
886 asection *sinterp;
887
888 /* If we are going to make any variable assignments, we need to let
889 the ELF backend know about them in case the variables are
890 referred to by dynamic objects. */
891 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
892
893 /* Let the ELF backend work out the sizes of any sections required
894 by dynamic linking. */
895 rpath = command_line.rpath;
896 if (rpath == NULL)
897 rpath = (const char *) getenv ("LD_RUN_PATH");
898 if (! (bfd_elf${ELFSIZE}_size_dynamic_sections
899 (output_bfd, command_line.soname, rpath,
605d9b3a 900 command_line.filter_shlib,
252b5132
RH
901 (const char * const *) command_line.auxiliary_filters,
902 &link_info, &sinterp, lang_elf_version_info)))
903 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
57e6abd2 904${ELF_INTERPRETER_SET_DEFAULT}
252b5132
RH
905 /* Let the user override the dynamic linker we are using. */
906 if (command_line.interpreter != NULL
907 && sinterp != NULL)
908 {
909 sinterp->contents = (bfd_byte *) command_line.interpreter;
910 sinterp->_raw_size = strlen (command_line.interpreter) + 1;
911 }
912
913 /* Look for any sections named .gnu.warning. As a GNU extensions,
914 we treat such sections as containing warning messages. We print
915 out the warning message, and then zero out the section size so
916 that it does not get copied into the output file. */
917
918 {
919 LANG_FOR_EACH_INPUT_STATEMENT (is)
920 {
921 asection *s;
922 bfd_size_type sz;
923 char *msg;
b34976b6 924 bfd_boolean ret;
252b5132
RH
925
926 if (is->just_syms_flag)
927 continue;
928
929 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
930 if (s == NULL)
931 continue;
932
933 sz = bfd_section_size (is->the_bfd, s);
934 msg = xmalloc ((size_t) sz + 1);
935 if (! bfd_get_section_contents (is->the_bfd, s, msg, (file_ptr) 0, sz))
936 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
937 is->the_bfd);
938 msg[sz] = '\0';
939 ret = link_info.callbacks->warning (&link_info, msg,
940 (const char *) NULL,
941 is->the_bfd, (asection *) NULL,
942 (bfd_vma) 0);
943 ASSERT (ret);
944 free (msg);
945
946 /* Clobber the section size, so that we don't waste copying the
947 warning into the output file. */
948 s->_raw_size = 0;
949 }
950 }
951}
952
41392f03
AM
953EOF
954fi
955
956if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
957cat >>e${EMULATION_NAME}.c <<EOF
252b5132 958
04925e1e
AM
959/* Try to open a dynamic archive. This is where we know that ELF
960 dynamic libraries have an extension of .so (or .sl on oddball systems
961 like hpux). */
962
b34976b6 963static bfd_boolean
04925e1e
AM
964gld${EMULATION_NAME}_open_dynamic_archive (arch, search, entry)
965 const char *arch;
966 search_dirs_type *search;
967 lang_input_statement_type *entry;
252b5132 968{
04925e1e
AM
969 const char *filename;
970 char *string;
252b5132 971
04925e1e 972 if (! entry->is_archive)
b34976b6 973 return FALSE;
252b5132 974
04925e1e 975 filename = entry->filename;
252b5132 976
04925e1e
AM
977 /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
978 is defined, but it does not seem worth the headache to optimize
979 away those two bytes of space. */
980 string = (char *) xmalloc (strlen (search->name)
981 + strlen (filename)
982 + strlen (arch)
983#ifdef EXTRA_SHLIB_EXTENSION
984 + strlen (EXTRA_SHLIB_EXTENSION)
985#endif
986 + sizeof "/lib.so");
987
988 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
989
990#ifdef EXTRA_SHLIB_EXTENSION
991 /* Try the .so extension first. If that fails build a new filename
992 using EXTRA_SHLIB_EXTENSION. */
993 if (! ldfile_try_open_bfd (string, entry))
994 sprintf (string, "%s/lib%s%s%s", search->name,
995 filename, arch, EXTRA_SHLIB_EXTENSION);
996#endif
997
998 if (! ldfile_try_open_bfd (string, entry))
252b5132 999 {
04925e1e 1000 free (string);
b34976b6 1001 return FALSE;
04925e1e 1002 }
252b5132 1003
04925e1e 1004 entry->filename = string;
252b5132 1005
04925e1e
AM
1006 /* We have found a dynamic object to include in the link. The ELF
1007 backend linker will create a DT_NEEDED entry in the .dynamic
1008 section naming this file. If this file includes a DT_SONAME
1009 entry, it will be used. Otherwise, the ELF linker will just use
1010 the name of the file. For an archive found by searching, like
1011 this one, the DT_NEEDED entry should consist of just the name of
1012 the file, without the path information used to find it. Note
1013 that we only need to do this if we have a dynamic object; an
1014 archive will never be referenced by a DT_NEEDED entry.
252b5132 1015
04925e1e
AM
1016 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
1017 very pretty. I haven't been able to think of anything that is
1018 pretty, though. */
1019 if (bfd_check_format (entry->the_bfd, bfd_object)
1020 && (entry->the_bfd->flags & DYNAMIC) != 0)
1021 {
04925e1e 1022 ASSERT (entry->is_archive && entry->search_dirs_flag);
252b5132 1023
04925e1e 1024 /* Rather than duplicating the logic above. Just use the
1c9acd94 1025 filename we recorded earlier. */
04925e1e 1026
fed2999d 1027 filename = lbasename (entry->filename);
1c9acd94 1028 bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
04925e1e
AM
1029 }
1030
b34976b6 1031 return TRUE;
04925e1e
AM
1032}
1033
41392f03
AM
1034EOF
1035fi
cde43e70
AM
1036
1037if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
41392f03
AM
1038cat >>e${EMULATION_NAME}.c <<EOF
1039
1040/* A variant of lang_output_section_find. Used by place_orphan. */
04925e1e 1041
04925e1e 1042static lang_output_section_statement_type *
24cdb50a
AM
1043output_rel_find (sec)
1044 asection *sec;
04925e1e
AM
1045{
1046 lang_statement_union_type *u;
1047 lang_output_section_statement_type *lookup;
ba493122
AM
1048 lang_output_section_statement_type *last = NULL;
1049 lang_output_section_statement_type *last_rel = NULL;
1050 lang_output_section_statement_type *last_rel_alloc = NULL;
24cdb50a 1051 int rela = sec->name[4] == 'a';
04925e1e 1052
ba493122 1053 for (u = lang_output_section_statement.head; u; u = lookup->next)
04925e1e
AM
1054 {
1055 lookup = &u->output_section_statement;
ba493122 1056 if (strncmp (".rel", lookup->name, 4) == 0)
04925e1e 1057 {
ba493122
AM
1058 /* Don't place after .rel.plt as doing so results in wrong
1059 dynamic tags. Also, place allocated reloc sections before
1060 non-allocated. */
24cdb50a 1061 int lookrela = lookup->name[4] == 'a';
ba493122 1062
24cdb50a 1063 if (strcmp (".plt", lookup->name + 4 + lookrela) == 0
ba493122
AM
1064 || (lookup->bfd_section != NULL
1065 && (lookup->bfd_section->flags & SEC_ALLOC) == 0))
1066 break;
24cdb50a
AM
1067 last = lookup;
1068 if (rela == lookrela)
1069 last_rel = lookup;
ba493122
AM
1070 if (lookup->bfd_section != NULL
1071 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1072 last_rel_alloc = lookup;
04925e1e 1073 }
252b5132 1074 }
ba493122
AM
1075
1076 if (last_rel_alloc)
1077 return last_rel_alloc;
1078
1079 if (last_rel)
1080 return last_rel;
1081
1082 return last;
252b5132
RH
1083}
1084
95500e1c
JJ
1085/* Find the last output section before given output statement.
1086 Used by place_orphan. */
1087
1088static asection *
1089output_prev_sec_find (os)
1090 lang_output_section_statement_type *os;
1091{
1092 asection *s = (asection *) NULL;
1093 lang_statement_union_type *u;
1094 lang_output_section_statement_type *lookup;
1095
1096 for (u = lang_output_section_statement.head;
1097 u != (lang_statement_union_type *) NULL;
1098 u = lookup->next)
1099 {
1100 lookup = &u->output_section_statement;
1101 if (lookup == os)
cde43e70
AM
1102 return s;
1103
1104 if (lookup->bfd_section != NULL && lookup->bfd_section->owner != NULL)
95500e1c
JJ
1105 s = lookup->bfd_section;
1106 }
1107
cde43e70 1108 return NULL;
95500e1c
JJ
1109}
1110
252b5132
RH
1111/* Place an orphan section. We use this to put random SHF_ALLOC
1112 sections in the right segment. */
1113
41392f03 1114struct orphan_save {
6a345e87 1115 lang_output_section_statement_type *os;
5ba47421 1116 asection **section;
6a345e87 1117 lang_statement_union_type **stmt;
1e5e5400 1118 lang_statement_union_type **os_tail;
6a345e87 1119};
252b5132 1120
b34976b6 1121static bfd_boolean
252b5132
RH
1122gld${EMULATION_NAME}_place_orphan (file, s)
1123 lang_input_statement_type *file;
1124 asection *s;
1125{
aea4bd9d
AM
1126 static struct orphan_save hold_text;
1127 static struct orphan_save hold_rodata;
1128 static struct orphan_save hold_data;
1129 static struct orphan_save hold_bss;
1130 static struct orphan_save hold_rel;
1131 static struct orphan_save hold_interp;
c940e6fc 1132 static struct orphan_save hold_sdata;
f9989030 1133 static int count = 1;
6a345e87 1134 struct orphan_save *place;
71bfc0ae 1135 lang_statement_list_type *old;
252b5132
RH
1136 lang_statement_list_type add;
1137 etree_type *address;
a854a4a7 1138 const char *secname;
a854a4a7 1139 const char *ps = NULL;
252b5132 1140 lang_output_section_statement_type *os;
1e5e5400 1141 lang_statement_union_type **os_tail;
36478e9d 1142 etree_type *load_base;
24cdb50a 1143 int isdyn = 0;
252b5132 1144
aea4bd9d 1145 secname = bfd_get_section_name (s->owner, s);
24cdb50a
AM
1146 if (! link_info.relocateable
1147 && link_info.combreloc
a8927cfd 1148 && (s->flags & SEC_ALLOC)
24cdb50a
AM
1149 && strncmp (secname, ".rel", 4) == 0)
1150 {
1151 if (secname[4] == 'a')
1152 secname = ".rela.dyn";
1153 else
1154 secname = ".rel.dyn";
1155 isdyn = 1;
1156 }
aea4bd9d 1157
24cdb50a 1158 if (isdyn || (!config.unique_orphan_sections && !unique_section_p (secname)))
252b5132 1159 {
6d02a667 1160 /* Look through the script to see where to place this section. */
a854a4a7
AM
1161 os = lang_output_section_find (secname);
1162
1163 if (os != NULL
0f33d40b
AM
1164 && (os->bfd_section == NULL
1165 || ((s->flags ^ os->bfd_section->flags)
1166 & (SEC_LOAD | SEC_ALLOC)) == 0))
a854a4a7 1167 {
0f33d40b 1168 /* We already have an output section statement with this
22af9fd3 1169 name, and its bfd section, if any, has compatible flags. */
39dcfe18 1170 lang_add_section (&os->children, s, os, file);
b34976b6 1171 return TRUE;
a854a4a7 1172 }
252b5132
RH
1173 }
1174
aea4bd9d
AM
1175 if (hold_text.os == NULL)
1176 hold_text.os = lang_output_section_find (".text");
252b5132
RH
1177
1178 /* If this is a final link, then always put .gnu.warning.SYMBOL
1179 sections into the .text section to get them out of the way. */
1180 if (! link_info.shared
1181 && ! link_info.relocateable
1182 && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
6a345e87 1183 && hold_text.os != NULL)
252b5132 1184 {
39dcfe18 1185 lang_add_section (&hold_text.os->children, s, hold_text.os, file);
b34976b6 1186 return TRUE;
252b5132
RH
1187 }
1188
1189 /* Decide which segment the section should go in based on the
1190 section name and section flags. We put loadable .note sections
1191 right after the .interp section, so that the PT_NOTE segment is
1192 stored right after the program headers where the OS can read it
1193 in the first page. */
aea4bd9d
AM
1194#define HAVE_SECTION(hold, name) \
1195(hold.os != NULL || (hold.os = lang_output_section_find (name)) != NULL)
1196
1d475d82 1197 if ((s->flags & SEC_EXCLUDE) != 0 && !link_info.relocateable)
22af9fd3
AM
1198 {
1199 if (s->output_section == NULL)
1200 s->output_section = bfd_abs_section_ptr;
b34976b6 1201 return TRUE;
22af9fd3 1202 }
71bfc0ae
AM
1203
1204 place = NULL;
1205 if ((s->flags & SEC_ALLOC) == 0)
1206 ;
252b5132 1207 else if ((s->flags & SEC_LOAD) != 0
577a0623 1208 && strncmp (secname, ".note", 5) == 0
aea4bd9d 1209 && HAVE_SECTION (hold_interp, ".interp"))
6a345e87 1210 place = &hold_interp;
252b5132 1211 else if ((s->flags & SEC_HAS_CONTENTS) == 0
aea4bd9d 1212 && HAVE_SECTION (hold_bss, ".bss"))
6a345e87 1213 place = &hold_bss;
c940e6fc
JW
1214 else if ((s->flags & SEC_SMALL_DATA) != 0
1215 && HAVE_SECTION (hold_sdata, ".sdata"))
1216 place = &hold_sdata;
252b5132 1217 else if ((s->flags & SEC_READONLY) == 0
aea4bd9d 1218 && HAVE_SECTION (hold_data, ".data"))
6a345e87 1219 place = &hold_data;
252b5132 1220 else if (strncmp (secname, ".rel", 4) == 0
ba493122 1221 && (s->flags & SEC_LOAD) != 0
aea4bd9d 1222 && (hold_rel.os != NULL
24cdb50a 1223 || (hold_rel.os = output_rel_find (s)) != NULL))
ba493122 1224 place = &hold_rel;
71bfc0ae 1225 else if ((s->flags & (SEC_CODE | SEC_READONLY)) == SEC_READONLY
aea4bd9d 1226 && HAVE_SECTION (hold_rodata, ".rodata"))
6a345e87 1227 place = &hold_rodata;
71bfc0ae 1228 else if ((s->flags & (SEC_CODE | SEC_READONLY)) == (SEC_CODE | SEC_READONLY)
6a345e87
AM
1229 && hold_text.os != NULL)
1230 place = &hold_text;
252b5132 1231
aea4bd9d
AM
1232#undef HAVE_SECTION
1233
252b5132
RH
1234 /* Choose a unique name for the section. This will be needed if the
1235 same section name appears in the input file with different
f813923c 1236 loadable or allocatable characteristics. */
24cdb50a 1237 if (bfd_get_section_by_name (output_bfd, secname) != NULL)
b3ea3584 1238 {
24cdb50a
AM
1239 secname = bfd_get_unique_section_name (output_bfd, secname, &count);
1240 if (secname == NULL)
b3ea3584
AM
1241 einfo ("%F%P: place_orphan failed: %E\n");
1242 }
252b5132 1243
71bfc0ae
AM
1244 /* Start building a list of statements for this section.
1245 First save the current statement pointer. */
1246 old = stat_ptr;
1247
1248 /* If we have found an appropriate place for the output section
1249 statements for this orphan, add them to our own private list,
1250 inserting them later into the global statement list. */
5ba47421 1251 if (place != NULL)
252b5132 1252 {
5ba47421
AM
1253 stat_ptr = &add;
1254 lang_list_init (stat_ptr);
71bfc0ae 1255 }
5ba47421 1256
71bfc0ae
AM
1257 if (config.build_constructors)
1258 {
5ba47421
AM
1259 /* If the name of the section is representable in C, then create
1260 symbols to mark the start and the end of the section. */
24cdb50a 1261 for (ps = secname; *ps != '\0'; ps++)
3882b010 1262 if (! ISALNUM (*ps) && *ps != '_')
5ba47421 1263 break;
71bfc0ae 1264 if (*ps == '\0')
5ba47421
AM
1265 {
1266 char *symname;
1267 etree_type *e_align;
1268
24cdb50a
AM
1269 symname = (char *) xmalloc (ps - secname + sizeof "__start_");
1270 sprintf (symname, "__start_%s", secname);
5ba47421
AM
1271 e_align = exp_unop (ALIGN_K,
1272 exp_intop ((bfd_vma) 1 << s->alignment_power));
1273 lang_add_assignment (exp_assop ('=', symname, e_align));
1274 }
252b5132
RH
1275 }
1276
36478e9d 1277 address = NULL;
01cc8ff8 1278 if (link_info.relocateable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
252b5132 1279 address = exp_intop ((bfd_vma) 0);
36478e9d
AM
1280
1281 load_base = NULL;
1282 if (place != NULL && place->os->load_base != NULL)
1283 {
1284 etree_type *lma_from_vma;
1285 lma_from_vma = exp_binop ('-', place->os->load_base,
1286 exp_nameop (ADDR, place->os->name));
1287 load_base = exp_binop ('+', lma_from_vma,
1288 exp_nameop (ADDR, secname));
1289 }
252b5132 1290
1e5e5400 1291 os_tail = lang_output_section_statement.tail;
24cdb50a 1292 os = lang_enter_output_section_statement (secname, address, 0,
aea4bd9d
AM
1293 (bfd_vma) 0,
1294 (etree_type *) NULL,
1295 (etree_type *) NULL,
36478e9d 1296 load_base);
252b5132 1297
39dcfe18 1298 lang_add_section (&os->children, s, os, file);
252b5132 1299
20d04697
L
1300 lang_leave_output_section_statement
1301 ((bfd_vma) 0, "*default*",
ee3cc2e2 1302 (struct lang_output_section_phdr_list *) NULL, NULL);
20d04697 1303
71bfc0ae 1304 if (config.build_constructors && *ps == '\0')
252b5132 1305 {
71bfc0ae 1306 char *symname;
252b5132 1307
71bfc0ae
AM
1308 /* lang_leave_ouput_section_statement resets stat_ptr. Put
1309 stat_ptr back where we want it. */
1310 if (place != NULL)
1311 stat_ptr = &add;
252b5132 1312
24cdb50a
AM
1313 symname = (char *) xmalloc (ps - secname + sizeof "__stop_");
1314 sprintf (symname, "__stop_%s", secname);
71bfc0ae
AM
1315 lang_add_assignment (exp_assop ('=', symname,
1316 exp_nameop (NAME, ".")));
1317 }
5ba47421 1318
71bfc0ae
AM
1319 /* Restore the global list pointer. */
1320 stat_ptr = old;
1321
25844aae 1322 if (place != NULL && os->bfd_section != NULL)
71bfc0ae 1323 {
cde43e70 1324 asection *snew, **pps;
5ba47421
AM
1325
1326 snew = os->bfd_section;
95500e1c 1327
cde43e70
AM
1328 /* Shuffle the bfd section list to make the output file look
1329 neater. This is really only cosmetic. */
1330 if (place->section == NULL)
5ba47421 1331 {
cde43e70 1332 asection *bfd_section = place->os->bfd_section;
5ba47421 1333
cde43e70
AM
1334 /* If the output statement hasn't been used to place
1335 any input sections (and thus doesn't have an output
1336 bfd_section), look for the closest prior output statement
1337 having an output section. */
1338 if (bfd_section == NULL)
1339 bfd_section = output_prev_sec_find (place->os);
1340
1341 if (bfd_section != NULL && bfd_section != snew)
1342 place->section = &bfd_section->next;
1343 }
1344
1345 if (place->section != NULL)
1346 {
3dfe7a8c 1347 /* Unlink the section. */
5ba47421
AM
1348 for (pps = &output_bfd->sections; *pps != snew; pps = &(*pps)->next)
1349 ;
3dfe7a8c 1350 bfd_section_list_remove (output_bfd, pps);
5ba47421
AM
1351
1352 /* Now tack it on to the "place->os" section list. */
3dfe7a8c 1353 bfd_section_list_insert (output_bfd, place->section, snew);
5ba47421 1354 }
5ba47421 1355
cde43e70
AM
1356 /* Save the end of this list. Further ophans of this type will
1357 follow the one we've just added. */
1358 place->section = &snew->next;
1359
1360 /* The following is non-cosmetic. We try to put the output
1361 statements in some sort of reasonable order here, because
1362 they determine the final load addresses of the orphan
1363 sections. In addition, placing output statements in the
1364 wrong order may require extra segments. For instance,
1365 given a typical situation of all read-only sections placed
1366 in one segment and following that a segment containing all
1367 the read-write sections, we wouldn't want to place an orphan
1368 read/write section before or amongst the read-only ones. */
ed15ac6a 1369 if (add.head != NULL)
01cc8ff8 1370 {
1e5e5400
AM
1371 lang_statement_union_type *newly_added_os;
1372
ed15ac6a
AM
1373 if (place->stmt == NULL)
1374 {
1375 /* Put the new statement list right at the head. */
1376 *add.tail = place->os->header.next;
1377 place->os->header.next = add.head;
1e5e5400
AM
1378
1379 place->os_tail = &place->os->next;
ed15ac6a
AM
1380 }
1381 else
1382 {
1383 /* Put it after the last orphan statement we added. */
1384 *add.tail = *place->stmt;
1385 *place->stmt = add.head;
1386 }
71bfc0ae 1387
ed15ac6a
AM
1388 /* Fix the global list pointer if we happened to tack our
1389 new list at the tail. */
1390 if (*old->tail == add.head)
1391 old->tail = add.tail;
71bfc0ae 1392
ed15ac6a
AM
1393 /* Save the end of this list. */
1394 place->stmt = add.tail;
1e5e5400
AM
1395
1396 /* Do the same for the list of output section statements. */
1397 newly_added_os = *os_tail;
1398 *os_tail = NULL;
1399 newly_added_os->output_section_statement.next = *place->os_tail;
1400 *place->os_tail = newly_added_os;
1401 place->os_tail = &newly_added_os->output_section_statement.next;
1402
1403 /* Fixing the global list pointer here is a little different.
1404 We added to the list in lang_enter_output_section_statement,
1405 trimmed off the new output_section_statment above when
1406 assigning *os_tail = NULL, but possibly added it back in
1407 the same place when assigning *place->os_tail. */
1408 if (*os_tail == NULL)
1409 lang_output_section_statement.tail = os_tail;
ed15ac6a 1410 }
6a345e87 1411 }
252b5132 1412
b34976b6 1413 return TRUE;
252b5132 1414}
c56feb2b
AM
1415EOF
1416fi
1417
1418if test x"$LDEMUL_FINISH" != xgld"$EMULATION_NAME"_finish; then
1419cat >>e${EMULATION_NAME}.c <<EOF
252b5132 1420
73d074b4
DJ
1421static void
1422gld${EMULATION_NAME}_finish ()
1423{
65765700 1424 if (bfd_elf${ELFSIZE}_discard_info (output_bfd, &link_info))
73d074b4 1425 {
e3dc8847
HPN
1426 lang_reset_memory_regions ();
1427
73d074b4
DJ
1428 /* Resize the sections. */
1429 lang_size_sections (stat_ptr->head, abs_output_section,
ca0b5847 1430 &stat_ptr->head, 0, (bfd_vma) 0, NULL);
73d074b4
DJ
1431
1432 /* Redo special stuff. */
1433 ldemul_after_allocation ();
1434
1435 /* Do the assignments again. */
1436 lang_do_assignments (stat_ptr->head, abs_output_section,
2c382fb6 1437 (fill_type *) 0, (bfd_vma) 0);
73d074b4
DJ
1438 }
1439}
41392f03
AM
1440EOF
1441fi
1442
1443if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
1444cat >>e${EMULATION_NAME}.c <<EOF
252b5132
RH
1445
1446static char *
41392f03 1447gld${EMULATION_NAME}_get_script (isfile)
252b5132
RH
1448 int *isfile;
1449EOF
1450
1451if test -n "$COMPILE_IN"
1452then
1453# Scripts compiled in.
1454
1455# sed commands to quote an ld script as a C string.
597e2591 1456sc="-f stringify.sed"
252b5132
RH
1457
1458cat >>e${EMULATION_NAME}.c <<EOF
60bcf0fa 1459{
252b5132
RH
1460 *isfile = 0;
1461
b34976b6 1462 if (link_info.relocateable && config.build_constructors)
597e2591 1463 return
252b5132 1464EOF
b34976b6
AM
1465sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1466echo ' ; else if (link_info.relocateable) return' >> e${EMULATION_NAME}.c
1467sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1468echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1469sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
61585df2 1470if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
b34976b6
AM
1471echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1472sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
db6751f2 1473fi
252b5132 1474if test -n "$GENERATE_SHLIB_SCRIPT" ; then
82434356 1475if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
db6751f2 1476echo ' ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
b34976b6 1477sed $sc ldscripts/${EMULATION_NAME}.xsc >> e${EMULATION_NAME}.c
82434356 1478fi
b34976b6
AM
1479echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c
1480sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
252b5132 1481fi
82434356 1482if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
b34976b6
AM
1483echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c
1484sed $sc ldscripts/${EMULATION_NAME}.xc >> e${EMULATION_NAME}.c
82434356 1485fi
b34976b6
AM
1486echo ' ; else return' >> e${EMULATION_NAME}.c
1487sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1488echo '; }' >> e${EMULATION_NAME}.c
252b5132
RH
1489
1490else
1491# Scripts read from the filesystem.
1492
1493cat >>e${EMULATION_NAME}.c <<EOF
60bcf0fa 1494{
252b5132
RH
1495 *isfile = 1;
1496
b34976b6 1497 if (link_info.relocateable && config.build_constructors)
252b5132 1498 return "ldscripts/${EMULATION_NAME}.xu";
b34976b6 1499 else if (link_info.relocateable)
252b5132
RH
1500 return "ldscripts/${EMULATION_NAME}.xr";
1501 else if (!config.text_read_only)
1502 return "ldscripts/${EMULATION_NAME}.xbn";
1503 else if (!config.magic_demand_paged)
1504 return "ldscripts/${EMULATION_NAME}.xn";
1505 else if (link_info.shared)
1506 return "ldscripts/${EMULATION_NAME}.xs";
1507 else
1508 return "ldscripts/${EMULATION_NAME}.x";
1509}
252b5132 1510
3b108066 1511EOF
41392f03
AM
1512fi
1513fi
3b108066 1514
41392f03 1515if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
3b108066 1516
4b209b22 1517if test x"$LDEMUL_PARSE_ARGS" != xgld"$EMULATION_NAME"_parse_args; then
3b108066 1518
e0ee487b
L
1519if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
1520cat >>e${EMULATION_NAME}.c <<EOF
1521 $PARSE_AND_LIST_PROLOGUE
1522EOF
1523fi
1524
e0ee487b
L
1525cat >>e${EMULATION_NAME}.c <<EOF
1526
1527#include "getopt.h"
1528
6c1439be
L
1529#define OPTION_DISABLE_NEW_DTAGS (400)
1530#define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
a1ab1d2a 1531#define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
65765700 1532#define OPTION_EH_FRAME_HDR (OPTION_GROUP + 1)
6c1439be 1533
e0ee487b
L
1534static struct option longopts[] =
1535{
1536EOF
e0ee487b
L
1537
1538if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1539cat >>e${EMULATION_NAME}.c <<EOF
699845ef
L
1540 /* getopt allows abbreviations, so we do this to stop it from
1541 treating -d/-e as abbreviations for these options. */
6c1439be 1542 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
699845ef
L
1543 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
1544 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
6c1439be 1545 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
65765700 1546 {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
a1ab1d2a
UD
1547 {"Bgroup", no_argument, NULL, OPTION_GROUP},
1548 {"Bgroup", no_argument, NULL, OPTION_GROUP},
e0ee487b
L
1549EOF
1550fi
1551
1552if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
1553cat >>e${EMULATION_NAME}.c <<EOF
1554 $PARSE_AND_LIST_LONGOPTS
1555EOF
1556fi
1557
e0ee487b
L
1558cat >>e${EMULATION_NAME}.c <<EOF
1559 {NULL, no_argument, NULL, 0}
1560};
1561
04925e1e 1562
4b209b22 1563static int gld${EMULATION_NAME}_parse_args PARAMS ((int, char **));
41392f03 1564
e0ee487b 1565static int
4b209b22 1566gld${EMULATION_NAME}_parse_args (argc, argv)
e0ee487b
L
1567 int argc;
1568 char ** argv;
1569{
4b209b22
AM
1570 int longind;
1571 int optc;
1572 static int prevoptind = -1;
e0ee487b
L
1573 int prevopterr = opterr;
1574 int wanterror;
e0ee487b 1575
4b209b22 1576 if (prevoptind != optind)
e0ee487b
L
1577 opterr = 0;
1578
4b209b22
AM
1579 wanterror = opterr;
1580 prevoptind = optind;
1581
41392f03
AM
1582 optc = getopt_long_only (argc, argv,
1583 "-${PARSE_AND_LIST_SHORTOPTS}z:", longopts,
1584 &longind);
e0ee487b
L
1585 opterr = prevopterr;
1586
1587 switch (optc)
1588 {
1589 default:
1590 if (wanterror)
1591 xexit (1);
4b209b22 1592 optind = prevoptind;
e0ee487b 1593 return 0;
6c1439be 1594
e0ee487b 1595EOF
e0ee487b
L
1596
1597if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1598cat >>e${EMULATION_NAME}.c <<EOF
6c1439be 1599 case OPTION_DISABLE_NEW_DTAGS:
b34976b6 1600 link_info.new_dtags = FALSE;
6c1439be
L
1601 break;
1602
1603 case OPTION_ENABLE_NEW_DTAGS:
b34976b6 1604 link_info.new_dtags = TRUE;
6c1439be
L
1605 break;
1606
65765700 1607 case OPTION_EH_FRAME_HDR:
b34976b6 1608 link_info.eh_frame_hdr = TRUE;
65765700
JJ
1609 break;
1610
a1ab1d2a
UD
1611 case OPTION_GROUP:
1612 link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
1613 /* Groups must be self-contained. */
b34976b6 1614 link_info.no_undefined = TRUE;
a1ab1d2a
UD
1615 break;
1616
e0ee487b
L
1617 case 'z':
1618 if (strcmp (optarg, "initfirst") == 0)
1619 link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
1620 else if (strcmp (optarg, "interpose") == 0)
1621 link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
1622 else if (strcmp (optarg, "loadfltr") == 0)
1623 link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
1624 else if (strcmp (optarg, "nodefaultlib") == 0)
1625 link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
1626 else if (strcmp (optarg, "nodelete") == 0)
1627 link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
1628 else if (strcmp (optarg, "nodlopen") == 0)
1629 link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
1630 else if (strcmp (optarg, "nodump") == 0)
1631 link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
1632 else if (strcmp (optarg, "now") == 0)
1633 {
1634 link_info.flags |= (bfd_vma) DF_BIND_NOW;
1635 link_info.flags_1 |= (bfd_vma) DF_1_NOW;
1636 }
1637 else if (strcmp (optarg, "origin") == 0)
1638 {
1639 link_info.flags |= (bfd_vma) DF_ORIGIN;
1640 link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
1641 }
a1ab1d2a 1642 else if (strcmp (optarg, "defs") == 0)
b34976b6 1643 link_info.no_undefined = TRUE;
aa713662 1644 else if (strcmp (optarg, "muldefs") == 0)
b34976b6 1645 link_info.allow_multiple_definition = TRUE;
db6751f2 1646 else if (strcmp (optarg, "combreloc") == 0)
b34976b6 1647 link_info.combreloc = TRUE;
db6751f2 1648 else if (strcmp (optarg, "nocombreloc") == 0)
b34976b6 1649 link_info.combreloc = FALSE;
8bd621d8 1650 else if (strcmp (optarg, "nocopyreloc") == 0)
b34976b6 1651 link_info.nocopyreloc = TRUE;
e0ee487b 1652 /* What about the other Solaris -z options? FIXME. */
6c1439be 1653 break;
e0ee487b
L
1654EOF
1655fi
1656
1657if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
1658cat >>e${EMULATION_NAME}.c <<EOF
1659 $PARSE_AND_LIST_ARGS_CASES
1660EOF
1661fi
1662
e0ee487b
L
1663cat >>e${EMULATION_NAME}.c <<EOF
1664 }
1665
1666 return 1;
1667}
1668
41392f03
AM
1669EOF
1670fi
1671
4b209b22 1672if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
41392f03
AM
1673cat >>e${EMULATION_NAME}.c <<EOF
1674
4b209b22 1675static void gld${EMULATION_NAME}_list_options PARAMS ((FILE * file));
04925e1e 1676
e0ee487b 1677static void
4b209b22 1678gld${EMULATION_NAME}_list_options (file)
e0ee487b
L
1679 FILE * file;
1680{
1681EOF
e0ee487b
L
1682
1683if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
1684cat >>e${EMULATION_NAME}.c <<EOF
a1ab1d2a 1685 fprintf (file, _(" -Bgroup\t\tSelects group name lookup rules for DSO\n"));
6c1439be
L
1686 fprintf (file, _(" --disable-new-dtags\tDisable new dynamic tags\n"));
1687 fprintf (file, _(" --enable-new-dtags\tEnable new dynamic tags\n"));
65765700 1688 fprintf (file, _(" --eh-frame-hdr\tCreate .eh_frame_hdr section\n"));
ec38dd05 1689 fprintf (file, _(" -z combreloc\t\tMerge dynamic relocs into one section and sort\n"));
a1ab1d2a 1690 fprintf (file, _(" -z defs\t\tDisallows undefined symbols\n"));
f813923c
HPN
1691 fprintf (file, _(" -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
1692 fprintf (file, _(" -z interpose\t\tMark object to interpose all DSOs but executable\n"));
e0ee487b 1693 fprintf (file, _(" -z loadfltr\t\tMark object requiring immediate process\n"));
aa713662 1694 fprintf (file, _(" -z muldefs\t\tAllow multiple definitions\n"));
146e7110
AM
1695 fprintf (file, _(" -z nocombreloc\tDon't merge dynamic relocs into one section\n"));
1696 fprintf (file, _(" -z nocopyreloc\tDon't create copy relocs\n"));
e0ee487b
L
1697 fprintf (file, _(" -z nodefaultlib\tMark object not to use default search paths\n"));
1698 fprintf (file, _(" -z nodelete\t\tMark DSO non-deletable at runtime\n"));
f813923c
HPN
1699 fprintf (file, _(" -z nodlopen\t\tMark DSO not available to dlopen\n"));
1700 fprintf (file, _(" -z nodump\t\tMark DSO not available to dldump\n"));
e0ee487b 1701 fprintf (file, _(" -z now\t\tMark object non-lazy runtime binding\n"));
73e87d70 1702 fprintf (file, _(" -z origin\t\tMark object requiring immediate \$ORIGIN processing\n\t\t\t at runtime\n"));
19e3be22 1703 fprintf (file, _(" -z KEYWORD\t\tIgnored for Solaris compatibility\n"));
e0ee487b
L
1704EOF
1705fi
1706
1707if test -n "$PARSE_AND_LIST_OPTIONS" ; then
1708cat >>e${EMULATION_NAME}.c <<EOF
1709 $PARSE_AND_LIST_OPTIONS
1710EOF
1711fi
1712
e0ee487b
L
1713cat >>e${EMULATION_NAME}.c <<EOF
1714}
1715EOF
e0ee487b
L
1716
1717if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
1718cat >>e${EMULATION_NAME}.c <<EOF
1719 $PARSE_AND_LIST_EPILOGUE
1720EOF
1721fi
41392f03
AM
1722fi
1723else
4b209b22 1724if test x"$LDEMUL_PARSE_ARGS" != xgld"$EMULATION_NAME"_parse_args; then
41392f03 1725cat >>e${EMULATION_NAME}.c <<EOF
4b209b22 1726#define gld${EMULATION_NAME}_parse_args NULL
41392f03
AM
1727EOF
1728fi
4b209b22 1729if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
41392f03 1730cat >>e${EMULATION_NAME}.c <<EOF
4b209b22 1731#define gld${EMULATION_NAME}_list_options NULL
41392f03
AM
1732EOF
1733fi
1734fi
e0ee487b 1735
252b5132
RH
1736cat >>e${EMULATION_NAME}.c <<EOF
1737
60bcf0fa 1738struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
252b5132 1739{
41392f03
AM
1740 ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
1741 ${LDEMUL_SYSLIB-syslib_default},
1742 ${LDEMUL_HLL-hll_default},
1743 ${LDEMUL_AFTER_PARSE-after_parse_default},
1744 ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
1745 ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
1746 ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
1747 ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
1748 ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
1749 ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
252b5132
RH
1750 "${EMULATION_NAME}",
1751 "${OUTPUT_FORMAT}",
c56feb2b 1752 ${LDEMUL_FINISH-gld${EMULATION_NAME}_finish},
41392f03
AM
1753 ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
1754 ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
1755 ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
1756 ${LDEMUL_SET_SYMBOLS-NULL},
4b209b22 1757 ${LDEMUL_PARSE_ARGS-gld${EMULATION_NAME}_parse_args},
41392f03 1758 ${LDEMUL_UNRECOGNIZED_FILE-NULL},
4b209b22 1759 ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
41392f03
AM
1760 ${LDEMUL_RECOGNIZED_FILE-NULL},
1761 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
fac1652d 1762 ${LDEMUL_NEW_VERS_PATTERN-NULL}
252b5132
RH
1763};
1764EOF
This page took 0.245017 seconds and 4 git commands to generate.