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