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