ldemul.c revision 78828
1/* ldemul.c -- clearing house for ld emulation states 2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000 3 Free Software Foundation, Inc. 4 5This file is part of GLD, the Gnu Linker. 6 7GLD is free software; you can redistribute it and/or modify 8it under the terms of the GNU General Public License as published by 9the Free Software Foundation; either version 2, or (at your option) 10any later version. 11 12GLD is distributed in the hope that it will be useful, 13but WITHOUT ANY WARRANTY; without even the implied warranty of 14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15GNU General Public License for more details. 16 17You should have received a copy of the GNU General Public License 18along with GLD; see the file COPYING. If not, write to the Free 19Software Foundation, 59 Temple Place - Suite 330, Boston, MA 2002111-1307, USA. */ 21 22#include "bfd.h" 23#include "sysdep.h" 24 25#include "ld.h" 26#include "ldmisc.h" 27#include "ldexp.h" 28#include "ldlang.h" 29#include "ldfile.h" 30#include "ldemul.h" 31#include "ldmain.h" 32#include "ldemul-list.h" 33 34ld_emulation_xfer_type *ld_emulation; 35 36void 37ldemul_hll (name) 38 char *name; 39{ 40 ld_emulation->hll (name); 41} 42 43void 44ldemul_syslib (name) 45 char *name; 46{ 47 ld_emulation->syslib (name); 48} 49 50void 51ldemul_after_parse () 52{ 53 ld_emulation->after_parse (); 54} 55 56void 57ldemul_before_parse () 58{ 59 ld_emulation->before_parse (); 60} 61 62void 63ldemul_after_open () 64{ 65 ld_emulation->after_open (); 66} 67 68void 69ldemul_after_allocation () 70{ 71 ld_emulation->after_allocation (); 72} 73 74void 75ldemul_before_allocation () 76{ 77 if (ld_emulation->before_allocation) 78 ld_emulation->before_allocation (); 79} 80 81void 82ldemul_set_output_arch () 83{ 84 ld_emulation->set_output_arch (); 85} 86 87void 88ldemul_finish () 89{ 90 if (ld_emulation->finish) 91 ld_emulation->finish (); 92} 93 94void 95ldemul_set_symbols () 96{ 97 if (ld_emulation->set_symbols) 98 ld_emulation->set_symbols (); 99} 100 101void 102ldemul_create_output_section_statements () 103{ 104 if (ld_emulation->create_output_section_statements) 105 ld_emulation->create_output_section_statements (); 106} 107 108char * 109ldemul_get_script (isfile) 110 int *isfile; 111{ 112 return ld_emulation->get_script (isfile); 113} 114 115boolean 116ldemul_open_dynamic_archive (arch, search, entry) 117 const char *arch; 118 search_dirs_type *search; 119 lang_input_statement_type *entry; 120{ 121 if (ld_emulation->open_dynamic_archive) 122 return (*ld_emulation->open_dynamic_archive) (arch, search, entry); 123 return false; 124} 125 126boolean 127ldemul_place_orphan (file, s) 128 lang_input_statement_type *file; 129 asection *s; 130{ 131 if (ld_emulation->place_orphan) 132 return (*ld_emulation->place_orphan) (file, s); 133 return false; 134} 135 136int 137ldemul_parse_args (argc, argv) 138 int argc; 139 char **argv; 140{ 141 /* Try and use the emulation parser if there is one. */ 142 if (ld_emulation->parse_args) 143 { 144 return ld_emulation->parse_args (argc, argv); 145 } 146 return 0; 147} 148 149/* Let the emulation code handle an unrecognized file. */ 150 151boolean 152ldemul_unrecognized_file (entry) 153 lang_input_statement_type *entry; 154{ 155 if (ld_emulation->unrecognized_file) 156 return (*ld_emulation->unrecognized_file) (entry); 157 return false; 158} 159 160/* Let the emulation code handle a recognized file. */ 161 162boolean 163ldemul_recognized_file (entry) 164 lang_input_statement_type *entry; 165{ 166 if (ld_emulation->recognized_file) 167 return (*ld_emulation->recognized_file) (entry); 168 return false; 169} 170 171char * 172ldemul_choose_target () 173{ 174 return ld_emulation->choose_target (); 175} 176 177/* The default choose_target function. */ 178 179char * 180ldemul_default_target () 181{ 182 char *from_outside = getenv (TARGET_ENVIRON); 183 if (from_outside != (char *) NULL) 184 return from_outside; 185 return ld_emulation->target_name; 186} 187 188void 189after_parse_default () 190{ 191} 192 193void 194after_open_default () 195{ 196} 197 198void 199after_allocation_default () 200{ 201} 202 203void 204before_allocation_default () 205{ 206} 207 208void 209set_output_arch_default () 210{ 211 /* Set the output architecture and machine if possible. */ 212 bfd_set_arch_mach (output_bfd, 213 ldfile_output_architecture, ldfile_output_machine); 214} 215 216void 217syslib_default (ignore) 218 char *ignore ATTRIBUTE_UNUSED; 219{ 220 info_msg (_("%S SYSLIB ignored\n")); 221} 222 223void 224hll_default (ignore) 225 char *ignore ATTRIBUTE_UNUSED; 226{ 227 info_msg (_("%S HLL ignored\n")); 228} 229 230ld_emulation_xfer_type *ld_emulations[] = { EMULATION_LIST }; 231 232void 233ldemul_choose_mode (target) 234 char *target; 235{ 236 ld_emulation_xfer_type **eptr = ld_emulations; 237 /* Ignore "gld" prefix. */ 238 if (target[0] == 'g' && target[1] == 'l' && target[2] == 'd') 239 target += 3; 240 for (; *eptr; eptr++) 241 { 242 if (strcmp (target, (*eptr)->emulation_name) == 0) 243 { 244 ld_emulation = *eptr; 245 return; 246 } 247 } 248 einfo (_("%P: unrecognised emulation mode: %s\n"), target); 249 einfo (_("Supported emulations: ")); 250 ldemul_list_emulations (stderr); 251 einfo ("%F\n"); 252} 253 254void 255ldemul_list_emulations (f) 256 FILE *f; 257{ 258 ld_emulation_xfer_type **eptr = ld_emulations; 259 boolean first = true; 260 261 for (; *eptr; eptr++) 262 { 263 if (first) 264 first = false; 265 else 266 fprintf (f, " "); 267 fprintf (f, "%s", (*eptr)->emulation_name); 268 } 269} 270 271void 272ldemul_list_emulation_options (f) 273 FILE *f; 274{ 275 ld_emulation_xfer_type **eptr; 276 int options_found = 0; 277 278 for (eptr = ld_emulations; *eptr; eptr++) 279 { 280 ld_emulation_xfer_type *emul = *eptr; 281 282 if (emul->list_options) 283 { 284 fprintf (f, "%s: \n", emul->emulation_name); 285 286 emul->list_options (f); 287 288 options_found = 1; 289 } 290 } 291 292 if (! options_found) 293 fprintf (f, _(" no emulation specific options.\n")); 294} 295 296int 297ldemul_find_potential_libraries (name, entry) 298 char *name; 299 lang_input_statement_type *entry; 300{ 301 if (ld_emulation->find_potential_libraries) 302 return ld_emulation->find_potential_libraries (name, entry); 303 304 return 0; 305} 306