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