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