1 # This shell script emits a C file. -*- C -*-
2 # It does some substitutions.
4 cat >e${EMULATION_NAME}.c <<EOF
5 /* This file is is generated by a shell script. DO NOT EDIT! */
7 /* emulate the original gld for the given ${EMULATION_NAME}
8 Copyright (C) 1991, 93, 96, 97, 98, 1999 Free Software Foundation, Inc.
9 Written by Steve Chamberlain steve@cygnus.com
11 This file is part of GLD, the Gnu Linker.
13 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation; either version 2 of the License, or
16 (at your option) any later version.
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
27 #define TARGET_IS_${EMULATION_NAME}
44 static boolean gld${EMULATION_NAME}_open_dynamic_archive
45 PARAMS ((const char *, search_dirs_type *, lang_input_statement_type *));
46 static void gld${EMULATION_NAME}_after_open PARAMS ((void));
47 static void gld${EMULATION_NAME}_check_needed
48 PARAMS ((lang_input_statement_type *));
49 static void gld${EMULATION_NAME}_stat_needed
50 PARAMS ((lang_input_statement_type *));
51 static boolean gld${EMULATION_NAME}_search_needed
52 PARAMS ((const char *, const char *, int));
53 static boolean gld${EMULATION_NAME}_try_needed PARAMS ((const char *, int));
54 static void gld${EMULATION_NAME}_vercheck
55 PARAMS ((lang_input_statement_type *));
56 static void gld${EMULATION_NAME}_find_statement_assignment
57 PARAMS ((lang_statement_union_type *));
58 static void gld${EMULATION_NAME}_find_exp_assignment PARAMS ((etree_type *));
59 static boolean gld${EMULATION_NAME}_place_orphan
60 PARAMS ((lang_input_statement_type *, asection *));
61 static void gld${EMULATION_NAME}_place_section
62 PARAMS ((lang_statement_union_type *));
63 static void gld${EMULATION_NAME}_before_parse PARAMS ((void));
64 static void gld${EMULATION_NAME}_before_allocation PARAMS ((void));
65 static char *gld${EMULATION_NAME}_get_script PARAMS ((int *isfile));
68 gld${EMULATION_NAME}_before_parse ()
70 #ifndef TARGET_ /* I.e., if not generic. */
71 ldfile_set_output_arch ("`echo ${ARCH}`");
72 #endif /* not TARGET_ */
73 config.dynamic_link = ${DYNAMIC_LINK-true};
74 config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo true ; else echo false ; fi`;
77 /* Try to open a dynamic archive. This is where we know that ELF
78 dynamic libraries have an extension of .so. */
81 gld${EMULATION_NAME}_open_dynamic_archive (arch, search, entry)
83 search_dirs_type *search;
84 lang_input_statement_type *entry;
89 if (! entry->is_archive)
92 filename = entry->filename;
94 string = (char *) xmalloc (strlen (search->name)
99 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
101 if (! ldfile_try_open_bfd (string, entry))
107 entry->filename = string;
109 /* We have found a dynamic object to include in the link. The ELF
110 backend linker will create a DT_NEEDED entry in the .dynamic
111 section naming this file. If this file includes a DT_SONAME
112 entry, it will be used. Otherwise, the ELF linker will just use
113 the name of the file. For an archive found by searching, like
114 this one, the DT_NEEDED entry should consist of just the name of
115 the file, without the path information used to find it. Note
116 that we only need to do this if we have a dynamic object; an
117 archive will never be referenced by a DT_NEEDED entry.
119 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
120 very pretty. I haven't been able to think of anything that is
122 if (bfd_check_format (entry->the_bfd, bfd_object)
123 && (entry->the_bfd->flags & DYNAMIC) != 0)
127 ASSERT (entry->is_archive && entry->search_dirs_flag);
128 needed_name = (char *) xmalloc (strlen (filename)
131 sprintf (needed_name, "lib%s%s.so", filename, arch);
132 bfd_elf_set_dt_needed_name (entry->the_bfd, needed_name);
139 if [ "x${host}" = "x${target}" ] ; then
140 if [ "x${DEFAULT_EMULATION}" = "x${EMULATION_NAME}" ] ; then
141 cat >>e${EMULATION_NAME}.c <<EOF
143 /* For a native linker, check the file /etc/ld.so.conf for directories
144 in which we may find shared libraries. /etc/ld.so.conf is really
145 only meaningful on Linux, but we check it on other systems anyhow. */
147 static boolean gld${EMULATION_NAME}_check_ld_so_conf
148 PARAMS ((const char *, int));
151 gld${EMULATION_NAME}_check_ld_so_conf (name, force)
155 static boolean initialized;
156 static char *ld_so_conf;
162 f = fopen ("/etc/ld.so.conf", FOPEN_RT);
171 b = (char *) xmalloc (alloc);
173 while ((c = getc (f)) != EOF)
175 if (len + 1 >= alloc)
178 b = (char *) xrealloc (b, alloc);
191 if (len > 0 && b[len - 1] != ':')
199 if (len > 0 && b[len - 1] == ':')
218 if (ld_so_conf == NULL)
221 return gld${EMULATION_NAME}_search_needed (ld_so_conf, name, force);
227 cat >>e${EMULATION_NAME}.c <<EOF
229 /* These variables are required to pass information back and forth
230 between after_open and check_needed and stat_needed and vercheck. */
232 static struct bfd_link_needed_list *global_needed;
233 static struct stat global_stat;
234 static boolean global_found;
235 static struct bfd_link_needed_list *global_vercheck_needed;
236 static boolean global_vercheck_failed;
239 gld${EMULATION_NAME}_after_open ()
241 struct bfd_link_needed_list *needed, *l;
243 LANG_FOR_EACH_INPUT_STATEMENT (is)
245 /* The interworking bfd must be the last one to be processed */
247 bfd_elf32_arm_get_bfd_for_interworking (is->the_bfd, & link_info);
250 /* We only need to worry about this when doing a final link. */
251 if (link_info.relocateable || link_info.shared)
254 /* Get the list of files which appear in DT_NEEDED entries in
255 dynamic objects included in the link (often there will be none).
256 For each such file, we want to track down the corresponding
257 library, and include the symbol table in the link. This is what
258 the runtime dynamic linker will do. Tracking the files down here
259 permits one dynamic object to include another without requiring
260 special action by the person doing the link. Note that the
261 needed list can actually grow while we are stepping through this
263 needed = bfd_elf_get_needed_list (output_bfd, &link_info);
264 for (l = needed; l != NULL; l = l->next)
266 struct bfd_link_needed_list *ll;
269 /* If we've already seen this file, skip it. */
270 for (ll = needed; ll != l; ll = ll->next)
271 if (strcmp (ll->name, l->name) == 0)
276 /* See if this file was included in the link explicitly. */
278 global_found = false;
279 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
283 /* We need to find this file and include the symbol table. We
284 want to search for the file in the same way that the dynamic
285 linker will search. That means that we want to use
286 rpath_link, rpath, then the environment variable
287 LD_LIBRARY_PATH (native only), then the linker script
288 LIB_SEARCH_DIRS. We do not search using the -L arguments.
290 We search twice. The first time, we skip objects which may
291 introduce version mismatches. The second time, we force
292 their use. See gld${EMULATION_NAME}_vercheck comment. */
293 for (force = 0; force < 2; force++)
295 const char *lib_path;
297 search_dirs_type *search;
299 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
302 if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
305 if (command_line.rpath_link == NULL
306 && command_line.rpath == NULL)
308 lib_path = (const char *) getenv ("LD_RUN_PATH");
309 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name,
314 if [ "x${host}" = "x${target}" ] ; then
315 if [ "x${DEFAULT_EMULATION}" = "x${EMULATION_NAME}" ] ; then
316 cat >>e${EMULATION_NAME}.c <<EOF
317 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
318 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, force))
323 cat >>e${EMULATION_NAME}.c <<EOF
324 len = strlen (l->name);
325 for (search = search_head; search != NULL; search = search->next)
331 filename = (char *) xmalloc (strlen (search->name) + len + 2);
332 sprintf (filename, "%s/%s", search->name, l->name);
333 if (gld${EMULATION_NAME}_try_needed (filename, force))
340 if [ "x${host}" = "x${target}" ] ; then
341 if [ "x${DEFAULT_EMULATION}" = "x${EMULATION_NAME}" ] ; then
342 cat >>e${EMULATION_NAME}.c <<EOF
343 if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
348 cat >>e${EMULATION_NAME}.c <<EOF
354 einfo ("%P: warning: %s, needed by %B, not found (try using --rpath)\n",
359 /* Search for a needed file in a path. */
362 gld${EMULATION_NAME}_search_needed (path, name, force)
370 if (path == NULL || *path == '\0')
375 char *filename, *sset;
377 s = strchr (path, ':');
379 s = path + strlen (path);
381 filename = (char *) xmalloc (s - path + len + 2);
386 memcpy (filename, path, s - path);
387 filename[s - path] = '/';
388 sset = filename + (s - path) + 1;
392 if (gld${EMULATION_NAME}_try_needed (filename, force))
405 /* This function is called for each possible name for a dynamic object
406 named by a DT_NEEDED entry. The FORCE parameter indicates whether
407 to skip the check for a conflicting version. */
410 gld${EMULATION_NAME}_try_needed (name, force)
416 abfd = bfd_openr (name, bfd_get_target (output_bfd));
419 if (! bfd_check_format (abfd, bfd_object))
421 (void) bfd_close (abfd);
424 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
426 (void) bfd_close (abfd);
430 /* Check whether this object would include any conflicting library
431 versions. If FORCE is set, then we skip this check; we use this
432 the second time around, if we couldn't find any compatible
433 instance of the shared library. */
437 struct bfd_link_needed_list *needed;
439 if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
440 einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
444 global_vercheck_needed = needed;
445 global_vercheck_failed = false;
446 lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
447 if (global_vercheck_failed)
449 (void) bfd_close (abfd);
450 /* Return false to force the caller to move on to try
451 another file on the search path. */
455 /* But wait! It gets much worse. On Linux, if a shared
456 library does not use libc at all, we are supposed to skip
457 it the first time around in case we encounter a shared
458 library later on with the same name which does use the
459 version of libc that we want. This is much too horrible
460 to use on any system other than Linux. */
465 cat >>e${EMULATION_NAME}.c <<EOF
467 struct bfd_link_needed_list *l;
469 for (l = needed; l != NULL; l = l->next)
470 if (strncmp (l->name, "libc.so", 7) == 0)
474 (void) bfd_close (abfd);
482 cat >>e${EMULATION_NAME}.c <<EOF
486 /* We've found a dynamic object matching the DT_NEEDED entry. */
488 /* We have already checked that there is no other input file of the
489 same name. We must now check again that we are not including the
490 same file twice. We need to do this because on many systems
491 libc.so is a symlink to, e.g., libc.so.1. The SONAME entry will
492 reference libc.so.1. If we have already included libc.so, we
493 don't want to include libc.so.1 if they are the same file, and we
494 can only check that using stat. */
496 if (bfd_stat (abfd, &global_stat) != 0)
497 einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
498 global_found = false;
499 lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
502 /* Return true to indicate that we found the file, even though
503 we aren't going to do anything with it. */
507 /* Tell the ELF backend that don't want the output file to have a
508 DT_NEEDED entry for this file. */
509 bfd_elf_set_dt_needed_name (abfd, "");
511 /* Add this file into the symbol table. */
512 if (! bfd_link_add_symbols (abfd, &link_info))
513 einfo ("%F%B: could not read symbols: %E\n", abfd);
518 /* See if an input file matches a DT_NEEDED entry by name. */
521 gld${EMULATION_NAME}_check_needed (s)
522 lang_input_statement_type *s;
527 if (s->filename != NULL
528 && strcmp (s->filename, global_needed->name) == 0)
534 if (s->the_bfd != NULL)
538 soname = bfd_elf_get_dt_soname (s->the_bfd);
540 && strcmp (soname, global_needed->name) == 0)
547 if (s->search_dirs_flag
548 && s->filename != NULL
549 && strchr (global_needed->name, '/') == NULL)
553 f = strrchr (s->filename, '/');
555 && strcmp (f + 1, global_needed->name) == 0)
563 /* See if an input file matches a DT_NEEDED entry by running stat on
567 gld${EMULATION_NAME}_stat_needed (s)
568 lang_input_statement_type *s;
577 if (s->the_bfd == NULL)
580 if (bfd_stat (s->the_bfd, &st) != 0)
582 einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
586 if (st.st_dev == global_stat.st_dev
587 && st.st_ino == global_stat.st_ino)
593 /* We issue a warning if it looks like we are including two
594 different versions of the same shared library. For example,
595 there may be a problem if -lc picks up libc.so.6 but some other
596 shared library has a DT_NEEDED entry of libc.so.5. This is a
597 hueristic test, and it will only work if the name looks like
598 NAME.so.VERSION. FIXME: Depending on file names is error-prone.
599 If we really want to issue warnings about mixing version numbers
600 of shared libraries, we need to find a better way. */
602 if (strchr (global_needed->name, '/') != NULL)
604 suffix = strstr (global_needed->name, ".so.");
607 suffix += sizeof ".so." - 1;
609 soname = bfd_elf_get_dt_soname (s->the_bfd);
611 soname = s->filename;
613 f = strrchr (soname, '/');
619 if (strncmp (f, global_needed->name, suffix - global_needed->name) == 0)
620 einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
621 global_needed->name, global_needed->by, f);
624 /* On Linux, it's possible to have different versions of the same
625 shared library linked against different versions of libc. The
626 dynamic linker somehow tags which libc version to use in
627 /etc/ld.so.cache, and, based on the libc that it sees in the
628 executable, chooses which version of the shared library to use.
630 We try to do a similar check here by checking whether this shared
631 library needs any other shared libraries which may conflict with
632 libraries we have already included in the link. If it does, we
633 skip it, and try to find another shared library farther on down the
636 This is called via lang_for_each_input_file.
637 GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
638 which we ar checking. This sets GLOBAL_VERCHECK_FAILED if we find
639 a conflicting version. */
642 gld${EMULATION_NAME}_vercheck (s)
643 lang_input_statement_type *s;
645 const char *soname, *f;
646 struct bfd_link_needed_list *l;
648 if (global_vercheck_failed)
650 if (s->the_bfd == NULL
651 || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
654 soname = bfd_elf_get_dt_soname (s->the_bfd);
656 soname = bfd_get_filename (s->the_bfd);
658 f = strrchr (soname, '/');
664 for (l = global_vercheck_needed; l != NULL; l = l->next)
668 if (strcmp (f, l->name) == 0)
670 /* Probably can't happen, but it's an easy check. */
674 if (strchr (l->name, '/') != NULL)
677 suffix = strstr (l->name, ".so.");
681 suffix += sizeof ".so." - 1;
683 if (strncmp (f, l->name, suffix - l->name) == 0)
685 /* Here we know that S is a dynamic object FOO.SO.VER1, and
686 the object we are considering needs a dynamic object
687 FOO.SO.VER2, and VER1 and VER2 are different. This
688 appears to be a version mismatch, so we tell the caller
689 to try a different version of this library. */
690 global_vercheck_failed = true;
696 /* Place an orphan section. We use this to put random SHF_ALLOC
697 sections in the right segment. */
699 static asection *hold_section;
700 static lang_output_section_statement_type *hold_use;
701 static lang_output_section_statement_type *hold_text;
702 static lang_output_section_statement_type *hold_rodata;
703 static lang_output_section_statement_type *hold_data;
704 static lang_output_section_statement_type *hold_bss;
705 static lang_output_section_statement_type *hold_rel;
706 static lang_output_section_statement_type *hold_interp;
710 gld${EMULATION_NAME}_place_orphan (file, s)
711 lang_input_statement_type *file;
714 lang_output_section_statement_type *place;
715 asection *snew, **pps;
716 lang_statement_list_type *old;
717 lang_statement_list_type add;
719 const char *secname, *ps;
720 const char *outsecname;
721 lang_output_section_statement_type *os;
723 if ((s->flags & SEC_ALLOC) == 0)
726 /* Look through the script to see where to place this section. */
729 lang_for_each_statement (gld${EMULATION_NAME}_place_section);
731 if (hold_use != NULL)
733 /* We have already placed a section with this name. */
734 wild_doit (&hold_use->children, s, hold_use, file);
738 secname = bfd_get_section_name (s->owner, s);
740 /* If this is a final link, then always put .gnu.warning.SYMBOL
741 sections into the .text section to get them out of the way. */
742 if (! link_info.shared
743 && ! link_info.relocateable
744 && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
745 && hold_text != NULL)
747 wild_doit (&hold_text->children, s, hold_text, file);
751 /* Decide which segment the section should go in based on the
752 section name and section flags. We put loadable .note sections
753 right after the .interp section, so that the PT_NOTE segment is
754 stored right after the program headers where the OS can read it
755 in the first page. */
757 if (s->flags & SEC_EXCLUDE)
759 else if ((s->flags & SEC_LOAD) != 0
760 && strncmp (secname, ".note", 4) == 0
761 && hold_interp != NULL)
763 else if ((s->flags & SEC_HAS_CONTENTS) == 0
766 else if ((s->flags & SEC_READONLY) == 0
767 && hold_data != NULL)
769 else if (strncmp (secname, ".rel", 4) == 0
772 else if ((s->flags & SEC_CODE) == 0
773 && (s->flags & SEC_READONLY) != 0
774 && hold_rodata != NULL)
776 else if ((s->flags & SEC_READONLY) != 0
777 && hold_text != NULL)
782 /* Choose a unique name for the section. This will be needed if the
783 same section name appears in the input file with different
784 loadable or allocateable characteristics. */
785 outsecname = secname;
786 if (bfd_get_section_by_name (output_bfd, outsecname) != NULL)
792 len = strlen (outsecname);
793 newname = xmalloc (len + 5);
794 strcpy (newname, outsecname);
798 sprintf (newname + len, "%d", i);
801 while (bfd_get_section_by_name (output_bfd, newname) != NULL);
803 outsecname = newname;
806 /* Create the section in the output file, and put it in the right
807 place. This shuffling is to make the output file look neater. */
808 snew = bfd_make_section (output_bfd, outsecname);
810 einfo ("%P%F: output format %s cannot represent section called %s\n",
811 output_bfd->xvec->name, outsecname);
812 if (place->bfd_section != NULL)
814 for (pps = &output_bfd->sections; *pps != snew; pps = &(*pps)->next)
817 snew->next = place->bfd_section->next;
818 place->bfd_section->next = snew;
821 /* Start building a list of statements for this section. */
824 lang_list_init (stat_ptr);
826 /* If the name of the section is representable in C, then create
827 symbols to mark the start and the end of the section. */
828 for (ps = outsecname; *ps != '\0'; ps++)
829 if (! isalnum ((unsigned char) *ps) && *ps != '_')
831 if (*ps == '\0' && config.build_constructors)
835 symname = (char *) xmalloc (ps - outsecname + sizeof "__start_");
836 sprintf (symname, "__start_%s", outsecname);
837 lang_add_assignment (exp_assop ('=', symname,
839 exp_intop ((bfd_vma) 1
840 << s->alignment_power))));
843 if (! link_info.relocateable)
846 address = exp_intop ((bfd_vma) 0);
848 lang_enter_output_section_statement (outsecname, address, 0,
852 (etree_type *) NULL);
854 os = lang_output_section_statement_lookup (outsecname);
855 wild_doit (&os->children, s, os, file);
857 lang_leave_output_section_statement
858 ((bfd_vma) 0, "*default*", (struct lang_output_section_phdr_list *) NULL);
861 if (*ps == '\0' && config.build_constructors)
865 symname = (char *) xmalloc (ps - outsecname + sizeof "__stop_");
866 sprintf (symname, "__stop_%s", outsecname);
867 lang_add_assignment (exp_assop ('=', symname,
868 exp_nameop (NAME, ".")));
871 /* Now stick the new statement list right after PLACE. */
872 *add.tail = place->header.next;
873 place->header.next = add.head;
881 gld${EMULATION_NAME}_place_section (s)
882 lang_statement_union_type *s;
884 lang_output_section_statement_type *os;
886 if (s->header.type != lang_output_section_statement_enum)
889 os = &s->output_section_statement;
891 if (strcmp (os->name, hold_section->name) == 0
892 && os->bfd_section != NULL
893 && ((hold_section->flags & (SEC_LOAD | SEC_ALLOC))
894 == (os->bfd_section->flags & (SEC_LOAD | SEC_ALLOC))))
897 if (strcmp (os->name, ".text") == 0)
899 else if (strcmp (os->name, ".rodata") == 0)
901 else if (strcmp (os->name, ".data") == 0)
903 else if (strcmp (os->name, ".bss") == 0)
905 else if (hold_rel == NULL
906 && os->bfd_section != NULL
907 && (os->bfd_section->flags & SEC_ALLOC) != 0
908 && strncmp (os->name, ".rel", 4) == 0)
910 else if (strcmp (os->name, ".interp") == 0)
914 /* Look through an expression for an assignment statement. */
917 gld${EMULATION_NAME}_find_exp_assignment (exp)
920 struct bfd_link_hash_entry *h;
922 switch (exp->type.node_class)
925 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
926 false, false, false);
930 /* We call record_link_assignment even if the symbol is defined.
931 This is because if it is defined by a dynamic object, we
932 actually want to use the value defined by the linker script,
933 not the value from the dynamic object (because we are setting
934 symbols like etext). If the symbol is defined by a regular
935 object, then, as it happens, calling record_link_assignment
940 if (strcmp (exp->assign.dst, ".") != 0)
942 if (! (bfd_elf${ELFSIZE}_record_link_assignment
943 (output_bfd, &link_info, exp->assign.dst,
944 exp->type.node_class == etree_provide ? true : false)))
945 einfo ("%P%F: failed to record assignment to %s: %E\n",
948 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
952 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
953 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
957 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
958 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
959 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
963 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
971 /* This is called by the before_allocation routine via
972 lang_for_each_statement. It locates any assignment statements, and
973 tells the ELF backend about them, in case they are assignments to
974 symbols which are referred to by dynamic objects. */
977 gld${EMULATION_NAME}_find_statement_assignment (s)
978 lang_statement_union_type *s;
980 if (s->header.type == lang_assignment_statement_enum)
981 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
984 /* This is called after the sections have been attached to output
985 sections, but before any sizes or addresses have been set. */
988 gld${EMULATION_NAME}_before_allocation ()
993 /* If we are going to make any variable assignments, we need to let
994 the ELF backend know about them in case the variables are
995 referred to by dynamic objects. */
996 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
998 /* Let the ELF backend work out the sizes of any sections required
999 by dynamic linking. */
1000 rpath = command_line.rpath;
1002 rpath = (const char *) getenv ("LD_RUN_PATH");
1003 if (! (bfd_elf${ELFSIZE}_size_dynamic_sections
1004 (output_bfd, command_line.soname, rpath,
1005 command_line.export_dynamic, command_line.filter_shlib,
1006 (const char * const *) command_line.auxiliary_filters,
1007 &link_info, &sinterp, lang_elf_version_info)))
1008 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1010 /* Let the user override the dynamic linker we are using. */
1011 if (command_line.interpreter != NULL
1014 sinterp->contents = (bfd_byte *) command_line.interpreter;
1015 sinterp->_raw_size = strlen (command_line.interpreter) + 1;
1018 /* Look for any sections named .gnu.warning. As a GNU extensions,
1019 we treat such sections as containing warning messages. We print
1020 out the warning message, and then zero out the section size so
1021 that it does not get copied into the output file. */
1024 LANG_FOR_EACH_INPUT_STATEMENT (is)
1031 if (is->just_syms_flag)
1034 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
1038 sz = bfd_section_size (is->the_bfd, s);
1039 msg = xmalloc ((size_t) sz + 1);
1040 if (! bfd_get_section_contents (is->the_bfd, s, msg, (file_ptr) 0, sz))
1041 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
1044 ret = link_info.callbacks->warning (&link_info, msg,
1045 (const char *) NULL,
1046 is->the_bfd, (asection *) NULL,
1051 /* Clobber the section size, so that we don't waste copying the
1052 warning into the output file. */
1057 /* we should be able to set the size of the interworking stub section */
1059 /* Here we rummage through the found bfds to collect glue information */
1060 /* FIXME: should this be based on a command line option? krk@cygnus.com */
1062 LANG_FOR_EACH_INPUT_STATEMENT (is)
1064 if (!bfd_elf32_arm_process_before_allocation (is->the_bfd, &link_info))
1066 /* xgettext:c-format */
1067 einfo (_("Errors encountered processing file %s"), is->filename);
1072 /* We have seen it all. Allocate it, and carry on */
1073 bfd_elf32_arm_allocate_interworking_sections (& link_info);
1077 gld${EMULATION_NAME}_get_script (isfile)
1081 if test -n "$COMPILE_IN"
1083 # Scripts compiled in.
1085 # sed commands to quote an ld script as a C string.
1086 sc="-f ${srcdir}/emultempl/stringify.sed"
1088 cat >>e${EMULATION_NAME}.c <<EOF
1092 if (link_info.relocateable == true && config.build_constructors == true)
1095 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1096 echo ' ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c
1097 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1098 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1099 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1100 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1101 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1102 echo ' ; else return' >> e${EMULATION_NAME}.c
1103 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1104 echo '; }' >> e${EMULATION_NAME}.c
1107 # Scripts read from the filesystem.
1109 cat >>e${EMULATION_NAME}.c <<EOF
1113 if (link_info.relocateable == true && config.build_constructors == true)
1114 return "ldscripts/${EMULATION_NAME}.xu";
1115 else if (link_info.relocateable == true)
1116 return "ldscripts/${EMULATION_NAME}.xr";
1117 else if (!config.text_read_only)
1118 return "ldscripts/${EMULATION_NAME}.xbn";
1119 else if (!config.magic_demand_paged)
1120 return "ldscripts/${EMULATION_NAME}.xn";
1122 return "ldscripts/${EMULATION_NAME}.x";
1128 cat >>e${EMULATION_NAME}.c <<EOF
1130 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1132 gld${EMULATION_NAME}_before_parse,
1135 after_parse_default,
1136 gld${EMULATION_NAME}_after_open,
1137 after_allocation_default,
1138 set_output_arch_default,
1139 ldemul_default_target,
1140 gld${EMULATION_NAME}_before_allocation,
1141 gld${EMULATION_NAME}_get_script,
1142 "${EMULATION_NAME}",
1145 NULL, /* create output section statements */
1146 gld${EMULATION_NAME}_open_dynamic_archive,
1147 gld${EMULATION_NAME}_place_orphan,
1148 NULL, /* set_symbols */
1150 NULL, /* unrecognised file */