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 5 This file is part of GLD, the Gnu Linker. 6 7 GLD is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 2, or (at your option) 10 any later version. 11 12 GLD is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with GLD; see the file COPYING. If not, write to the Free 19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA 20 02111-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 34 ld_emulation_xfer_type *ld_emulation; 35 36 void 37 ldemul_hll (name) 38 char *name; 39 { 40 ld_emulation->hll (name); 41 } 42 43 void 44 ldemul_syslib (name) 45 char *name; 46 { 47 ld_emulation->syslib (name); 48 } 49 50 void 51 ldemul_after_parse () 52 { 53 ld_emulation->after_parse (); 54 } 55 56 void 57 ldemul_before_parse () 58 { 59 ld_emulation->before_parse (); 60 } 61 62 void 63 ldemul_after_open () 64 { 65 ld_emulation->after_open (); 66 } 67 68 void 69 ldemul_after_allocation () 70 { 71 ld_emulation->after_allocation (); 72 } 73 74 void 75 ldemul_before_allocation () 76 { 77 if (ld_emulation->before_allocation) 78 ld_emulation->before_allocation (); 79 } 80 81 void 82 ldemul_set_output_arch () 83 { 84 ld_emulation->set_output_arch (); 85 } 86 87 void 88 ldemul_finish () 89 { 90 if (ld_emulation->finish) 91 ld_emulation->finish (); 92 } 93 94 void 95 ldemul_set_symbols () 96 { 97 if (ld_emulation->set_symbols) 98 ld_emulation->set_symbols (); 99 } 100 101 void 102 ldemul_create_output_section_statements () 103 { 104 if (ld_emulation->create_output_section_statements) 105 ld_emulation->create_output_section_statements (); 106 } 107 108 char * 109 ldemul_get_script (isfile) 110 int *isfile; 111 { 112 return ld_emulation->get_script (isfile); 113 } 114 115 boolean 116 ldemul_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 126 boolean 127 ldemul_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 136 int 137 ldemul_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 151 boolean 152 ldemul_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 162 boolean 163 ldemul_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 171 char * 172 ldemul_choose_target () 173 { 174 return ld_emulation->choose_target (); 175 } 176 177 /* The default choose_target function. */ 178 179 char * 180 ldemul_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 188 void 189 after_parse_default () 190 { 191 } 192 193 void 194 after_open_default () 195 { 196 } 197 198 void 199 after_allocation_default () 200 { 201 } 202 203 void 204 before_allocation_default () 205 { 206 } 207 208 void 209 set_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 216 void 217 syslib_default (ignore) 218 char *ignore ATTRIBUTE_UNUSED; 219 { 220 info_msg (_("%S SYSLIB ignored\n")); 221 } 222 223 void 224 hll_default (ignore) 225 char *ignore ATTRIBUTE_UNUSED; 226 { 227 info_msg (_("%S HLL ignored\n")); 228 } 229 230 ld_emulation_xfer_type *ld_emulations[] = { EMULATION_LIST }; 231 232 void 233 ldemul_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 254 void 255 ldemul_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 271 void 272 ldemul_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 296 int 297 ldemul_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