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_ */
75 /* Try to open a dynamic archive. This is where we know that ELF
76 dynamic libraries have an extension of .so. */
79 gld${EMULATION_NAME}_open_dynamic_archive (arch, search, entry)
81 search_dirs_type *search;
82 lang_input_statement_type *entry;
87 if (! entry->is_archive)
90 filename = entry->filename;
92 string = (char *) xmalloc (strlen (search->name)
97 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
99 if (! ldfile_try_open_bfd (string, entry))
105 entry->filename = string;
107 /* We have found a dynamic object to include in the link. The ELF
108 backend linker will create a DT_NEEDED entry in the .dynamic
109 section naming this file. If this file includes a DT_SONAME
110 entry, it will be used. Otherwise, the ELF linker will just use
111 the name of the file. For an archive found by searching, like
112 this one, the DT_NEEDED entry should consist of just the name of
113 the file, without the path information used to find it. Note
114 that we only need to do this if we have a dynamic object; an
115 archive will never be referenced by a DT_NEEDED entry.
117 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
118 very pretty. I haven't been able to think of anything that is
120 if (bfd_check_format (entry->the_bfd, bfd_object)
121 && (entry->the_bfd->flags & DYNAMIC) != 0)
125 ASSERT (entry->is_archive && entry->search_dirs_flag);
126 needed_name = (char *) xmalloc (strlen (filename)
129 sprintf (needed_name, "lib%s%s.so", filename, arch);
130 bfd_elf_set_dt_needed_name (entry->the_bfd, needed_name);
137 if [ "x${host}" = "x${target}" ] ; then
138 if [ "x${DEFAULT_EMULATION}" = "x${EMULATION_NAME}" ] ; then
139 cat >>e${EMULATION_NAME}.c <<EOF
141 /* For a native linker, check the file /etc/ld.so.conf for directories
142 in which we may find shared libraries. /etc/ld.so.conf is really
143 only meaningful on Linux, but we check it on other systems anyhow. */
145 static boolean gld${EMULATION_NAME}_check_ld_so_conf
146 PARAMS ((const char *, int));
149 gld${EMULATION_NAME}_check_ld_so_conf (name, force)
153 static boolean initialized;
154 static char *ld_so_conf;
160 f = fopen ("/etc/ld.so.conf", FOPEN_RT);
169 b = (char *) xmalloc (alloc);
171 while ((c = getc (f)) != EOF)
173 if (len + 1 >= alloc)
176 b = (char *) xrealloc (b, alloc);
189 if (len > 0 && b[len - 1] != ':')
197 if (len > 0 && b[len - 1] == ':')
216 if (ld_so_conf == NULL)
219 return gld${EMULATION_NAME}_search_needed (ld_so_conf, name, force);
225 cat >>e${EMULATION_NAME}.c <<EOF
227 /* These variables are required to pass information back and forth
228 between after_open and check_needed and stat_needed and vercheck. */
230 static struct bfd_link_needed_list *global_needed;
231 static struct stat global_stat;
232 static boolean global_found;
233 static struct bfd_link_needed_list *global_vercheck_needed;
234 static boolean global_vercheck_failed;
237 gld${EMULATION_NAME}_after_open ()
239 struct bfd_link_needed_list *needed, *l;
241 LANG_FOR_EACH_INPUT_STATEMENT (is)
243 /* The interworking bfd must be the last one to be processed */
245 bfd_elf32_arm_get_bfd_for_interworking (is->the_bfd, & link_info);
248 /* We only need to worry about this when doing a final link. */
249 if (link_info.relocateable || link_info.shared)
252 /* Get the list of files which appear in DT_NEEDED entries in
253 dynamic objects included in the link (often there will be none).
254 For each such file, we want to track down the corresponding
255 library, and include the symbol table in the link. This is what
256 the runtime dynamic linker will do. Tracking the files down here
257 permits one dynamic object to include another without requiring
258 special action by the person doing the link. Note that the
259 needed list can actually grow while we are stepping through this
261 needed = bfd_elf_get_needed_list (output_bfd, &link_info);
262 for (l = needed; l != NULL; l = l->next)
264 struct bfd_link_needed_list *ll;
267 /* If we've already seen this file, skip it. */
268 for (ll = needed; ll != l; ll = ll->next)
269 if (strcmp (ll->name, l->name) == 0)
274 /* See if this file was included in the link explicitly. */
276 global_found = false;
277 lang_for_each_input_file (gld${EMULATION_NAME}_check_needed);
281 /* We need to find this file and include the symbol table. We
282 want to search for the file in the same way that the dynamic
283 linker will search. That means that we want to use
284 rpath_link, rpath, then the environment variable
285 LD_LIBRARY_PATH (native only), then the linker script
286 LIB_SEARCH_DIRS. We do not search using the -L arguments.
288 We search twice. The first time, we skip objects which may
289 introduce version mismatches. The second time, we force
290 their use. See gld${EMULATION_NAME}_vercheck comment. */
291 for (force = 0; force < 2; force++)
293 const char *lib_path;
295 search_dirs_type *search;
297 if (gld${EMULATION_NAME}_search_needed (command_line.rpath_link,
300 if (gld${EMULATION_NAME}_search_needed (command_line.rpath,
303 if (command_line.rpath_link == NULL
304 && command_line.rpath == NULL)
306 lib_path = (const char *) getenv ("LD_RUN_PATH");
307 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name,
312 if [ "x${host}" = "x${target}" ] ; then
313 if [ "x${DEFAULT_EMULATION}" = "x${EMULATION_NAME}" ] ; then
314 cat >>e${EMULATION_NAME}.c <<EOF
315 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
316 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, force))
321 cat >>e${EMULATION_NAME}.c <<EOF
322 len = strlen (l->name);
323 for (search = search_head; search != NULL; search = search->next)
329 filename = (char *) xmalloc (strlen (search->name) + len + 2);
330 sprintf (filename, "%s/%s", search->name, l->name);
331 if (gld${EMULATION_NAME}_try_needed (filename, force))
338 if [ "x${host}" = "x${target}" ] ; then
339 if [ "x${DEFAULT_EMULATION}" = "x${EMULATION_NAME}" ] ; then
340 cat >>e${EMULATION_NAME}.c <<EOF
341 if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
346 cat >>e${EMULATION_NAME}.c <<EOF
352 einfo ("%P: warning: %s, needed by %B, not found (try using --rpath)\n",
357 /* Search for a needed file in a path. */
360 gld${EMULATION_NAME}_search_needed (path, name, force)
368 if (path == NULL || *path == '\0')
373 char *filename, *sset;
375 s = strchr (path, ':');
377 s = path + strlen (path);
379 filename = (char *) xmalloc (s - path + len + 2);
384 memcpy (filename, path, s - path);
385 filename[s - path] = '/';
386 sset = filename + (s - path) + 1;
390 if (gld${EMULATION_NAME}_try_needed (filename, force))
403 /* This function is called for each possible name for a dynamic object
404 named by a DT_NEEDED entry. The FORCE parameter indicates whether
405 to skip the check for a conflicting version. */
408 gld${EMULATION_NAME}_try_needed (name, force)
414 abfd = bfd_openr (name, bfd_get_target (output_bfd));
417 if (! bfd_check_format (abfd, bfd_object))
419 (void) bfd_close (abfd);
422 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
424 (void) bfd_close (abfd);
428 /* Check whether this object would include any conflicting library
429 versions. If FORCE is set, then we skip this check; we use this
430 the second time around, if we couldn't find any compatible
431 instance of the shared library. */
435 struct bfd_link_needed_list *needed;
437 if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
438 einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
442 global_vercheck_needed = needed;
443 global_vercheck_failed = false;
444 lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
445 if (global_vercheck_failed)
447 (void) bfd_close (abfd);
448 /* Return false to force the caller to move on to try
449 another file on the search path. */
453 /* But wait! It gets much worse. On Linux, if a shared
454 library does not use libc at all, we are supposed to skip
455 it the first time around in case we encounter a shared
456 library later on with the same name which does use the
457 version of libc that we want. This is much too horrible
458 to use on any system other than Linux. */
463 cat >>e${EMULATION_NAME}.c <<EOF
465 struct bfd_link_needed_list *l;
467 for (l = needed; l != NULL; l = l->next)
468 if (strncmp (l->name, "libc.so", 7) == 0)
472 (void) bfd_close (abfd);
480 cat >>e${EMULATION_NAME}.c <<EOF
484 /* We've found a dynamic object matching the DT_NEEDED entry. */
486 /* We have already checked that there is no other input file of the
487 same name. We must now check again that we are not including the
488 same file twice. We need to do this because on many systems
489 libc.so is a symlink to, e.g., libc.so.1. The SONAME entry will
490 reference libc.so.1. If we have already included libc.so, we
491 don't want to include libc.so.1 if they are the same file, and we
492 can only check that using stat. */
494 if (bfd_stat (abfd, &global_stat) != 0)
495 einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
496 global_found = false;
497 lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
500 /* Return true to indicate that we found the file, even though
501 we aren't going to do anything with it. */
505 /* Tell the ELF backend that don't want the output file to have a
506 DT_NEEDED entry for this file. */
507 bfd_elf_set_dt_needed_name (abfd, "");
509 /* Add this file into the symbol table. */
510 if (! bfd_link_add_symbols (abfd, &link_info))
511 einfo ("%F%B: could not read symbols: %E\n", abfd);
516 /* See if an input file matches a DT_NEEDED entry by name. */
519 gld${EMULATION_NAME}_check_needed (s)
520 lang_input_statement_type *s;
525 if (s->filename != NULL
526 && strcmp (s->filename, global_needed->name) == 0)
532 if (s->the_bfd != NULL)
536 soname = bfd_elf_get_dt_soname (s->the_bfd);
538 && strcmp (soname, global_needed->name) == 0)
545 if (s->search_dirs_flag
546 && s->filename != NULL
547 && strchr (global_needed->name, '/') == NULL)
551 f = strrchr (s->filename, '/');
553 && strcmp (f + 1, global_needed->name) == 0)
561 /* See if an input file matches a DT_NEEDED entry by running stat on
565 gld${EMULATION_NAME}_stat_needed (s)
566 lang_input_statement_type *s;
575 if (s->the_bfd == NULL)
578 if (bfd_stat (s->the_bfd, &st) != 0)
580 einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
584 if (st.st_dev == global_stat.st_dev
585 && st.st_ino == global_stat.st_ino)
591 /* We issue a warning if it looks like we are including two
592 different versions of the same shared library. For example,
593 there may be a problem if -lc picks up libc.so.6 but some other
594 shared library has a DT_NEEDED entry of libc.so.5. This is a
595 hueristic test, and it will only work if the name looks like
596 NAME.so.VERSION. FIXME: Depending on file names is error-prone.
597 If we really want to issue warnings about mixing version numbers
598 of shared libraries, we need to find a better way. */
600 if (strchr (global_needed->name, '/') != NULL)
602 suffix = strstr (global_needed->name, ".so.");
605 suffix += sizeof ".so." - 1;
607 soname = bfd_elf_get_dt_soname (s->the_bfd);
609 soname = s->filename;
611 f = strrchr (soname, '/');
617 if (strncmp (f, global_needed->name, suffix - global_needed->name) == 0)
618 einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
619 global_needed->name, global_needed->by, f);
622 /* On Linux, it's possible to have different versions of the same
623 shared library linked against different versions of libc. The
624 dynamic linker somehow tags which libc version to use in
625 /etc/ld.so.cache, and, based on the libc that it sees in the
626 executable, chooses which version of the shared library to use.
628 We try to do a similar check here by checking whether this shared
629 library needs any other shared libraries which may conflict with
630 libraries we have already included in the link. If it does, we
631 skip it, and try to find another shared library farther on down the
634 This is called via lang_for_each_input_file.
635 GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
636 which we ar checking. This sets GLOBAL_VERCHECK_FAILED if we find
637 a conflicting version. */
640 gld${EMULATION_NAME}_vercheck (s)
641 lang_input_statement_type *s;
643 const char *soname, *f;
644 struct bfd_link_needed_list *l;
646 if (global_vercheck_failed)
648 if (s->the_bfd == NULL
649 || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
652 soname = bfd_elf_get_dt_soname (s->the_bfd);
654 soname = bfd_get_filename (s->the_bfd);
656 f = strrchr (soname, '/');
662 for (l = global_vercheck_needed; l != NULL; l = l->next)
666 if (strcmp (f, l->name) == 0)
668 /* Probably can't happen, but it's an easy check. */
672 if (strchr (l->name, '/') != NULL)
675 suffix = strstr (l->name, ".so.");
679 suffix += sizeof ".so." - 1;
681 if (strncmp (f, l->name, suffix - l->name) == 0)
683 /* Here we know that S is a dynamic object FOO.SO.VER1, and
684 the object we are considering needs a dynamic object
685 FOO.SO.VER2, and VER1 and VER2 are different. This
686 appears to be a version mismatch, so we tell the caller
687 to try a different version of this library. */
688 global_vercheck_failed = true;
694 /* Place an orphan section. We use this to put random SHF_ALLOC
695 sections in the right segment. */
697 static asection *hold_section;
698 static lang_output_section_statement_type *hold_use;
699 static lang_output_section_statement_type *hold_text;
700 static lang_output_section_statement_type *hold_rodata;
701 static lang_output_section_statement_type *hold_data;
702 static lang_output_section_statement_type *hold_bss;
703 static lang_output_section_statement_type *hold_rel;
704 static lang_output_section_statement_type *hold_interp;
708 gld${EMULATION_NAME}_place_orphan (file, s)
709 lang_input_statement_type *file;
712 lang_output_section_statement_type *place;
713 asection *snew, **pps;
714 lang_statement_list_type *old;
715 lang_statement_list_type add;
717 const char *secname, *ps;
718 const char *outsecname;
719 lang_output_section_statement_type *os;
721 if ((s->flags & SEC_ALLOC) == 0)
724 /* Look through the script to see where to place this section. */
727 lang_for_each_statement (gld${EMULATION_NAME}_place_section);
729 if (hold_use != NULL)
731 /* We have already placed a section with this name. */
732 wild_doit (&hold_use->children, s, hold_use, file);
736 secname = bfd_get_section_name (s->owner, s);
738 /* If this is a final link, then always put .gnu.warning.SYMBOL
739 sections into the .text section to get them out of the way. */
740 if (! link_info.shared
741 && ! link_info.relocateable
742 && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
743 && hold_text != NULL)
745 wild_doit (&hold_text->children, s, hold_text, file);
749 /* Decide which segment the section should go in based on the
750 section name and section flags. We put loadable .note sections
751 right after the .interp section, so that the PT_NOTE segment is
752 stored right after the program headers where the OS can read it
753 in the first page. */
755 if (s->flags & SEC_EXCLUDE)
757 else if ((s->flags & SEC_LOAD) != 0
758 && strncmp (secname, ".note", 4) == 0
759 && hold_interp != NULL)
761 else if ((s->flags & SEC_HAS_CONTENTS) == 0
764 else if ((s->flags & SEC_READONLY) == 0
765 && hold_data != NULL)
767 else if (strncmp (secname, ".rel", 4) == 0
770 else if ((s->flags & SEC_CODE) == 0
771 && (s->flags & SEC_READONLY) != 0
772 && hold_rodata != NULL)
774 else if ((s->flags & SEC_READONLY) != 0
775 && hold_text != NULL)
780 /* Choose a unique name for the section. This will be needed if the
781 same section name appears in the input file with different
782 loadable or allocateable characteristics. */
783 outsecname = secname;
784 if (bfd_get_section_by_name (output_bfd, outsecname) != NULL)
790 len = strlen (outsecname);
791 newname = xmalloc (len + 5);
792 strcpy (newname, outsecname);
796 sprintf (newname + len, "%d", i);
799 while (bfd_get_section_by_name (output_bfd, newname) != NULL);
801 outsecname = newname;
804 /* Create the section in the output file, and put it in the right
805 place. This shuffling is to make the output file look neater. */
806 snew = bfd_make_section (output_bfd, outsecname);
808 einfo ("%P%F: output format %s cannot represent section called %s\n",
809 output_bfd->xvec->name, outsecname);
810 if (place->bfd_section != NULL)
812 for (pps = &output_bfd->sections; *pps != snew; pps = &(*pps)->next)
815 snew->next = place->bfd_section->next;
816 place->bfd_section->next = snew;
819 /* Start building a list of statements for this section. */
822 lang_list_init (stat_ptr);
824 /* If the name of the section is representable in C, then create
825 symbols to mark the start and the end of the section. */
826 for (ps = outsecname; *ps != '\0'; ps++)
827 if (! isalnum ((unsigned char) *ps) && *ps != '_')
829 if (*ps == '\0' && config.build_constructors)
833 symname = (char *) xmalloc (ps - outsecname + sizeof "__start_");
834 sprintf (symname, "__start_%s", outsecname);
835 lang_add_assignment (exp_assop ('=', symname,
837 exp_intop ((bfd_vma) 1
838 << s->alignment_power))));
841 if (! link_info.relocateable)
844 address = exp_intop ((bfd_vma) 0);
846 lang_enter_output_section_statement (outsecname, address, 0,
850 (etree_type *) NULL);
852 os = lang_output_section_statement_lookup (outsecname);
853 wild_doit (&os->children, s, os, file);
855 lang_leave_output_section_statement
856 ((bfd_vma) 0, "*default*", (struct lang_output_section_phdr_list *) NULL);
859 if (*ps == '\0' && config.build_constructors)
863 symname = (char *) xmalloc (ps - outsecname + sizeof "__stop_");
864 sprintf (symname, "__stop_%s", outsecname);
865 lang_add_assignment (exp_assop ('=', symname,
866 exp_nameop (NAME, ".")));
869 /* Now stick the new statement list right after PLACE. */
870 *add.tail = place->header.next;
871 place->header.next = add.head;
879 gld${EMULATION_NAME}_place_section (s)
880 lang_statement_union_type *s;
882 lang_output_section_statement_type *os;
884 if (s->header.type != lang_output_section_statement_enum)
887 os = &s->output_section_statement;
889 if (strcmp (os->name, hold_section->name) == 0
890 && os->bfd_section != NULL
891 && ((hold_section->flags & (SEC_LOAD | SEC_ALLOC))
892 == (os->bfd_section->flags & (SEC_LOAD | SEC_ALLOC))))
895 if (strcmp (os->name, ".text") == 0)
897 else if (strcmp (os->name, ".rodata") == 0)
899 else if (strcmp (os->name, ".data") == 0)
901 else if (strcmp (os->name, ".bss") == 0)
903 else if (hold_rel == NULL
904 && os->bfd_section != NULL
905 && (os->bfd_section->flags & SEC_ALLOC) != 0
906 && strncmp (os->name, ".rel", 4) == 0)
908 else if (strcmp (os->name, ".interp") == 0)
912 /* Look through an expression for an assignment statement. */
915 gld${EMULATION_NAME}_find_exp_assignment (exp)
918 struct bfd_link_hash_entry *h;
920 switch (exp->type.node_class)
923 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
924 false, false, false);
928 /* We call record_link_assignment even if the symbol is defined.
929 This is because if it is defined by a dynamic object, we
930 actually want to use the value defined by the linker script,
931 not the value from the dynamic object (because we are setting
932 symbols like etext). If the symbol is defined by a regular
933 object, then, as it happens, calling record_link_assignment
938 if (strcmp (exp->assign.dst, ".") != 0)
940 if (! (bfd_elf${ELFSIZE}_record_link_assignment
941 (output_bfd, &link_info, exp->assign.dst,
942 exp->type.node_class == etree_provide ? true : false)))
943 einfo ("%P%F: failed to record assignment to %s: %E\n",
946 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
950 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
951 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
955 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
956 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
957 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
961 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
969 /* This is called by the before_allocation routine via
970 lang_for_each_statement. It locates any assignment statements, and
971 tells the ELF backend about them, in case they are assignments to
972 symbols which are referred to by dynamic objects. */
975 gld${EMULATION_NAME}_find_statement_assignment (s)
976 lang_statement_union_type *s;
978 if (s->header.type == lang_assignment_statement_enum)
979 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
982 /* This is called after the sections have been attached to output
983 sections, but before any sizes or addresses have been set. */
986 gld${EMULATION_NAME}_before_allocation ()
991 /* If we are going to make any variable assignments, we need to let
992 the ELF backend know about them in case the variables are
993 referred to by dynamic objects. */
994 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
996 /* Let the ELF backend work out the sizes of any sections required
997 by dynamic linking. */
998 rpath = command_line.rpath;
1000 rpath = (const char *) getenv ("LD_RUN_PATH");
1001 if (! (bfd_elf${ELFSIZE}_size_dynamic_sections
1002 (output_bfd, command_line.soname, rpath,
1003 command_line.export_dynamic, command_line.filter_shlib,
1004 (const char * const *) command_line.auxiliary_filters,
1005 &link_info, &sinterp, lang_elf_version_info)))
1006 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
1008 /* Let the user override the dynamic linker we are using. */
1009 if (command_line.interpreter != NULL
1012 sinterp->contents = (bfd_byte *) command_line.interpreter;
1013 sinterp->_raw_size = strlen (command_line.interpreter) + 1;
1016 /* Look for any sections named .gnu.warning. As a GNU extensions,
1017 we treat such sections as containing warning messages. We print
1018 out the warning message, and then zero out the section size so
1019 that it does not get copied into the output file. */
1022 LANG_FOR_EACH_INPUT_STATEMENT (is)
1029 if (is->just_syms_flag)
1032 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
1036 sz = bfd_section_size (is->the_bfd, s);
1037 msg = xmalloc ((size_t) sz + 1);
1038 if (! bfd_get_section_contents (is->the_bfd, s, msg, (file_ptr) 0, sz))
1039 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
1042 ret = link_info.callbacks->warning (&link_info, msg,
1043 (const char *) NULL,
1044 is->the_bfd, (asection *) NULL,
1049 /* Clobber the section size, so that we don't waste copying the
1050 warning into the output file. */
1055 /* we should be able to set the size of the interworking stub section */
1057 /* Here we rummage through the found bfds to collect glue information */
1058 /* FIXME: should this be based on a command line option? krk@cygnus.com */
1060 LANG_FOR_EACH_INPUT_STATEMENT (is)
1062 if (!bfd_elf32_arm_process_before_allocation (is->the_bfd, &link_info))
1064 /* xgettext:c-format */
1065 einfo (_("Errors encountered processing file %s"), is->filename);
1070 /* We have seen it all. Allocate it, and carry on */
1071 bfd_elf32_arm_allocate_interworking_sections (& link_info);
1075 gld${EMULATION_NAME}_get_script (isfile)
1079 if test -n "$COMPILE_IN"
1081 # Scripts compiled in.
1083 # sed commands to quote an ld script as a C string.
1084 sc="-f ${srcdir}/emultempl/stringify.sed"
1086 cat >>e${EMULATION_NAME}.c <<EOF
1090 if (link_info.relocateable == true && config.build_constructors == true)
1093 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1094 echo ' ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c
1095 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1096 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1097 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1098 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1099 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1100 echo ' ; else return' >> e${EMULATION_NAME}.c
1101 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1102 echo '; }' >> e${EMULATION_NAME}.c
1105 # Scripts read from the filesystem.
1107 cat >>e${EMULATION_NAME}.c <<EOF
1111 if (link_info.relocateable == true && config.build_constructors == true)
1112 return "ldscripts/${EMULATION_NAME}.xu";
1113 else if (link_info.relocateable == true)
1114 return "ldscripts/${EMULATION_NAME}.xr";
1115 else if (!config.text_read_only)
1116 return "ldscripts/${EMULATION_NAME}.xbn";
1117 else if (!config.magic_demand_paged)
1118 return "ldscripts/${EMULATION_NAME}.xn";
1120 return "ldscripts/${EMULATION_NAME}.x";
1126 cat >>e${EMULATION_NAME}.c <<EOF
1128 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1130 gld${EMULATION_NAME}_before_parse,
1133 after_parse_default,
1134 gld${EMULATION_NAME}_after_open,
1135 after_allocation_default,
1136 set_output_arch_default,
1137 ldemul_default_target,
1138 gld${EMULATION_NAME}_before_allocation,
1139 gld${EMULATION_NAME}_get_script,
1140 "${EMULATION_NAME}",
1143 NULL, /* create output section statements */
1144 gld${EMULATION_NAME}_open_dynamic_archive,
1145 gld${EMULATION_NAME}_place_orphan,
1146 NULL, /* set_symbols */
1148 NULL, /* unrecognised file */