# This shell script emits a C file. -*- C -*- # It does some substitutions. cat >e${EMULATION_NAME}.c < Set the entry point to be Thumb symbol \n")); } static int gld${EMULATION_NAME}_parse_args (argc, argv) int argc; char ** argv; { int longind; int optc; int prevoptind = optind; int prevopterr = opterr; int wanterror; static int lastoptind = -1; if (lastoptind != optind) opterr = 0; wanterror = opterr; lastoptind = optind; optc = getopt_long_only (argc, argv, "-", longopts, & longind); opterr = prevopterr; switch (optc) { default: if (wanterror) xexit (1); optind = prevoptind; return 0; case OPTION_SUPPORT_OLD_CODE: support_old_code = 1; break; case OPTION_THUMB_ENTRY: thumb_entry_symbol = optarg; break; } return 1; } static void gld${EMULATION_NAME}_before_parse () { #ifndef TARGET_ /* I.e., if not generic. */ ldfile_set_output_arch ("`echo ${ARCH}`"); #endif /* not TARGET_ */ } /* This is called after the sections have been attached to output sections, but before any sizes or addresses have been set. */ static void gld${EMULATION_NAME}_before_allocation () { /* we should be able to set the size of the interworking stub section */ /* Here we rummage through the found bfds to collect glue information */ /* FIXME: should this be based on a command line option? krk@cygnus.com */ { LANG_FOR_EACH_INPUT_STATEMENT (is) { if (! bfd_arm_process_before_allocation (is->the_bfd, & link_info, support_old_code)) { /* xgettext:c-format */ einfo (_("Errors encountered processing file %s"), is->filename); } } } /* We have seen it all. Allocate it, and carry on */ bfd_arm_allocate_interworking_sections (& link_info); } static void gld${EMULATION_NAME}_after_open () { LANG_FOR_EACH_INPUT_STATEMENT (is) { if (bfd_arm_get_bfd_for_interworking (is->the_bfd, & link_info)) break; } } static void gld${EMULATION_NAME}_finish PARAMS((void)) { struct bfd_link_hash_entry * h; if (thumb_entry_symbol == NULL) return; h = bfd_link_hash_lookup (link_info.hash, thumb_entry_symbol, false, false, true); if (h != (struct bfd_link_hash_entry *) NULL && (h->type == bfd_link_hash_defined || h->type == bfd_link_hash_defweak) && h->u.def.section->output_section != NULL) { static char buffer[32]; bfd_vma val; /* Special procesing is required for a Thumb entry symbol. The bottom bit of its address must be set. */ val = (h->u.def.value + bfd_get_section_vma (output_bfd, h->u.def.section->output_section) + h->u.def.section->output_offset); val |= 1; /* Now convert this value into a string and store it in entry_symbol where the lang_finish() function will pick it up. */ buffer[0] = '0'; buffer[1] = 'x'; sprintf_vma (buffer + 2, val); if (entry_symbol != NULL && entry_from_cmdline) einfo (_("%P: warning: '--thumb-entry %s' is overriding '-e %s'\n"), thumb_entry_symbol, entry_symbol); entry_symbol = buffer; } else einfo (_("%P: warning: connot find thumb start symbol %s\n"), thumb_entry_symbol); } static char * gld${EMULATION_NAME}_get_script (isfile) int *isfile; EOF if test -n "$COMPILE_IN" then # Scripts compiled in. # sed commands to quote an ld script as a C string. sc="-f ${srcdir}/emultempl/stringify.sed" cat >>e${EMULATION_NAME}.c <> e${EMULATION_NAME}.c echo ' ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c echo ' ; else return' >> e${EMULATION_NAME}.c sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c echo '; }' >> e${EMULATION_NAME}.c else # Scripts read from the filesystem. cat >>e${EMULATION_NAME}.c <>e${EMULATION_NAME}.c <