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