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