]>
Commit | Line | Data |
---|---|---|
4e6f9223 SC |
1 | /* Generic target-file-type support for the BFD library. |
2 | Copyright (C) 1990-1991 Free Software Foundation, Inc. | |
3 | Written by Cygnus Support. | |
4a81b561 | 4 | |
4e6f9223 | 5 | This file is part of BFD, the Binary File Descriptor library. |
4a81b561 | 6 | |
4e6f9223 | 7 | This program is free software; you can redistribute it and/or modify |
4a81b561 | 8 | it under the terms of the GNU General Public License as published by |
4e6f9223 SC |
9 | the Free Software Foundation; either version 2 of the License, or |
10 | (at your option) any later version. | |
4a81b561 | 11 | |
4e6f9223 | 12 | This program is distributed in the hope that it will be useful, |
4a81b561 DHW |
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 | |
4e6f9223 SC |
18 | along with this program; if not, write to the Free Software |
19 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | |
4a81b561 DHW |
20 | |
21 | /* $Id$ */ | |
22 | ||
4a81b561 | 23 | #include "bfd.h" |
bbc8d484 | 24 | #include "sysdep.h" |
4a81b561 DHW |
25 | #include "libbfd.h" |
26 | ||
6f715d66 SC |
27 | /*doc* |
28 | @section Targets | |
29 | Each port of BFD to a different machine requries the creation of a | |
4e6f9223 | 30 | target back end. All the back end provides to the root part of BFD is |
6f715d66 SC |
31 | a structure containing pointers to functions which perform certain low |
32 | level operations on files. BFD translates the applications's requests | |
33 | through a pointer into calls to the back end routines. | |
34 | ||
35 | When a file is opened with @code{bfd_openr}, its format and target are | |
36 | unknown. BFD uses various mechanisms to determine how to interpret the | |
3f85ebce | 37 | file. The operations performed are: |
6f715d66 SC |
38 | @itemize @bullet |
39 | @item | |
4e6f9223 | 40 | First a BFD is created by calling the internal routine |
6f715d66 | 41 | @code{new_bfd}, then @code{bfd_find_target} is called with the target |
4e6f9223 | 42 | string supplied to @code{bfd_openr} and the new BFD pointer. |
6f715d66 SC |
43 | @item |
44 | If a null target string was provided to | |
45 | @code{bfd_find_target}, it looks up the environment variable | |
46 | @code{GNUTARGET} and uses that as the target string. | |
47 | @item | |
48 | If the target string is still NULL, or the target string | |
49 | is @code{default}, then the first item in the target vector is used as | |
4e6f9223 | 50 | the target type. @xref{bfd_target}. |
6f715d66 SC |
51 | @item |
52 | Otherwise, the elements in the target vector are | |
53 | inspected one by one, until a match on target name is found. When | |
54 | found, that is used. | |
55 | @item | |
56 | Otherwise the error @code{invalid_target} is returned to | |
57 | @code{bfd_openr}. | |
58 | @item | |
59 | @code{bfd_openr} attempts to open the file using | |
4e6f9223 | 60 | @code{bfd_open_file}, and returns the BFD. |
6f715d66 | 61 | @end itemize |
4e6f9223 | 62 | Once the BFD has been opened and the target selected, the file format |
6f715d66 | 63 | may be determined. This is done by calling @code{bfd_check_format} on |
4e6f9223 | 64 | the BFD with a suggested format. The routine returns @code{true} when |
6f715d66 | 65 | the application guesses right. |
92c78ee6 RP |
66 | |
67 | @menu | |
68 | * bfd_target:: | |
69 | @end menu | |
6f715d66 SC |
70 | */ |
71 | ||
72 | ||
73 | /*proto* bfd_target | |
92c78ee6 | 74 | @node bfd_target, , Targets, Targets |
6f715d66 SC |
75 | @subsection bfd_target |
76 | This structure contains everything that BFD knows about a target. | |
77 | It includes things like its byte order, name, what routines to call | |
78 | to do various operations, etc. | |
79 | ||
80 | Every BFD points to a target structure with its "xvec" member. | |
81 | ||
82 | ||
83 | Shortcut for declaring fields which are prototyped function pointers, | |
84 | while avoiding anguish on compilers that don't support protos. | |
85 | ||
86 | $#define SDEF(ret, name, arglist) \ | |
87 | $ PROTO(ret,(*name),arglist) | |
88 | $#define SDEF_FMT(ret, name, arglist) \ | |
89 | $ PROTO(ret,(*name[bfd_type_end]),arglist) | |
90 | ||
91 | These macros are used to dispatch to functions through the bfd_target | |
4e6f9223 SC |
92 | vector. They are used in a number of macros further down in @file{bfd.h}, and |
93 | are also used when calling various routines by hand inside the BFD | |
6f715d66 SC |
94 | implementation. The "arglist" argument must be parenthesized; it |
95 | contains all the arguments to the called function. | |
96 | ||
97 | $#define BFD_SEND(bfd, message, arglist) \ | |
98 | $ ((*((bfd)->xvec->message)) arglist) | |
99 | ||
4e6f9223 | 100 | For operations which index on the BFD format |
6f715d66 SC |
101 | |
102 | $#define BFD_SEND_FMT(bfd, message, arglist) \ | |
103 | $ (((bfd)->xvec->message[(int)((bfd)->format)]) arglist) | |
104 | ||
105 | This is the struct which defines the type of BFD this is. The | |
4e6f9223 | 106 | "xvec" member of the struct @code{bfd} itself points here. Each module |
6f715d66 SC |
107 | that implements access to a different target under BFD, defines |
108 | one of these. | |
109 | ||
110 | FIXME, these names should be rationalised with the names of the | |
111 | entry points which call them. Too bad we can't have one macro to | |
112 | define them both! | |
113 | ||
114 | *+++ | |
115 | ||
116 | $typedef struct bfd_target | |
117 | ${ | |
118 | ||
119 | identifies the kind of target, eg SunOS4, Ultrix, etc | |
120 | ||
121 | $ char *name; | |
122 | ||
123 | The "flavour" of a back end is a general indication about the contents | |
124 | of a file. | |
125 | ||
92c78ee6 RP |
126 | $ enum target_flavour { |
127 | $ bfd_target_unknown_flavour, | |
128 | $ bfd_target_aout_flavour, | |
129 | $ bfd_target_coff_flavour, | |
130 | $ bfd_target_elf_flavour, | |
131 | $ bfd_target_ieee_flavour, | |
132 | $ bfd_target_oasys_flavour, | |
133 | $ bfd_target_srec_flavour} flavour; | |
6f715d66 SC |
134 | |
135 | The order of bytes within the data area of a file. | |
136 | ||
137 | $ boolean byteorder_big_p; | |
138 | ||
139 | The order of bytes within the header parts of a file. | |
140 | ||
141 | $ boolean header_byteorder_big_p; | |
142 | ||
143 | This is a mask of all the flags which an executable may have set - | |
144 | from the set @code{NO_FLAGS}, @code{HAS_RELOC}, ...@code{D_PAGED}. | |
145 | ||
146 | $ flagword object_flags; | |
147 | ||
148 | This is a mask of all the flags which a section may have set - from | |
149 | the set @code{SEC_NO_FLAGS}, @code{SEC_ALLOC}, ...@code{SET_NEVER_LOAD}. | |
150 | ||
151 | $ flagword section_flags; | |
152 | ||
153 | The pad character for filenames within an archive header. | |
154 | ||
155 | $ char ar_pad_char; | |
156 | ||
157 | The maximum number of characters in an archive header. | |
158 | ||
159 | $ unsigned short ar_max_namelen; | |
160 | ||
161 | The minimum alignment restriction for any section. | |
162 | ||
163 | $ unsigned int align_power_min; | |
164 | ||
165 | Entries for byte swapping for data. These are different to the other | |
4e6f9223 | 166 | entry points, since they don't take BFD as first arg. Certain other handlers |
6f715d66 SC |
167 | could do the same. |
168 | ||
81f3996f SC |
169 | $ SDEF (bfd_vma, bfd_getx64, (bfd_byte *)); |
170 | $ SDEF (void, bfd_putx64, (bfd_vma, bfd_byte *)); | |
171 | $ SDEF (bfd_vma, bfd_getx32, (bfd_byte *)); | |
172 | $ SDEF (void, bfd_putx32, (bfd_vma, bfd_byte *)); | |
173 | $ SDEF (bfd_vma, bfd_getx16, (bfd_byte *)); | |
174 | $ SDEF (void, bfd_putx16, (bfd_vma, bfd_byte *)); | |
6f715d66 SC |
175 | |
176 | Byte swapping for the headers | |
177 | ||
4e6f9223 | 178 | $ SDEF (bfd_vma, bfd_h_getx64, (bfd_byte *)); |
81f3996f SC |
179 | $ SDEF (void, bfd_h_putx64, (bfd_vma, bfd_byte *)); |
180 | $ SDEF (bfd_vma, bfd_h_getx32, (bfd_byte *)); | |
181 | $ SDEF (void, bfd_h_putx32, (bfd_vma, bfd_byte *)); | |
182 | $ SDEF (bfd_vma, bfd_h_getx16, (bfd_byte *)); | |
183 | $ SDEF (void, bfd_h_putx16, (bfd_vma, bfd_byte *)); | |
6f715d66 SC |
184 | |
185 | Format dependent routines, these turn into vectors of entry points | |
186 | within the target vector structure; one for each format to check. | |
187 | ||
188 | Check the format of a file being read. Return bfd_target * or zero. | |
189 | ||
190 | $ SDEF_FMT (struct bfd_target *, _bfd_check_format, (bfd *)); | |
191 | ||
192 | Set the format of a file being written. | |
193 | ||
194 | $ SDEF_FMT (boolean, _bfd_set_format, (bfd *)); | |
195 | ||
196 | Write cached information into a file being written, at bfd_close. | |
197 | ||
198 | $ SDEF_FMT (boolean, _bfd_write_contents, (bfd *)); | |
199 | ||
200 | The following functions are defined in @code{JUMP_TABLE}. The idea is | |
201 | that the back end writer of @code{foo} names all the routines | |
202 | @code{foo_}@var{entry_point}, @code{JUMP_TABLE} will built the entries | |
203 | in this structure in the right order. | |
204 | ||
205 | Core file entry points | |
206 | ||
207 | $ SDEF (char *, _core_file_failing_command, (bfd *)); | |
208 | $ SDEF (int, _core_file_failing_signal, (bfd *)); | |
209 | $ SDEF (boolean, _core_file_matches_executable_p, (bfd *, bfd *)); | |
210 | ||
211 | Archive entry points | |
212 | ||
213 | $ SDEF (boolean, _bfd_slurp_armap, (bfd *)); | |
214 | $ SDEF (boolean, _bfd_slurp_extended_name_table, (bfd *)); | |
215 | $ SDEF (void, _bfd_truncate_arname, (bfd *, CONST char *, char *)); | |
216 | $ SDEF (boolean, write_armap, (bfd *arch, | |
217 | $ unsigned int elength, | |
218 | $ struct orl *map, | |
f58809fd | 219 | $ unsigned int orl_count, |
6f715d66 SC |
220 | $ int stridx)); |
221 | ||
222 | Standard stuff. | |
223 | ||
224 | $ SDEF (boolean, _close_and_cleanup, (bfd *)); | |
225 | $ SDEF (boolean, _bfd_set_section_contents, (bfd *, sec_ptr, PTR, | |
226 | $ file_ptr, bfd_size_type)); | |
227 | $ SDEF (boolean, _bfd_get_section_contents, (bfd *, sec_ptr, PTR, | |
228 | $ file_ptr, bfd_size_type)); | |
229 | $ SDEF (boolean, _new_section_hook, (bfd *, sec_ptr)); | |
230 | ||
231 | Symbols and reloctions | |
232 | ||
233 | $ SDEF (unsigned int, _get_symtab_upper_bound, (bfd *)); | |
234 | $ SDEF (unsigned int, _bfd_canonicalize_symtab, | |
235 | $ (bfd *, struct symbol_cache_entry **)); | |
236 | $ SDEF (unsigned int, _get_reloc_upper_bound, (bfd *, sec_ptr)); | |
237 | $ SDEF (unsigned int, _bfd_canonicalize_reloc, (bfd *, sec_ptr, arelent **, | |
238 | $ struct symbol_cache_entry**)); | |
239 | $ SDEF (struct symbol_cache_entry *, _bfd_make_empty_symbol, (bfd *)); | |
240 | $ SDEF (void, _bfd_print_symbol, (bfd *, PTR, struct symbol_cache_entry *, | |
92c78ee6 | 241 | $ bfd_print_symbol_type)); |
6f715d66 SC |
242 | $#define bfd_print_symbol(b,p,s,e) BFD_SEND(b, _bfd_print_symbol, (b,p,s,e)) |
243 | $ SDEF (alent *, _get_lineno, (bfd *, struct symbol_cache_entry *)); | |
244 | $ | |
245 | $ SDEF (boolean, _bfd_set_arch_mach, (bfd *, enum bfd_architecture, | |
246 | $ unsigned long)); | |
247 | $ | |
248 | $ SDEF (bfd *, openr_next_archived_file, (bfd *arch, bfd *prev)); | |
249 | $ SDEF (boolean, _bfd_find_nearest_line, | |
250 | $ (bfd *abfd, struct sec *section, | |
251 | $ struct symbol_cache_entry **symbols,bfd_vma offset, | |
252 | $ CONST char **file, CONST char **func, unsigned int *line)); | |
253 | $ SDEF (int, _bfd_stat_arch_elt, (bfd *, struct stat *)); | |
254 | $ | |
255 | $ SDEF (int, _bfd_sizeof_headers, (bfd *, boolean)); | |
256 | $ | |
257 | $ SDEF (void, _bfd_debug_info_start, (bfd *)); | |
258 | $ SDEF (void, _bfd_debug_info_end, (bfd *)); | |
259 | $ SDEF (void, _bfd_debug_info_accumulate, (bfd *, struct sec *)); | |
260 | ||
261 | Special entry points for gdb to swap in coff symbol table parts | |
262 | ||
263 | $ SDEF(void, _bfd_coff_swap_aux_in,( | |
264 | $ bfd *abfd , | |
265 | $ PTR ext, | |
266 | $ int type, | |
267 | $ int class , | |
268 | $ PTR in)); | |
269 | $ | |
270 | $ SDEF(void, _bfd_coff_swap_sym_in,( | |
271 | $ bfd *abfd , | |
272 | $ PTR ext, | |
273 | $ PTR in)); | |
274 | $ | |
275 | $ SDEF(void, _bfd_coff_swap_lineno_in, ( | |
276 | $ bfd *abfd, | |
277 | $ PTR ext, | |
278 | $ PTR in)); | |
279 | $ | |
0d740984 SC |
280 | |
281 | Special entry points for gas to swap coff parts | |
282 | ||
283 | $ SDEF(unsigned int, _bfd_coff_swap_aux_out,( | |
284 | $ bfd *abfd, | |
285 | $ PTR in, | |
286 | $ int type, | |
287 | $ int class, | |
288 | $ PTR ext)); | |
289 | $ | |
290 | $ SDEF(unsigned int, _bfd_coff_swap_sym_out,( | |
291 | $ bfd *abfd, | |
292 | $ PTR in, | |
293 | $ PTR ext)); | |
294 | $ | |
295 | $ SDEF(unsigned int, _bfd_coff_swap_lineno_out,( | |
296 | $ bfd *abfd, | |
297 | $ PTR in, | |
298 | $ PTR ext)); | |
299 | $ | |
300 | $ SDEF(unsigned int, _bfd_coff_swap_reloc_out,( | |
301 | $ bfd *abfd, | |
302 | $ PTR src, | |
303 | $ PTR dst)); | |
304 | $ | |
305 | $ SDEF(unsigned int, _bfd_coff_swap_filehdr_out,( | |
306 | $ bfd *abfd, | |
307 | $ PTR in, | |
308 | $ PTR out)); | |
309 | $ | |
310 | $ SDEF(unsigned int, _bfd_coff_swap_aouthdr_out,( | |
311 | $ bfd *abfd, | |
312 | $ PTR in, | |
313 | $ PTR out)); | |
314 | $ | |
315 | $ SDEF(unsigned int, _bfd_coff_swap_scnhdr_out,( | |
316 | $ bfd *abfd, | |
317 | $ PTR in, | |
318 | $ PTR out)); | |
319 | $ | |
6f715d66 SC |
320 | $} bfd_target; |
321 | ||
322 | *--- | |
323 | ||
324 | */ | |
23b0b558 JG |
325 | extern bfd_target ecoff_little_vec; |
326 | extern bfd_target ecoff_big_vec; | |
2b1d8a50 | 327 | extern bfd_target sunos_big_vec; |
7ed4093a | 328 | extern bfd_target demo_64_vec; |
4a81b561 DHW |
329 | extern bfd_target srec_vec; |
330 | extern bfd_target b_out_vec_little_host; | |
331 | extern bfd_target b_out_vec_big_host; | |
332 | extern bfd_target icoff_little_vec; | |
333 | extern bfd_target icoff_big_vec; | |
3f85ebce JG |
334 | extern bfd_target elf_little_vec; |
335 | extern bfd_target elf_big_vec; | |
aacf30e3 DHW |
336 | extern bfd_target ieee_vec; |
337 | extern bfd_target oasys_vec; | |
338 | extern bfd_target m88k_bcs_vec; | |
c407897e | 339 | extern bfd_target m68kcoff_vec; |
20fdc627 | 340 | extern bfd_target i386coff_vec; |
bbc8d484 | 341 | extern bfd_target i386aout_vec; |
41f50af0 | 342 | extern bfd_target a29kcoff_big_vec; |
f58809fd | 343 | extern bfd_target trad_core_vec; |
cbdc7909 | 344 | extern bfd_target rs6000coff_vec; |
4e6f9223 SC |
345 | |
346 | #ifdef SELECT_VECS | |
347 | ||
348 | bfd_target *target_vector[] = { | |
349 | SELECT_VECS, | |
350 | 0 | |
351 | ||
352 | }; | |
353 | #else | |
c0e5039e JG |
354 | #ifdef DEFAULT_VECTOR |
355 | extern bfd_target DEFAULT_VECTOR; | |
356 | #endif | |
357 | ||
7d774e01 | 358 | #ifdef GNU960 |
6f715d66 SC |
359 | #define ICOFF_LITTLE_VEC icoff_little_vec |
360 | #define ICOFF_BIG_VEC icoff_big_vec | |
361 | #define B_OUT_VEC_LITTLE_HOST b_out_vec_little_host | |
362 | #define B_OUT_VEC_BIG_HOST b_out_vec_big_host | |
7d774e01 | 363 | #endif /* GNU960 */ |
9846338e | 364 | |
9872a49c | 365 | #ifndef RESTRICTED |
6f715d66 SC |
366 | #define ECOFF_LITTLE_VEC ecoff_little_vec |
367 | #define ECOFF_BIG_VEC ecoff_big_vec | |
368 | #define ICOFF_LITTLE_VEC icoff_little_vec | |
369 | #define ICOFF_BIG_VEC icoff_big_vec | |
3f85ebce JG |
370 | #define ELF_LITTLE_VEC elf_little_vec |
371 | #define ELF_BIG_VEC elf_big_vec | |
6f715d66 SC |
372 | #define ZB_OUT_VEC_LITTLE_HOST b_out_vec_little_host |
373 | #define ZB_OUT_VEC_BIG_HOST b_out_vec_big_host | |
374 | #define SUNOS_VEC_BIG_HOST sunos_big_vec | |
375 | #define DEMO_64_VEC demo_64_vec | |
92c78ee6 RP |
376 | |
377 | /* We have no oasys tools anymore, so we can't test any of this | |
378 | anymore. If you want to test the stuff yourself, go ahead... | |
379 | [email protected] */ | |
380 | #if 0 | |
6f715d66 | 381 | #define OASYS_VEC oasys_vec |
92c78ee6 RP |
382 | #endif |
383 | ||
6f715d66 SC |
384 | #define IEEE_VEC ieee_vec |
385 | #define M88K_BCS_VEC m88k_bcs_vec | |
386 | #define SREC_VEC srec_vec | |
387 | #define M68KCOFF_VEC m68kcoff_vec | |
388 | #define I386COFF_VEC i386coff_vec | |
bbc8d484 | 389 | #define I386AOUT_VEC i386aout_vec |
41f50af0 | 390 | #define A29KCOFF_BIG_VEC a29kcoff_big_vec |
cbdc7909 | 391 | #define RS6000COFF_VEC rs6000coff_vec |
9872a49c | 392 | #endif |
4e6f9223 | 393 | |
7d774e01 | 394 | bfd_target *target_vector[] = { |
9846338e | 395 | |
7d774e01 | 396 | #ifdef DEFAULT_VECTOR |
6f715d66 | 397 | &DEFAULT_VECTOR, |
92c78ee6 | 398 | #endif |
7d774e01 | 399 | |
6f715d66 SC |
400 | #ifdef I386COFF_VEC |
401 | &I386COFF_VEC, | |
92c78ee6 | 402 | #endif |
20fdc627 | 403 | |
bbc8d484 JG |
404 | #ifdef I386AOUT_VEC |
405 | &I386AOUT_VEC, | |
406 | #endif | |
407 | ||
23b0b558 | 408 | #ifdef ECOFF_LITTLE_VEC |
6f715d66 | 409 | &ECOFF_LITTLE_VEC, |
23b0b558 JG |
410 | #endif |
411 | ||
412 | #ifdef ECOFF_BIG_VEC | |
6f715d66 | 413 | &ECOFF_BIG_VEC, |
23b0b558 | 414 | #endif |
92c78ee6 | 415 | |
7d774e01 | 416 | #ifdef IEEE_VEC |
6f715d66 | 417 | &IEEE_VEC, |
92c78ee6 | 418 | #endif |
7d774e01 RP |
419 | |
420 | #ifdef OASYS_VEC | |
6f715d66 | 421 | &OASYS_VEC, |
92c78ee6 | 422 | #endif |
7d774e01 | 423 | |
2b1d8a50 | 424 | #ifdef SUNOS_VEC_BIG_HOST |
6f715d66 | 425 | &SUNOS_VEC_BIG_HOST, |
92c78ee6 | 426 | #endif |
7ed4093a SC |
427 | |
428 | #ifdef HOST_64_BIT | |
429 | #ifdef DEMO_64_VEC | |
6f715d66 | 430 | &DEMO_64_VEC, |
7ed4093a SC |
431 | #endif |
432 | #endif | |
433 | ||
7d774e01 | 434 | #ifdef M88K_BCS_VEC |
6f715d66 | 435 | &M88K_BCS_VEC, |
92c78ee6 | 436 | #endif |
7d774e01 RP |
437 | |
438 | #ifdef SREC_VEC | |
6f715d66 | 439 | &SREC_VEC, |
92c78ee6 | 440 | #endif |
6f715d66 | 441 | |
7d774e01 | 442 | #ifdef ICOFF_LITTLE_VEC |
6f715d66 | 443 | &ICOFF_LITTLE_VEC, |
92c78ee6 | 444 | #endif |
7d774e01 RP |
445 | |
446 | #ifdef ICOFF_BIG_VEC | |
6f715d66 | 447 | &ICOFF_BIG_VEC, |
92c78ee6 | 448 | #endif |
7d774e01 | 449 | |
3f85ebce JG |
450 | #ifdef ELF_LITTLE_VEC |
451 | &ELF_LITTLE_VEC, | |
92c78ee6 | 452 | #endif |
3f85ebce JG |
453 | |
454 | #ifdef ELF_BIG_VEC | |
455 | &ELF_BIG_VEC, | |
92c78ee6 | 456 | #endif |
3f85ebce | 457 | |
7d774e01 | 458 | #ifdef B_OUT_VEC_LITTLE_HOST |
6f715d66 | 459 | &B_OUT_VEC_LITTLE_HOST, |
92c78ee6 | 460 | #endif |
9846338e | 461 | |
7d774e01 | 462 | #ifdef B_OUT_VEC_BIG_HOST |
6f715d66 | 463 | &B_OUT_VEC_BIG_HOST, |
92c78ee6 | 464 | #endif |
9846338e | 465 | |
6f715d66 SC |
466 | #ifdef M68KCOFF_VEC |
467 | &M68KCOFF_VEC, | |
92c78ee6 | 468 | #endif |
20fdc627 | 469 | |
41f50af0 SC |
470 | #ifdef A29KCOFF_BIG_VEC |
471 | &A29KCOFF_BIG_VEC, | |
92c78ee6 RP |
472 | #endif |
473 | ||
474 | #ifdef TRAD_CORE | |
f58809fd | 475 | &trad_core_vec, |
92c78ee6 | 476 | #endif |
41f50af0 | 477 | |
cbdc7909 JG |
478 | #ifdef RS6000COFF_VEC |
479 | &RS6000COFF_VEC, | |
480 | #endif | |
481 | ||
6f715d66 | 482 | NULL, /* end of list marker */ |
7d774e01 | 483 | }; |
c0e5039e | 484 | |
4e6f9223 | 485 | #endif |
c0e5039e JG |
486 | |
487 | /* default_vector[0] contains either the address of the default vector, | |
488 | if there is one, or zero if there isn't. */ | |
489 | ||
490 | bfd_target *default_vector[] = { | |
491 | #ifdef DEFAULT_VECTOR | |
6f715d66 | 492 | &DEFAULT_VECTOR, |
c0e5039e | 493 | #endif |
6f715d66 | 494 | 0, |
c0e5039e | 495 | }; |
6f715d66 SC |
496 | |
497 | ||
498 | ||
499 | ||
500 | /*proto* | |
501 | *i bfd_find_target | |
502 | Returns a pointer to the transfer vector for the object target | |
503 | named target_name. If target_name is NULL, chooses the one in the | |
504 | environment variable GNUTARGET; if that is null or not defined then | |
505 | the first entry in the target list is chosen. Passing in the | |
506 | string "default" or setting the environment variable to "default" | |
507 | will cause the first entry in the target list to be returned, | |
4e6f9223 SC |
508 | and "target_defaulted" will be set in the BFD. This causes |
509 | @code{bfd_check_format} to loop over all the targets to find the one | |
6f715d66 SC |
510 | that matches the file being read. |
511 | *; PROTO(bfd_target *, bfd_find_target,(CONST char *, bfd *)); | |
512 | *-*/ | |
513 | ||
514 | bfd_target * | |
515 | DEFUN(bfd_find_target,(target_name, abfd), | |
516 | CONST char *target_name AND | |
517 | bfd *abfd) | |
518 | { | |
519 | bfd_target **target; | |
520 | extern char *getenv (); | |
521 | CONST char *targname = (target_name ? target_name : getenv ("GNUTARGET")); | |
522 | ||
523 | /* This is safe; the vector cannot be null */ | |
524 | if (targname == NULL || !strcmp (targname, "default")) { | |
525 | abfd->target_defaulted = true; | |
526 | return abfd->xvec = target_vector[0]; | |
527 | } | |
528 | ||
529 | abfd->target_defaulted = false; | |
530 | ||
531 | for (target = &target_vector[0]; *target != NULL; target++) { | |
532 | if (!strcmp (targname, (*target)->name)) | |
533 | return abfd->xvec = *target; | |
534 | } | |
535 | ||
536 | bfd_error = invalid_target; | |
537 | return NULL; | |
538 | } | |
539 | ||
540 | ||
541 | /*proto* | |
542 | *i bfd_target_list | |
543 | This function returns a freshly malloced NULL-terminated vector of the | |
4e6f9223 | 544 | names of all the valid BFD targets. Do not modify the names |
6f715d66 SC |
545 | *; PROTO(CONST char **,bfd_target_list,()); |
546 | ||
547 | *-*/ | |
548 | ||
549 | CONST char ** | |
550 | DEFUN_VOID(bfd_target_list) | |
551 | { | |
552 | int vec_length= 0; | |
553 | bfd_target **target; | |
4e6f9223 | 554 | CONST char **name_list, **name_ptr; |
6f715d66 SC |
555 | |
556 | for (target = &target_vector[0]; *target != NULL; target++) | |
557 | vec_length++; | |
558 | ||
559 | name_ptr = | |
560 | name_list = (CONST char **) zalloc ((vec_length + 1) * sizeof (char **)); | |
561 | ||
562 | if (name_list == NULL) { | |
563 | bfd_error = no_memory; | |
564 | return NULL; | |
565 | } | |
566 | ||
6f715d66 SC |
567 | for (target = &target_vector[0]; *target != NULL; target++) |
568 | *(name_ptr++) = (*target)->name; | |
569 | ||
570 | return name_list; | |
571 | } |