/src/binutils-gdb/bfd/targets.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* Generic target-file-type support for the BFD library. |
2 | | Copyright (C) 1990-2025 Free Software Foundation, Inc. |
3 | | Written by Cygnus Support. |
4 | | |
5 | | This file is part of BFD, the Binary File Descriptor library. |
6 | | |
7 | | This program 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 3 of the License, or |
10 | | (at your option) any later version. |
11 | | |
12 | | This program 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 this program; if not, write to the Free Software |
19 | | Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
20 | | MA 02110-1301, USA. */ |
21 | | |
22 | | #include "sysdep.h" |
23 | | #include "libiberty.h" |
24 | | #include "bfd.h" |
25 | | #include "libbfd.h" |
26 | | #include "fnmatch.h" |
27 | | |
28 | | /* |
29 | | It's okay to see some: |
30 | | #if 0 |
31 | | directives in this source file, as targets.c uses them to exclude |
32 | | certain BFD vectors. This comment is specially formatted to catch |
33 | | users who grep for ^#if 0, so please keep it this way! |
34 | | */ |
35 | | |
36 | | /* |
37 | | SECTION |
38 | | Targets |
39 | | |
40 | | DESCRIPTION |
41 | | Each port of BFD to a different machine requires the creation |
42 | | of a target back end. All the back end provides to the root |
43 | | part of BFD is a structure containing pointers to functions |
44 | | which perform certain low level operations on files. BFD |
45 | | translates the applications's requests through a pointer into |
46 | | calls to the back end routines. |
47 | | |
48 | | When a file is opened with <<bfd_openr>>, its format and |
49 | | target are unknown. BFD uses various mechanisms to determine |
50 | | how to interpret the file. The operations performed are: |
51 | | |
52 | | o Create a BFD by calling the internal routine |
53 | | <<_bfd_new_bfd>>, then call <<bfd_find_target>> with the |
54 | | target string supplied to <<bfd_openr>> and the new BFD pointer. |
55 | | |
56 | | o If a null target string was provided to <<bfd_find_target>>, |
57 | | look up the environment variable <<GNUTARGET>> and use |
58 | | that as the target string. |
59 | | |
60 | | o If the target string is still <<NULL>>, or the target string is |
61 | | <<default>>, then use the first item in the target vector |
62 | | as the target type, and set <<target_defaulted>> in the BFD to |
63 | | cause <<bfd_check_format>> to loop through all the targets. |
64 | | @xref{bfd_target}. @xref{Formats}. |
65 | | |
66 | | o Otherwise, inspect the elements in the target vector |
67 | | one by one, until a match on target name is found. When found, |
68 | | use it. |
69 | | |
70 | | o Otherwise return the error <<bfd_error_invalid_target>> to |
71 | | <<bfd_openr>>. |
72 | | |
73 | | o <<bfd_openr>> attempts to open the file using |
74 | | <<bfd_open_file>>, and returns the BFD. |
75 | | |
76 | | Once the BFD has been opened and the target selected, the file |
77 | | format may be determined. This is done by calling |
78 | | <<bfd_check_format>> on the BFD with a suggested format. |
79 | | If <<target_defaulted>> has been set, each possible target |
80 | | type is tried to see if it recognizes the specified format. |
81 | | <<bfd_check_format>> returns <<TRUE>> when the caller guesses right. |
82 | | @menu |
83 | | @* bfd_target:: |
84 | | @end menu |
85 | | */ |
86 | | |
87 | | /* |
88 | | |
89 | | INODE |
90 | | bfd_target, , Targets, Targets |
91 | | DOCDD |
92 | | SUBSECTION |
93 | | bfd_target |
94 | | |
95 | | DESCRIPTION |
96 | | This structure contains everything that BFD knows about a |
97 | | target. It includes things like its byte order, name, and which |
98 | | routines to call to do various operations. |
99 | | |
100 | | Every BFD points to a target structure with its <<xvec>> |
101 | | member. |
102 | | |
103 | | The macros below are used to dispatch to functions through the |
104 | | <<bfd_target>> vector. They are used in a number of macros further |
105 | | down in @file{bfd.h}, and are also used when calling various |
106 | | routines by hand inside the BFD implementation. The @var{arglist} |
107 | | argument must be parenthesized; it contains all the arguments |
108 | | to the called function. |
109 | | |
110 | | They make the documentation (more) unpleasant to read, so if |
111 | | someone wants to fix this and not break the above, please do. |
112 | | |
113 | | .#define BFD_SEND(bfd, message, arglist) \ |
114 | | . ((*((bfd)->xvec->message)) arglist) |
115 | | . |
116 | | .#ifdef DEBUG_BFD_SEND |
117 | | .#undef BFD_SEND |
118 | | .#define BFD_SEND(bfd, message, arglist) \ |
119 | | . (((bfd) && (bfd)->xvec && (bfd)->xvec->message) ? \ |
120 | | . ((*((bfd)->xvec->message)) arglist) : \ |
121 | | . (bfd_assert (__FILE__,__LINE__), NULL)) |
122 | | .#endif |
123 | | |
124 | | For operations which index on the BFD format: |
125 | | |
126 | | .#define BFD_SEND_FMT(bfd, message, arglist) \ |
127 | | . (((bfd)->xvec->message[(int) ((bfd)->format)]) arglist) |
128 | | . |
129 | | .#ifdef DEBUG_BFD_SEND |
130 | | .#undef BFD_SEND_FMT |
131 | | .#define BFD_SEND_FMT(bfd, message, arglist) \ |
132 | | . (((bfd) && (bfd)->xvec && (bfd)->xvec->message) ? \ |
133 | | . (((bfd)->xvec->message[(int) ((bfd)->format)]) arglist) : \ |
134 | | . (bfd_assert (__FILE__,__LINE__), NULL)) |
135 | | .#endif |
136 | | . |
137 | | .{* Defined to TRUE if unused section symbol should be kept. *} |
138 | | .#ifndef TARGET_KEEP_UNUSED_SECTION_SYMBOLS |
139 | | .#define TARGET_KEEP_UNUSED_SECTION_SYMBOLS true |
140 | | .#endif |
141 | | . |
142 | | This is the structure which defines the type of BFD this is. The |
143 | | <<xvec>> member of the struct <<bfd>> itself points here. Each |
144 | | module that implements access to a different target under BFD, |
145 | | defines one of these. |
146 | | |
147 | | FIXME, these names should be rationalised with the names of |
148 | | the entry points which call them. Too bad we can't have one |
149 | | macro to define them both! |
150 | | |
151 | | EXTERNAL |
152 | | .enum bfd_flavour |
153 | | .{ |
154 | | . {* N.B. Update bfd_flavour_name if you change this. *} |
155 | | . bfd_target_unknown_flavour, |
156 | | . bfd_target_aout_flavour, |
157 | | . bfd_target_coff_flavour, |
158 | | . bfd_target_ecoff_flavour, |
159 | | . bfd_target_xcoff_flavour, |
160 | | . bfd_target_elf_flavour, |
161 | | . bfd_target_tekhex_flavour, |
162 | | . bfd_target_srec_flavour, |
163 | | . bfd_target_verilog_flavour, |
164 | | . bfd_target_ihex_flavour, |
165 | | . bfd_target_som_flavour, |
166 | | . bfd_target_msdos_flavour, |
167 | | . bfd_target_evax_flavour, |
168 | | . bfd_target_mmo_flavour, |
169 | | . bfd_target_mach_o_flavour, |
170 | | . bfd_target_pef_flavour, |
171 | | . bfd_target_pef_xlib_flavour, |
172 | | . bfd_target_sym_flavour |
173 | | .}; |
174 | | . |
175 | | .enum bfd_endian { BFD_ENDIAN_BIG, BFD_ENDIAN_LITTLE, BFD_ENDIAN_UNKNOWN }; |
176 | | . |
177 | | .{* Forward declarations. *} |
178 | | .struct flag_info; |
179 | | .typedef void (*bfd_cleanup) (bfd *); |
180 | | . |
181 | | |
182 | | CODE_FRAGMENT |
183 | | .typedef struct bfd_target |
184 | | .{ |
185 | | . {* Identifies the kind of target, e.g., SunOS4, Ultrix, etc. *} |
186 | | . const char *name; |
187 | | . |
188 | | . {* The "flavour" of a back end is a general indication about |
189 | | . the contents of a file. *} |
190 | | . enum bfd_flavour flavour; |
191 | | . |
192 | | . {* The order of bytes within the data area of a file. *} |
193 | | . enum bfd_endian byteorder; |
194 | | . |
195 | | . {* The order of bytes within the header parts of a file. *} |
196 | | . enum bfd_endian header_byteorder; |
197 | | . |
198 | | . {* A mask of all the flags which an executable may have set - |
199 | | . from the set <<BFD_NO_FLAGS>>, <<HAS_RELOC>>, ...<<D_PAGED>>. *} |
200 | | . flagword object_flags; |
201 | | . |
202 | | . {* A mask of all the flags which a section may have set - from |
203 | | . the set <<SEC_NO_FLAGS>>, <<SEC_ALLOC>>, ...<<SET_NEVER_LOAD>>. *} |
204 | | . flagword section_flags; |
205 | | . |
206 | | . {* The character normally found at the front of a symbol. |
207 | | . (if any), perhaps `_'. *} |
208 | | . char symbol_leading_char; |
209 | | . |
210 | | . {* The pad character for file names within an archive header. *} |
211 | | . char ar_pad_char; |
212 | | . |
213 | | . {* The maximum number of characters in an archive header. *} |
214 | | . unsigned char ar_max_namelen; |
215 | | . |
216 | | . {* How well this target matches, used to select between various |
217 | | . possible targets when more than one target matches. *} |
218 | | . unsigned char match_priority; |
219 | | . |
220 | | . {* TRUE if unused section symbols should be kept. *} |
221 | | . bool keep_unused_section_symbols; |
222 | | . |
223 | | . {* Entries for byte swapping for data. These are different from the |
224 | | . other entry points, since they don't take a BFD as the first argument. |
225 | | . Certain other handlers could do the same. *} |
226 | | . uint64_t (*bfd_getx64) (const void *); |
227 | | . int64_t (*bfd_getx_signed_64) (const void *); |
228 | | . void (*bfd_putx64) (uint64_t, void *); |
229 | | . bfd_vma (*bfd_getx32) (const void *); |
230 | | . bfd_signed_vma (*bfd_getx_signed_32) (const void *); |
231 | | . void (*bfd_putx32) (bfd_vma, void *); |
232 | | . bfd_vma (*bfd_getx16) (const void *); |
233 | | . bfd_signed_vma (*bfd_getx_signed_16) (const void *); |
234 | | . void (*bfd_putx16) (bfd_vma, void *); |
235 | | . |
236 | | . {* Byte swapping for the headers. *} |
237 | | . uint64_t (*bfd_h_getx64) (const void *); |
238 | | . int64_t (*bfd_h_getx_signed_64) (const void *); |
239 | | . void (*bfd_h_putx64) (uint64_t, void *); |
240 | | . bfd_vma (*bfd_h_getx32) (const void *); |
241 | | . bfd_signed_vma (*bfd_h_getx_signed_32) (const void *); |
242 | | . void (*bfd_h_putx32) (bfd_vma, void *); |
243 | | . bfd_vma (*bfd_h_getx16) (const void *); |
244 | | . bfd_signed_vma (*bfd_h_getx_signed_16) (const void *); |
245 | | . void (*bfd_h_putx16) (bfd_vma, void *); |
246 | | . |
247 | | . {* Format dependent routines: these are vectors of entry points |
248 | | . within the target vector structure, one for each format to check. *} |
249 | | . |
250 | | . {* Check the format of a file being read. Return a <<bfd_cleanup>> on |
251 | | . success or zero on failure. *} |
252 | | . bfd_cleanup (*_bfd_check_format[bfd_type_end]) (bfd *); |
253 | | . |
254 | | . {* Set the format of a file being written. *} |
255 | | . bool (*_bfd_set_format[bfd_type_end]) (bfd *); |
256 | | . |
257 | | . {* Write cached information into a file being written, at <<bfd_close>>. *} |
258 | | . bool (*_bfd_write_contents[bfd_type_end]) (bfd *); |
259 | | . |
260 | | |
261 | | The general target vector. These vectors are initialized using the |
262 | | BFD_JUMP_TABLE macros. |
263 | | |
264 | | . {* Generic entry points. *} |
265 | | .#define BFD_JUMP_TABLE_GENERIC(NAME) \ |
266 | | . NAME##_close_and_cleanup, \ |
267 | | . NAME##_bfd_free_cached_info, \ |
268 | | . NAME##_new_section_hook, \ |
269 | | . NAME##_get_section_contents |
270 | | . |
271 | | . {* Called when the BFD is being closed to do any necessary cleanup. *} |
272 | | . bool (*_close_and_cleanup) (bfd *); |
273 | | . {* Ask the BFD to free all cached information. *} |
274 | | . bool (*_bfd_free_cached_info) (bfd *); |
275 | | . {* Called when a new section is created. *} |
276 | | . bool (*_new_section_hook) (bfd *, sec_ptr); |
277 | | . {* Read the contents of a section. *} |
278 | | . bool (*_bfd_get_section_contents) (bfd *, sec_ptr, void *, file_ptr, |
279 | | . bfd_size_type); |
280 | | . |
281 | | . {* Entry points to copy private data. *} |
282 | | .#define BFD_JUMP_TABLE_COPY(NAME) \ |
283 | | . NAME##_bfd_copy_private_bfd_data, \ |
284 | | . NAME##_bfd_merge_private_bfd_data, \ |
285 | | . NAME##_init_private_section_data, \ |
286 | | . NAME##_bfd_copy_private_section_data, \ |
287 | | . NAME##_bfd_copy_private_symbol_data, \ |
288 | | . NAME##_bfd_copy_private_header_data, \ |
289 | | . NAME##_bfd_set_private_flags, \ |
290 | | . NAME##_bfd_print_private_bfd_data |
291 | | . |
292 | | . {* Called to copy BFD general private data from one object file |
293 | | . to another. *} |
294 | | . bool (*_bfd_copy_private_bfd_data) (bfd *, bfd *); |
295 | | . {* Called to merge BFD general private data from one object file |
296 | | . to a common output file when linking. *} |
297 | | . bool (*_bfd_merge_private_bfd_data) (bfd *, struct bfd_link_info *); |
298 | | . {* Called to initialize BFD private section data from one object file |
299 | | . to another. *} |
300 | | .#define bfd_init_private_section_data(ibfd, isec, obfd, osec, link_info) \ |
301 | | . BFD_SEND (obfd, _bfd_init_private_section_data, \ |
302 | | . (ibfd, isec, obfd, osec, link_info)) |
303 | | . bool (*_bfd_init_private_section_data) (bfd *, sec_ptr, bfd *, sec_ptr, |
304 | | . struct bfd_link_info *); |
305 | | . {* Called to copy BFD private section data from one object file |
306 | | . to another. *} |
307 | | . bool (*_bfd_copy_private_section_data) (bfd *, sec_ptr, bfd *, sec_ptr); |
308 | | . {* Called to copy BFD private symbol data from one symbol |
309 | | . to another. *} |
310 | | . bool (*_bfd_copy_private_symbol_data) (bfd *, asymbol *, |
311 | | . bfd *, asymbol *); |
312 | | . {* Called to copy BFD private header data from one object file |
313 | | . to another. *} |
314 | | . bool (*_bfd_copy_private_header_data) (bfd *, bfd *); |
315 | | . {* Called to set private backend flags. *} |
316 | | . bool (*_bfd_set_private_flags) (bfd *, flagword); |
317 | | . |
318 | | . {* Called to print private BFD data. *} |
319 | | . bool (*_bfd_print_private_bfd_data) (bfd *, void *); |
320 | | . |
321 | | . {* Core file entry points. *} |
322 | | .#define BFD_JUMP_TABLE_CORE(NAME) \ |
323 | | . NAME##_core_file_failing_command, \ |
324 | | . NAME##_core_file_failing_signal, \ |
325 | | . NAME##_core_file_matches_executable_p, \ |
326 | | . NAME##_core_file_pid |
327 | | . |
328 | | . char *(*_core_file_failing_command) (bfd *); |
329 | | . int (*_core_file_failing_signal) (bfd *); |
330 | | . bool (*_core_file_matches_executable_p) (bfd *, bfd *); |
331 | | . int (*_core_file_pid) (bfd *); |
332 | | . |
333 | | . {* Archive entry points. *} |
334 | | .#define BFD_JUMP_TABLE_ARCHIVE(NAME) \ |
335 | | . NAME##_slurp_armap, \ |
336 | | . NAME##_slurp_extended_name_table, \ |
337 | | . NAME##_construct_extended_name_table, \ |
338 | | . NAME##_truncate_arname, \ |
339 | | . NAME##_write_armap, \ |
340 | | . NAME##_read_ar_hdr, \ |
341 | | . NAME##_write_ar_hdr, \ |
342 | | . NAME##_openr_next_archived_file, \ |
343 | | . NAME##_get_elt_at_index, \ |
344 | | . NAME##_generic_stat_arch_elt, \ |
345 | | . NAME##_update_armap_timestamp |
346 | | . |
347 | | . bool (*_bfd_slurp_armap) (bfd *); |
348 | | . bool (*_bfd_slurp_extended_name_table) (bfd *); |
349 | | . bool (*_bfd_construct_extended_name_table) (bfd *, char **, |
350 | | . bfd_size_type *, |
351 | | . const char **); |
352 | | . void (*_bfd_truncate_arname) (bfd *, const char *, char *); |
353 | | . bool (*write_armap) (bfd *, unsigned, struct orl *, unsigned, int); |
354 | | . void *(*_bfd_read_ar_hdr_fn) (bfd *); |
355 | | . bool (*_bfd_write_ar_hdr_fn) (bfd *, bfd *); |
356 | | . bfd *(*openr_next_archived_file) (bfd *, bfd *); |
357 | | .#define bfd_get_elt_at_index(b,i) \ |
358 | | . BFD_SEND (b, _bfd_get_elt_at_index, (b,i)) |
359 | | . bfd *(*_bfd_get_elt_at_index) (bfd *, symindex); |
360 | | . int (*_bfd_stat_arch_elt) (bfd *, struct stat *); |
361 | | . bool (*_bfd_update_armap_timestamp) (bfd *); |
362 | | . |
363 | | . {* Entry points used for symbols. *} |
364 | | .#define BFD_JUMP_TABLE_SYMBOLS(NAME) \ |
365 | | . NAME##_get_symtab_upper_bound, \ |
366 | | . NAME##_canonicalize_symtab, \ |
367 | | . NAME##_make_empty_symbol, \ |
368 | | . NAME##_print_symbol, \ |
369 | | . NAME##_get_symbol_info, \ |
370 | | . NAME##_get_symbol_version_string, \ |
371 | | . NAME##_bfd_is_local_label_name, \ |
372 | | . NAME##_bfd_is_target_special_symbol, \ |
373 | | . NAME##_get_lineno, \ |
374 | | . NAME##_find_nearest_line, \ |
375 | | . NAME##_find_nearest_line_with_alt, \ |
376 | | . NAME##_find_line, \ |
377 | | . NAME##_find_inliner_info, \ |
378 | | . NAME##_bfd_make_debug_symbol, \ |
379 | | . NAME##_read_minisymbols, \ |
380 | | . NAME##_minisymbol_to_symbol |
381 | | . |
382 | | . long (*_bfd_get_symtab_upper_bound) (bfd *); |
383 | | . long (*_bfd_canonicalize_symtab) (bfd *, struct bfd_symbol **); |
384 | | . struct bfd_symbol * |
385 | | . (*_bfd_make_empty_symbol) (bfd *); |
386 | | . void (*_bfd_print_symbol) (bfd *, void *, struct bfd_symbol *, |
387 | | . bfd_print_symbol_type); |
388 | | .#define bfd_print_symbol(b,p,s,e) \ |
389 | | . BFD_SEND (b, _bfd_print_symbol, (b,p,s,e)) |
390 | | . void (*_bfd_get_symbol_info) (bfd *, struct bfd_symbol *, symbol_info *); |
391 | | .#define bfd_get_symbol_info(b,p,e) \ |
392 | | . BFD_SEND (b, _bfd_get_symbol_info, (b,p,e)) |
393 | | . const char * |
394 | | . (*_bfd_get_symbol_version_string) (bfd *, struct bfd_symbol *, |
395 | | . bool, bool *); |
396 | | .#define bfd_get_symbol_version_string(b,s,p,h) \ |
397 | | . BFD_SEND (b, _bfd_get_symbol_version_string, (b,s,p,h)) |
398 | | . bool (*_bfd_is_local_label_name) (bfd *, const char *); |
399 | | . bool (*_bfd_is_target_special_symbol) (bfd *, asymbol *); |
400 | | . alent * |
401 | | . (*_get_lineno) (bfd *, struct bfd_symbol *); |
402 | | . bool (*_bfd_find_nearest_line) (bfd *, struct bfd_symbol **, |
403 | | . struct bfd_section *, bfd_vma, |
404 | | . const char **, const char **, |
405 | | . unsigned int *, unsigned int *); |
406 | | . bool (*_bfd_find_nearest_line_with_alt) (bfd *, const char *, |
407 | | . struct bfd_symbol **, |
408 | | . struct bfd_section *, bfd_vma, |
409 | | . const char **, const char **, |
410 | | . unsigned int *, unsigned int *); |
411 | | . bool (*_bfd_find_line) (bfd *, struct bfd_symbol **, |
412 | | . struct bfd_symbol *, const char **, |
413 | | . unsigned int *); |
414 | | . bool (*_bfd_find_inliner_info) |
415 | | . (bfd *, const char **, const char **, unsigned int *); |
416 | | . {* Back-door to allow format-aware applications to create debug symbols |
417 | | . while using BFD for everything else. Currently used by the assembler |
418 | | . when creating COFF files. *} |
419 | | . asymbol * |
420 | | . (*_bfd_make_debug_symbol) (bfd *); |
421 | | .#define bfd_read_minisymbols(b, d, m, s) \ |
422 | | . BFD_SEND (b, _read_minisymbols, (b, d, m, s)) |
423 | | . long (*_read_minisymbols) (bfd *, bool, void **, unsigned int *); |
424 | | .#define bfd_minisymbol_to_symbol(b, d, m, f) \ |
425 | | . BFD_SEND (b, _minisymbol_to_symbol, (b, d, m, f)) |
426 | | . asymbol * |
427 | | . (*_minisymbol_to_symbol) (bfd *, bool, const void *, asymbol *); |
428 | | . |
429 | | . {* Routines for relocs. *} |
430 | | .#define BFD_JUMP_TABLE_RELOCS(NAME) \ |
431 | | . NAME##_get_reloc_upper_bound, \ |
432 | | . NAME##_canonicalize_reloc, \ |
433 | | . NAME##_set_reloc, \ |
434 | | . NAME##_bfd_reloc_type_lookup, \ |
435 | | . NAME##_bfd_reloc_name_lookup |
436 | | . |
437 | | . long (*_get_reloc_upper_bound) (bfd *, sec_ptr); |
438 | | . long (*_bfd_canonicalize_reloc) (bfd *, sec_ptr, arelent **, |
439 | | . struct bfd_symbol **); |
440 | | . void (*_bfd_set_reloc) (bfd *, sec_ptr, arelent **, unsigned int); |
441 | | . {* See documentation on reloc types. *} |
442 | | . reloc_howto_type * |
443 | | . (*reloc_type_lookup) (bfd *, bfd_reloc_code_real_type); |
444 | | . reloc_howto_type * |
445 | | . (*reloc_name_lookup) (bfd *, const char *); |
446 | | . |
447 | | . {* Routines used when writing an object file. *} |
448 | | .#define BFD_JUMP_TABLE_WRITE(NAME) \ |
449 | | . NAME##_set_arch_mach, \ |
450 | | . NAME##_set_section_contents |
451 | | . |
452 | | . bool (*_bfd_set_arch_mach) (bfd *, enum bfd_architecture, |
453 | | . unsigned long); |
454 | | . bool (*_bfd_set_section_contents) (bfd *, sec_ptr, const void *, |
455 | | . file_ptr, bfd_size_type); |
456 | | . |
457 | | . {* Routines used by the linker. *} |
458 | | .#define BFD_JUMP_TABLE_LINK(NAME) \ |
459 | | . NAME##_sizeof_headers, \ |
460 | | . NAME##_bfd_get_relocated_section_contents, \ |
461 | | . NAME##_bfd_relax_section, \ |
462 | | . NAME##_bfd_link_hash_table_create, \ |
463 | | . NAME##_bfd_link_add_symbols, \ |
464 | | . NAME##_bfd_link_just_syms, \ |
465 | | . NAME##_bfd_copy_link_hash_symbol_type, \ |
466 | | . NAME##_bfd_final_link, \ |
467 | | . NAME##_bfd_link_split_section, \ |
468 | | . NAME##_bfd_link_check_relocs, \ |
469 | | . NAME##_bfd_gc_sections, \ |
470 | | . NAME##_bfd_lookup_section_flags, \ |
471 | | . NAME##_bfd_merge_sections, \ |
472 | | . NAME##_bfd_is_group_section, \ |
473 | | . NAME##_bfd_group_name, \ |
474 | | . NAME##_bfd_discard_group, \ |
475 | | . NAME##_section_already_linked, \ |
476 | | . NAME##_bfd_define_common_symbol, \ |
477 | | . NAME##_bfd_link_hide_symbol, \ |
478 | | . NAME##_bfd_define_start_stop |
479 | | . |
480 | | . int (*_bfd_sizeof_headers) (bfd *, struct bfd_link_info *); |
481 | | . bfd_byte * |
482 | | . (*_bfd_get_relocated_section_contents) (bfd *, |
483 | | . struct bfd_link_info *, |
484 | | . struct bfd_link_order *, |
485 | | . bfd_byte *, bool, |
486 | | . struct bfd_symbol **); |
487 | | . |
488 | | . bool (*_bfd_relax_section) (bfd *, struct bfd_section *, |
489 | | . struct bfd_link_info *, bool *); |
490 | | . |
491 | | . {* Create a hash table for the linker. Different backends store |
492 | | . different information in this table. *} |
493 | | . struct bfd_link_hash_table * |
494 | | . (*_bfd_link_hash_table_create) (bfd *); |
495 | | . |
496 | | . {* Add symbols from this object file into the hash table. *} |
497 | | . bool (*_bfd_link_add_symbols) (bfd *, struct bfd_link_info *); |
498 | | . |
499 | | . {* Indicate that we are only retrieving symbol values from this section. *} |
500 | | . void (*_bfd_link_just_syms) (asection *, struct bfd_link_info *); |
501 | | . |
502 | | . {* Copy the symbol type and other attributes for a linker script |
503 | | . assignment of one symbol to another. *} |
504 | | .#define bfd_copy_link_hash_symbol_type(b, t, f) \ |
505 | | . BFD_SEND (b, _bfd_copy_link_hash_symbol_type, (b, t, f)) |
506 | | . void (*_bfd_copy_link_hash_symbol_type) (bfd *, |
507 | | . struct bfd_link_hash_entry *, |
508 | | . struct bfd_link_hash_entry *); |
509 | | . |
510 | | . {* Do a link based on the link_order structures attached to each |
511 | | . section of the BFD. *} |
512 | | . bool (*_bfd_final_link) (bfd *, struct bfd_link_info *); |
513 | | . |
514 | | . {* Should this section be split up into smaller pieces during linking. *} |
515 | | . bool (*_bfd_link_split_section) (bfd *, struct bfd_section *); |
516 | | . |
517 | | . {* Check the relocations in the bfd for validity. *} |
518 | | . bool (* _bfd_link_check_relocs)(bfd *, struct bfd_link_info *); |
519 | | . |
520 | | . {* Remove sections that are not referenced from the output. *} |
521 | | . bool (*_bfd_gc_sections) (bfd *, struct bfd_link_info *); |
522 | | . |
523 | | . {* Sets the bitmask of allowed and disallowed section flags. *} |
524 | | . bool (*_bfd_lookup_section_flags) (struct bfd_link_info *, |
525 | | . struct flag_info *, asection *); |
526 | | . |
527 | | . {* Attempt to merge SEC_MERGE sections. *} |
528 | | . bool (*_bfd_merge_sections) (bfd *, struct bfd_link_info *); |
529 | | . |
530 | | . {* Is this section a member of a group? *} |
531 | | . bool (*_bfd_is_group_section) (bfd *, const struct bfd_section *); |
532 | | . |
533 | | . {* The group name, if section is a member of a group. *} |
534 | | . const char *(*_bfd_group_name) (bfd *, const struct bfd_section *); |
535 | | . |
536 | | . {* Discard members of a group. *} |
537 | | . bool (*_bfd_discard_group) (bfd *, struct bfd_section *); |
538 | | . |
539 | | . {* Check if SEC has been already linked during a reloceatable or |
540 | | . final link. *} |
541 | | . bool (*_section_already_linked) (bfd *, asection *, |
542 | | . struct bfd_link_info *); |
543 | | . |
544 | | . {* Define a common symbol. *} |
545 | | . bool (*_bfd_define_common_symbol) (bfd *, struct bfd_link_info *, |
546 | | . struct bfd_link_hash_entry *); |
547 | | . |
548 | | . {* Hide a symbol. *} |
549 | | . void (*_bfd_link_hide_symbol) (bfd *, struct bfd_link_info *, |
550 | | . struct bfd_link_hash_entry *); |
551 | | . |
552 | | . {* Define a __start, __stop, .startof. or .sizeof. symbol. *} |
553 | | . struct bfd_link_hash_entry * |
554 | | . (*_bfd_define_start_stop) (struct bfd_link_info *, const char *, |
555 | | . asection *); |
556 | | . |
557 | | . {* Routines to handle dynamic symbols and relocs. *} |
558 | | .#define BFD_JUMP_TABLE_DYNAMIC(NAME) \ |
559 | | . NAME##_get_dynamic_symtab_upper_bound, \ |
560 | | . NAME##_canonicalize_dynamic_symtab, \ |
561 | | . NAME##_get_synthetic_symtab, \ |
562 | | . NAME##_get_dynamic_reloc_upper_bound, \ |
563 | | . NAME##_canonicalize_dynamic_reloc |
564 | | . |
565 | | . {* Get the amount of memory required to hold the dynamic symbols. *} |
566 | | . long (*_bfd_get_dynamic_symtab_upper_bound) (bfd *); |
567 | | . {* Read in the dynamic symbols. *} |
568 | | . long (*_bfd_canonicalize_dynamic_symtab) (bfd *, struct bfd_symbol **); |
569 | | . {* Create synthetized symbols. *} |
570 | | . long (*_bfd_get_synthetic_symtab) (bfd *, long, struct bfd_symbol **, |
571 | | . long, struct bfd_symbol **, |
572 | | . struct bfd_symbol **); |
573 | | . {* Get the amount of memory required to hold the dynamic relocs. *} |
574 | | . long (*_bfd_get_dynamic_reloc_upper_bound) (bfd *); |
575 | | . {* Read in the dynamic relocs. *} |
576 | | . long (*_bfd_canonicalize_dynamic_reloc) (bfd *, arelent **, |
577 | | . struct bfd_symbol **); |
578 | | . |
579 | | |
580 | | A pointer to an alternative bfd_target in case the current one is not |
581 | | satisfactory. This can happen when the target cpu supports both big |
582 | | and little endian code, and target chosen by the linker has the wrong |
583 | | endianness. The function open_output() in ld/ldlang.c uses this field |
584 | | to find an alternative output format that is suitable. |
585 | | |
586 | | . {* Opposite endian version of this target. *} |
587 | | . const struct bfd_target *alternative_target; |
588 | | . |
589 | | |
590 | | . {* Data for use by back-end routines, which isn't |
591 | | . generic enough to belong in this structure. *} |
592 | | . const void *backend_data; |
593 | | . |
594 | | .} bfd_target; |
595 | | . |
596 | | .static inline const char * |
597 | | .bfd_get_target (const bfd *abfd) |
598 | | .{ |
599 | | . return abfd->xvec->name; |
600 | | .} |
601 | | . |
602 | | .static inline enum bfd_flavour |
603 | | .bfd_get_flavour (const bfd *abfd) |
604 | | .{ |
605 | | . return abfd->xvec->flavour; |
606 | | .} |
607 | | . |
608 | | .static inline flagword |
609 | | .bfd_applicable_file_flags (const bfd *abfd) |
610 | | .{ |
611 | | . return abfd->xvec->object_flags; |
612 | | .} |
613 | | . |
614 | | .static inline bool |
615 | | .bfd_family_coff (const bfd *abfd) |
616 | | .{ |
617 | | . return (bfd_get_flavour (abfd) == bfd_target_coff_flavour |
618 | | . || bfd_get_flavour (abfd) == bfd_target_xcoff_flavour); |
619 | | .} |
620 | | . |
621 | | .static inline bool |
622 | | .bfd_big_endian (const bfd *abfd) |
623 | | .{ |
624 | | . return abfd->xvec->byteorder == BFD_ENDIAN_BIG; |
625 | | .} |
626 | | .static inline bool |
627 | | .bfd_little_endian (const bfd *abfd) |
628 | | .{ |
629 | | . return abfd->xvec->byteorder == BFD_ENDIAN_LITTLE; |
630 | | .} |
631 | | . |
632 | | .static inline bool |
633 | | .bfd_header_big_endian (const bfd *abfd) |
634 | | .{ |
635 | | . return abfd->xvec->header_byteorder == BFD_ENDIAN_BIG; |
636 | | .} |
637 | | . |
638 | | .static inline bool |
639 | | .bfd_header_little_endian (const bfd *abfd) |
640 | | .{ |
641 | | . return abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE; |
642 | | .} |
643 | | . |
644 | | .static inline flagword |
645 | | .bfd_applicable_section_flags (const bfd *abfd) |
646 | | .{ |
647 | | . return abfd->xvec->section_flags; |
648 | | .} |
649 | | . |
650 | | .static inline char |
651 | | .bfd_get_symbol_leading_char (const bfd *abfd) |
652 | | .{ |
653 | | . return abfd->xvec->symbol_leading_char; |
654 | | .} |
655 | | . |
656 | | .static inline enum bfd_flavour |
657 | | .bfd_asymbol_flavour (const asymbol *sy) |
658 | | .{ |
659 | | . if ((sy->flags & BSF_SYNTHETIC) != 0) |
660 | | . return bfd_target_unknown_flavour; |
661 | | . return sy->the_bfd->xvec->flavour; |
662 | | .} |
663 | | . |
664 | | .static inline bool |
665 | | .bfd_keep_unused_section_symbols (const bfd *abfd) |
666 | | .{ |
667 | | . return abfd->xvec->keep_unused_section_symbols; |
668 | | .} |
669 | | . |
670 | | .static inline bool |
671 | | .bfd_target_supports_archives (const bfd *abfd) |
672 | | .{ |
673 | | . return (abfd->xvec->_bfd_check_format[bfd_archive] |
674 | | . != abfd->xvec->_bfd_check_format[bfd_unknown]); |
675 | | .} |
676 | | . |
677 | | */ |
678 | | |
679 | | /* All known xvecs (even those that don't compile on all systems). |
680 | | Alphabetized for easy reference. |
681 | | They are listed a second time below, since |
682 | | we can't intermix extern's and initializers. */ |
683 | | extern const bfd_target aarch64_elf32_be_vec; |
684 | | extern const bfd_target aarch64_elf32_le_vec; |
685 | | extern const bfd_target aarch64_elf64_be_vec; |
686 | | extern const bfd_target aarch64_elf64_be_cloudabi_vec; |
687 | | extern const bfd_target aarch64_elf64_le_vec; |
688 | | extern const bfd_target aarch64_elf64_le_cloudabi_vec; |
689 | | extern const bfd_target aarch64_mach_o_vec; |
690 | | extern const bfd_target aarch64_pei_le_vec; |
691 | | extern const bfd_target aarch64_pe_le_vec; |
692 | | extern const bfd_target alpha_ecoff_le_vec; |
693 | | extern const bfd_target alpha_elf64_vec; |
694 | | extern const bfd_target alpha_elf64_fbsd_vec; |
695 | | extern const bfd_target alpha_vms_vec; |
696 | | extern const bfd_target alpha_vms_lib_txt_vec; |
697 | | extern const bfd_target am33_elf32_linux_vec; |
698 | | extern const bfd_target amdgcn_elf64_le_vec; |
699 | | extern const bfd_target aout_vec; |
700 | | extern const bfd_target arc_elf32_be_vec; |
701 | | extern const bfd_target arc_elf32_le_vec; |
702 | | extern const bfd_target arm_elf32_be_vec; |
703 | | extern const bfd_target arm_elf32_le_vec; |
704 | | extern const bfd_target arm_elf32_fdpic_be_vec; |
705 | | extern const bfd_target arm_elf32_fdpic_le_vec; |
706 | | extern const bfd_target arm_elf32_nacl_be_vec; |
707 | | extern const bfd_target arm_elf32_nacl_le_vec; |
708 | | extern const bfd_target arm_elf32_vxworks_be_vec; |
709 | | extern const bfd_target arm_elf32_vxworks_le_vec; |
710 | | extern const bfd_target arm_mach_o_vec; |
711 | | extern const bfd_target arm_pe_be_vec; |
712 | | extern const bfd_target arm_pe_le_vec; |
713 | | extern const bfd_target arm_pe_wince_be_vec; |
714 | | extern const bfd_target arm_pe_wince_le_vec; |
715 | | extern const bfd_target arm_pei_be_vec; |
716 | | extern const bfd_target arm_pei_le_vec; |
717 | | extern const bfd_target arm_pei_wince_be_vec; |
718 | | extern const bfd_target arm_pei_wince_le_vec; |
719 | | extern const bfd_target avr_elf32_vec; |
720 | | extern const bfd_target bfin_elf32_vec; |
721 | | extern const bfd_target bfin_elf32_fdpic_vec; |
722 | | extern const bfd_target cr16_elf32_vec; |
723 | | extern const bfd_target cris_aout_vec; |
724 | | extern const bfd_target cris_elf32_vec; |
725 | | extern const bfd_target cris_elf32_us_vec; |
726 | | extern const bfd_target crx_elf32_vec; |
727 | | extern const bfd_target csky_elf32_be_vec; |
728 | | extern const bfd_target csky_elf32_le_vec; |
729 | | extern const bfd_target d10v_elf32_vec; |
730 | | extern const bfd_target d30v_elf32_vec; |
731 | | extern const bfd_target dlx_elf32_be_vec; |
732 | | extern const bfd_target elf32_be_vec; |
733 | | extern const bfd_target elf32_le_vec; |
734 | | extern const bfd_target elf64_be_vec; |
735 | | extern const bfd_target elf64_le_vec; |
736 | | extern const bfd_target bpf_elf64_le_vec; |
737 | | extern const bfd_target bpf_elf64_be_vec; |
738 | | extern const bfd_target epiphany_elf32_vec; |
739 | | extern const bfd_target fr30_elf32_vec; |
740 | | extern const bfd_target frv_elf32_vec; |
741 | | extern const bfd_target frv_elf32_fdpic_vec; |
742 | | extern const bfd_target h8300_elf32_vec; |
743 | | extern const bfd_target h8300_elf32_linux_vec; |
744 | | extern const bfd_target hppa_elf32_vec; |
745 | | extern const bfd_target hppa_elf32_linux_vec; |
746 | | extern const bfd_target hppa_elf32_nbsd_vec; |
747 | | extern const bfd_target hppa_elf64_vec; |
748 | | extern const bfd_target hppa_elf64_linux_vec; |
749 | | extern const bfd_target hppa_som_vec; |
750 | | extern const bfd_target i386_aout_vec; |
751 | | extern const bfd_target i386_aout_bsd_vec; |
752 | | extern const bfd_target i386_aout_lynx_vec; |
753 | | extern const bfd_target i386_coff_vec; |
754 | | extern const bfd_target i386_coff_go32_vec; |
755 | | extern const bfd_target i386_coff_go32stubbed_vec; |
756 | | extern const bfd_target i386_coff_lynx_vec; |
757 | | extern const bfd_target i386_elf32_vec; |
758 | | extern const bfd_target i386_elf32_fbsd_vec; |
759 | | extern const bfd_target i386_elf32_sol2_vec; |
760 | | extern const bfd_target i386_elf32_vxworks_vec; |
761 | | extern const bfd_target i386_mach_o_vec; |
762 | | extern const bfd_target i386_msdos_vec; |
763 | | extern const bfd_target i386_pe_vec; |
764 | | extern const bfd_target i386_pe_big_vec; |
765 | | extern const bfd_target i386_pei_vec; |
766 | | extern const bfd_target iamcu_elf32_vec; |
767 | | extern const bfd_target ia64_elf32_be_vec; |
768 | | extern const bfd_target ia64_elf32_hpux_be_vec; |
769 | | extern const bfd_target ia64_elf64_be_vec; |
770 | | extern const bfd_target ia64_elf64_le_vec; |
771 | | extern const bfd_target ia64_elf64_hpux_be_vec; |
772 | | extern const bfd_target ia64_elf64_vms_vec; |
773 | | extern const bfd_target ia64_pei_vec; |
774 | | extern const bfd_target ip2k_elf32_vec; |
775 | | extern const bfd_target iq2000_elf32_vec; |
776 | | extern const bfd_target kvx_elf32_vec; |
777 | | extern const bfd_target kvx_elf64_vec; |
778 | | extern const bfd_target lm32_elf32_vec; |
779 | | extern const bfd_target lm32_elf32_fdpic_vec; |
780 | | extern const bfd_target loongarch_elf64_vec; |
781 | | extern const bfd_target loongarch_elf32_vec; |
782 | | extern const bfd_target loongarch64_pei_vec; |
783 | | extern const bfd_target m32c_elf32_vec; |
784 | | extern const bfd_target m32r_elf32_vec; |
785 | | extern const bfd_target m32r_elf32_le_vec; |
786 | | extern const bfd_target m32r_elf32_linux_vec; |
787 | | extern const bfd_target m32r_elf32_linux_le_vec; |
788 | | extern const bfd_target m68hc11_elf32_vec; |
789 | | extern const bfd_target m68hc12_elf32_vec; |
790 | | extern const bfd_target m68k_elf32_vec; |
791 | | extern const bfd_target s12z_elf32_vec; |
792 | | extern const bfd_target mach_o_be_vec; |
793 | | extern const bfd_target mach_o_le_vec; |
794 | | extern const bfd_target mach_o_fat_vec; |
795 | | extern const bfd_target mcore_elf32_be_vec; |
796 | | extern const bfd_target mcore_elf32_le_vec; |
797 | | extern const bfd_target mcore_pe_be_vec; |
798 | | extern const bfd_target mcore_pe_le_vec; |
799 | | extern const bfd_target mcore_pei_be_vec; |
800 | | extern const bfd_target mcore_pei_le_vec; |
801 | | extern const bfd_target mep_elf32_vec; |
802 | | extern const bfd_target mep_elf32_le_vec; |
803 | | extern const bfd_target metag_elf32_vec; |
804 | | extern const bfd_target microblaze_elf32_vec; |
805 | | extern const bfd_target microblaze_elf32_le_vec; |
806 | | extern const bfd_target mips_ecoff_be_vec; |
807 | | extern const bfd_target mips_ecoff_le_vec; |
808 | | extern const bfd_target mips_ecoff_bele_vec; |
809 | | extern const bfd_target mips_elf32_be_vec; |
810 | | extern const bfd_target mips_elf32_le_vec; |
811 | | extern const bfd_target mips_elf32_n_be_vec; |
812 | | extern const bfd_target mips_elf32_n_le_vec; |
813 | | extern const bfd_target mips_elf32_ntrad_be_vec; |
814 | | extern const bfd_target mips_elf32_ntrad_le_vec; |
815 | | extern const bfd_target mips_elf32_ntradfbsd_be_vec; |
816 | | extern const bfd_target mips_elf32_ntradfbsd_le_vec; |
817 | | extern const bfd_target mips_elf32_trad_be_vec; |
818 | | extern const bfd_target mips_elf32_trad_le_vec; |
819 | | extern const bfd_target mips_elf32_tradfbsd_be_vec; |
820 | | extern const bfd_target mips_elf32_tradfbsd_le_vec; |
821 | | extern const bfd_target mips_elf32_vxworks_be_vec; |
822 | | extern const bfd_target mips_elf32_vxworks_le_vec; |
823 | | extern const bfd_target mips_elf64_be_vec; |
824 | | extern const bfd_target mips_elf64_le_vec; |
825 | | extern const bfd_target mips_elf64_trad_be_vec; |
826 | | extern const bfd_target mips_elf64_trad_le_vec; |
827 | | extern const bfd_target mips_elf64_tradfbsd_be_vec; |
828 | | extern const bfd_target mips_elf64_tradfbsd_le_vec; |
829 | | extern const bfd_target mmix_elf64_vec; |
830 | | extern const bfd_target mmix_mmo_vec; |
831 | | extern const bfd_target mn10200_elf32_vec; |
832 | | extern const bfd_target mn10300_elf32_vec; |
833 | | extern const bfd_target moxie_elf32_be_vec; |
834 | | extern const bfd_target moxie_elf32_le_vec; |
835 | | extern const bfd_target msp430_elf32_vec; |
836 | | extern const bfd_target msp430_elf32_ti_vec; |
837 | | extern const bfd_target mt_elf32_vec; |
838 | | extern const bfd_target nds32_elf32_be_vec; |
839 | | extern const bfd_target nds32_elf32_le_vec; |
840 | | extern const bfd_target nds32_elf32_linux_be_vec; |
841 | | extern const bfd_target nds32_elf32_linux_le_vec; |
842 | | extern const bfd_target nfp_elf64_vec; |
843 | | extern const bfd_target ns32k_aout_pc532mach_vec; |
844 | | extern const bfd_target ns32k_aout_pc532nbsd_vec; |
845 | | extern const bfd_target or1k_elf32_vec; |
846 | | extern const bfd_target pdb_vec; |
847 | | extern const bfd_target pdp11_aout_vec; |
848 | | extern const bfd_target pef_vec; |
849 | | extern const bfd_target pef_xlib_vec; |
850 | | extern const bfd_target pj_elf32_vec; |
851 | | extern const bfd_target pj_elf32_le_vec; |
852 | | extern const bfd_target plugin_vec; |
853 | | extern const bfd_target powerpc_boot_vec; |
854 | | extern const bfd_target powerpc_elf32_vec; |
855 | | extern const bfd_target powerpc_elf32_le_vec; |
856 | | extern const bfd_target powerpc_elf32_fbsd_vec; |
857 | | extern const bfd_target powerpc_elf32_vxworks_vec; |
858 | | extern const bfd_target powerpc_elf64_vec; |
859 | | extern const bfd_target powerpc_elf64_le_vec; |
860 | | extern const bfd_target powerpc_elf64_fbsd_vec; |
861 | | extern const bfd_target powerpc_elf64_fbsd_le_vec; |
862 | | extern const bfd_target powerpc_xcoff_vec; |
863 | | extern const bfd_target pru_elf32_vec; |
864 | | extern const bfd_target riscv_elf32_vec; |
865 | | extern const bfd_target riscv_elf64_vec; |
866 | | extern const bfd_target riscv_elf32_be_vec; |
867 | | extern const bfd_target riscv_elf64_be_vec; |
868 | | extern const bfd_target riscv64_pei_vec; |
869 | | extern const bfd_target rl78_elf32_vec; |
870 | | extern const bfd_target rs6000_xcoff64_vec; |
871 | | extern const bfd_target rs6000_xcoff64_aix_vec; |
872 | | extern const bfd_target rs6000_xcoff_vec; |
873 | | extern const bfd_target rx_elf32_be_vec; |
874 | | extern const bfd_target rx_elf32_be_ns_vec; |
875 | | extern const bfd_target rx_elf32_le_vec; |
876 | | extern const bfd_target rx_elf32_linux_le_vec; |
877 | | extern const bfd_target s390_elf32_vec; |
878 | | extern const bfd_target s390_elf64_vec; |
879 | | extern const bfd_target score_elf32_be_vec; |
880 | | extern const bfd_target score_elf32_le_vec; |
881 | | extern const bfd_target sh_coff_vec; |
882 | | extern const bfd_target sh_coff_le_vec; |
883 | | extern const bfd_target sh_coff_small_vec; |
884 | | extern const bfd_target sh_coff_small_le_vec; |
885 | | extern const bfd_target sh_elf32_vec; |
886 | | extern const bfd_target sh_elf32_le_vec; |
887 | | extern const bfd_target sh_elf32_fdpic_be_vec; |
888 | | extern const bfd_target sh_elf32_fdpic_le_vec; |
889 | | extern const bfd_target sh_elf32_linux_vec; |
890 | | extern const bfd_target sh_elf32_linux_be_vec; |
891 | | extern const bfd_target sh_elf32_nbsd_vec; |
892 | | extern const bfd_target sh_elf32_nbsd_le_vec; |
893 | | extern const bfd_target sh_elf32_vxworks_vec; |
894 | | extern const bfd_target sh_elf32_vxworks_le_vec; |
895 | | extern const bfd_target sh_pe_le_vec; |
896 | | extern const bfd_target sh_pei_le_vec; |
897 | | extern const bfd_target sparc_elf32_vec; |
898 | | extern const bfd_target sparc_elf32_sol2_vec; |
899 | | extern const bfd_target sparc_elf32_vxworks_vec; |
900 | | extern const bfd_target sparc_elf64_vec; |
901 | | extern const bfd_target sparc_elf64_fbsd_vec; |
902 | | extern const bfd_target sparc_elf64_sol2_vec; |
903 | | extern const bfd_target spu_elf32_vec; |
904 | | extern const bfd_target sym_vec; |
905 | | extern const bfd_target tic30_coff_vec; |
906 | | extern const bfd_target tic4x_coff0_vec; |
907 | | extern const bfd_target tic4x_coff0_beh_vec; |
908 | | extern const bfd_target tic4x_coff1_vec; |
909 | | extern const bfd_target tic4x_coff1_beh_vec; |
910 | | extern const bfd_target tic4x_coff2_vec; |
911 | | extern const bfd_target tic4x_coff2_beh_vec; |
912 | | extern const bfd_target tic54x_coff0_vec; |
913 | | extern const bfd_target tic54x_coff0_beh_vec; |
914 | | extern const bfd_target tic54x_coff1_vec; |
915 | | extern const bfd_target tic54x_coff1_beh_vec; |
916 | | extern const bfd_target tic54x_coff2_vec; |
917 | | extern const bfd_target tic54x_coff2_beh_vec; |
918 | | extern const bfd_target tic6x_elf32_be_vec; |
919 | | extern const bfd_target tic6x_elf32_le_vec; |
920 | | extern const bfd_target tic6x_elf32_c6000_be_vec; |
921 | | extern const bfd_target tic6x_elf32_c6000_le_vec; |
922 | | extern const bfd_target tic6x_elf32_linux_be_vec; |
923 | | extern const bfd_target tic6x_elf32_linux_le_vec; |
924 | | extern const bfd_target tilegx_elf32_be_vec; |
925 | | extern const bfd_target tilegx_elf32_le_vec; |
926 | | extern const bfd_target tilegx_elf64_be_vec; |
927 | | extern const bfd_target tilegx_elf64_le_vec; |
928 | | extern const bfd_target tilepro_elf32_vec; |
929 | | extern const bfd_target v800_elf32_vec; |
930 | | extern const bfd_target v850_elf32_vec; |
931 | | extern const bfd_target ft32_elf32_vec; |
932 | | extern const bfd_target vax_aout_1knbsd_vec; |
933 | | extern const bfd_target vax_aout_nbsd_vec; |
934 | | extern const bfd_target vax_elf32_vec; |
935 | | extern const bfd_target visium_elf32_vec; |
936 | | extern const bfd_target wasm_vec; |
937 | | extern const bfd_target wasm32_elf32_vec; |
938 | | extern const bfd_target x86_64_coff_vec; |
939 | | extern const bfd_target x86_64_elf32_vec; |
940 | | extern const bfd_target x86_64_elf64_vec; |
941 | | extern const bfd_target x86_64_elf64_cloudabi_vec; |
942 | | extern const bfd_target x86_64_elf64_fbsd_vec; |
943 | | extern const bfd_target x86_64_elf64_sol2_vec; |
944 | | extern const bfd_target x86_64_mach_o_vec; |
945 | | extern const bfd_target x86_64_pe_vec; |
946 | | extern const bfd_target x86_64_pe_big_vec; |
947 | | extern const bfd_target x86_64_pei_vec; |
948 | | extern const bfd_target xgate_elf32_vec; |
949 | | extern const bfd_target xstormy16_elf32_vec; |
950 | | extern const bfd_target xtensa_elf32_be_vec; |
951 | | extern const bfd_target xtensa_elf32_le_vec; |
952 | | extern const bfd_target z80_coff_vec; |
953 | | extern const bfd_target z80_elf32_vec; |
954 | | extern const bfd_target z8k_coff_vec; |
955 | | |
956 | | /* These are always included. */ |
957 | | extern const bfd_target srec_vec; |
958 | | extern const bfd_target symbolsrec_vec; |
959 | | extern const bfd_target verilog_vec; |
960 | | extern const bfd_target tekhex_vec; |
961 | | extern const bfd_target binary_vec; |
962 | | extern const bfd_target ihex_vec; |
963 | | |
964 | | /* All of the xvecs for core files. */ |
965 | | extern const bfd_target core_cisco_be_vec; |
966 | | extern const bfd_target core_cisco_le_vec; |
967 | | extern const bfd_target core_hppabsd_vec; |
968 | | extern const bfd_target core_hpux_vec; |
969 | | extern const bfd_target core_irix_vec; |
970 | | extern const bfd_target core_netbsd_vec; |
971 | | extern const bfd_target core_osf_vec; |
972 | | extern const bfd_target core_ptrace_vec; |
973 | | extern const bfd_target core_trad_vec; |
974 | | |
975 | | static const bfd_target * const _bfd_target_vector[] = |
976 | | { |
977 | | #ifdef SELECT_VECS |
978 | | |
979 | | SELECT_VECS, |
980 | | |
981 | | #else /* not SELECT_VECS */ |
982 | | |
983 | | #ifdef DEFAULT_VECTOR |
984 | | &DEFAULT_VECTOR, |
985 | | #endif |
986 | | /* This list is alphabetized to make it easy to compare |
987 | | with other vector lists -- the decls above and |
988 | | the case statement in configure.ac. |
989 | | Try to keep it in order when adding new targets, and |
990 | | use a name of the form <cpu>_<format>_<other>_<endian>_vec. |
991 | | Note that sorting is done as if _<endian>_vec wasn't present. |
992 | | Vectors that don't compile on all systems, or aren't finished, |
993 | | should have an entry here with #if 0 around it, to show that |
994 | | it wasn't omitted by mistake. */ |
995 | | #ifdef BFD64 |
996 | | &aarch64_elf32_be_vec, |
997 | | &aarch64_elf32_le_vec, |
998 | | &aarch64_elf64_be_vec, |
999 | | &aarch64_elf64_be_cloudabi_vec, |
1000 | | &aarch64_elf64_le_vec, |
1001 | | &aarch64_elf64_le_cloudabi_vec, |
1002 | | &aarch64_mach_o_vec, |
1003 | | &aarch64_pe_le_vec, |
1004 | | &aarch64_pei_le_vec, |
1005 | | #endif |
1006 | | |
1007 | | #ifdef BFD64 |
1008 | | &amdgcn_elf64_le_vec, |
1009 | | #endif |
1010 | | |
1011 | | #ifdef BFD64 |
1012 | | &alpha_ecoff_le_vec, |
1013 | | &alpha_elf64_vec, |
1014 | | &alpha_elf64_fbsd_vec, |
1015 | | &alpha_vms_vec, |
1016 | | #endif |
1017 | | &alpha_vms_lib_txt_vec, |
1018 | | |
1019 | | &am33_elf32_linux_vec, |
1020 | | |
1021 | | #if 0 |
1022 | | /* Since a.out files lack decent magic numbers, no way to recognize |
1023 | | which kind of a.out file it is. */ |
1024 | | &aout_vec, |
1025 | | #endif |
1026 | | |
1027 | | &arc_elf32_be_vec, |
1028 | | &arc_elf32_le_vec, |
1029 | | |
1030 | | &arm_elf32_be_vec, |
1031 | | &arm_elf32_le_vec, |
1032 | | &arm_elf32_fdpic_be_vec, |
1033 | | &arm_elf32_fdpic_le_vec, |
1034 | | &arm_elf32_vxworks_be_vec, |
1035 | | &arm_elf32_vxworks_le_vec, |
1036 | | &arm_mach_o_vec, |
1037 | | &arm_pe_be_vec, |
1038 | | &arm_pe_le_vec, |
1039 | | &arm_pe_wince_be_vec, |
1040 | | &arm_pe_wince_le_vec, |
1041 | | &arm_pei_be_vec, |
1042 | | &arm_pei_le_vec, |
1043 | | &arm_pei_wince_be_vec, |
1044 | | &arm_pei_wince_le_vec, |
1045 | | |
1046 | | &avr_elf32_vec, |
1047 | | |
1048 | | &bfin_elf32_vec, |
1049 | | &bfin_elf32_fdpic_vec, |
1050 | | |
1051 | | &cr16_elf32_vec, |
1052 | | |
1053 | | &cris_aout_vec, |
1054 | | &cris_elf32_vec, |
1055 | | &cris_elf32_us_vec, |
1056 | | |
1057 | | &crx_elf32_vec, |
1058 | | |
1059 | | &csky_elf32_be_vec, |
1060 | | &csky_elf32_le_vec, |
1061 | | |
1062 | | &d10v_elf32_vec, |
1063 | | &d30v_elf32_vec, |
1064 | | |
1065 | | &dlx_elf32_be_vec, |
1066 | | |
1067 | | /* This, and other vectors, may not be used in any *.mt configuration. |
1068 | | But that does not mean they are unnecessary. If configured with |
1069 | | --enable-targets=all, objdump or gdb should be able to examine |
1070 | | the file even if we don't recognize the machine type. */ |
1071 | | &elf32_be_vec, |
1072 | | &elf32_le_vec, |
1073 | | #ifdef BFD64 |
1074 | | &elf64_be_vec, |
1075 | | &elf64_le_vec, |
1076 | | #endif |
1077 | | |
1078 | | &epiphany_elf32_vec, |
1079 | | |
1080 | | &fr30_elf32_vec, |
1081 | | |
1082 | | &frv_elf32_vec, |
1083 | | &frv_elf32_fdpic_vec, |
1084 | | |
1085 | | &h8300_elf32_vec, |
1086 | | &h8300_elf32_linux_vec, |
1087 | | |
1088 | | &hppa_elf32_vec, |
1089 | | &hppa_elf32_linux_vec, |
1090 | | &hppa_elf32_nbsd_vec, |
1091 | | #ifdef BFD64 |
1092 | | &hppa_elf64_vec, |
1093 | | &hppa_elf64_linux_vec, |
1094 | | #endif |
1095 | | &hppa_som_vec, |
1096 | | |
1097 | | &i386_aout_vec, |
1098 | | &i386_aout_bsd_vec, |
1099 | | &i386_aout_lynx_vec, |
1100 | | &i386_coff_vec, |
1101 | | &i386_coff_go32_vec, |
1102 | | &i386_coff_go32stubbed_vec, |
1103 | | &i386_coff_lynx_vec, |
1104 | | &i386_elf32_vec, |
1105 | | &i386_elf32_fbsd_vec, |
1106 | | &i386_elf32_sol2_vec, |
1107 | | &i386_elf32_vxworks_vec, |
1108 | | &i386_mach_o_vec, |
1109 | | &i386_msdos_vec, |
1110 | | &i386_pe_vec, |
1111 | | &i386_pe_big_vec, |
1112 | | &i386_pei_vec, |
1113 | | |
1114 | | &iamcu_elf32_vec, |
1115 | | |
1116 | | #ifdef BFD64 |
1117 | | &bpf_elf64_be_vec, |
1118 | | &bpf_elf64_le_vec, |
1119 | | #endif |
1120 | | |
1121 | | #ifdef BFD64 |
1122 | | #if 0 |
1123 | | &ia64_elf32_be_vec, |
1124 | | #endif |
1125 | | &ia64_elf32_hpux_be_vec, |
1126 | | &ia64_elf64_be_vec, |
1127 | | &ia64_elf64_le_vec, |
1128 | | &ia64_elf64_hpux_be_vec, |
1129 | | &ia64_elf64_vms_vec, |
1130 | | &ia64_pei_vec, |
1131 | | #endif |
1132 | | |
1133 | | &ip2k_elf32_vec, |
1134 | | &iq2000_elf32_vec, |
1135 | | |
1136 | | #ifdef BFD64 |
1137 | | &kvx_elf32_vec, |
1138 | | &kvx_elf64_vec, |
1139 | | #endif |
1140 | | |
1141 | | &lm32_elf32_vec, |
1142 | | |
1143 | | &m32c_elf32_vec, |
1144 | | |
1145 | | &m32r_elf32_vec, |
1146 | | &m32r_elf32_le_vec, |
1147 | | &m32r_elf32_linux_vec, |
1148 | | &m32r_elf32_linux_le_vec, |
1149 | | |
1150 | | &m68hc11_elf32_vec, |
1151 | | &m68hc12_elf32_vec, |
1152 | | |
1153 | | &m68k_elf32_vec, |
1154 | | |
1155 | | &s12z_elf32_vec, |
1156 | | |
1157 | | &mach_o_be_vec, |
1158 | | &mach_o_le_vec, |
1159 | | &mach_o_fat_vec, |
1160 | | |
1161 | | &mcore_elf32_be_vec, |
1162 | | &mcore_elf32_le_vec, |
1163 | | &mcore_pe_be_vec, |
1164 | | &mcore_pe_le_vec, |
1165 | | &mcore_pei_be_vec, |
1166 | | &mcore_pei_le_vec, |
1167 | | |
1168 | | &mep_elf32_vec, |
1169 | | |
1170 | | &metag_elf32_vec, |
1171 | | |
1172 | | µblaze_elf32_vec, |
1173 | | |
1174 | | &mips_ecoff_be_vec, |
1175 | | &mips_ecoff_le_vec, |
1176 | | &mips_ecoff_bele_vec, |
1177 | | #ifdef BFD64 |
1178 | | &mips_elf32_be_vec, |
1179 | | &mips_elf32_le_vec, |
1180 | | &mips_elf32_n_be_vec, |
1181 | | &mips_elf32_n_le_vec, |
1182 | | &mips_elf32_ntrad_be_vec, |
1183 | | &mips_elf32_ntrad_le_vec, |
1184 | | &mips_elf32_ntradfbsd_be_vec, |
1185 | | &mips_elf32_ntradfbsd_le_vec, |
1186 | | &mips_elf32_trad_be_vec, |
1187 | | &mips_elf32_trad_le_vec, |
1188 | | &mips_elf32_tradfbsd_be_vec, |
1189 | | &mips_elf32_tradfbsd_le_vec, |
1190 | | &mips_elf32_vxworks_be_vec, |
1191 | | &mips_elf32_vxworks_le_vec, |
1192 | | &mips_elf64_be_vec, |
1193 | | &mips_elf64_le_vec, |
1194 | | &mips_elf64_trad_be_vec, |
1195 | | &mips_elf64_trad_le_vec, |
1196 | | &mips_elf64_tradfbsd_be_vec, |
1197 | | &mips_elf64_tradfbsd_le_vec, |
1198 | | #endif |
1199 | | |
1200 | | #ifdef BFD64 |
1201 | | &mmix_elf64_vec, |
1202 | | &mmix_mmo_vec, |
1203 | | #endif |
1204 | | |
1205 | | &mn10200_elf32_vec, |
1206 | | &mn10300_elf32_vec, |
1207 | | |
1208 | | &moxie_elf32_be_vec, |
1209 | | &moxie_elf32_le_vec, |
1210 | | |
1211 | | &msp430_elf32_vec, |
1212 | | &msp430_elf32_ti_vec, |
1213 | | |
1214 | | &mt_elf32_vec, |
1215 | | |
1216 | | &nds32_elf32_be_vec, |
1217 | | &nds32_elf32_le_vec, |
1218 | | &nds32_elf32_linux_be_vec, |
1219 | | &nds32_elf32_linux_le_vec, |
1220 | | |
1221 | | #ifdef BFD64 |
1222 | | &nfp_elf64_vec, |
1223 | | #endif |
1224 | | |
1225 | | &ns32k_aout_pc532mach_vec, |
1226 | | &ns32k_aout_pc532nbsd_vec, |
1227 | | |
1228 | | &or1k_elf32_vec, |
1229 | | |
1230 | | &pdb_vec, |
1231 | | |
1232 | | &pdp11_aout_vec, |
1233 | | |
1234 | | &pef_vec, |
1235 | | &pef_xlib_vec, |
1236 | | |
1237 | | &pj_elf32_vec, |
1238 | | &pj_elf32_le_vec, |
1239 | | |
1240 | | &powerpc_boot_vec, |
1241 | | &powerpc_elf32_vec, |
1242 | | &powerpc_elf32_le_vec, |
1243 | | &powerpc_elf32_fbsd_vec, |
1244 | | &powerpc_elf32_vxworks_vec, |
1245 | | #ifdef BFD64 |
1246 | | &powerpc_elf64_vec, |
1247 | | &powerpc_elf64_le_vec, |
1248 | | &powerpc_elf64_fbsd_vec, |
1249 | | &powerpc_elf64_fbsd_le_vec, |
1250 | | #endif |
1251 | | #if 0 |
1252 | | /* This has the same magic number as RS/6000. */ |
1253 | | &powerpc_xcoff_vec, |
1254 | | #endif |
1255 | | |
1256 | | &pru_elf32_vec, |
1257 | | |
1258 | | #ifdef BFD64 |
1259 | | &riscv_elf32_vec, |
1260 | | &riscv_elf64_vec, |
1261 | | &riscv_elf32_be_vec, |
1262 | | &riscv_elf64_be_vec, |
1263 | | &riscv64_pei_vec, |
1264 | | #endif |
1265 | | &rl78_elf32_vec, |
1266 | | |
1267 | | #ifdef BFD64 |
1268 | | &rs6000_xcoff64_vec, |
1269 | | &rs6000_xcoff64_aix_vec, |
1270 | | #endif |
1271 | | &rs6000_xcoff_vec, |
1272 | | |
1273 | | &rx_elf32_be_vec, |
1274 | | &rx_elf32_be_ns_vec, |
1275 | | &rx_elf32_le_vec, |
1276 | | |
1277 | | &s390_elf32_vec, |
1278 | | #ifdef BFD64 |
1279 | | &s390_elf64_vec, |
1280 | | #endif |
1281 | | |
1282 | | #ifdef BFD64 |
1283 | | &score_elf32_be_vec, |
1284 | | &score_elf32_le_vec, |
1285 | | #endif |
1286 | | |
1287 | | &sh_coff_vec, |
1288 | | &sh_coff_le_vec, |
1289 | | &sh_coff_small_vec, |
1290 | | &sh_coff_small_le_vec, |
1291 | | &sh_elf32_vec, |
1292 | | &sh_elf32_le_vec, |
1293 | | &sh_elf32_fdpic_be_vec, |
1294 | | &sh_elf32_fdpic_le_vec, |
1295 | | &sh_elf32_linux_vec, |
1296 | | &sh_elf32_linux_be_vec, |
1297 | | &sh_elf32_nbsd_vec, |
1298 | | &sh_elf32_nbsd_le_vec, |
1299 | | &sh_elf32_vxworks_vec, |
1300 | | &sh_elf32_vxworks_le_vec, |
1301 | | &sh_pe_le_vec, |
1302 | | &sh_pei_le_vec, |
1303 | | |
1304 | | &sparc_elf32_vec, |
1305 | | &sparc_elf32_sol2_vec, |
1306 | | &sparc_elf32_vxworks_vec, |
1307 | | #ifdef BFD64 |
1308 | | &sparc_elf64_vec, |
1309 | | &sparc_elf64_fbsd_vec, |
1310 | | &sparc_elf64_sol2_vec, |
1311 | | #endif |
1312 | | |
1313 | | &spu_elf32_vec, |
1314 | | |
1315 | | &sym_vec, |
1316 | | |
1317 | | &tic30_coff_vec, |
1318 | | &tic54x_coff0_beh_vec, |
1319 | | &tic54x_coff0_vec, |
1320 | | &tic54x_coff1_beh_vec, |
1321 | | &tic54x_coff1_vec, |
1322 | | &tic54x_coff2_beh_vec, |
1323 | | &tic54x_coff2_vec, |
1324 | | &tic6x_elf32_be_vec, |
1325 | | &tic6x_elf32_le_vec, |
1326 | | |
1327 | | &tilegx_elf32_be_vec, |
1328 | | &tilegx_elf32_le_vec, |
1329 | | #ifdef BFD64 |
1330 | | &tilegx_elf64_be_vec, |
1331 | | &tilegx_elf64_le_vec, |
1332 | | #endif |
1333 | | &tilepro_elf32_vec, |
1334 | | |
1335 | | &ft32_elf32_vec, |
1336 | | |
1337 | | &v800_elf32_vec, |
1338 | | &v850_elf32_vec, |
1339 | | |
1340 | | &vax_aout_1knbsd_vec, |
1341 | | &vax_aout_nbsd_vec, |
1342 | | &vax_elf32_vec, |
1343 | | |
1344 | | &visium_elf32_vec, |
1345 | | |
1346 | | &wasm_vec, |
1347 | | &wasm32_elf32_vec, |
1348 | | |
1349 | | #ifdef BFD64 |
1350 | | &x86_64_coff_vec, |
1351 | | &x86_64_elf32_vec, |
1352 | | &x86_64_elf64_vec, |
1353 | | &x86_64_elf64_cloudabi_vec, |
1354 | | &x86_64_elf64_fbsd_vec, |
1355 | | &x86_64_elf64_sol2_vec, |
1356 | | &x86_64_mach_o_vec, |
1357 | | &x86_64_pe_vec, |
1358 | | &x86_64_pe_big_vec, |
1359 | | &x86_64_pei_vec, |
1360 | | #endif |
1361 | | |
1362 | | &xgate_elf32_vec, |
1363 | | |
1364 | | &xstormy16_elf32_vec, |
1365 | | |
1366 | | &xtensa_elf32_be_vec, |
1367 | | &xtensa_elf32_le_vec, |
1368 | | |
1369 | | &z80_coff_vec, |
1370 | | &z80_elf32_vec, |
1371 | | |
1372 | | &z8k_coff_vec, |
1373 | | |
1374 | | #ifdef BFD64 |
1375 | | &loongarch_elf32_vec, |
1376 | | &loongarch_elf64_vec, |
1377 | | &loongarch64_pei_vec, |
1378 | | #endif |
1379 | | |
1380 | | #endif /* not SELECT_VECS */ |
1381 | | |
1382 | | /* Always support S-records, for convenience. */ |
1383 | | &srec_vec, |
1384 | | &symbolsrec_vec, |
1385 | | /* And verilog. */ |
1386 | | &verilog_vec, |
1387 | | /* And tekhex */ |
1388 | | &tekhex_vec, |
1389 | | /* Likewise for binary output. */ |
1390 | | &binary_vec, |
1391 | | /* Likewise for ihex. */ |
1392 | | &ihex_vec, |
1393 | | |
1394 | | #if BFD_SUPPORTS_PLUGINS |
1395 | | &plugin_vec, |
1396 | | #endif |
1397 | | |
1398 | | /* Add any required traditional-core-file-handler. */ |
1399 | | |
1400 | | #if 0 |
1401 | | /* We don't include cisco_core_*_vec. Although it has a magic number, |
1402 | | the magic number isn't at the beginning of the file, and thus |
1403 | | might spuriously match other kinds of files. */ |
1404 | | &core_cisco_be_vec, |
1405 | | &core_cisco_le_vec, |
1406 | | #endif |
1407 | | #ifdef HPPABSD_CORE |
1408 | | &core_hppabsd_vec, |
1409 | | #endif |
1410 | | #ifdef HPUX_CORE |
1411 | | &core_hpux_vec, |
1412 | | #endif |
1413 | | #ifdef IRIX_CORE |
1414 | | &core_irix_vec, |
1415 | | #endif |
1416 | | #ifdef NETBSD_CORE |
1417 | | &core_netbsd_vec, |
1418 | | #endif |
1419 | | #ifdef OSF_CORE |
1420 | | &core_osf_vec, |
1421 | | #endif |
1422 | | #ifdef PTRACE_CORE |
1423 | | &core_ptrace_vec, |
1424 | | #endif |
1425 | | #ifdef TRAD_CORE |
1426 | | &core_trad_vec, |
1427 | | #endif |
1428 | | |
1429 | | NULL /* end of list marker */ |
1430 | | }; |
1431 | | const bfd_target *const *const bfd_target_vector = _bfd_target_vector; |
1432 | | |
1433 | | /* bfd_default_vector[0] contains either the address of the default vector, |
1434 | | if there is one, or zero if there isn't. */ |
1435 | | |
1436 | | const bfd_target *bfd_default_vector[] = { |
1437 | | #ifdef DEFAULT_VECTOR |
1438 | | &DEFAULT_VECTOR, |
1439 | | #endif |
1440 | | NULL |
1441 | | }; |
1442 | | |
1443 | | /* bfd_associated_vector[] contains the associated target vectors used |
1444 | | to reduce the ambiguity in bfd_check_format_matches. */ |
1445 | | |
1446 | | static const bfd_target *const _bfd_associated_vector[] = { |
1447 | | #ifdef ASSOCIATED_VECS |
1448 | | ASSOCIATED_VECS, |
1449 | | #endif |
1450 | | NULL |
1451 | | }; |
1452 | | const bfd_target *const *const bfd_associated_vector = _bfd_associated_vector; |
1453 | | |
1454 | | /* When there is an ambiguous match, bfd_check_format_matches puts the |
1455 | | names of the matching targets in an array. This variable is the maximum |
1456 | | number of entries that the array could possibly need. */ |
1457 | | const size_t _bfd_target_vector_entries = ARRAY_SIZE (_bfd_target_vector); |
1458 | | |
1459 | | |
1460 | | /* This array maps configuration triplets onto BFD vectors. */ |
1461 | | |
1462 | | struct targmatch |
1463 | | { |
1464 | | /* The configuration triplet. */ |
1465 | | const char *triplet; |
1466 | | /* The BFD vector. If this is NULL, then the vector is found by |
1467 | | searching forward for the next structure with a non NULL vector |
1468 | | field. */ |
1469 | | const bfd_target *vector; |
1470 | | }; |
1471 | | |
1472 | | /* targmatch.h is built by Makefile out of config.bfd. */ |
1473 | | static const struct targmatch bfd_target_match[] = { |
1474 | | #include "targmatch.h" |
1475 | | { NULL, NULL } |
1476 | | }; |
1477 | | |
1478 | | /* Find a target vector, given a name or configuration triplet. */ |
1479 | | |
1480 | | static const bfd_target * |
1481 | | find_target (const char *name) |
1482 | 36.6k | { |
1483 | 36.6k | const bfd_target * const *target; |
1484 | 36.6k | const struct targmatch *match; |
1485 | | |
1486 | 8.73M | for (target = &bfd_target_vector[0]; *target != NULL; target++) |
1487 | 8.72M | if (strcmp (name, (*target)->name) == 0) |
1488 | 32.9k | return *target; |
1489 | | |
1490 | | /* If we couldn't match on the exact name, try matching on the |
1491 | | configuration triplet. FIXME: We should run the triplet through |
1492 | | config.sub first, but that is hard. */ |
1493 | 568k | for (match = &bfd_target_match[0]; match->triplet != NULL; match++) |
1494 | 568k | { |
1495 | 568k | if (fnmatch (match->triplet, name, 0) == 0) |
1496 | 3.71k | { |
1497 | 3.71k | while (match->vector == NULL) |
1498 | 0 | ++match; |
1499 | 3.71k | return match->vector; |
1500 | 3.71k | } |
1501 | 568k | } |
1502 | | |
1503 | 1 | bfd_set_error (bfd_error_invalid_target); |
1504 | 1 | return NULL; |
1505 | 3.71k | } |
1506 | | |
1507 | | /* |
1508 | | FUNCTION |
1509 | | bfd_set_default_target |
1510 | | |
1511 | | SYNOPSIS |
1512 | | bool bfd_set_default_target (const char *name); |
1513 | | |
1514 | | DESCRIPTION |
1515 | | Set the default target vector to use when recognizing a BFD. |
1516 | | This takes the name of the target, which may be a BFD target |
1517 | | name or a configuration triplet. |
1518 | | */ |
1519 | | |
1520 | | bool |
1521 | | bfd_set_default_target (const char *name) |
1522 | 3.71k | { |
1523 | 3.71k | const bfd_target *target; |
1524 | | |
1525 | 3.71k | if (bfd_default_vector[0] != NULL |
1526 | 3.71k | && strcmp (name, bfd_default_vector[0]->name) == 0) |
1527 | 0 | return true; |
1528 | | |
1529 | 3.71k | target = find_target (name); |
1530 | 3.71k | if (target == NULL) |
1531 | 0 | return false; |
1532 | | |
1533 | 3.71k | bfd_default_vector[0] = target; |
1534 | 3.71k | return true; |
1535 | 3.71k | } |
1536 | | |
1537 | | /* |
1538 | | FUNCTION |
1539 | | bfd_find_target |
1540 | | |
1541 | | SYNOPSIS |
1542 | | const bfd_target *bfd_find_target (const char *target_name, bfd *abfd); |
1543 | | |
1544 | | DESCRIPTION |
1545 | | Return a pointer to the transfer vector for the object target |
1546 | | named @var{target_name}. If @var{target_name} is <<NULL>>, |
1547 | | choose the one in the environment variable <<GNUTARGET>>; if |
1548 | | that is null or not defined, then choose the first entry in the |
1549 | | target list. Passing in the string "default" or setting the |
1550 | | environment variable to "default" will cause the first entry in |
1551 | | the target list to be returned, and "target_defaulted" will be |
1552 | | set in the BFD if @var{abfd} isn't <<NULL>>. This causes |
1553 | | <<bfd_check_format>> to loop over all the targets to find the |
1554 | | one that matches the file being read. |
1555 | | */ |
1556 | | |
1557 | | const bfd_target * |
1558 | | bfd_find_target (const char *target_name, bfd *abfd) |
1559 | 196k | { |
1560 | 196k | const char *targname; |
1561 | 196k | const bfd_target *target; |
1562 | | |
1563 | 196k | if (target_name != NULL) |
1564 | 32.9k | targname = target_name; |
1565 | 163k | else |
1566 | 163k | targname = getenv ("GNUTARGET"); |
1567 | | |
1568 | | /* This is safe; the vector cannot be null. */ |
1569 | 196k | if (targname == NULL || strcmp (targname, "default") == 0) |
1570 | 163k | { |
1571 | 163k | if (bfd_default_vector[0] != NULL) |
1572 | 163k | target = bfd_default_vector[0]; |
1573 | 0 | else |
1574 | 0 | target = bfd_target_vector[0]; |
1575 | 163k | if (abfd) |
1576 | 163k | { |
1577 | 163k | abfd->xvec = target; |
1578 | 163k | abfd->target_defaulted = true; |
1579 | 163k | } |
1580 | 163k | return target; |
1581 | 163k | } |
1582 | | |
1583 | 32.9k | if (abfd) |
1584 | 32.9k | abfd->target_defaulted = false; |
1585 | | |
1586 | 32.9k | target = find_target (targname); |
1587 | 32.9k | if (target == NULL) |
1588 | 1 | return NULL; |
1589 | | |
1590 | 32.9k | if (abfd) |
1591 | 32.9k | abfd->xvec = target; |
1592 | 32.9k | return target; |
1593 | 32.9k | } |
1594 | | |
1595 | | /* Helper function for bfd_get_target_info to determine the target's |
1596 | | architecture. This method handles bfd internal target names as |
1597 | | tuples and triplets. */ |
1598 | | static bool |
1599 | | _bfd_find_arch_match (const char *tname, const char **arch, |
1600 | | const char **def_target_arch) |
1601 | 0 | { |
1602 | 0 | if (!arch) |
1603 | 0 | return false; |
1604 | | |
1605 | 0 | while (*arch != NULL) |
1606 | 0 | { |
1607 | 0 | const char *in_a = strstr (*arch, tname); |
1608 | 0 | char end_ch = (in_a ? in_a[strlen (tname)] : 0); |
1609 | |
|
1610 | 0 | if (in_a && (in_a == *arch || in_a[-1] == ':') |
1611 | 0 | && end_ch == 0) |
1612 | 0 | { |
1613 | 0 | *def_target_arch = *arch; |
1614 | 0 | return true; |
1615 | 0 | } |
1616 | 0 | arch++; |
1617 | 0 | } |
1618 | 0 | return false; |
1619 | 0 | } |
1620 | | |
1621 | | /* |
1622 | | FUNCTION |
1623 | | bfd_get_target_info |
1624 | | SYNOPSIS |
1625 | | const bfd_target *bfd_get_target_info (const char *target_name, |
1626 | | bfd *abfd, |
1627 | | bool *is_bigendian, |
1628 | | int *underscoring, |
1629 | | const char **def_target_arch); |
1630 | | DESCRIPTION |
1631 | | Return a pointer to the transfer vector for the object target |
1632 | | named @var{target_name}. If @var{target_name} is <<NULL>>, |
1633 | | choose the one in the environment variable <<GNUTARGET>>; if |
1634 | | that is null or not defined, then choose the first entry in the |
1635 | | target list. Passing in the string "default" or setting the |
1636 | | environment variable to "default" will cause the first entry in |
1637 | | the target list to be returned, and "target_defaulted" will be |
1638 | | set in the BFD if @var{abfd} isn't <<NULL>>. This causes |
1639 | | <<bfd_check_format>> to loop over all the targets to find the |
1640 | | one that matches the file being read. |
1641 | | If @var{is_bigendian} is not <<NULL>>, then set this value to target's |
1642 | | endian mode. True for big-endian, FALSE for little-endian or for |
1643 | | invalid target. |
1644 | | If @var{underscoring} is not <<NULL>>, then set this value to target's |
1645 | | underscoring mode. Zero for none-underscoring, -1 for invalid target, |
1646 | | else the value of target vector's symbol underscoring. |
1647 | | If @var{def_target_arch} is not <<NULL>>, then set it to the architecture |
1648 | | string specified by the target_name. |
1649 | | */ |
1650 | | const bfd_target * |
1651 | | bfd_get_target_info (const char *target_name, bfd *abfd, |
1652 | | bool *is_bigendian, |
1653 | | int *underscoring, const char **def_target_arch) |
1654 | 0 | { |
1655 | 0 | const bfd_target *target_vec; |
1656 | |
|
1657 | 0 | if (is_bigendian) |
1658 | 0 | *is_bigendian = false; |
1659 | 0 | if (underscoring) |
1660 | 0 | *underscoring = -1; |
1661 | 0 | if (def_target_arch) |
1662 | 0 | *def_target_arch = NULL; |
1663 | 0 | target_vec = bfd_find_target (target_name, abfd); |
1664 | 0 | if (! target_vec) |
1665 | 0 | return NULL; |
1666 | 0 | if (is_bigendian) |
1667 | 0 | *is_bigendian = target_vec->byteorder == BFD_ENDIAN_BIG; |
1668 | 0 | if (underscoring) |
1669 | 0 | *underscoring = ((int) target_vec->symbol_leading_char) & 0xff; |
1670 | |
|
1671 | 0 | if (def_target_arch) |
1672 | 0 | { |
1673 | 0 | const char *tname = target_vec->name; |
1674 | 0 | const char **arches = bfd_arch_list (); |
1675 | |
|
1676 | 0 | if (arches && tname) |
1677 | 0 | { |
1678 | 0 | char *hyp = strchr (tname, '-'); |
1679 | |
|
1680 | 0 | if (hyp != NULL) |
1681 | 0 | { |
1682 | 0 | tname = ++hyp; |
1683 | | |
1684 | | /* Make sure we detect architecture names |
1685 | | for triplets like "pe-arm-wince-little". */ |
1686 | 0 | if (!_bfd_find_arch_match (tname, arches, def_target_arch)) |
1687 | 0 | { |
1688 | 0 | char new_tname[50]; |
1689 | |
|
1690 | 0 | strcpy (new_tname, hyp); |
1691 | 0 | while ((hyp = strrchr (new_tname, '-')) != NULL) |
1692 | 0 | { |
1693 | 0 | *hyp = 0; |
1694 | 0 | if (_bfd_find_arch_match (new_tname, arches, |
1695 | 0 | def_target_arch)) |
1696 | 0 | break; |
1697 | 0 | } |
1698 | 0 | } |
1699 | 0 | } |
1700 | 0 | else |
1701 | 0 | _bfd_find_arch_match (tname, arches, def_target_arch); |
1702 | 0 | } |
1703 | |
|
1704 | 0 | free (arches); |
1705 | 0 | } |
1706 | 0 | return target_vec; |
1707 | 0 | } |
1708 | | |
1709 | | /* |
1710 | | FUNCTION |
1711 | | bfd_target_list |
1712 | | |
1713 | | SYNOPSIS |
1714 | | const char ** bfd_target_list (void); |
1715 | | |
1716 | | DESCRIPTION |
1717 | | Return a freshly malloced NULL-terminated |
1718 | | vector of the names of all the valid BFD targets. Do not |
1719 | | modify the names. |
1720 | | |
1721 | | */ |
1722 | | |
1723 | | const char ** |
1724 | | bfd_target_list (void) |
1725 | 0 | { |
1726 | 0 | int vec_length = 0; |
1727 | 0 | size_t amt; |
1728 | 0 | const bfd_target * const *target; |
1729 | 0 | const char **name_list, **name_ptr; |
1730 | |
|
1731 | 0 | for (target = &bfd_target_vector[0]; *target != NULL; target++) |
1732 | 0 | vec_length++; |
1733 | |
|
1734 | 0 | amt = (vec_length + 1) * sizeof (char **); |
1735 | 0 | name_ptr = name_list = (const char **) bfd_malloc (amt); |
1736 | |
|
1737 | 0 | if (name_list == NULL) |
1738 | 0 | return NULL; |
1739 | | |
1740 | 0 | for (target = &bfd_target_vector[0]; *target != NULL; target++) |
1741 | 0 | if (target == &bfd_target_vector[0] |
1742 | 0 | || *target != bfd_target_vector[0]) |
1743 | 0 | *name_ptr++ = (*target)->name; |
1744 | |
|
1745 | 0 | *name_ptr = NULL; |
1746 | 0 | return name_list; |
1747 | 0 | } |
1748 | | |
1749 | | /* |
1750 | | FUNCTION |
1751 | | bfd_iterate_over_targets |
1752 | | |
1753 | | SYNOPSIS |
1754 | | const bfd_target *bfd_iterate_over_targets |
1755 | | (int (*func) (const bfd_target *, void *), |
1756 | | void *data); |
1757 | | |
1758 | | DESCRIPTION |
1759 | | Call @var{func} for each target in the list of BFD target |
1760 | | vectors, passing @var{data} to @var{func}. Stop iterating if |
1761 | | @var{func} returns a non-zero result, and return that target |
1762 | | vector. Return NULL if @var{func} always returns zero. |
1763 | | */ |
1764 | | |
1765 | | const bfd_target * |
1766 | | bfd_iterate_over_targets (int (*func) (const bfd_target *, void *), |
1767 | | void *data) |
1768 | 0 | { |
1769 | 0 | const bfd_target *const *target; |
1770 | |
|
1771 | 0 | for (target = bfd_target_vector; *target != NULL; ++target) |
1772 | 0 | if (func (*target, data)) |
1773 | 0 | return *target; |
1774 | | |
1775 | 0 | return NULL; |
1776 | 0 | } |
1777 | | |
1778 | | /* |
1779 | | FUNCTION |
1780 | | bfd_flavour_name |
1781 | | |
1782 | | SYNOPSIS |
1783 | | const char *bfd_flavour_name (enum bfd_flavour flavour); |
1784 | | |
1785 | | DESCRIPTION |
1786 | | Return the string form of @var{flavour}. |
1787 | | */ |
1788 | | |
1789 | | const char * |
1790 | | bfd_flavour_name (enum bfd_flavour flavour) |
1791 | 0 | { |
1792 | 0 | switch (flavour) |
1793 | 0 | { |
1794 | 0 | case bfd_target_unknown_flavour: return "unknown file format"; |
1795 | 0 | case bfd_target_aout_flavour: return "a.out"; |
1796 | 0 | case bfd_target_coff_flavour: return "COFF"; |
1797 | 0 | case bfd_target_ecoff_flavour: return "ECOFF"; |
1798 | 0 | case bfd_target_xcoff_flavour: return "XCOFF"; |
1799 | 0 | case bfd_target_elf_flavour: return "ELF"; |
1800 | 0 | case bfd_target_tekhex_flavour: return "Tekhex"; |
1801 | 0 | case bfd_target_srec_flavour: return "Srec"; |
1802 | 0 | case bfd_target_verilog_flavour: return "Verilog"; |
1803 | 0 | case bfd_target_ihex_flavour: return "Ihex"; |
1804 | 0 | case bfd_target_som_flavour: return "SOM"; |
1805 | 0 | case bfd_target_msdos_flavour: return "MSDOS"; |
1806 | 0 | case bfd_target_evax_flavour: return "Evax"; |
1807 | 0 | case bfd_target_mmo_flavour: return "mmo"; |
1808 | 0 | case bfd_target_mach_o_flavour: return "MACH_O"; |
1809 | 0 | case bfd_target_pef_flavour: return "PEF"; |
1810 | 0 | case bfd_target_pef_xlib_flavour: return "PEF_XLIB"; |
1811 | 0 | case bfd_target_sym_flavour: return "SYM"; |
1812 | | /* There is no "default" case here so that -Wswitch (part of -Wall) |
1813 | | catches missing entries. */ |
1814 | 0 | } |
1815 | | |
1816 | 0 | abort (); |
1817 | 0 | } |