armcoff.em revision 104834
1# This shell script emits a C file. -*- C -*- 2# It does some substitutions. 3cat >e${EMULATION_NAME}.c <<EOF 4/* This file is is generated by a shell script. DO NOT EDIT! */ 5 6/* emulate the original gld for the given ${EMULATION_NAME} 7 Copyright 1991, 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002 8 Free Software Foundation, Inc. 9 Written by Steve Chamberlain steve@cygnus.com 10 11This file is part of GLD, the Gnu Linker. 12 13This program is free software; you can redistribute it and/or modify 14it under the terms of the GNU General Public License as published by 15the Free Software Foundation; either version 2 of the License, or 16(at your option) any later version. 17 18This program is distributed in the hope that it will be useful, 19but WITHOUT ANY WARRANTY; without even the implied warranty of 20MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21GNU General Public License for more details. 22 23You should have received a copy of the GNU General Public License 24along with this program; if not, write to the Free Software 25Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 26 27#define TARGET_IS_${EMULATION_NAME} 28 29#include "bfd.h" 30#include "sysdep.h" 31#include "bfdlink.h" 32#include "getopt.h" 33 34#include "ld.h" 35#include "ldmain.h" 36#include "ldmisc.h" 37 38#include "ldexp.h" 39#include "ldlang.h" 40#include "ldfile.h" 41#include "ldemul.h" 42 43static void gld${EMULATION_NAME}_before_parse PARAMS ((void)); 44static void gld${EMULATION_NAME}_before_allocation PARAMS ((void)); 45static char *gld${EMULATION_NAME}_get_script PARAMS ((int *isfile)); 46static int gld${EMULATION_NAME}_parse_args PARAMS((int, char **)); 47static void gld${EMULATION_NAME}_list_options PARAMS ((FILE *)); 48static void gld${EMULATION_NAME}_finish PARAMS ((void)); 49static void gld${EMULATION_NAME}_after_open PARAMS ((void)); 50 51/* If true, then interworking stubs which support calls to old, non-interworking 52 aware ARM code should be generated. */ 53 54static int support_old_code = 0; 55static char * thumb_entry_symbol = NULL; 56 57#define OPTION_SUPPORT_OLD_CODE 300 58#define OPTION_THUMB_ENTRY 301 59 60static struct option longopts[] = 61{ 62 {"support-old-code", no_argument, NULL, OPTION_SUPPORT_OLD_CODE}, 63 {"thumb-entry", required_argument, NULL, OPTION_THUMB_ENTRY}, 64 {NULL, no_argument, NULL, 0} 65}; 66 67static void 68gld${EMULATION_NAME}_list_options (file) 69 FILE * file; 70{ 71 fprintf (file, _(" --support-old-code Support interworking with old code\n")); 72 fprintf (file, _(" --thumb-entry=<sym> Set the entry point to be Thumb symbol <sym>\n")); 73} 74 75static int 76gld${EMULATION_NAME}_parse_args (argc, argv) 77 int argc; 78 char ** argv; 79{ 80 int longind; 81 int optc; 82 int prevoptind = optind; 83 int prevopterr = opterr; 84 int wanterror; 85 static int lastoptind = -1; 86 87 if (lastoptind != optind) 88 opterr = 0; 89 90 wanterror = opterr; 91 lastoptind = optind; 92 93 optc = getopt_long_only (argc, argv, "-", longopts, & longind); 94 opterr = prevopterr; 95 96 switch (optc) 97 { 98 default: 99 if (wanterror) 100 xexit (1); 101 optind = prevoptind; 102 return 0; 103 104 case OPTION_SUPPORT_OLD_CODE: 105 support_old_code = 1; 106 break; 107 108 case OPTION_THUMB_ENTRY: 109 thumb_entry_symbol = optarg; 110 break; 111 } 112 113 return 1; 114} 115 116static void 117gld${EMULATION_NAME}_before_parse () 118{ 119#ifndef TARGET_ /* I.e., if not generic. */ 120 ldfile_set_output_arch ("`echo ${ARCH}`"); 121#endif /* not TARGET_ */ 122} 123 124/* This is called after the sections have been attached to output 125 sections, but before any sizes or addresses have been set. */ 126 127static void 128gld${EMULATION_NAME}_before_allocation () 129{ 130 /* we should be able to set the size of the interworking stub section */ 131 132 /* Here we rummage through the found bfds to collect glue information */ 133 /* FIXME: should this be based on a command line option? krk@cygnus.com */ 134 { 135 LANG_FOR_EACH_INPUT_STATEMENT (is) 136 { 137 if (! bfd_arm_process_before_allocation 138 (is->the_bfd, & link_info, support_old_code)) 139 { 140 /* xgettext:c-format */ 141 einfo (_("Errors encountered processing file %s"), is->filename); 142 } 143 } 144 } 145 146 /* We have seen it all. Allocate it, and carry on */ 147 bfd_arm_allocate_interworking_sections (& link_info); 148} 149 150static void 151gld${EMULATION_NAME}_after_open () 152{ 153 if (strstr (bfd_get_target (output_bfd), "arm") == NULL) 154 { 155 /* The arm backend needs special fields in the output hash structure. 156 These will only be created if the output format is an arm format, 157 hence we do not support linking and changing output formats at the 158 same time. Use a link followed by objcopy to change output formats. */ 159 einfo ("%F%X%P: error: cannot change output format whilst linking ARM binaries\n"); 160 return; 161 } 162 163 { 164 LANG_FOR_EACH_INPUT_STATEMENT (is) 165 { 166 if (bfd_arm_get_bfd_for_interworking (is->the_bfd, & link_info)) 167 break; 168 } 169 } 170} 171 172static void 173gld${EMULATION_NAME}_finish PARAMS((void)) 174{ 175 struct bfd_link_hash_entry * h; 176 177 if (thumb_entry_symbol == NULL) 178 return; 179 180 h = bfd_link_hash_lookup (link_info.hash, thumb_entry_symbol, false, false, true); 181 182 if (h != (struct bfd_link_hash_entry *) NULL 183 && (h->type == bfd_link_hash_defined 184 || h->type == bfd_link_hash_defweak) 185 && h->u.def.section->output_section != NULL) 186 { 187 static char buffer[32]; 188 bfd_vma val; 189 190 /* Special procesing is required for a Thumb entry symbol. The 191 bottom bit of its address must be set. */ 192 val = (h->u.def.value 193 + bfd_get_section_vma (output_bfd, 194 h->u.def.section->output_section) 195 + h->u.def.section->output_offset); 196 197 val |= 1; 198 199 /* Now convert this value into a string and store it in entry_symbol 200 where the lang_finish() function will pick it up. */ 201 buffer[0] = '0'; 202 buffer[1] = 'x'; 203 204 sprintf_vma (buffer + 2, val); 205 206 if (entry_symbol.name != NULL && entry_from_cmdline) 207 einfo (_("%P: warning: '--thumb-entry %s' is overriding '-e %s'\n"), 208 thumb_entry_symbol, entry_symbol.name); 209 entry_symbol.name = buffer; 210 } 211 else 212 einfo (_("%P: warning: connot find thumb start symbol %s\n"), thumb_entry_symbol); 213} 214 215static char * 216gld${EMULATION_NAME}_get_script (isfile) 217 int *isfile; 218EOF 219 220if test -n "$COMPILE_IN" 221then 222# Scripts compiled in. 223 224# sed commands to quote an ld script as a C string. 225sc="-f stringify.sed" 226 227cat >>e${EMULATION_NAME}.c <<EOF 228{ 229 *isfile = 0; 230 231 if (link_info.relocateable == true && config.build_constructors == true) 232 return 233EOF 234sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c 235echo ' ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c 236sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c 237echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c 238sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c 239echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c 240sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c 241echo ' ; else return' >> e${EMULATION_NAME}.c 242sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c 243echo '; }' >> e${EMULATION_NAME}.c 244 245else 246# Scripts read from the filesystem. 247 248cat >>e${EMULATION_NAME}.c <<EOF 249{ 250 *isfile = 1; 251 252 if (link_info.relocateable == true && config.build_constructors == true) 253 return "ldscripts/${EMULATION_NAME}.xu"; 254 else if (link_info.relocateable == true) 255 return "ldscripts/${EMULATION_NAME}.xr"; 256 else if (!config.text_read_only) 257 return "ldscripts/${EMULATION_NAME}.xbn"; 258 else if (!config.magic_demand_paged) 259 return "ldscripts/${EMULATION_NAME}.xn"; 260 else 261 return "ldscripts/${EMULATION_NAME}.x"; 262} 263EOF 264 265fi 266 267cat >>e${EMULATION_NAME}.c <<EOF 268 269struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = 270{ 271 gld${EMULATION_NAME}_before_parse, 272 syslib_default, 273 hll_default, 274 after_parse_default, 275 gld${EMULATION_NAME}_after_open, 276 after_allocation_default, 277 set_output_arch_default, 278 ldemul_default_target, 279 gld${EMULATION_NAME}_before_allocation, 280 gld${EMULATION_NAME}_get_script, 281 "${EMULATION_NAME}", 282 "${OUTPUT_FORMAT}", 283 gld${EMULATION_NAME}_finish, 284 NULL, /* create output section statements */ 285 NULL, /* open dynamic archive */ 286 NULL, /* place orphan */ 287 NULL, /* set symbols */ 288 gld${EMULATION_NAME}_parse_args, 289 NULL, /* unrecognised file */ 290 gld${EMULATION_NAME}_list_options, 291 NULL, /* recognized file */ 292 NULL, /* find_potential_libraries */ 293 NULL /* new_vers_pattern */ 294}; 295EOF 296