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