Update copyright years
[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 fragment <<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 (C) 1991-2014 Free Software Foundation, Inc.
16 Written by Steve Chamberlain <sac@cygnus.com>
17 ELF support by Ian Lance Taylor <ian@cygnus.com>
18
19 This file is part of the GNU Binutils.
20
21 This program is free software; you can redistribute it and/or modify
22 it under the terms of the GNU General Public License as published by
23 the Free Software Foundation; either version 3 of the License, or
24 (at your option) any later version.
25
26 This program is distributed in the hope that it will be useful,
27 but WITHOUT ANY WARRANTY; without even the implied warranty of
28 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29 GNU General Public License for more details.
30
31 You should have received a copy of the GNU General Public License
32 along with this program; if not, write to the Free Software
33 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
34 MA 02110-1301, USA. */
35
36 #define TARGET_IS_${EMULATION_NAME}
37
38 #include "sysdep.h"
39 #include "bfd.h"
40 #include "libiberty.h"
41 #include "filenames.h"
42 #include "safe-ctype.h"
43 #include "getopt.h"
44 #include "md5.h"
45 #include "sha1.h"
46 #include <fcntl.h>
47
48 #include "bfdlink.h"
49
50 #include "ld.h"
51 #include "ldmain.h"
52 #include "ldmisc.h"
53 #include "ldexp.h"
54 #include "ldlang.h"
55 #include "ldfile.h"
56 #include "ldemul.h"
57 #include <ldgram.h>
58 #include "elf/common.h"
59 #include "elf-bfd.h"
60 #include "filenames.h"
61
62 /* Declare functions used by various EXTRA_EM_FILEs. */
63 static void gld${EMULATION_NAME}_before_parse (void);
64 static void gld${EMULATION_NAME}_after_open (void);
65 static void gld${EMULATION_NAME}_before_allocation (void);
66 static void gld${EMULATION_NAME}_after_allocation (void);
67 static lang_output_section_statement_type *gld${EMULATION_NAME}_place_orphan
68 (asection *, const char *, int);
69 EOF
70
71 if [ "x${USE_LIBPATH}" = xyes ] ; then
72 case ${target} in
73 *-*-linux-* | *-*-k*bsd*-* | *-*-gnu*)
74 fragment <<EOF
75 #ifdef HAVE_GLOB
76 #include <glob.h>
77 #endif
78 EOF
79 ;;
80 esac
81 fi
82
83 # Import any needed special functions and/or overrides.
84 #
85 source_em ${srcdir}/emultempl/elf-generic.em
86 if test -n "$EXTRA_EM_FILE" ; then
87 source_em ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
88 fi
89
90 # Functions in this file can be overridden by setting the LDEMUL_* shell
91 # variables. If the name of the overriding function is the same as is
92 # defined in this file, then don't output this file's version.
93 # If a different overriding name is given then output the standard function
94 # as presumably it is called from the overriding function.
95 #
96 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
97 fragment <<EOF
98
99 static void
100 gld${EMULATION_NAME}_before_parse (void)
101 {
102 ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
103 input_flags.dynamic = ${DYNAMIC_LINK-TRUE};
104 config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
105 config.separate_code = `if test "x${SEPARATE_CODE}" = xyes ; then echo TRUE ; else echo FALSE ; fi`;
106 }
107
108 EOF
109 fi
110
111 if test x"$LDEMUL_RECOGNIZED_FILE" != xgld"${EMULATION_NAME}"_load_symbols; then
112 fragment <<EOF
113 /* Handle the generation of DT_NEEDED tags. */
114
115 static bfd_boolean
116 gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *entry)
117 {
118 int link_class = 0;
119
120 /* Tell the ELF linker that we don't want the output file to have a
121 DT_NEEDED entry for this file, unless it is used to resolve
122 references in a regular object. */
123 if (entry->flags.add_DT_NEEDED_for_regular)
124 link_class = DYN_AS_NEEDED;
125
126 /* Tell the ELF linker that we don't want the output file to have a
127 DT_NEEDED entry for any dynamic library in DT_NEEDED tags from
128 this file at all. */
129 if (!entry->flags.add_DT_NEEDED_for_dynamic)
130 link_class |= DYN_NO_ADD_NEEDED;
131
132 if (entry->flags.just_syms
133 && (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) != 0)
134 einfo (_("%P%F: --just-symbols may not be used on DSO: %B\n"),
135 entry->the_bfd);
136
137 if (link_class == 0
138 || (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) == 0)
139 return FALSE;
140
141 bfd_elf_set_dyn_lib_class (entry->the_bfd,
142 (enum dynamic_lib_link_class) link_class);
143
144 /* Continue on with normal load_symbols processing. */
145 return FALSE;
146 }
147 EOF
148 fi
149
150 fragment <<EOF
151
152 /* These variables are required to pass information back and forth
153 between after_open and check_needed and stat_needed and vercheck. */
154
155 static struct bfd_link_needed_list *global_needed;
156 static struct stat global_stat;
157 static lang_input_statement_type *global_found;
158 static struct bfd_link_needed_list *global_vercheck_needed;
159 static bfd_boolean global_vercheck_failed;
160
161 /* These variables are used to implement target options */
162
163 static char *audit; /* colon (typically) separated list of libs */
164 static char *depaudit; /* colon (typically) separated list of libs */
165
166 /* Style of .note.gnu.build-id section. */
167 static const char *emit_note_gnu_build_id;
168
169 /* On Linux, it's possible to have different versions of the same
170 shared library linked against different versions of libc. The
171 dynamic linker somehow tags which libc version to use in
172 /etc/ld.so.cache, and, based on the libc that it sees in the
173 executable, chooses which version of the shared library to use.
174
175 We try to do a similar check here by checking whether this shared
176 library needs any other shared libraries which may conflict with
177 libraries we have already included in the link. If it does, we
178 skip it, and try to find another shared library farther on down the
179 link path.
180
181 This is called via lang_for_each_input_file.
182 GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
183 which we are checking. This sets GLOBAL_VERCHECK_FAILED if we find
184 a conflicting version. */
185
186 static void
187 gld${EMULATION_NAME}_vercheck (lang_input_statement_type *s)
188 {
189 const char *soname;
190 struct bfd_link_needed_list *l;
191
192 if (global_vercheck_failed)
193 return;
194 if (s->the_bfd == NULL
195 || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
196 return;
197
198 soname = bfd_elf_get_dt_soname (s->the_bfd);
199 if (soname == NULL)
200 soname = lbasename (bfd_get_filename (s->the_bfd));
201
202 for (l = global_vercheck_needed; l != NULL; l = l->next)
203 {
204 const char *suffix;
205
206 if (filename_cmp (soname, l->name) == 0)
207 {
208 /* Probably can't happen, but it's an easy check. */
209 continue;
210 }
211
212 if (strchr (l->name, '/') != NULL)
213 continue;
214
215 suffix = strstr (l->name, ".so.");
216 if (suffix == NULL)
217 continue;
218
219 suffix += sizeof ".so." - 1;
220
221 if (filename_ncmp (soname, l->name, suffix - l->name) == 0)
222 {
223 /* Here we know that S is a dynamic object FOO.SO.VER1, and
224 the object we are considering needs a dynamic object
225 FOO.SO.VER2, and VER1 and VER2 are different. This
226 appears to be a version mismatch, so we tell the caller
227 to try a different version of this library. */
228 global_vercheck_failed = TRUE;
229 return;
230 }
231 }
232 }
233
234
235 /* See if an input file matches a DT_NEEDED entry by running stat on
236 the file. */
237
238 static void
239 gld${EMULATION_NAME}_stat_needed (lang_input_statement_type *s)
240 {
241 struct stat st;
242 const char *suffix;
243 const char *soname;
244
245 if (global_found != NULL)
246 return;
247 if (s->the_bfd == NULL)
248 return;
249
250 /* If this input file was an as-needed entry, and wasn't found to be
251 needed at the stage it was linked, then don't say we have loaded it. */
252 if ((bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0)
253 return;
254
255 if (bfd_stat (s->the_bfd, &st) != 0)
256 {
257 einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
258 return;
259 }
260
261 /* Some operating systems, e.g. Windows, do not provide a meaningful
262 st_ino; they always set it to zero. (Windows does provide a
263 meaningful st_dev.) Do not indicate a duplicate library in that
264 case. While there is no guarantee that a system that provides
265 meaningful inode numbers will never set st_ino to zero, this is
266 merely an optimization, so we do not need to worry about false
267 negatives. */
268 if (st.st_dev == global_stat.st_dev
269 && st.st_ino == global_stat.st_ino
270 && st.st_ino != 0)
271 {
272 global_found = s;
273 return;
274 }
275
276 /* We issue a warning if it looks like we are including two
277 different versions of the same shared library. For example,
278 there may be a problem if -lc picks up libc.so.6 but some other
279 shared library has a DT_NEEDED entry of libc.so.5. This is a
280 heuristic test, and it will only work if the name looks like
281 NAME.so.VERSION. FIXME: Depending on file names is error-prone.
282 If we really want to issue warnings about mixing version numbers
283 of shared libraries, we need to find a better way. */
284
285 if (strchr (global_needed->name, '/') != NULL)
286 return;
287 suffix = strstr (global_needed->name, ".so.");
288 if (suffix == NULL)
289 return;
290 suffix += sizeof ".so." - 1;
291
292 soname = bfd_elf_get_dt_soname (s->the_bfd);
293 if (soname == NULL)
294 soname = lbasename (s->filename);
295
296 if (filename_ncmp (soname, global_needed->name, suffix - global_needed->name) == 0)
297 einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
298 global_needed->name, global_needed->by, soname);
299 }
300
301 struct dt_needed
302 {
303 bfd *by;
304 const char *name;
305 };
306
307 /* This function is called for each possible name for a dynamic object
308 named by a DT_NEEDED entry. The FORCE parameter indicates whether
309 to skip the check for a conflicting version. */
310
311 static bfd_boolean
312 gld${EMULATION_NAME}_try_needed (struct dt_needed *needed,
313 int force)
314 {
315 bfd *abfd;
316 const char *name = needed->name;
317 const char *soname;
318 int link_class;
319
320 abfd = bfd_openr (name, bfd_get_target (link_info.output_bfd));
321 if (abfd == NULL)
322 return FALSE;
323
324 /* Linker needs to decompress sections. */
325 abfd->flags |= BFD_DECOMPRESS;
326
327 if (! bfd_check_format (abfd, bfd_object))
328 {
329 bfd_close (abfd);
330 return FALSE;
331 }
332 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
333 {
334 bfd_close (abfd);
335 return FALSE;
336 }
337
338 /* For DT_NEEDED, they have to match. */
339 if (abfd->xvec != link_info.output_bfd->xvec)
340 {
341 bfd_close (abfd);
342 return FALSE;
343 }
344
345 /* Check whether this object would include any conflicting library
346 versions. If FORCE is set, then we skip this check; we use this
347 the second time around, if we couldn't find any compatible
348 instance of the shared library. */
349
350 if (! force)
351 {
352 struct bfd_link_needed_list *needs;
353
354 if (! bfd_elf_get_bfd_needed_list (abfd, &needs))
355 einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
356
357 if (needs != NULL)
358 {
359 global_vercheck_needed = needs;
360 global_vercheck_failed = FALSE;
361 lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
362 if (global_vercheck_failed)
363 {
364 bfd_close (abfd);
365 /* Return FALSE to force the caller to move on to try
366 another file on the search path. */
367 return FALSE;
368 }
369
370 /* But wait! It gets much worse. On Linux, if a shared
371 library does not use libc at all, we are supposed to skip
372 it the first time around in case we encounter a shared
373 library later on with the same name which does use the
374 version of libc that we want. This is much too horrible
375 to use on any system other than Linux. */
376
377 EOF
378 case ${target} in
379 *-*-linux-* | *-*-k*bsd*-* | *-*-gnu*)
380 fragment <<EOF
381 {
382 struct bfd_link_needed_list *l;
383
384 for (l = needs; l != NULL; l = l->next)
385 if (CONST_STRNEQ (l->name, "libc.so"))
386 break;
387 if (l == NULL)
388 {
389 bfd_close (abfd);
390 return FALSE;
391 }
392 }
393
394 EOF
395 ;;
396 esac
397 fragment <<EOF
398 }
399 }
400
401 /* We've found a dynamic object matching the DT_NEEDED entry. */
402
403 /* We have already checked that there is no other input file of the
404 same name. We must now check again that we are not including the
405 same file twice. We need to do this because on many systems
406 libc.so is a symlink to, e.g., libc.so.1. The SONAME entry will
407 reference libc.so.1. If we have already included libc.so, we
408 don't want to include libc.so.1 if they are the same file, and we
409 can only check that using stat. */
410
411 if (bfd_stat (abfd, &global_stat) != 0)
412 einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
413
414 /* First strip off everything before the last '/'. */
415 soname = lbasename (abfd->filename);
416
417 if (verbose)
418 info_msg (_("found %s at %s\n"), soname, name);
419
420 global_found = NULL;
421 lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
422 if (global_found != NULL)
423 {
424 /* Return TRUE to indicate that we found the file, even though
425 we aren't going to do anything with it. */
426 return TRUE;
427 }
428
429 /* Specify the soname to use. */
430 bfd_elf_set_dt_needed_name (abfd, soname);
431
432 /* Tell the ELF linker that we don't want the output file to have a
433 DT_NEEDED entry for this file, unless it is used to resolve
434 references in a regular object. */
435 link_class = DYN_DT_NEEDED;
436
437 /* Tell the ELF linker that we don't want the output file to have a
438 DT_NEEDED entry for this file at all if the entry is from a file
439 with DYN_NO_ADD_NEEDED. */
440 if (needed->by != NULL
441 && (bfd_elf_get_dyn_lib_class (needed->by) & DYN_NO_ADD_NEEDED) != 0)
442 link_class |= DYN_NO_NEEDED | DYN_NO_ADD_NEEDED;
443
444 bfd_elf_set_dyn_lib_class (abfd, (enum dynamic_lib_link_class) link_class);
445
446 /* Add this file into the symbol table. */
447 if (! bfd_link_add_symbols (abfd, &link_info))
448 einfo ("%F%B: error adding symbols: %E\n", abfd);
449
450 return TRUE;
451 }
452
453
454 /* Search for a needed file in a path. */
455
456 static bfd_boolean
457 gld${EMULATION_NAME}_search_needed (const char *path,
458 struct dt_needed *n, int force)
459 {
460 const char *s;
461 const char *name = n->name;
462 size_t len;
463 struct dt_needed needed;
464
465 if (name[0] == '/')
466 return gld${EMULATION_NAME}_try_needed (n, force);
467
468 if (path == NULL || *path == '\0')
469 return FALSE;
470
471 needed.by = n->by;
472 needed.name = n->name;
473
474 len = strlen (name);
475 while (1)
476 {
477 char *filename, *sset;
478
479 s = strchr (path, config.rpath_separator);
480 if (s == NULL)
481 s = path + strlen (path);
482
483 #if HAVE_DOS_BASED_FILE_SYSTEM
484 /* Assume a match on the second char is part of drive specifier. */
485 else if (config.rpath_separator == ':'
486 && s == path + 1
487 && ISALPHA (*path))
488 {
489 s = strchr (s + 1, config.rpath_separator);
490 if (s == NULL)
491 s = path + strlen (path);
492 }
493 #endif
494 filename = (char *) xmalloc (s - path + len + 2);
495 if (s == path)
496 sset = filename;
497 else
498 {
499 memcpy (filename, path, s - path);
500 filename[s - path] = '/';
501 sset = filename + (s - path) + 1;
502 }
503 strcpy (sset, name);
504
505 needed.name = filename;
506 if (gld${EMULATION_NAME}_try_needed (&needed, force))
507 return TRUE;
508
509 free (filename);
510
511 if (*s == '\0')
512 break;
513 path = s + 1;
514 }
515
516 return FALSE;
517 }
518
519 EOF
520 if [ "x${USE_LIBPATH}" = xyes ] ; then
521 fragment <<EOF
522
523 /* Add the sysroot to every entry in a path separated by
524 config.rpath_separator. */
525
526 static char *
527 gld${EMULATION_NAME}_add_sysroot (const char *path)
528 {
529 int len, colons, i;
530 char *ret, *p;
531
532 len = strlen (path);
533 colons = 0;
534 i = 0;
535 while (path[i])
536 if (path[i++] == config.rpath_separator)
537 colons++;
538
539 if (path[i])
540 colons++;
541
542 len = len + (colons + 1) * strlen (ld_sysroot);
543 ret = xmalloc (len + 1);
544 strcpy (ret, ld_sysroot);
545 p = ret + strlen (ret);
546 i = 0;
547 while (path[i])
548 if (path[i] == config.rpath_separator)
549 {
550 *p++ = path[i++];
551 strcpy (p, ld_sysroot);
552 p = p + strlen (p);
553 }
554 else
555 *p++ = path[i++];
556
557 *p = 0;
558 return ret;
559 }
560
561 EOF
562 case ${target} in
563 *-*-freebsd* | *-*-dragonfly*)
564 fragment <<EOF
565 /* Read the system search path the FreeBSD way rather than the Linux way. */
566 #ifdef HAVE_ELF_HINTS_H
567 #include <elf-hints.h>
568 #else
569 #include "elf-hints-local.h"
570 #endif
571
572 static bfd_boolean
573 gld${EMULATION_NAME}_check_ld_elf_hints (const struct bfd_link_needed_list *l,
574 int force)
575 {
576 static bfd_boolean initialized;
577 static char *ld_elf_hints;
578 struct dt_needed needed;
579
580 if (!initialized)
581 {
582 FILE *f;
583 char *tmppath;
584
585 tmppath = concat (ld_sysroot, _PATH_ELF_HINTS, (const char *) NULL);
586 f = fopen (tmppath, FOPEN_RB);
587 free (tmppath);
588 if (f != NULL)
589 {
590 struct elfhints_hdr hdr;
591
592 if (fread (&hdr, 1, sizeof (hdr), f) == sizeof (hdr)
593 && hdr.magic == ELFHINTS_MAGIC
594 && hdr.version == 1)
595 {
596 if (fseek (f, hdr.strtab + hdr.dirlist, SEEK_SET) != -1)
597 {
598 char *b;
599
600 b = xmalloc (hdr.dirlistlen + 1);
601 if (fread (b, 1, hdr.dirlistlen + 1, f) ==
602 hdr.dirlistlen + 1)
603 ld_elf_hints = gld${EMULATION_NAME}_add_sysroot (b);
604
605 free (b);
606 }
607 }
608 fclose (f);
609 }
610
611 initialized = TRUE;
612 }
613
614 if (ld_elf_hints == NULL)
615 return FALSE;
616
617 needed.by = l->by;
618 needed.name = l->name;
619 return gld${EMULATION_NAME}_search_needed (ld_elf_hints, &needed, force);
620 }
621 EOF
622 # FreeBSD
623 ;;
624
625 *-*-linux-* | *-*-k*bsd*-* | *-*-gnu*)
626 fragment <<EOF
627 /* For a native linker, check the file /etc/ld.so.conf for directories
628 in which we may find shared libraries. /etc/ld.so.conf is really
629 only meaningful on Linux. */
630
631 struct gld${EMULATION_NAME}_ld_so_conf
632 {
633 char *path;
634 size_t len, alloc;
635 };
636
637 static bfd_boolean
638 gld${EMULATION_NAME}_parse_ld_so_conf
639 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename);
640
641 static void
642 gld${EMULATION_NAME}_parse_ld_so_conf_include
643 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename,
644 const char *pattern)
645 {
646 char *newp = NULL;
647 #ifdef HAVE_GLOB
648 glob_t gl;
649 #endif
650
651 if (pattern[0] != '/')
652 {
653 char *p = strrchr (filename, '/');
654 size_t patlen = strlen (pattern) + 1;
655
656 newp = xmalloc (p - filename + 1 + patlen);
657 memcpy (newp, filename, p - filename + 1);
658 memcpy (newp + (p - filename + 1), pattern, patlen);
659 pattern = newp;
660 }
661
662 #ifdef HAVE_GLOB
663 if (glob (pattern, 0, NULL, &gl) == 0)
664 {
665 size_t i;
666
667 for (i = 0; i < gl.gl_pathc; ++i)
668 gld${EMULATION_NAME}_parse_ld_so_conf (info, gl.gl_pathv[i]);
669 globfree (&gl);
670 }
671 #else
672 /* If we do not have glob, treat the pattern as a literal filename. */
673 gld${EMULATION_NAME}_parse_ld_so_conf (info, pattern);
674 #endif
675
676 if (newp)
677 free (newp);
678 }
679
680 static bfd_boolean
681 gld${EMULATION_NAME}_parse_ld_so_conf
682 (struct gld${EMULATION_NAME}_ld_so_conf *info, const char *filename)
683 {
684 FILE *f = fopen (filename, FOPEN_RT);
685 char *line;
686 size_t linelen;
687
688 if (f == NULL)
689 return FALSE;
690
691 linelen = 256;
692 line = xmalloc (linelen);
693 do
694 {
695 char *p = line, *q;
696
697 /* Normally this would use getline(3), but we need to be portable. */
698 while ((q = fgets (p, linelen - (p - line), f)) != NULL
699 && strlen (q) == linelen - (p - line) - 1
700 && line[linelen - 2] != '\n')
701 {
702 line = xrealloc (line, 2 * linelen);
703 p = line + linelen - 1;
704 linelen += linelen;
705 }
706
707 if (q == NULL && p == line)
708 break;
709
710 p = strchr (line, '\n');
711 if (p)
712 *p = '\0';
713
714 /* Because the file format does not know any form of quoting we
715 can search forward for the next '#' character and if found
716 make it terminating the line. */
717 p = strchr (line, '#');
718 if (p)
719 *p = '\0';
720
721 /* Remove leading whitespace. NUL is no whitespace character. */
722 p = line;
723 while (*p == ' ' || *p == '\f' || *p == '\r' || *p == '\t' || *p == '\v')
724 ++p;
725
726 /* If the line is blank it is ignored. */
727 if (p[0] == '\0')
728 continue;
729
730 if (CONST_STRNEQ (p, "include") && (p[7] == ' ' || p[7] == '\t'))
731 {
732 char *dir, c;
733 p += 8;
734 do
735 {
736 while (*p == ' ' || *p == '\t')
737 ++p;
738
739 if (*p == '\0')
740 break;
741
742 dir = p;
743
744 while (*p != ' ' && *p != '\t' && *p)
745 ++p;
746
747 c = *p;
748 *p++ = '\0';
749 if (dir[0] != '\0')
750 gld${EMULATION_NAME}_parse_ld_so_conf_include (info, filename,
751 dir);
752 }
753 while (c != '\0');
754 }
755 else
756 {
757 char *dir = p;
758 while (*p && *p != '=' && *p != ' ' && *p != '\t' && *p != '\f'
759 && *p != '\r' && *p != '\v')
760 ++p;
761
762 while (p != dir && p[-1] == '/')
763 --p;
764 if (info->path == NULL)
765 {
766 info->alloc = p - dir + 1 + 256;
767 info->path = xmalloc (info->alloc);
768 info->len = 0;
769 }
770 else
771 {
772 if (info->len + 1 + (p - dir) >= info->alloc)
773 {
774 info->alloc += p - dir + 256;
775 info->path = xrealloc (info->path, info->alloc);
776 }
777 info->path[info->len++] = config.rpath_separator;
778 }
779 memcpy (info->path + info->len, dir, p - dir);
780 info->len += p - dir;
781 info->path[info->len] = '\0';
782 }
783 }
784 while (! feof (f));
785 free (line);
786 fclose (f);
787 return TRUE;
788 }
789
790 static bfd_boolean
791 gld${EMULATION_NAME}_check_ld_so_conf (const struct bfd_link_needed_list *l,
792 int force)
793 {
794 static bfd_boolean initialized;
795 static char *ld_so_conf;
796 struct dt_needed needed;
797
798 if (! initialized)
799 {
800 char *tmppath;
801 struct gld${EMULATION_NAME}_ld_so_conf info;
802
803 info.path = NULL;
804 info.len = info.alloc = 0;
805 tmppath = concat (ld_sysroot, "${prefix}/etc/ld.so.conf",
806 (const char *) NULL);
807 if (!gld${EMULATION_NAME}_parse_ld_so_conf (&info, tmppath))
808 {
809 free (tmppath);
810 tmppath = concat (ld_sysroot, "/etc/ld.so.conf",
811 (const char *) NULL);
812 gld${EMULATION_NAME}_parse_ld_so_conf (&info, tmppath);
813 }
814 free (tmppath);
815
816 if (info.path)
817 {
818 char *d = gld${EMULATION_NAME}_add_sysroot (info.path);
819 free (info.path);
820 ld_so_conf = d;
821 }
822 initialized = TRUE;
823 }
824
825 if (ld_so_conf == NULL)
826 return FALSE;
827
828
829 needed.by = l->by;
830 needed.name = l->name;
831 return gld${EMULATION_NAME}_search_needed (ld_so_conf, &needed, force);
832 }
833
834 EOF
835 # Linux
836 ;;
837 esac
838 fi
839 fragment <<EOF
840
841 /* See if an input file matches a DT_NEEDED entry by name. */
842
843 static void
844 gld${EMULATION_NAME}_check_needed (lang_input_statement_type *s)
845 {
846 const char *soname;
847
848 /* Stop looking if we've found a loaded lib. */
849 if (global_found != NULL
850 && (bfd_elf_get_dyn_lib_class (global_found->the_bfd)
851 & DYN_AS_NEEDED) == 0)
852 return;
853
854 if (s->filename == NULL || s->the_bfd == NULL)
855 return;
856
857 /* Don't look for a second non-loaded as-needed lib. */
858 if (global_found != NULL
859 && (bfd_elf_get_dyn_lib_class (s->the_bfd) & DYN_AS_NEEDED) != 0)
860 return;
861
862 if (filename_cmp (s->filename, global_needed->name) == 0)
863 {
864 global_found = s;
865 return;
866 }
867
868 if (s->flags.search_dirs)
869 {
870 const char *f = strrchr (s->filename, '/');
871 if (f != NULL
872 && filename_cmp (f + 1, global_needed->name) == 0)
873 {
874 global_found = s;
875 return;
876 }
877 }
878
879 soname = bfd_elf_get_dt_soname (s->the_bfd);
880 if (soname != NULL
881 && filename_cmp (soname, global_needed->name) == 0)
882 {
883 global_found = s;
884 return;
885 }
886 }
887
888 EOF
889
890 if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then
891 fragment <<EOF
892
893 static bfd_size_type
894 id_note_section_size (bfd *abfd ATTRIBUTE_UNUSED)
895 {
896 const char *style = emit_note_gnu_build_id;
897 bfd_size_type size;
898
899 size = offsetof (Elf_External_Note, name[sizeof "GNU"]);
900 size = (size + 3) & -(bfd_size_type) 4;
901
902 if (!strcmp (style, "md5") || !strcmp (style, "uuid"))
903 size += 128 / 8;
904 else if (!strcmp (style, "sha1"))
905 size += 160 / 8;
906 else if (!strncmp (style, "0x", 2))
907 {
908 /* ID is in string form (hex). Convert to bits. */
909 const char *id = style + 2;
910 do
911 {
912 if (ISXDIGIT (id[0]) && ISXDIGIT (id[1]))
913 {
914 ++size;
915 id += 2;
916 }
917 else if (*id == '-' || *id == ':')
918 ++id;
919 else
920 {
921 size = 0;
922 break;
923 }
924 } while (*id != '\0');
925 }
926 else
927 size = 0;
928
929 return size;
930 }
931
932 static unsigned char
933 read_hex (const char xdigit)
934 {
935 if (ISDIGIT (xdigit))
936 return xdigit - '0';
937 if (ISUPPER (xdigit))
938 return xdigit - 'A' + 0xa;
939 if (ISLOWER (xdigit))
940 return xdigit - 'a' + 0xa;
941 abort ();
942 return 0;
943 }
944
945 static bfd_boolean
946 write_build_id (bfd *abfd)
947 {
948 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
949 struct elf_obj_tdata *t = elf_tdata (abfd);
950 const char *style;
951 asection *asec;
952 Elf_Internal_Shdr *i_shdr;
953 unsigned char *contents, *id_bits;
954 bfd_size_type size;
955 file_ptr position;
956 Elf_External_Note *e_note;
957 typedef void (*sum_fn) (const void *, size_t, void *);
958
959 style = t->o->build_id.style;
960 asec = t->o->build_id.sec;
961 if (bfd_is_abs_section (asec->output_section))
962 {
963 einfo (_("%P: warning: .note.gnu.build-id section discarded,"
964 " --build-id ignored.\n"));
965 return TRUE;
966 }
967 i_shdr = &elf_section_data (asec->output_section)->this_hdr;
968
969 if (i_shdr->contents == NULL)
970 {
971 if (asec->contents == NULL)
972 asec->contents = (unsigned char *) xmalloc (asec->size);
973 contents = asec->contents;
974 }
975 else
976 contents = i_shdr->contents + asec->output_offset;
977
978 e_note = (Elf_External_Note *) contents;
979 size = offsetof (Elf_External_Note, name[sizeof "GNU"]);
980 size = (size + 3) & -(bfd_size_type) 4;
981 id_bits = contents + size;
982 size = asec->size - size;
983
984 bfd_h_put_32 (abfd, sizeof "GNU", &e_note->namesz);
985 bfd_h_put_32 (abfd, size, &e_note->descsz);
986 bfd_h_put_32 (abfd, NT_GNU_BUILD_ID, &e_note->type);
987 memcpy (e_note->name, "GNU", sizeof "GNU");
988
989 if (strcmp (style, "md5") == 0)
990 {
991 struct md5_ctx ctx;
992
993 md5_init_ctx (&ctx);
994 if (!bed->s->checksum_contents (abfd, (sum_fn) &md5_process_bytes, &ctx))
995 return FALSE;
996 md5_finish_ctx (&ctx, id_bits);
997 }
998 else if (strcmp (style, "sha1") == 0)
999 {
1000 struct sha1_ctx ctx;
1001
1002 sha1_init_ctx (&ctx);
1003 if (!bed->s->checksum_contents (abfd, (sum_fn) &sha1_process_bytes, &ctx))
1004 return FALSE;
1005 sha1_finish_ctx (&ctx, id_bits);
1006 }
1007 else if (strcmp (style, "uuid") == 0)
1008 {
1009 int n;
1010 int fd = open ("/dev/urandom", O_RDONLY);
1011 if (fd < 0)
1012 return FALSE;
1013 n = read (fd, id_bits, size);
1014 close (fd);
1015 if (n < (int) size)
1016 return FALSE;
1017 }
1018 else if (strncmp (style, "0x", 2) == 0)
1019 {
1020 /* ID is in string form (hex). Convert to bits. */
1021 const char *id = style + 2;
1022 size_t n = 0;
1023 do
1024 {
1025 if (ISXDIGIT (id[0]) && ISXDIGIT (id[1]))
1026 {
1027 id_bits[n] = read_hex (*id++) << 4;
1028 id_bits[n++] |= read_hex (*id++);
1029 }
1030 else if (*id == '-' || *id == ':')
1031 ++id;
1032 else
1033 abort (); /* Should have been validated earlier. */
1034 } while (*id != '\0');
1035 }
1036 else
1037 abort (); /* Should have been validated earlier. */
1038
1039 position = i_shdr->sh_offset + asec->output_offset;
1040 size = asec->size;
1041 return (bfd_seek (abfd, position, SEEK_SET) == 0
1042 && bfd_bwrite (contents, size, abfd) == size);
1043 }
1044
1045 /* Make .note.gnu.build-id section, and set up elf_tdata->build_id. */
1046
1047 static bfd_boolean
1048 setup_build_id (bfd *ibfd)
1049 {
1050 asection *s;
1051 bfd_size_type size;
1052 flagword flags;
1053
1054 size = id_note_section_size (ibfd);
1055 if (size == 0)
1056 {
1057 einfo ("%P: warning: unrecognized --build-id style ignored.\n");
1058 return FALSE;
1059 }
1060
1061 flags = (SEC_ALLOC | SEC_LOAD | SEC_IN_MEMORY
1062 | SEC_LINKER_CREATED | SEC_READONLY | SEC_DATA);
1063 s = bfd_make_section_with_flags (ibfd, ".note.gnu.build-id", flags);
1064 if (s != NULL && bfd_set_section_alignment (ibfd, s, 2))
1065 {
1066 struct elf_obj_tdata *t = elf_tdata (link_info.output_bfd);
1067 t->o->build_id.after_write_object_contents = &write_build_id;
1068 t->o->build_id.style = emit_note_gnu_build_id;
1069 t->o->build_id.sec = s;
1070 elf_section_type (s) = SHT_NOTE;
1071 s->size = size;
1072 return TRUE;
1073 }
1074
1075 einfo ("%P: warning: Cannot create .note.gnu.build-id section,"
1076 " --build-id ignored.\n");
1077 return FALSE;
1078 }
1079
1080 /* This is called after all the input files have been opened. */
1081
1082 static void
1083 gld${EMULATION_NAME}_after_open (void)
1084 {
1085 struct bfd_link_needed_list *needed, *l;
1086 struct elf_link_hash_table *htab;
1087
1088 after_open_default ();
1089
1090 htab = elf_hash_table (&link_info);
1091 if (!is_elf_hash_table (htab))
1092 return;
1093
1094 if (emit_note_gnu_build_id != NULL)
1095 {
1096 bfd *abfd;
1097
1098 /* Find an ELF input. */
1099 for (abfd = link_info.input_bfds;
1100 abfd != (bfd *) NULL; abfd = abfd->link_next)
1101 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1102 break;
1103
1104 /* PR 10555: If there are no ELF input files do not try to
1105 create a .note.gnu-build-id section. */
1106 if (abfd == NULL
1107 || !setup_build_id (abfd))
1108 {
1109 free ((char *) emit_note_gnu_build_id);
1110 emit_note_gnu_build_id = NULL;
1111 }
1112 }
1113
1114 if (link_info.relocatable)
1115 return;
1116
1117 if (link_info.eh_frame_hdr
1118 && !link_info.traditional_format)
1119 {
1120 bfd *abfd, *elfbfd = NULL;
1121 bfd_boolean warn_eh_frame = FALSE;
1122 asection *s;
1123
1124 for (abfd = link_info.input_bfds; abfd; abfd = abfd->link_next)
1125 {
1126 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1127 elfbfd = abfd;
1128 if (!warn_eh_frame)
1129 {
1130 s = bfd_get_section_by_name (abfd, ".eh_frame");
1131 while (s != NULL
1132 && (s->size <= 8
1133 || bfd_is_abs_section (s->output_section)))
1134 s = bfd_get_next_section_by_name (s);
1135 warn_eh_frame = s != NULL;
1136 }
1137 if (elfbfd && warn_eh_frame)
1138 break;
1139 }
1140 if (elfbfd)
1141 {
1142 const struct elf_backend_data *bed;
1143
1144 bed = get_elf_backend_data (elfbfd);
1145 s = bfd_make_section_with_flags (elfbfd, ".eh_frame_hdr",
1146 bed->dynamic_sec_flags
1147 | SEC_READONLY);
1148 if (s != NULL
1149 && bfd_set_section_alignment (elfbfd, s, 2))
1150 {
1151 htab->eh_info.hdr_sec = s;
1152 warn_eh_frame = FALSE;
1153 }
1154 }
1155 if (warn_eh_frame)
1156 einfo ("%P: warning: Cannot create .eh_frame_hdr section,"
1157 " --eh-frame-hdr ignored.\n");
1158 }
1159
1160 /* Get the list of files which appear in DT_NEEDED entries in
1161 dynamic objects included in the link (often there will be none).
1162 For each such file, we want to track down the corresponding
1163 library, and include the symbol table in the link. This is what
1164 the runtime dynamic linker will do. Tracking the files down here
1165 permits one dynamic object to include another without requiring
1166 special action by the person doing the link. Note that the
1167 needed list can actually grow while we are stepping through this
1168 loop. */
1169 needed = bfd_elf_get_needed_list (link_info.output_bfd, &link_info);
1170 for (l = needed; l != NULL; l = l->next)
1171 {
1172 struct bfd_link_needed_list *ll;
1173 struct dt_needed n, nn;
1174 int force;
1175
1176 /* If the lib that needs this one was --as-needed and wasn't
1177 found to be needed, then this lib isn't needed either. */
1178 if (l->by != NULL
1179 && (bfd_elf_get_dyn_lib_class (l->by) & DYN_AS_NEEDED) != 0)
1180 continue;
1181
1182 /* Skip the lib if --no-copy-dt-needed-entries and
1183 --allow-shlib-undefined is in effect. */
1184 if (l->by != NULL
1185 && link_info.unresolved_syms_in_shared_libs == RM_IGNORE
1186 && (bfd_elf_get_dyn_lib_class (l->by) & DYN_NO_ADD_NEEDED) != 0)
1187 continue;
1188
1189 /* If we've already seen this file, skip it. */
1190 for (ll = needed; ll != l; ll = ll->next)
1191 if ((ll->by == NULL
1192 || (bfd_elf_get_dyn_lib_class (ll->by) & DYN_AS_NEEDED) == 0)
1193 && strcmp (ll->name, l->name) == 0)
1194 break;
1195 if (ll != l)
1196 continue;
1197
1198 /* See if this file was included in the link explicitly. */
1199 global_needed = l;
1200 global_found = NULL;
1201 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
1202 if (global_found != NULL
1203 && (bfd_elf_get_dyn_lib_class (global_found->the_bfd)
1204 & DYN_AS_NEEDED) == 0)
1205 continue;
1206
1207 n.by = l->by;
1208 n.name = l->name;
1209 nn.by = l->by;
1210 if (verbose)
1211 info_msg (_("%s needed by %B\n"), l->name, l->by);
1212
1213 /* As-needed libs specified on the command line (or linker script)
1214 take priority over libs found in search dirs. */
1215 if (global_found != NULL)
1216 {
1217 nn.name = global_found->filename;
1218 if (gld${EMULATION_NAME}_try_needed (&nn, TRUE))
1219 continue;
1220 }
1221
1222 /* We need to find this file and include the symbol table. We
1223 want to search for the file in the same way that the dynamic
1224 linker will search. That means that we want to use
1225 rpath_link, rpath, then the environment variable
1226 LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
1227 entries (native only), then the linker script LIB_SEARCH_DIRS.
1228 We do not search using the -L arguments.
1229
1230 We search twice. The first time, we skip objects which may
1231 introduce version mismatches. The second time, we force
1232 their use. See gld${EMULATION_NAME}_vercheck comment. */
1233 for (force = 0; force < 2; force++)
1234 {
1235 size_t len;
1236 search_dirs_type *search;
1237 EOF
1238 if [ "x${NATIVE}" = xyes ] ; then
1239 fragment <<EOF
1240 const char *lib_path;
1241 EOF
1242 fi
1243 if [ "x${USE_LIBPATH}" = xyes ] ; then
1244 fragment <<EOF
1245 struct bfd_link_needed_list *rp;
1246 int found;
1247 EOF
1248 fi
1249 fragment <<EOF
1250
1251 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
1252 &n, force))
1253 break;
1254 EOF
1255 if [ "x${USE_LIBPATH}" = xyes ] ; then
1256 fragment <<EOF
1257 if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
1258 &n, force))
1259 break;
1260 EOF
1261 fi
1262 if [ "x${NATIVE}" = xyes ] ; then
1263 fragment <<EOF
1264 if (command_line.rpath_link == NULL
1265 && command_line.rpath == NULL)
1266 {
1267 lib_path = (const char *) getenv ("LD_RUN_PATH");
1268 if (gld${EMULATION_NAME}_search_needed (lib_path, &n,
1269 force))
1270 break;
1271 }
1272 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
1273 if (gld${EMULATION_NAME}_search_needed (lib_path, &n, force))
1274 break;
1275 EOF
1276 fi
1277 if [ "x${USE_LIBPATH}" = xyes ] ; then
1278 fragment <<EOF
1279 found = 0;
1280 rp = bfd_elf_get_runpath_list (link_info.output_bfd, &link_info);
1281 for (; !found && rp != NULL; rp = rp->next)
1282 {
1283 char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
1284 found = (rp->by == l->by
1285 && gld${EMULATION_NAME}_search_needed (tmpname,
1286 &n,
1287 force));
1288 free (tmpname);
1289 }
1290 if (found)
1291 break;
1292
1293 EOF
1294 fi
1295 if [ "x${USE_LIBPATH}" = xyes ] ; then
1296 case ${target} in
1297 *-*-freebsd* | *-*-dragonfly*)
1298 fragment <<EOF
1299 if (gld${EMULATION_NAME}_check_ld_elf_hints (l, force))
1300 break;
1301 EOF
1302 # FreeBSD
1303 ;;
1304
1305 *-*-linux-* | *-*-k*bsd*-* | *-*-gnu*)
1306 fragment <<EOF
1307 if (gld${EMULATION_NAME}_check_ld_so_conf (l, force))
1308 break;
1309
1310 EOF
1311 # Linux
1312 ;;
1313 esac
1314 fi
1315 fragment <<EOF
1316 len = strlen (l->name);
1317 for (search = search_head; search != NULL; search = search->next)
1318 {
1319 char *filename;
1320
1321 if (search->cmdline)
1322 continue;
1323 filename = (char *) xmalloc (strlen (search->name) + len + 2);
1324 sprintf (filename, "%s/%s", search->name, l->name);
1325 nn.name = filename;
1326 if (gld${EMULATION_NAME}_try_needed (&nn, force))
1327 break;
1328 free (filename);
1329 }
1330 if (search != NULL)
1331 break;
1332 EOF
1333 fragment <<EOF
1334 }
1335
1336 if (force < 2)
1337 continue;
1338
1339 einfo ("%P: warning: %s, needed by %B, not found (try using -rpath or -rpath-link)\n",
1340 l->name, l->by);
1341 }
1342 }
1343
1344 EOF
1345 fi
1346
1347 fragment <<EOF
1348
1349 /* Look through an expression for an assignment statement. */
1350
1351 static void
1352 gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp)
1353 {
1354 bfd_boolean provide = FALSE;
1355
1356 switch (exp->type.node_class)
1357 {
1358 case etree_provide:
1359 case etree_provided:
1360 provide = TRUE;
1361 /* Fall thru */
1362 case etree_assign:
1363 /* We call record_link_assignment even if the symbol is defined.
1364 This is because if it is defined by a dynamic object, we
1365 actually want to use the value defined by the linker script,
1366 not the value from the dynamic object (because we are setting
1367 symbols like etext). If the symbol is defined by a regular
1368 object, then, as it happens, calling record_link_assignment
1369 will do no harm. */
1370 if (strcmp (exp->assign.dst, ".") != 0)
1371 {
1372 if (!bfd_elf_record_link_assignment (link_info.output_bfd,
1373 &link_info,
1374 exp->assign.dst, provide,
1375 exp->assign.hidden))
1376 einfo ("%P%F: failed to record assignment to %s: %E\n",
1377 exp->assign.dst);
1378 }
1379 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
1380 break;
1381
1382 case etree_binary:
1383 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
1384 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
1385 break;
1386
1387 case etree_trinary:
1388 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
1389 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
1390 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
1391 break;
1392
1393 case etree_unary:
1394 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
1395 break;
1396
1397 default:
1398 break;
1399 }
1400 }
1401
1402
1403 /* This is called by the before_allocation routine via
1404 lang_for_each_statement. It locates any assignment statements, and
1405 tells the ELF backend about them, in case they are assignments to
1406 symbols which are referred to by dynamic objects. */
1407
1408 static void
1409 gld${EMULATION_NAME}_find_statement_assignment (lang_statement_union_type *s)
1410 {
1411 if (s->header.type == lang_assignment_statement_enum)
1412 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
1413 }
1414
1415 EOF
1416
1417 if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then
1418 if test x"${ELF_INTERPRETER_NAME+set}" = xset; then
1419 ELF_INTERPRETER_SET_DEFAULT="
1420 if (sinterp != NULL)
1421 {
1422 sinterp->contents = (unsigned char *) ${ELF_INTERPRETER_NAME};
1423 sinterp->size = strlen ((char *) sinterp->contents) + 1;
1424 }
1425
1426 "
1427 else
1428 ELF_INTERPRETER_SET_DEFAULT=
1429 fi
1430 fragment <<EOF
1431
1432 /* used by before_allocation and handle_option. */
1433 static void
1434 gld${EMULATION_NAME}_append_to_separated_string (char **to, char *op_arg)
1435 {
1436 if (*to == NULL)
1437 *to = xstrdup (op_arg);
1438 else
1439 {
1440 size_t to_len = strlen (*to);
1441 size_t op_arg_len = strlen (op_arg);
1442 char *buf;
1443 char *cp = *to;
1444
1445 /* First see whether OPTARG is already in the path. */
1446 do
1447 {
1448 if (strncmp (op_arg, cp, op_arg_len) == 0
1449 && (cp[op_arg_len] == 0
1450 || cp[op_arg_len] == config.rpath_separator))
1451 /* We found it. */
1452 break;
1453
1454 /* Not yet found. */
1455 cp = strchr (cp, config.rpath_separator);
1456 if (cp != NULL)
1457 ++cp;
1458 }
1459 while (cp != NULL);
1460
1461 if (cp == NULL)
1462 {
1463 buf = xmalloc (to_len + op_arg_len + 2);
1464 sprintf (buf, "%s%c%s", *to,
1465 config.rpath_separator, op_arg);
1466 free (*to);
1467 *to = buf;
1468 }
1469 }
1470 }
1471
1472 /* This is called after the sections have been attached to output
1473 sections, but before any sizes or addresses have been set. */
1474
1475 static void
1476 gld${EMULATION_NAME}_before_allocation (void)
1477 {
1478 const char *rpath;
1479 asection *sinterp;
1480 bfd *abfd;
1481 struct elf_link_hash_entry *ehdr_start = NULL;
1482 struct bfd_link_hash_entry ehdr_start_save = ehdr_start_save;
1483
1484 if (is_elf_hash_table (link_info.hash))
1485 {
1486 _bfd_elf_tls_setup (link_info.output_bfd, &link_info);
1487
1488 /* Make __ehdr_start hidden if it has been referenced, to
1489 prevent the symbol from being dynamic. */
1490 if (!link_info.relocatable)
1491 {
1492 struct elf_link_hash_entry *h
1493 = elf_link_hash_lookup (elf_hash_table (&link_info), "__ehdr_start",
1494 FALSE, FALSE, TRUE);
1495
1496 /* Only adjust the export class if the symbol was referenced
1497 and not defined, otherwise leave it alone. */
1498 if (h != NULL
1499 && (h->root.type == bfd_link_hash_new
1500 || h->root.type == bfd_link_hash_undefined
1501 || h->root.type == bfd_link_hash_undefweak
1502 || h->root.type == bfd_link_hash_common))
1503 {
1504 _bfd_elf_link_hash_hide_symbol (&link_info, h, TRUE);
1505 if (ELF_ST_VISIBILITY (h->other) != STV_INTERNAL)
1506 h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN;
1507 /* Don't leave the symbol undefined. Undefined hidden
1508 symbols typically won't have dynamic relocations, but
1509 we most likely will need dynamic relocations for
1510 __ehdr_start if we are building a PIE or shared
1511 library. */
1512 ehdr_start = h;
1513 ehdr_start_save = h->root;
1514 h->root.type = bfd_link_hash_defined;
1515 h->root.u.def.section = bfd_abs_section_ptr;
1516 h->root.u.def.value = 0;
1517 }
1518 }
1519
1520 /* If we are going to make any variable assignments, we need to
1521 let the ELF backend know about them in case the variables are
1522 referred to by dynamic objects. */
1523 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
1524 }
1525
1526 /* Let the ELF backend work out the sizes of any sections required
1527 by dynamic linking. */
1528 rpath = command_line.rpath;
1529 if (rpath == NULL)
1530 rpath = (const char *) getenv ("LD_RUN_PATH");
1531
1532 for (abfd = link_info.input_bfds; abfd; abfd = abfd->link_next)
1533 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1534 {
1535 const char *audit_libs = elf_dt_audit (abfd);
1536
1537 /* If the input bfd contains an audit entry, we need to add it as
1538 a dep audit entry. */
1539 if (audit_libs && *audit_libs != '\0')
1540 {
1541 char *cp = xstrdup (audit_libs);
1542 do
1543 {
1544 int more = 0;
1545 char *cp2 = strchr (cp, config.rpath_separator);
1546
1547 if (cp2)
1548 {
1549 *cp2 = '\0';
1550 more = 1;
1551 }
1552
1553 if (cp != NULL && *cp != '\0')
1554 gld${EMULATION_NAME}_append_to_separated_string (&depaudit, cp);
1555
1556 cp = more ? ++cp2 : NULL;
1557 }
1558 while (cp != NULL);
1559 }
1560 }
1561
1562 if (! (bfd_elf_size_dynamic_sections
1563 (link_info.output_bfd, command_line.soname, rpath,
1564 command_line.filter_shlib, audit, depaudit,
1565 (const char * const *) command_line.auxiliary_filters,
1566 &link_info, &sinterp)))
1567 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1568
1569 ${ELF_INTERPRETER_SET_DEFAULT}
1570 /* Let the user override the dynamic linker we are using. */
1571 if (command_line.interpreter != NULL
1572 && sinterp != NULL)
1573 {
1574 sinterp->contents = (bfd_byte *) command_line.interpreter;
1575 sinterp->size = strlen (command_line.interpreter) + 1;
1576 }
1577
1578 /* Look for any sections named .gnu.warning. As a GNU extensions,
1579 we treat such sections as containing warning messages. We print
1580 out the warning message, and then zero out the section size so
1581 that it does not get copied into the output file. */
1582
1583 {
1584 LANG_FOR_EACH_INPUT_STATEMENT (is)
1585 {
1586 asection *s;
1587 bfd_size_type sz;
1588 char *msg;
1589 bfd_boolean ret;
1590
1591 if (is->flags.just_syms)
1592 continue;
1593
1594 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
1595 if (s == NULL)
1596 continue;
1597
1598 sz = s->size;
1599 msg = (char *) xmalloc ((size_t) (sz + 1));
1600 if (! bfd_get_section_contents (is->the_bfd, s, msg,
1601 (file_ptr) 0, sz))
1602 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
1603 is->the_bfd);
1604 msg[sz] = '\0';
1605 ret = link_info.callbacks->warning (&link_info, msg,
1606 (const char *) NULL,
1607 is->the_bfd, (asection *) NULL,
1608 (bfd_vma) 0);
1609 ASSERT (ret);
1610 free (msg);
1611
1612 /* Clobber the section size, so that we don't waste space
1613 copying the warning into the output file. If we've already
1614 sized the output section, adjust its size. The adjustment
1615 is on rawsize because targets that size sections early will
1616 have called lang_reset_memory_regions after sizing. */
1617 if (s->output_section != NULL
1618 && s->output_section->rawsize >= s->size)
1619 s->output_section->rawsize -= s->size;
1620
1621 s->size = 0;
1622
1623 /* Also set SEC_EXCLUDE, so that local symbols defined in the
1624 warning section don't get copied to the output. */
1625 s->flags |= SEC_EXCLUDE | SEC_KEEP;
1626 }
1627 }
1628
1629 before_allocation_default ();
1630
1631 if (!bfd_elf_size_dynsym_hash_dynstr (link_info.output_bfd, &link_info))
1632 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1633
1634 if (ehdr_start != NULL)
1635 {
1636 /* If we twiddled __ehdr_start to defined earlier, put it back
1637 as it was. */
1638 ehdr_start->root.type = ehdr_start_save.type;
1639 ehdr_start->root.u = ehdr_start_save.u;
1640 }
1641 }
1642
1643 EOF
1644 fi
1645
1646 if test x"$LDEMUL_OPEN_DYNAMIC_ARCHIVE" != xgld"$EMULATION_NAME"_open_dynamic_archive; then
1647 fragment <<EOF
1648
1649 /* Try to open a dynamic archive. This is where we know that ELF
1650 dynamic libraries have an extension of .so (or .sl on oddball systems
1651 like hpux). */
1652
1653 static bfd_boolean
1654 gld${EMULATION_NAME}_open_dynamic_archive
1655 (const char *arch, search_dirs_type *search, lang_input_statement_type *entry)
1656 {
1657 const char *filename;
1658 char *string;
1659
1660 if (! entry->flags.maybe_archive)
1661 return FALSE;
1662
1663 filename = entry->filename;
1664
1665 /* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
1666 is defined, but it does not seem worth the headache to optimize
1667 away those two bytes of space. */
1668 string = (char *) xmalloc (strlen (search->name)
1669 + strlen (filename)
1670 + strlen (arch)
1671 #ifdef EXTRA_SHLIB_EXTENSION
1672 + strlen (EXTRA_SHLIB_EXTENSION)
1673 #endif
1674 + sizeof "/lib.so");
1675
1676 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
1677
1678 #ifdef EXTRA_SHLIB_EXTENSION
1679 /* Try the .so extension first. If that fails build a new filename
1680 using EXTRA_SHLIB_EXTENSION. */
1681 if (! ldfile_try_open_bfd (string, entry))
1682 {
1683 sprintf (string, "%s/lib%s%s%s", search->name,
1684 filename, arch, EXTRA_SHLIB_EXTENSION);
1685 #endif
1686
1687 if (! ldfile_try_open_bfd (string, entry))
1688 {
1689 free (string);
1690 return FALSE;
1691 }
1692 #ifdef EXTRA_SHLIB_EXTENSION
1693 }
1694 #endif
1695
1696 entry->filename = string;
1697
1698 /* We have found a dynamic object to include in the link. The ELF
1699 backend linker will create a DT_NEEDED entry in the .dynamic
1700 section naming this file. If this file includes a DT_SONAME
1701 entry, it will be used. Otherwise, the ELF linker will just use
1702 the name of the file. For an archive found by searching, like
1703 this one, the DT_NEEDED entry should consist of just the name of
1704 the file, without the path information used to find it. Note
1705 that we only need to do this if we have a dynamic object; an
1706 archive will never be referenced by a DT_NEEDED entry.
1707
1708 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
1709 very pretty. I haven't been able to think of anything that is
1710 pretty, though. */
1711 if (bfd_check_format (entry->the_bfd, bfd_object)
1712 && (entry->the_bfd->flags & DYNAMIC) != 0)
1713 {
1714 ASSERT (entry->flags.maybe_archive && entry->flags.search_dirs);
1715
1716 /* Rather than duplicating the logic above. Just use the
1717 filename we recorded earlier. */
1718
1719 filename = lbasename (entry->filename);
1720 bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
1721 }
1722
1723 return TRUE;
1724 }
1725
1726 EOF
1727 fi
1728
1729 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
1730 fragment <<EOF
1731
1732 /* A variant of lang_output_section_find used by place_orphan. */
1733
1734 static lang_output_section_statement_type *
1735 output_rel_find (asection *sec, int isdyn)
1736 {
1737 lang_output_section_statement_type *lookup;
1738 lang_output_section_statement_type *last = NULL;
1739 lang_output_section_statement_type *last_alloc = NULL;
1740 lang_output_section_statement_type *last_ro_alloc = NULL;
1741 lang_output_section_statement_type *last_rel = NULL;
1742 lang_output_section_statement_type *last_rel_alloc = NULL;
1743 int rela = sec->name[4] == 'a';
1744
1745 for (lookup = &lang_output_section_statement.head->output_section_statement;
1746 lookup != NULL;
1747 lookup = lookup->next)
1748 {
1749 if (lookup->constraint >= 0
1750 && CONST_STRNEQ (lookup->name, ".rel"))
1751 {
1752 int lookrela = lookup->name[4] == 'a';
1753
1754 /* .rel.dyn must come before all other reloc sections, to suit
1755 GNU ld.so. */
1756 if (isdyn)
1757 break;
1758
1759 /* Don't place after .rel.plt as doing so results in wrong
1760 dynamic tags. */
1761 if (strcmp (".plt", lookup->name + 4 + lookrela) == 0)
1762 break;
1763
1764 if (rela == lookrela || last_rel == NULL)
1765 last_rel = lookup;
1766 if ((rela == lookrela || last_rel_alloc == NULL)
1767 && lookup->bfd_section != NULL
1768 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1769 last_rel_alloc = lookup;
1770 }
1771
1772 last = lookup;
1773 if (lookup->bfd_section != NULL
1774 && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
1775 {
1776 last_alloc = lookup;
1777 if ((lookup->bfd_section->flags & SEC_READONLY) != 0)
1778 last_ro_alloc = lookup;
1779 }
1780 }
1781
1782 if (last_rel_alloc)
1783 return last_rel_alloc;
1784
1785 if (last_rel)
1786 return last_rel;
1787
1788 if (last_ro_alloc)
1789 return last_ro_alloc;
1790
1791 if (last_alloc)
1792 return last_alloc;
1793
1794 return last;
1795 }
1796
1797 /* Place an orphan section. We use this to put random SHF_ALLOC
1798 sections in the right segment. */
1799
1800 static lang_output_section_statement_type *
1801 gld${EMULATION_NAME}_place_orphan (asection *s,
1802 const char *secname,
1803 int constraint)
1804 {
1805 static struct orphan_save hold[] =
1806 {
1807 { ".text",
1808 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1809 0, 0, 0, 0 },
1810 { ".rodata",
1811 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1812 0, 0, 0, 0 },
1813 { ".tdata",
1814 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_THREAD_LOCAL,
1815 0, 0, 0, 0 },
1816 { ".data",
1817 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1818 0, 0, 0, 0 },
1819 { ".bss",
1820 SEC_ALLOC,
1821 0, 0, 0, 0 },
1822 { 0,
1823 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1824 0, 0, 0, 0 },
1825 { ".interp",
1826 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1827 0, 0, 0, 0 },
1828 { ".sdata",
1829 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_SMALL_DATA,
1830 0, 0, 0, 0 },
1831 { ".comment",
1832 SEC_HAS_CONTENTS,
1833 0, 0, 0, 0 },
1834 };
1835 enum orphan_save_index
1836 {
1837 orphan_text = 0,
1838 orphan_rodata,
1839 orphan_tdata,
1840 orphan_data,
1841 orphan_bss,
1842 orphan_rel,
1843 orphan_interp,
1844 orphan_sdata,
1845 orphan_nonalloc
1846 };
1847 static int orphan_init_done = 0;
1848 struct orphan_save *place;
1849 lang_output_section_statement_type *after;
1850 lang_output_section_statement_type *os;
1851 lang_output_section_statement_type *match_by_name = NULL;
1852 int isdyn = 0;
1853 int iself = s->owner->xvec->flavour == bfd_target_elf_flavour;
1854 unsigned int sh_type = iself ? elf_section_type (s) : SHT_NULL;
1855
1856 if (! link_info.relocatable
1857 && link_info.combreloc
1858 && (s->flags & SEC_ALLOC))
1859 {
1860 if (iself)
1861 switch (sh_type)
1862 {
1863 case SHT_RELA:
1864 secname = ".rela.dyn";
1865 isdyn = 1;
1866 break;
1867 case SHT_REL:
1868 secname = ".rel.dyn";
1869 isdyn = 1;
1870 break;
1871 default:
1872 break;
1873 }
1874 else if (CONST_STRNEQ (secname, ".rel"))
1875 {
1876 secname = secname[4] == 'a' ? ".rela.dyn" : ".rel.dyn";
1877 isdyn = 1;
1878 }
1879 }
1880
1881 /* Look through the script to see where to place this section. */
1882 if (constraint == 0)
1883 for (os = lang_output_section_find (secname);
1884 os != NULL;
1885 os = next_matching_output_section_statement (os, 0))
1886 {
1887 /* If we don't match an existing output section, tell
1888 lang_insert_orphan to create a new output section. */
1889 constraint = SPECIAL;
1890
1891 if (os->bfd_section != NULL
1892 && (os->bfd_section->flags == 0
1893 || (_bfd_elf_match_sections_by_type (link_info.output_bfd,
1894 os->bfd_section,
1895 s->owner, s)
1896 && ((s->flags ^ os->bfd_section->flags)
1897 & (SEC_LOAD | SEC_ALLOC)) == 0)))
1898 {
1899 /* We already have an output section statement with this
1900 name, and its bfd section has compatible flags.
1901 If the section already exists but does not have any flags
1902 set, then it has been created by the linker, probably as a
1903 result of a --section-start command line switch. */
1904 lang_add_section (&os->children, s, NULL, os);
1905 return os;
1906 }
1907
1908 /* Save unused output sections in case we can match them
1909 against orphans later. */
1910 if (os->bfd_section == NULL)
1911 match_by_name = os;
1912 }
1913
1914 /* If we didn't match an active output section, see if we matched an
1915 unused one and use that. */
1916 if (match_by_name)
1917 {
1918 lang_add_section (&match_by_name->children, s, NULL, match_by_name);
1919 return match_by_name;
1920 }
1921
1922 if (!orphan_init_done)
1923 {
1924 struct orphan_save *ho;
1925
1926 for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
1927 if (ho->name != NULL)
1928 {
1929 ho->os = lang_output_section_find (ho->name);
1930 if (ho->os != NULL && ho->os->flags == 0)
1931 ho->os->flags = ho->flags;
1932 }
1933 orphan_init_done = 1;
1934 }
1935
1936 /* If this is a final link, then always put .gnu.warning.SYMBOL
1937 sections into the .text section to get them out of the way. */
1938 if (link_info.executable
1939 && ! link_info.relocatable
1940 && CONST_STRNEQ (s->name, ".gnu.warning.")
1941 && hold[orphan_text].os != NULL)
1942 {
1943 os = hold[orphan_text].os;
1944 lang_add_section (&os->children, s, NULL, os);
1945 return os;
1946 }
1947
1948 /* Decide which segment the section should go in based on the
1949 section name and section flags. We put loadable .note sections
1950 right after the .interp section, so that the PT_NOTE segment is
1951 stored right after the program headers where the OS can read it
1952 in the first page. */
1953
1954 place = NULL;
1955 if ((s->flags & (SEC_ALLOC | SEC_DEBUGGING)) == 0)
1956 place = &hold[orphan_nonalloc];
1957 else if ((s->flags & SEC_ALLOC) == 0)
1958 ;
1959 else if ((s->flags & SEC_LOAD) != 0
1960 && ((iself && sh_type == SHT_NOTE)
1961 || (!iself && CONST_STRNEQ (secname, ".note"))))
1962 place = &hold[orphan_interp];
1963 else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS | SEC_THREAD_LOCAL)) == 0)
1964 place = &hold[orphan_bss];
1965 else if ((s->flags & SEC_SMALL_DATA) != 0)
1966 place = &hold[orphan_sdata];
1967 else if ((s->flags & SEC_THREAD_LOCAL) != 0)
1968 place = &hold[orphan_tdata];
1969 else if ((s->flags & SEC_READONLY) == 0)
1970 place = &hold[orphan_data];
1971 else if (((iself && (sh_type == SHT_RELA || sh_type == SHT_REL))
1972 || (!iself && CONST_STRNEQ (secname, ".rel")))
1973 && (s->flags & SEC_LOAD) != 0)
1974 place = &hold[orphan_rel];
1975 else if ((s->flags & SEC_CODE) == 0)
1976 place = &hold[orphan_rodata];
1977 else
1978 place = &hold[orphan_text];
1979
1980 after = NULL;
1981 if (place != NULL)
1982 {
1983 if (place->os == NULL)
1984 {
1985 if (place->name != NULL)
1986 place->os = lang_output_section_find (place->name);
1987 else
1988 place->os = output_rel_find (s, isdyn);
1989 }
1990 after = place->os;
1991 if (after == NULL)
1992 after = lang_output_section_find_by_flags
1993 (s, &place->os, _bfd_elf_match_sections_by_type);
1994 if (after == NULL)
1995 /* *ABS* is always the first output section statement. */
1996 after = &lang_output_section_statement.head->output_section_statement;
1997 }
1998
1999 return lang_insert_orphan (s, secname, constraint, after, place, NULL, NULL);
2000 }
2001 EOF
2002 fi
2003
2004 if test x"$LDEMUL_AFTER_ALLOCATION" != xgld"$EMULATION_NAME"_after_allocation; then
2005 fragment <<EOF
2006
2007 static void
2008 gld${EMULATION_NAME}_after_allocation (void)
2009 {
2010 bfd_boolean need_layout = bfd_elf_discard_info (link_info.output_bfd,
2011 &link_info);
2012 gld${EMULATION_NAME}_map_segments (need_layout);
2013 }
2014 EOF
2015 fi
2016
2017 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
2018 fragment <<EOF
2019
2020 static char *
2021 gld${EMULATION_NAME}_get_script (int *isfile)
2022 EOF
2023
2024 if test x"$COMPILE_IN" = xyes
2025 then
2026 # Scripts compiled in.
2027
2028 # sed commands to quote an ld script as a C string.
2029 sc="-f stringify.sed"
2030
2031 fragment <<EOF
2032 {
2033 *isfile = 0;
2034
2035 if (link_info.relocatable && config.build_constructors)
2036 return
2037 EOF
2038 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
2039 echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c
2040 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
2041 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
2042 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
2043 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else
2044 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
2045 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
2046 fi
2047 if test -n "$GENERATE_PIE_SCRIPT" ; then
2048 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2049 echo ' ; else if (link_info.pie && link_info.combreloc' >> e${EMULATION_NAME}.c
2050 echo ' && link_info.relro' >> e${EMULATION_NAME}.c
2051 echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
2052 sed $sc ldscripts/${EMULATION_NAME}.xdw >> e${EMULATION_NAME}.c
2053 echo ' ; else if (link_info.pie && link_info.combreloc) return' >> e${EMULATION_NAME}.c
2054 sed $sc ldscripts/${EMULATION_NAME}.xdc >> e${EMULATION_NAME}.c
2055 fi
2056 echo ' ; else if (link_info.pie) return' >> e${EMULATION_NAME}.c
2057 sed $sc ldscripts/${EMULATION_NAME}.xd >> e${EMULATION_NAME}.c
2058 fi
2059 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
2060 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2061 echo ' ; else if (link_info.shared && link_info.combreloc' >> e${EMULATION_NAME}.c
2062 echo ' && link_info.relro' >> e${EMULATION_NAME}.c
2063 echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
2064 sed $sc ldscripts/${EMULATION_NAME}.xsw >> e${EMULATION_NAME}.c
2065 echo ' ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c
2066 sed $sc ldscripts/${EMULATION_NAME}.xsc >> e${EMULATION_NAME}.c
2067 fi
2068 echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c
2069 sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
2070 fi
2071 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2072 echo ' ; else if (link_info.combreloc && link_info.relro' >> e${EMULATION_NAME}.c
2073 echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
2074 sed $sc ldscripts/${EMULATION_NAME}.xw >> e${EMULATION_NAME}.c
2075 echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c
2076 sed $sc ldscripts/${EMULATION_NAME}.xc >> e${EMULATION_NAME}.c
2077 fi
2078 echo ' ; else return' >> e${EMULATION_NAME}.c
2079 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
2080 echo '; }' >> e${EMULATION_NAME}.c
2081
2082 else
2083 # Scripts read from the filesystem.
2084
2085 fragment <<EOF
2086 {
2087 *isfile = 1;
2088
2089 if (link_info.relocatable && config.build_constructors)
2090 return "ldscripts/${EMULATION_NAME}.xu";
2091 else if (link_info.relocatable)
2092 return "ldscripts/${EMULATION_NAME}.xr";
2093 else if (!config.text_read_only)
2094 return "ldscripts/${EMULATION_NAME}.xbn";
2095 EOF
2096 if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then :
2097 else
2098 fragment <<EOF
2099 else if (!config.magic_demand_paged)
2100 return "ldscripts/${EMULATION_NAME}.xn";
2101 EOF
2102 fi
2103 if test -n "$GENERATE_PIE_SCRIPT" ; then
2104 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2105 fragment <<EOF
2106 else if (link_info.pie && link_info.combreloc
2107 && link_info.relro && (link_info.flags & DF_BIND_NOW))
2108 return "ldscripts/${EMULATION_NAME}.xdw";
2109 else if (link_info.pie && link_info.combreloc)
2110 return "ldscripts/${EMULATION_NAME}.xdc";
2111 EOF
2112 fi
2113 fragment <<EOF
2114 else if (link_info.pie)
2115 return "ldscripts/${EMULATION_NAME}.xd";
2116 EOF
2117 fi
2118 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
2119 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2120 fragment <<EOF
2121 else if (link_info.shared && link_info.combreloc
2122 && link_info.relro && (link_info.flags & DF_BIND_NOW))
2123 return "ldscripts/${EMULATION_NAME}.xsw";
2124 else if (link_info.shared && link_info.combreloc)
2125 return "ldscripts/${EMULATION_NAME}.xsc";
2126 EOF
2127 fi
2128 fragment <<EOF
2129 else if (link_info.shared)
2130 return "ldscripts/${EMULATION_NAME}.xs";
2131 EOF
2132 fi
2133 if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then
2134 fragment <<EOF
2135 else if (link_info.combreloc && link_info.relro
2136 && (link_info.flags & DF_BIND_NOW))
2137 return "ldscripts/${EMULATION_NAME}.xw";
2138 else if (link_info.combreloc)
2139 return "ldscripts/${EMULATION_NAME}.xc";
2140 EOF
2141 fi
2142 fragment <<EOF
2143 else
2144 return "ldscripts/${EMULATION_NAME}.x";
2145 }
2146
2147 EOF
2148 fi
2149 fi
2150
2151 if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
2152 fragment <<EOF
2153 $PARSE_AND_LIST_PROLOGUE
2154 EOF
2155 fi
2156
2157 fragment <<EOF
2158
2159 #define OPTION_DISABLE_NEW_DTAGS (400)
2160 #define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
2161 #define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
2162 #define OPTION_EH_FRAME_HDR (OPTION_GROUP + 1)
2163 #define OPTION_EXCLUDE_LIBS (OPTION_EH_FRAME_HDR + 1)
2164 #define OPTION_HASH_STYLE (OPTION_EXCLUDE_LIBS + 1)
2165 #define OPTION_BUILD_ID (OPTION_HASH_STYLE + 1)
2166 #define OPTION_AUDIT (OPTION_BUILD_ID + 1)
2167
2168 static void
2169 gld${EMULATION_NAME}_add_options
2170 (int ns, char **shortopts, int nl, struct option **longopts,
2171 int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
2172 {
2173 EOF
2174 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2175 fragment <<EOF
2176 static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:P:";
2177 EOF
2178 else
2179 fragment <<EOF
2180 static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:";
2181 EOF
2182 fi
2183 fragment <<EOF
2184 static const struct option xtra_long[] = {
2185 EOF
2186 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2187 fragment <<EOF
2188 {"audit", required_argument, NULL, OPTION_AUDIT},
2189 {"Bgroup", no_argument, NULL, OPTION_GROUP},
2190 EOF
2191 fi
2192 fragment <<EOF
2193 {"build-id", optional_argument, NULL, OPTION_BUILD_ID},
2194 EOF
2195 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2196 fragment <<EOF
2197 {"depaudit", required_argument, NULL, 'P'},
2198 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
2199 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
2200 {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
2201 {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
2202 {"hash-style", required_argument, NULL, OPTION_HASH_STYLE},
2203 EOF
2204 fi
2205 if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
2206 fragment <<EOF
2207 $PARSE_AND_LIST_LONGOPTS
2208 EOF
2209 fi
2210 fragment <<EOF
2211 {NULL, no_argument, NULL, 0}
2212 };
2213
2214 *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
2215 memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
2216 *longopts = (struct option *)
2217 xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
2218 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
2219 }
2220
2221 #define DEFAULT_BUILD_ID_STYLE "sha1"
2222
2223 static bfd_boolean
2224 gld${EMULATION_NAME}_handle_option (int optc)
2225 {
2226 switch (optc)
2227 {
2228 default:
2229 return FALSE;
2230
2231 case OPTION_BUILD_ID:
2232 if (emit_note_gnu_build_id != NULL)
2233 {
2234 free ((char *) emit_note_gnu_build_id);
2235 emit_note_gnu_build_id = NULL;
2236 }
2237 if (optarg == NULL)
2238 optarg = DEFAULT_BUILD_ID_STYLE;
2239 if (strcmp (optarg, "none"))
2240 emit_note_gnu_build_id = xstrdup (optarg);
2241 break;
2242
2243 EOF
2244
2245 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2246 fragment <<EOF
2247 case OPTION_AUDIT:
2248 gld${EMULATION_NAME}_append_to_separated_string (&audit, optarg);
2249 break;
2250
2251 case 'P':
2252 gld${EMULATION_NAME}_append_to_separated_string (&depaudit, optarg);
2253 break;
2254
2255 case OPTION_DISABLE_NEW_DTAGS:
2256 link_info.new_dtags = FALSE;
2257 break;
2258
2259 case OPTION_ENABLE_NEW_DTAGS:
2260 link_info.new_dtags = TRUE;
2261 break;
2262
2263 case OPTION_EH_FRAME_HDR:
2264 link_info.eh_frame_hdr = TRUE;
2265 break;
2266
2267 case OPTION_GROUP:
2268 link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
2269 /* Groups must be self-contained. */
2270 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2271 link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
2272 break;
2273
2274 case OPTION_EXCLUDE_LIBS:
2275 add_excluded_libs (optarg);
2276 break;
2277
2278 case OPTION_HASH_STYLE:
2279 link_info.emit_hash = FALSE;
2280 link_info.emit_gnu_hash = FALSE;
2281 if (strcmp (optarg, "sysv") == 0)
2282 link_info.emit_hash = TRUE;
2283 else if (strcmp (optarg, "gnu") == 0)
2284 link_info.emit_gnu_hash = TRUE;
2285 else if (strcmp (optarg, "both") == 0)
2286 {
2287 link_info.emit_hash = TRUE;
2288 link_info.emit_gnu_hash = TRUE;
2289 }
2290 else
2291 einfo (_("%P%F: invalid hash style \`%s'\n"), optarg);
2292 break;
2293
2294 EOF
2295 fi
2296 fragment <<EOF
2297 case 'z':
2298 if (strcmp (optarg, "defs") == 0)
2299 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
2300 else if (strcmp (optarg, "muldefs") == 0)
2301 link_info.allow_multiple_definition = TRUE;
2302 else if (CONST_STRNEQ (optarg, "max-page-size="))
2303 {
2304 char *end;
2305
2306 config.maxpagesize = strtoul (optarg + 14, &end, 0);
2307 if (*end || (config.maxpagesize & (config.maxpagesize - 1)) != 0)
2308 einfo (_("%P%F: invalid maxium page size \`%s'\n"),
2309 optarg + 14);
2310 }
2311 else if (CONST_STRNEQ (optarg, "common-page-size="))
2312 {
2313 char *end;
2314 config.commonpagesize = strtoul (optarg + 17, &end, 0);
2315 if (*end
2316 || (config.commonpagesize & (config.commonpagesize - 1)) != 0)
2317 einfo (_("%P%F: invalid common page size \`%s'\n"),
2318 optarg + 17);
2319 }
2320 else if (CONST_STRNEQ (optarg, "stack-size="))
2321 {
2322 char *end;
2323 link_info.stacksize = strtoul (optarg + 11, &end, 0);
2324 if (*end || link_info.stacksize < 0)
2325 einfo (_("%P%F: invalid stack size \`%s'\n"), optarg + 11);
2326 if (!link_info.stacksize)
2327 /* Use -1 for explicit no-stack, because zero means
2328 'default'. */
2329 link_info.stacksize = -1;
2330 }
2331 else if (strcmp (optarg, "execstack") == 0)
2332 {
2333 link_info.execstack = TRUE;
2334 link_info.noexecstack = FALSE;
2335 }
2336 else if (strcmp (optarg, "noexecstack") == 0)
2337 {
2338 link_info.noexecstack = TRUE;
2339 link_info.execstack = FALSE;
2340 }
2341 EOF
2342 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2343 fragment <<EOF
2344 else if (strcmp (optarg, "global") == 0)
2345 link_info.flags_1 |= (bfd_vma) DF_1_GLOBAL;
2346 else if (strcmp (optarg, "initfirst") == 0)
2347 link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
2348 else if (strcmp (optarg, "interpose") == 0)
2349 link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE;
2350 else if (strcmp (optarg, "loadfltr") == 0)
2351 link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR;
2352 else if (strcmp (optarg, "nodefaultlib") == 0)
2353 link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB;
2354 else if (strcmp (optarg, "nodelete") == 0)
2355 link_info.flags_1 |= (bfd_vma) DF_1_NODELETE;
2356 else if (strcmp (optarg, "nodlopen") == 0)
2357 link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN;
2358 else if (strcmp (optarg, "nodump") == 0)
2359 link_info.flags_1 |= (bfd_vma) DF_1_NODUMP;
2360 else if (strcmp (optarg, "now") == 0)
2361 {
2362 link_info.flags |= (bfd_vma) DF_BIND_NOW;
2363 link_info.flags_1 |= (bfd_vma) DF_1_NOW;
2364 }
2365 else if (strcmp (optarg, "lazy") == 0)
2366 {
2367 link_info.flags &= ~(bfd_vma) DF_BIND_NOW;
2368 link_info.flags_1 &= ~(bfd_vma) DF_1_NOW;
2369 }
2370 else if (strcmp (optarg, "origin") == 0)
2371 {
2372 link_info.flags |= (bfd_vma) DF_ORIGIN;
2373 link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
2374 }
2375 else if (strcmp (optarg, "combreloc") == 0)
2376 link_info.combreloc = TRUE;
2377 else if (strcmp (optarg, "nocombreloc") == 0)
2378 link_info.combreloc = FALSE;
2379 else if (strcmp (optarg, "nocopyreloc") == 0)
2380 link_info.nocopyreloc = TRUE;
2381 else if (strcmp (optarg, "relro") == 0)
2382 link_info.relro = TRUE;
2383 else if (strcmp (optarg, "norelro") == 0)
2384 link_info.relro = FALSE;
2385 else if (strcmp (optarg, "text") == 0)
2386 link_info.error_textrel = TRUE;
2387 else if (strcmp (optarg, "notext") == 0)
2388 link_info.error_textrel = FALSE;
2389 else if (strcmp (optarg, "textoff") == 0)
2390 link_info.error_textrel = FALSE;
2391 EOF
2392 fi
2393
2394 fragment <<EOF
2395 else
2396 einfo (_("%P: warning: -z %s ignored.\n"), optarg);
2397 break;
2398 EOF
2399
2400 if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then
2401 fragment <<EOF
2402 $PARSE_AND_LIST_ARGS_CASES
2403 EOF
2404 fi
2405
2406 fragment <<EOF
2407 }
2408
2409 return TRUE;
2410 }
2411
2412 EOF
2413
2414 if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
2415 fragment <<EOF
2416
2417 static void
2418 gld${EMULATION_NAME}_list_options (FILE * file)
2419 {
2420 EOF
2421 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2422 fragment <<EOF
2423 fprintf (file, _("\
2424 --audit=AUDITLIB Specify a library to use for auditing\n"));
2425 fprintf (file, _("\
2426 -Bgroup Selects group name lookup rules for DSO\n"));
2427 EOF
2428 fi
2429 fragment <<EOF
2430 fprintf (file, _("\
2431 --build-id[=STYLE] Generate build ID note\n"));
2432 EOF
2433 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2434 fragment <<EOF
2435 fprintf (file, _("\
2436 -P AUDITLIB, --depaudit=AUDITLIB\n" "\
2437 Specify a library to use for auditing dependencies\n"));
2438 fprintf (file, _("\
2439 --disable-new-dtags Disable new dynamic tags\n"));
2440 fprintf (file, _("\
2441 --enable-new-dtags Enable new dynamic tags\n"));
2442 fprintf (file, _("\
2443 --eh-frame-hdr Create .eh_frame_hdr section\n"));
2444 fprintf (file, _("\
2445 --exclude-libs=LIBS Make all symbols in LIBS hidden\n"));
2446 fprintf (file, _("\
2447 --hash-style=STYLE Set hash style to sysv, gnu or both\n"));
2448 fprintf (file, _("\
2449 -z combreloc Merge dynamic relocs into one section and sort\n"));
2450 EOF
2451 fi
2452
2453 fragment <<EOF
2454 fprintf (file, _("\
2455 -z common-page-size=SIZE Set common page size to SIZE\n"));
2456 fprintf (file, _("\
2457 -z defs Report unresolved symbols in object files.\n"));
2458 fprintf (file, _("\
2459 -z execstack Mark executable as requiring executable stack\n"));
2460 EOF
2461
2462 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2463 fragment <<EOF
2464 fprintf (file, _("\
2465 -z global Make symbols in DSO available for subsequently\n\
2466 loaded objects\n"));
2467 fprintf (file, _("\
2468 -z initfirst Mark DSO to be initialized first at runtime\n"));
2469 fprintf (file, _("\
2470 -z interpose Mark object to interpose all DSOs but executable\n"));
2471 fprintf (file, _("\
2472 -z lazy Mark object lazy runtime binding (default)\n"));
2473 fprintf (file, _("\
2474 -z loadfltr Mark object requiring immediate process\n"));
2475 EOF
2476 fi
2477
2478 fragment <<EOF
2479 fprintf (file, _("\
2480 -z max-page-size=SIZE Set maximum page size to SIZE\n"));
2481 fprintf (file, _("\
2482 -z muldefs Allow multiple definitions\n"));
2483 EOF
2484
2485 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2486 fragment <<EOF
2487 fprintf (file, _("\
2488 -z nocombreloc Don't merge dynamic relocs into one section\n"));
2489 fprintf (file, _("\
2490 -z nocopyreloc Don't create copy relocs\n"));
2491 fprintf (file, _("\
2492 -z nodefaultlib Mark object not to use default search paths\n"));
2493 fprintf (file, _("\
2494 -z nodelete Mark DSO non-deletable at runtime\n"));
2495 fprintf (file, _("\
2496 -z nodlopen Mark DSO not available to dlopen\n"));
2497 fprintf (file, _("\
2498 -z nodump Mark DSO not available to dldump\n"));
2499 EOF
2500 fi
2501 fragment <<EOF
2502 fprintf (file, _("\
2503 -z noexecstack Mark executable as not requiring executable stack\n"));
2504 EOF
2505 if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
2506 fragment <<EOF
2507 fprintf (file, _("\
2508 -z norelro Don't create RELRO program header\n"));
2509 fprintf (file, _("\
2510 -z now Mark object non-lazy runtime binding\n"));
2511 fprintf (file, _("\
2512 -z origin Mark object requiring immediate \$ORIGIN\n\
2513 processing at runtime\n"));
2514 fprintf (file, _("\
2515 -z relro Create RELRO program header\n"));
2516 fprintf (file, _("\
2517 -z stacksize=SIZE Set size of stack segment\n"));
2518 EOF
2519 fi
2520
2521 if test -n "$PARSE_AND_LIST_OPTIONS" ; then
2522 fragment <<EOF
2523 $PARSE_AND_LIST_OPTIONS
2524 EOF
2525 fi
2526
2527 fragment <<EOF
2528 }
2529 EOF
2530
2531 if test -n "$PARSE_AND_LIST_EPILOGUE" ; then
2532 fragment <<EOF
2533 $PARSE_AND_LIST_EPILOGUE
2534 EOF
2535 fi
2536 fi
2537
2538 fragment <<EOF
2539
2540 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
2541 {
2542 ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
2543 ${LDEMUL_SYSLIB-syslib_default},
2544 ${LDEMUL_HLL-hll_default},
2545 ${LDEMUL_AFTER_PARSE-after_parse_default},
2546 ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
2547 ${LDEMUL_AFTER_ALLOCATION-gld${EMULATION_NAME}_after_allocation},
2548 ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
2549 ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
2550 ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
2551 ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
2552 "${EMULATION_NAME}",
2553 "${OUTPUT_FORMAT}",
2554 ${LDEMUL_FINISH-finish_default},
2555 ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
2556 ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
2557 ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
2558 ${LDEMUL_SET_SYMBOLS-NULL},
2559 ${LDEMUL_PARSE_ARGS-NULL},
2560 gld${EMULATION_NAME}_add_options,
2561 gld${EMULATION_NAME}_handle_option,
2562 ${LDEMUL_UNRECOGNIZED_FILE-NULL},
2563 ${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
2564 ${LDEMUL_RECOGNIZED_FILE-gld${EMULATION_NAME}_load_symbols},
2565 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
2566 ${LDEMUL_NEW_VERS_PATTERN-NULL}
2567 };
2568 EOF
This page took 0.086712 seconds and 5 git commands to generate.