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
5 test -z "${ELFSIZE}" && ELFSIZE=32
6 cat >e${EMULATION_NAME}.c <<EOF
7 /* This file is is generated by a shell script. DO NOT EDIT! */
9 /* ${ELFSIZE} bit ELF emulation code for ${EMULATION_NAME}
10 Copyright (C) 1991, 93, 94, 95, 96, 97, 98, 1999
11 Free Software Foundation, Inc.
15 This file is part of GLD, the Gnu Linker.
17 This program is free software; you can redistribute it and/or modify
18 it under the terms of the GNU General Public License as published by
19 the Free Software Foundation; either version 2 of the License, or
20 (at your option) any later version.
22 This program is distributed in the hope that it will be useful,
23 but WITHOUT ANY WARRANTY; without even the implied warranty of
24 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 GNU General Public License for more details.
27 You should have received a copy of the GNU General Public License
28 along with this program; if not, write to the Free Software
29 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
31 #define TARGET_IS_${EMULATION_NAME}
49 static void gld${EMULATION_NAME}_before_parse PARAMS ((void));
50 static boolean gld${EMULATION_NAME}_open_dynamic_archive
51 PARAMS ((const char *, search_dirs_type *, lang_input_statement_type *));
52 static void gld${EMULATION_NAME}_after_open PARAMS ((void));
53 static void gld${EMULATION_NAME}_check_needed
54 PARAMS ((lang_input_statement_type *));
55 static void gld${EMULATION_NAME}_stat_needed
56 PARAMS ((lang_input_statement_type *));
57 static boolean gld${EMULATION_NAME}_search_needed
58 PARAMS ((const char *, const char *, int));
59 static boolean gld${EMULATION_NAME}_try_needed PARAMS ((const char *, int));
60 static void gld${EMULATION_NAME}_vercheck
61 PARAMS ((lang_input_statement_type *));
62 static void gld${EMULATION_NAME}_before_allocation PARAMS ((void));
63 static void gld${EMULATION_NAME}_find_statement_assignment
64 PARAMS ((lang_statement_union_type *));
65 static void gld${EMULATION_NAME}_find_exp_assignment PARAMS ((etree_type *));
66 static boolean gld${EMULATION_NAME}_place_orphan
67 PARAMS ((lang_input_statement_type *, asection *));
68 static void gld${EMULATION_NAME}_place_section
69 PARAMS ((lang_statement_union_type *));
70 static char *gld${EMULATION_NAME}_get_script PARAMS ((int *isfile));
73 gld${EMULATION_NAME}_before_parse()
75 ldfile_output_architecture = bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`;
76 config.dynamic_link = ${DYNAMIC_LINK-true};
77 config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo true ; else echo false ; fi`;
80 /* Try to open a dynamic archive. This is where we know that ELF
81 dynamic libraries have an extension of .so. */
84 gld${EMULATION_NAME}_open_dynamic_archive (arch, search, entry)
86 search_dirs_type *search;
87 lang_input_statement_type *entry;
92 if (! entry->is_archive)
95 filename = entry->filename;
97 string = (char *) xmalloc (strlen (search->name)
102 sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
104 if (! ldfile_try_open_bfd (string, entry))
110 entry->filename = string;
112 /* We have found a dynamic object to include in the link. The ELF
113 backend linker will create a DT_NEEDED entry in the .dynamic
114 section naming this file. If this file includes a DT_SONAME
115 entry, it will be used. Otherwise, the ELF linker will just use
116 the name of the file. For an archive found by searching, like
117 this one, the DT_NEEDED entry should consist of just the name of
118 the file, without the path information used to find it. Note
119 that we only need to do this if we have a dynamic object; an
120 archive will never be referenced by a DT_NEEDED entry.
122 FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
123 very pretty. I haven't been able to think of anything that is
125 if (bfd_check_format (entry->the_bfd, bfd_object)
126 && (entry->the_bfd->flags & DYNAMIC) != 0)
130 ASSERT (entry->is_archive && entry->search_dirs_flag);
131 needed_name = (char *) xmalloc (strlen (filename)
134 sprintf (needed_name, "lib%s%s.so", filename, arch);
135 bfd_elf_set_dt_needed_name (entry->the_bfd, needed_name);
142 if [ "x${host}" = "x${target}" ] ; then
143 case " ${EMULATION_LIBPATH} " in
144 *" ${EMULATION_NAME} "*)
145 cat >>e${EMULATION_NAME}.c <<EOF
147 /* For a native linker, check the file /etc/ld.so.conf for directories
148 in which we may find shared libraries. /etc/ld.so.conf is really
149 only meaningful on Linux, but we check it on other systems anyhow. */
151 static boolean gld${EMULATION_NAME}_check_ld_so_conf
152 PARAMS ((const char *, int));
155 gld${EMULATION_NAME}_check_ld_so_conf (name, force)
159 static boolean initialized;
160 static char *ld_so_conf;
166 f = fopen ("/etc/ld.so.conf", FOPEN_RT);
175 b = (char *) xmalloc (alloc);
177 while ((c = getc (f)) != EOF)
179 if (len + 1 >= alloc)
182 b = (char *) xrealloc (b, alloc);
195 if (len > 0 && b[len - 1] != ':')
203 if (len > 0 && b[len - 1] == ':')
222 if (ld_so_conf == NULL)
225 return gld${EMULATION_NAME}_search_needed (ld_so_conf, name, force);
232 cat >>e${EMULATION_NAME}.c <<EOF
234 /* These variables are required to pass information back and forth
235 between after_open and check_needed and stat_needed and vercheck. */
237 static struct bfd_link_needed_list *global_needed;
238 static struct stat global_stat;
239 static boolean global_found;
240 static struct bfd_link_needed_list *global_vercheck_needed;
241 static boolean global_vercheck_failed;
243 /* This is called after all the input files have been opened. */
246 gld${EMULATION_NAME}_after_open ()
248 struct bfd_link_needed_list *needed, *l;
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 case " ${EMULATION_LIBPATH} " in
316 *" ${EMULATION_NAME} "*)
317 cat >>e${EMULATION_NAME}.c <<EOF
318 lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
319 if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, force))
325 cat >>e${EMULATION_NAME}.c <<EOF
326 len = strlen (l->name);
327 for (search = search_head; search != NULL; search = search->next)
333 filename = (char *) xmalloc (strlen (search->name) + len + 2);
334 sprintf (filename, "%s/%s", search->name, l->name);
335 if (gld${EMULATION_NAME}_try_needed (filename, force))
342 if [ "x${host}" = "x${target}" ] ; then
343 case " ${EMULATION_LIBPATH} " in
344 *" ${EMULATION_NAME} "*)
345 cat >>e${EMULATION_NAME}.c <<EOF
346 if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
352 cat >>e${EMULATION_NAME}.c <<EOF
358 einfo ("%P: warning: %s, needed by %B, not found (try using --rpath)\n",
363 /* Search for a needed file in a path. */
366 gld${EMULATION_NAME}_search_needed (path, name, force)
374 if (path == NULL || *path == '\0')
379 char *filename, *sset;
381 s = strchr (path, ':');
383 s = path + strlen (path);
385 filename = (char *) xmalloc (s - path + len + 2);
390 memcpy (filename, path, s - path);
391 filename[s - path] = '/';
392 sset = filename + (s - path) + 1;
396 if (gld${EMULATION_NAME}_try_needed (filename, force))
409 /* This function is called for each possible name for a dynamic object
410 named by a DT_NEEDED entry. The FORCE parameter indicates whether
411 to skip the check for a conflicting version. */
414 gld${EMULATION_NAME}_try_needed (name, force)
420 abfd = bfd_openr (name, bfd_get_target (output_bfd));
423 if (! bfd_check_format (abfd, bfd_object))
425 (void) bfd_close (abfd);
428 if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
430 (void) bfd_close (abfd);
434 /* Check whether this object would include any conflicting library
435 versions. If FORCE is set, then we skip this check; we use this
436 the second time around, if we couldn't find any compatible
437 instance of the shared library. */
441 struct bfd_link_needed_list *needed;
443 if (! bfd_elf_get_bfd_needed_list (abfd, &needed))
444 einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd);
448 global_vercheck_needed = needed;
449 global_vercheck_failed = false;
450 lang_for_each_input_file (gld${EMULATION_NAME}_vercheck);
451 if (global_vercheck_failed)
453 (void) bfd_close (abfd);
454 /* Return false to force the caller to move on to try
455 another file on the search path. */
459 /* But wait! It gets much worse. On Linux, if a shared
460 library does not use libc at all, we are supposed to skip
461 it the first time around in case we encounter a shared
462 library later on with the same name which does use the
463 version of libc that we want. This is much too horrible
464 to use on any system other than Linux. */
469 cat >>e${EMULATION_NAME}.c <<EOF
471 struct bfd_link_needed_list *l;
473 for (l = needed; l != NULL; l = l->next)
474 if (strncmp (l->name, "libc.so", 7) == 0)
478 (void) bfd_close (abfd);
486 cat >>e${EMULATION_NAME}.c <<EOF
490 /* We've found a dynamic object matching the DT_NEEDED entry. */
492 /* We have already checked that there is no other input file of the
493 same name. We must now check again that we are not including the
494 same file twice. We need to do this because on many systems
495 libc.so is a symlink to, e.g., libc.so.1. The SONAME entry will
496 reference libc.so.1. If we have already included libc.so, we
497 don't want to include libc.so.1 if they are the same file, and we
498 can only check that using stat. */
500 if (bfd_stat (abfd, &global_stat) != 0)
501 einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
502 global_found = false;
503 lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
506 /* Return true to indicate that we found the file, even though
507 we aren't going to do anything with it. */
511 /* Tell the ELF backend that don't want the output file to have a
512 DT_NEEDED entry for this file. */
513 bfd_elf_set_dt_needed_name (abfd, "");
515 /* Add this file into the symbol table. */
516 if (! bfd_link_add_symbols (abfd, &link_info))
517 einfo ("%F%B: could not read symbols: %E\n", abfd);
522 /* See if an input file matches a DT_NEEDED entry by name. */
525 gld${EMULATION_NAME}_check_needed (s)
526 lang_input_statement_type *s;
531 if (s->filename != NULL
532 && strcmp (s->filename, global_needed->name) == 0)
538 if (s->the_bfd != NULL)
542 soname = bfd_elf_get_dt_soname (s->the_bfd);
544 && strcmp (soname, global_needed->name) == 0)
551 if (s->search_dirs_flag
552 && s->filename != NULL
553 && strchr (global_needed->name, '/') == NULL)
557 f = strrchr (s->filename, '/');
559 && strcmp (f + 1, global_needed->name) == 0)
567 /* See if an input file matches a DT_NEEDED entry by running stat on
571 gld${EMULATION_NAME}_stat_needed (s)
572 lang_input_statement_type *s;
581 if (s->the_bfd == NULL)
584 if (bfd_stat (s->the_bfd, &st) != 0)
586 einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd);
590 if (st.st_dev == global_stat.st_dev
591 && st.st_ino == global_stat.st_ino)
597 /* We issue a warning if it looks like we are including two
598 different versions of the same shared library. For example,
599 there may be a problem if -lc picks up libc.so.6 but some other
600 shared library has a DT_NEEDED entry of libc.so.5. This is a
601 hueristic test, and it will only work if the name looks like
602 NAME.so.VERSION. FIXME: Depending on file names is error-prone.
603 If we really want to issue warnings about mixing version numbers
604 of shared libraries, we need to find a better way. */
606 if (strchr (global_needed->name, '/') != NULL)
608 suffix = strstr (global_needed->name, ".so.");
611 suffix += sizeof ".so." - 1;
613 soname = bfd_elf_get_dt_soname (s->the_bfd);
615 soname = s->filename;
617 f = strrchr (soname, '/');
623 if (strncmp (f, global_needed->name, suffix - global_needed->name) == 0)
624 einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
625 global_needed->name, global_needed->by, f);
628 /* On Linux, it's possible to have different versions of the same
629 shared library linked against different versions of libc. The
630 dynamic linker somehow tags which libc version to use in
631 /etc/ld.so.cache, and, based on the libc that it sees in the
632 executable, chooses which version of the shared library to use.
634 We try to do a similar check here by checking whether this shared
635 library needs any other shared libraries which may conflict with
636 libraries we have already included in the link. If it does, we
637 skip it, and try to find another shared library farther on down the
640 This is called via lang_for_each_input_file.
641 GLOBAL_VERCHECK_NEEDED is the list of objects needed by the object
642 which we ar checking. This sets GLOBAL_VERCHECK_FAILED if we find
643 a conflicting version. */
646 gld${EMULATION_NAME}_vercheck (s)
647 lang_input_statement_type *s;
649 const char *soname, *f;
650 struct bfd_link_needed_list *l;
652 if (global_vercheck_failed)
654 if (s->the_bfd == NULL
655 || (bfd_get_file_flags (s->the_bfd) & DYNAMIC) == 0)
658 soname = bfd_elf_get_dt_soname (s->the_bfd);
660 soname = bfd_get_filename (s->the_bfd);
662 f = strrchr (soname, '/');
668 for (l = global_vercheck_needed; l != NULL; l = l->next)
672 if (strcmp (f, l->name) == 0)
674 /* Probably can't happen, but it's an easy check. */
678 if (strchr (l->name, '/') != NULL)
681 suffix = strstr (l->name, ".so.");
685 suffix += sizeof ".so." - 1;
687 if (strncmp (f, l->name, suffix - l->name) == 0)
689 /* Here we know that S is a dynamic object FOO.SO.VER1, and
690 the object we are considering needs a dynamic object
691 FOO.SO.VER2, and VER1 and VER2 are different. This
692 appears to be a version mismatch, so we tell the caller
693 to try a different version of this library. */
694 global_vercheck_failed = true;
700 /* This is called after the sections have been attached to output
701 sections, but before any sizes or addresses have been set. */
704 gld${EMULATION_NAME}_before_allocation ()
709 /* If we are going to make any variable assignments, we need to let
710 the ELF backend know about them in case the variables are
711 referred to by dynamic objects. */
712 lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
714 /* Let the ELF backend work out the sizes of any sections required
715 by dynamic linking. */
716 rpath = command_line.rpath;
718 rpath = (const char *) getenv ("LD_RUN_PATH");
719 if (! (bfd_elf${ELFSIZE}_size_dynamic_sections
720 (output_bfd, command_line.soname, rpath,
721 command_line.export_dynamic, command_line.filter_shlib,
722 (const char * const *) command_line.auxiliary_filters,
723 &link_info, &sinterp, lang_elf_version_info)))
724 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
726 /* Let the user override the dynamic linker we are using. */
727 if (command_line.interpreter != NULL
730 sinterp->contents = (bfd_byte *) command_line.interpreter;
731 sinterp->_raw_size = strlen (command_line.interpreter) + 1;
734 /* Look for any sections named .gnu.warning. As a GNU extensions,
735 we treat such sections as containing warning messages. We print
736 out the warning message, and then zero out the section size so
737 that it does not get copied into the output file. */
740 LANG_FOR_EACH_INPUT_STATEMENT (is)
747 if (is->just_syms_flag)
750 s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
754 sz = bfd_section_size (is->the_bfd, s);
755 msg = xmalloc ((size_t) sz + 1);
756 if (! bfd_get_section_contents (is->the_bfd, s, msg, (file_ptr) 0, sz))
757 einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n",
760 ret = link_info.callbacks->warning (&link_info, msg,
762 is->the_bfd, (asection *) NULL,
767 /* Clobber the section size, so that we don't waste copying the
768 warning into the output file. */
774 /* This is called by the before_allocation routine via
775 lang_for_each_statement. It locates any assignment statements, and
776 tells the ELF backend about them, in case they are assignments to
777 symbols which are referred to by dynamic objects. */
780 gld${EMULATION_NAME}_find_statement_assignment (s)
781 lang_statement_union_type *s;
783 if (s->header.type == lang_assignment_statement_enum)
784 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp);
787 /* Look through an expression for an assignment statement. */
790 gld${EMULATION_NAME}_find_exp_assignment (exp)
793 struct bfd_link_hash_entry *h;
795 switch (exp->type.node_class)
798 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
799 false, false, false);
803 /* We call record_link_assignment even if the symbol is defined.
804 This is because if it is defined by a dynamic object, we
805 actually want to use the value defined by the linker script,
806 not the value from the dynamic object (because we are setting
807 symbols like etext). If the symbol is defined by a regular
808 object, then, as it happens, calling record_link_assignment
813 if (strcmp (exp->assign.dst, ".") != 0)
815 if (! (bfd_elf${ELFSIZE}_record_link_assignment
816 (output_bfd, &link_info, exp->assign.dst,
817 exp->type.node_class == etree_provide ? true : false)))
818 einfo ("%P%F: failed to record assignment to %s: %E\n",
821 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src);
825 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs);
826 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs);
830 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond);
831 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs);
832 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs);
836 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child);
844 /* Place an orphan section. We use this to put random SHF_ALLOC
845 sections in the right segment. */
847 static asection *hold_section;
848 static lang_output_section_statement_type *hold_use;
849 static lang_output_section_statement_type *hold_text;
850 static lang_output_section_statement_type *hold_rodata;
851 static lang_output_section_statement_type *hold_data;
852 static lang_output_section_statement_type *hold_bss;
853 static lang_output_section_statement_type *hold_rel;
854 static lang_output_section_statement_type *hold_interp;
858 gld${EMULATION_NAME}_place_orphan (file, s)
859 lang_input_statement_type *file;
862 lang_output_section_statement_type *place;
863 asection *snew, **pps;
864 lang_statement_list_type *old;
865 lang_statement_list_type add;
867 const char *secname, *ps;
868 const char *outsecname;
869 lang_output_section_statement_type *os;
871 if ((s->flags & SEC_ALLOC) == 0)
874 /* Look through the script to see where to place this section. */
877 lang_for_each_statement (gld${EMULATION_NAME}_place_section);
879 if (hold_use != NULL)
881 /* We have already placed a section with this name. */
882 wild_doit (&hold_use->children, s, hold_use, file);
886 secname = bfd_get_section_name (s->owner, s);
888 /* If this is a final link, then always put .gnu.warning.SYMBOL
889 sections into the .text section to get them out of the way. */
890 if (! link_info.shared
891 && ! link_info.relocateable
892 && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
893 && hold_text != NULL)
895 wild_doit (&hold_text->children, s, hold_text, file);
899 /* Decide which segment the section should go in based on the
900 section name and section flags. We put loadable .note sections
901 right after the .interp section, so that the PT_NOTE segment is
902 stored right after the program headers where the OS can read it
903 in the first page. */
905 if (s->flags & SEC_EXCLUDE)
907 else if ((s->flags & SEC_LOAD) != 0
908 && strncmp (secname, ".note", 4) == 0
909 && hold_interp != NULL)
911 else if ((s->flags & SEC_HAS_CONTENTS) == 0
914 else if ((s->flags & SEC_READONLY) == 0
915 && hold_data != NULL)
917 else if (strncmp (secname, ".rel", 4) == 0
920 else if ((s->flags & SEC_CODE) == 0
921 && (s->flags & SEC_READONLY) != 0
922 && hold_rodata != NULL)
924 else if ((s->flags & SEC_READONLY) != 0
925 && hold_text != NULL)
930 /* Choose a unique name for the section. This will be needed if the
931 same section name appears in the input file with different
932 loadable or allocateable characteristics. */
933 outsecname = secname;
934 if (bfd_get_section_by_name (output_bfd, outsecname) != NULL)
940 len = strlen (outsecname);
941 newname = xmalloc (len + 5);
942 strcpy (newname, outsecname);
946 sprintf (newname + len, "%d", i);
949 while (bfd_get_section_by_name (output_bfd, newname) != NULL);
951 outsecname = newname;
954 /* Create the section in the output file, and put it in the right
955 place. This shuffling is to make the output file look neater. */
956 snew = bfd_make_section (output_bfd, outsecname);
958 einfo ("%P%F: output format %s cannot represent section called %s\n",
959 output_bfd->xvec->name, outsecname);
960 if (place->bfd_section != NULL)
962 for (pps = &output_bfd->sections; *pps != snew; pps = &(*pps)->next)
965 snew->next = place->bfd_section->next;
966 place->bfd_section->next = snew;
969 /* Start building a list of statements for this section. */
972 lang_list_init (stat_ptr);
974 /* If the name of the section is representable in C, then create
975 symbols to mark the start and the end of the section. */
976 for (ps = outsecname; *ps != '\0'; ps++)
977 if (! isalnum ((unsigned char) *ps) && *ps != '_')
979 if (*ps == '\0' && config.build_constructors)
983 symname = (char *) xmalloc (ps - outsecname + sizeof "__start_");
984 sprintf (symname, "__start_%s", outsecname);
985 lang_add_assignment (exp_assop ('=', symname,
987 exp_intop ((bfd_vma) 1
988 << s->alignment_power))));
991 if (! link_info.relocateable)
994 address = exp_intop ((bfd_vma) 0);
996 lang_enter_output_section_statement (outsecname, address, 0,
1000 (etree_type *) NULL);
1002 os = lang_output_section_statement_lookup (outsecname);
1003 wild_doit (&os->children, s, os, file);
1005 lang_leave_output_section_statement
1006 ((bfd_vma) 0, "*default*", (struct lang_output_section_phdr_list *) NULL);
1009 if (*ps == '\0' && config.build_constructors)
1013 symname = (char *) xmalloc (ps - outsecname + sizeof "__stop_");
1014 sprintf (symname, "__stop_%s", outsecname);
1015 lang_add_assignment (exp_assop ('=', symname,
1016 exp_nameop (NAME, ".")));
1019 /* Now stick the new statement list right after PLACE. */
1020 *add.tail = place->header.next;
1021 place->header.next = add.head;
1029 gld${EMULATION_NAME}_place_section (s)
1030 lang_statement_union_type *s;
1032 lang_output_section_statement_type *os;
1034 if (s->header.type != lang_output_section_statement_enum)
1037 os = &s->output_section_statement;
1039 if (strcmp (os->name, hold_section->name) == 0
1040 && os->bfd_section != NULL
1041 && ((hold_section->flags & (SEC_LOAD | SEC_ALLOC))
1042 == (os->bfd_section->flags & (SEC_LOAD | SEC_ALLOC))))
1045 if (strcmp (os->name, ".text") == 0)
1047 else if (strcmp (os->name, ".rodata") == 0)
1049 else if (strcmp (os->name, ".data") == 0)
1051 else if (strcmp (os->name, ".bss") == 0)
1053 else if (hold_rel == NULL
1054 && os->bfd_section != NULL
1055 && (os->bfd_section->flags & SEC_ALLOC) != 0
1056 && strncmp (os->name, ".rel", 4) == 0)
1058 else if (strcmp (os->name, ".interp") == 0)
1063 gld${EMULATION_NAME}_get_script(isfile)
1067 if test -n "$COMPILE_IN"
1069 # Scripts compiled in.
1071 # sed commands to quote an ld script as a C string.
1072 sc="-f stringify.sed"
1074 cat >>e${EMULATION_NAME}.c <<EOF
1078 if (link_info.relocateable == true && config.build_constructors == true)
1081 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
1082 echo ' ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c
1083 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
1084 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
1085 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
1086 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
1087 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
1089 if test -n "$GENERATE_SHLIB_SCRIPT" ; then
1090 echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c
1091 sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
1094 echo ' ; else return' >> e${EMULATION_NAME}.c
1095 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
1096 echo '; }' >> e${EMULATION_NAME}.c
1099 # Scripts read from the filesystem.
1101 cat >>e${EMULATION_NAME}.c <<EOF
1105 if (link_info.relocateable == true && config.build_constructors == true)
1106 return "ldscripts/${EMULATION_NAME}.xu";
1107 else if (link_info.relocateable == true)
1108 return "ldscripts/${EMULATION_NAME}.xr";
1109 else if (!config.text_read_only)
1110 return "ldscripts/${EMULATION_NAME}.xbn";
1111 else if (!config.magic_demand_paged)
1112 return "ldscripts/${EMULATION_NAME}.xn";
1113 else if (link_info.shared)
1114 return "ldscripts/${EMULATION_NAME}.xs";
1116 return "ldscripts/${EMULATION_NAME}.x";
1122 cat >>e${EMULATION_NAME}.c <<EOF
1124 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
1126 gld${EMULATION_NAME}_before_parse,
1129 after_parse_default,
1130 gld${EMULATION_NAME}_after_open,
1131 after_allocation_default,
1132 set_output_arch_default,
1133 ldemul_default_target,
1134 gld${EMULATION_NAME}_before_allocation,
1135 gld${EMULATION_NAME}_get_script,
1136 "${EMULATION_NAME}",
1140 gld${EMULATION_NAME}_open_dynamic_archive,
1141 gld${EMULATION_NAME}_place_orphan,
1142 NULL, /* set_symbols */
1143 NULL, /* parse_args */
1144 NULL, /* unrecognized_file */
1145 NULL, /* list_options */
1146 NULL /* recognized_file */