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