source: branches/libc-0.6/src/binutils/bfd/libcoff.h

Last change on this file was 610, checked in by bird, 22 years ago

This commit was generated by cvs2svn to compensate for changes in r609,
which included commits to RCS files with non-trunk default branches.

  • Property cvs2svn:cvs-rev set to 1.1.1.2
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 30.9 KB
Line 
1/* DO NOT EDIT! -*- buffer-read-only: t -*- This file is automatically
2 generated from "libcoff-in.h" and "coffcode.h".
3 Run "make headers" in your build bfd/ to regenerate. */
4
5/* BFD COFF object file private structure.
6 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
7 2000, 2001, 2002
8 Free Software Foundation, Inc.
9 Written by Cygnus Support.
10
11This file is part of BFD, the Binary File Descriptor library.
12
13This program is free software; you can redistribute it and/or modify
14it under the terms of the GNU General Public License as published by
15the Free Software Foundation; either version 2 of the License, or
16(at your option) any later version.
17
18This program is distributed in the hope that it will be useful,
19but WITHOUT ANY WARRANTY; without even the implied warranty of
20MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21GNU General Public License for more details.
22
23You should have received a copy of the GNU General Public License
24along with this program; if not, write to the Free Software
25Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
26
27#include "bfdlink.h"
28
29/* Object file tdata; access macros */
30
31#define coff_data(bfd) ((bfd)->tdata.coff_obj_data)
32#define exec_hdr(bfd) (coff_data(bfd)->hdr)
33#define obj_pe(bfd) (coff_data(bfd)->pe)
34#define obj_symbols(bfd) (coff_data(bfd)->symbols)
35#define obj_sym_filepos(bfd) (coff_data(bfd)->sym_filepos)
36
37#define obj_relocbase(bfd) (coff_data(bfd)->relocbase)
38#define obj_raw_syments(bfd) (coff_data(bfd)->raw_syments)
39#define obj_raw_syment_count(bfd) (coff_data(bfd)->raw_syment_count)
40#define obj_convert(bfd) (coff_data(bfd)->conversion_table)
41#define obj_conv_table_size(bfd) (coff_data(bfd)->conv_table_size)
42
43#define obj_coff_external_syms(bfd) (coff_data (bfd)->external_syms)
44#define obj_coff_keep_syms(bfd) (coff_data (bfd)->keep_syms)
45#define obj_coff_strings(bfd) (coff_data (bfd)->strings)
46#define obj_coff_keep_strings(bfd) (coff_data (bfd)->keep_strings)
47#define obj_coff_sym_hashes(bfd) (coff_data (bfd)->sym_hashes)
48#define obj_coff_strings_written(bfd) (coff_data (bfd)->strings_written)
49
50#define obj_coff_local_toc_table(bfd) (coff_data(bfd)->local_toc_sym_map)
51
52/* `Tdata' information kept for COFF files. */
53
54typedef struct coff_tdata
55{
56 struct coff_symbol_struct *symbols; /* symtab for input bfd */
57 unsigned int *conversion_table;
58 int conv_table_size;
59 file_ptr sym_filepos;
60
61 struct coff_ptr_struct *raw_syments;
62 unsigned long raw_syment_count;
63
64 /* These are only valid once writing has begun */
65 long int relocbase;
66
67 /* These members communicate important constants about the symbol table
68 to GDB's symbol-reading code. These `constants' unfortunately vary
69 from coff implementation to implementation... */
70 unsigned local_n_btmask;
71 unsigned local_n_btshft;
72 unsigned local_n_tmask;
73 unsigned local_n_tshift;
74 unsigned local_symesz;
75 unsigned local_auxesz;
76 unsigned local_linesz;
77
78 /* The unswapped external symbols. May be NULL. Read by
79 _bfd_coff_get_external_symbols. */
80 PTR external_syms;
81 /* If this is TRUE, the external_syms may not be freed. */
82 bfd_boolean keep_syms;
83
84 /* The string table. May be NULL. Read by
85 _bfd_coff_read_string_table. */
86 char *strings;
87 /* If this is TRUE, the strings may not be freed. */
88 bfd_boolean keep_strings;
89 /* If this is TRUE, the strings have been written out already. */
90 bfd_boolean strings_written;
91
92 /* is this a PE format coff file */
93 int pe;
94 /* Used by the COFF backend linker. */
95 struct coff_link_hash_entry **sym_hashes;
96
97 /* used by the pe linker for PowerPC */
98 int *local_toc_sym_map;
99
100 struct bfd_link_info *link_info;
101
102 /* Used by coff_find_nearest_line. */
103 PTR line_info;
104
105 /* A place to stash dwarf2 info for this bfd. */
106 PTR dwarf2_find_line_info;
107
108 /* The timestamp from the COFF file header. */
109 long timestamp;
110
111 /* Copy of some of the f_flags bits in the COFF filehdr structure,
112 used by ARM code. */
113 flagword flags;
114
115} coff_data_type;
116
117/* Tdata for pe image files. */
118typedef struct pe_tdata
119{
120 coff_data_type coff;
121 struct internal_extra_pe_aouthdr pe_opthdr;
122 int dll;
123 int has_reloc_section;
124 bfd_boolean (*in_reloc_p) PARAMS((bfd *, reloc_howto_type *));
125 flagword real_flags;
126 int target_subsystem;
127 bfd_boolean force_minimum_alignment;
128} pe_data_type;
129
130#define pe_data(bfd) ((bfd)->tdata.pe_obj_data)
131
132/* Tdata for XCOFF files. */
133
134struct xcoff_tdata
135{
136 /* Basic COFF information. */
137 coff_data_type coff;
138
139 /* TRUE if this is an XCOFF64 file. */
140 bfd_boolean xcoff64;
141
142 /* TRUE if a large a.out header should be generated. */
143 bfd_boolean full_aouthdr;
144
145 /* TOC value. */
146 bfd_vma toc;
147
148 /* Index of section holding TOC. */
149 int sntoc;
150
151 /* Index of section holding entry point. */
152 int snentry;
153
154 /* .text alignment from optional header. */
155 int text_align_power;
156
157 /* .data alignment from optional header. */
158 int data_align_power;
159
160 /* modtype from optional header. */
161 short modtype;
162
163 /* cputype from optional header. */
164 short cputype;
165
166 /* maxdata from optional header. */
167 bfd_vma maxdata;
168
169 /* maxstack from optional header. */
170 bfd_vma maxstack;
171
172 /* Used by the XCOFF backend linker. */
173 asection **csects;
174 unsigned long *debug_indices;
175 unsigned int import_file_id;
176};
177
178#define xcoff_data(abfd) ((abfd)->tdata.xcoff_obj_data)
179
180/* We take the address of the first element of an asymbol to ensure that the
181 * macro is only ever applied to an asymbol. */
182#define coffsymbol(asymbol) ((coff_symbol_type *)(&((asymbol)->the_bfd)))
183
184/* The used_by_bfd field of a section may be set to a pointer to this
185 structure. */
186
187struct coff_section_tdata
188{
189 /* The relocs, swapped into COFF internal form. This may be NULL. */
190 struct internal_reloc *relocs;
191 /* If this is TRUE, the relocs entry may not be freed. */
192 bfd_boolean keep_relocs;
193 /* The section contents. This may be NULL. */
194 bfd_byte *contents;
195 /* If this is TRUE, the contents entry may not be freed. */
196 bfd_boolean keep_contents;
197 /* Information cached by coff_find_nearest_line. */
198 bfd_vma offset;
199 unsigned int i;
200 const char *function;
201 int line_base;
202 /* A pointer used for .stab linking optimizations. */
203 PTR stab_info;
204 /* Available for individual backends. */
205 PTR tdata;
206};
207
208/* An accessor macro for the coff_section_tdata structure. */
209#define coff_section_data(abfd, sec) \
210 ((struct coff_section_tdata *) (sec)->used_by_bfd)
211
212/* Tdata for sections in XCOFF files. This is used by the linker. */
213
214struct xcoff_section_tdata
215{
216 /* Used for XCOFF csects created by the linker; points to the real
217 XCOFF section which contains this csect. */
218 asection *enclosing;
219 /* The lineno_count field for the enclosing section, because we are
220 going to clobber it there. */
221 unsigned int lineno_count;
222 /* The first and one past the last symbol indices for symbols used
223 by this csect. */
224 unsigned long first_symndx;
225 unsigned long last_symndx;
226};
227
228/* An accessor macro the xcoff_section_tdata structure. */
229#define xcoff_section_data(abfd, sec) \
230 ((struct xcoff_section_tdata *) coff_section_data ((abfd), (sec))->tdata)
231
232/* Tdata for sections in PE files. */
233
234struct pei_section_tdata
235{
236 /* The virtual size of the section. */
237 bfd_size_type virt_size;
238 /* The PE section flags. */
239 long pe_flags;
240};
241
242/* An accessor macro for the pei_section_tdata structure. */
243#define pei_section_data(abfd, sec) \
244 ((struct pei_section_tdata *) coff_section_data ((abfd), (sec))->tdata)
245
246/* COFF linker hash table entries. */
247
248struct coff_link_hash_entry
249{
250 struct bfd_link_hash_entry root;
251
252 /* Symbol index in output file. Set to -1 initially. Set to -2 if
253 there is a reloc against this symbol. */
254 long indx;
255
256 /* Symbol type. */
257 unsigned short type;
258
259 /* Symbol class. */
260 unsigned char class;
261
262 /* Number of auxiliary entries. */
263 char numaux;
264
265 /* BFD to take auxiliary entries from. */
266 bfd *auxbfd;
267
268 /* Pointer to array of auxiliary entries, if any. */
269 union internal_auxent *aux;
270
271 /* Flag word; legal values follow. */
272 unsigned short coff_link_hash_flags;
273 /* Symbol is a PE section symbol. */
274#define COFF_LINK_HASH_PE_SECTION_SYMBOL (01)
275};
276
277/* COFF linker hash table. */
278
279struct coff_link_hash_table
280{
281 struct bfd_link_hash_table root;
282 /* A pointer to information used to link stabs in sections. */
283 PTR stab_info;
284};
285
286/* Look up an entry in a COFF linker hash table. */
287
288#define coff_link_hash_lookup(table, string, create, copy, follow) \
289 ((struct coff_link_hash_entry *) \
290 bfd_link_hash_lookup (&(table)->root, (string), (create), \
291 (copy), (follow)))
292
293/* Traverse a COFF linker hash table. */
294
295#define coff_link_hash_traverse(table, func, info) \
296 (bfd_link_hash_traverse \
297 (&(table)->root, \
298 (bfd_boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \
299 (info)))
300
301/* Get the COFF linker hash table from a link_info structure. */
302
303#define coff_hash_table(p) ((struct coff_link_hash_table *) ((p)->hash))
304
305/* Functions in coffgen.c. */
306extern const bfd_target *coff_object_p
307 PARAMS ((bfd *));
308extern struct sec *coff_section_from_bfd_index
309 PARAMS ((bfd *, int));
310extern long coff_get_symtab_upper_bound
311 PARAMS ((bfd *));
312extern long coff_get_symtab
313 PARAMS ((bfd *, asymbol **));
314extern int coff_count_linenumbers
315 PARAMS ((bfd *));
316extern struct coff_symbol_struct *coff_symbol_from
317 PARAMS ((bfd *, asymbol *));
318extern bfd_boolean coff_renumber_symbols
319 PARAMS ((bfd *, int *));
320extern void coff_mangle_symbols
321 PARAMS ((bfd *));
322extern bfd_boolean coff_write_symbols
323 PARAMS ((bfd *));
324extern bfd_boolean coff_write_linenumbers
325 PARAMS ((bfd *));
326extern alent *coff_get_lineno
327 PARAMS ((bfd *, asymbol *));
328extern asymbol *coff_section_symbol
329 PARAMS ((bfd *, char *));
330extern bfd_boolean _bfd_coff_get_external_symbols
331 PARAMS ((bfd *));
332extern const char *_bfd_coff_read_string_table
333 PARAMS ((bfd *));
334extern bfd_boolean _bfd_coff_free_symbols
335 PARAMS ((bfd *));
336extern struct coff_ptr_struct *coff_get_normalized_symtab
337 PARAMS ((bfd *));
338extern long coff_get_reloc_upper_bound
339 PARAMS ((bfd *, sec_ptr));
340extern asymbol *coff_make_empty_symbol
341 PARAMS ((bfd *));
342extern void coff_print_symbol
343 PARAMS ((bfd *, PTR filep, asymbol *, bfd_print_symbol_type));
344extern void coff_get_symbol_info
345 PARAMS ((bfd *, asymbol *, symbol_info *ret));
346extern bfd_boolean _bfd_coff_is_local_label_name
347 PARAMS ((bfd *, const char *));
348extern asymbol *coff_bfd_make_debug_symbol
349 PARAMS ((bfd *, PTR, unsigned long));
350extern bfd_boolean coff_find_nearest_line
351 PARAMS ((bfd *, asection *, asymbol **, bfd_vma, const char **,
352 const char **, unsigned int *));
353extern int coff_sizeof_headers
354 PARAMS ((bfd *, bfd_boolean));
355extern bfd_boolean bfd_coff_reloc16_relax_section
356 PARAMS ((bfd *, asection *, struct bfd_link_info *, bfd_boolean *));
357extern bfd_byte *bfd_coff_reloc16_get_relocated_section_contents
358 PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *,
359 bfd_byte *, bfd_boolean, asymbol **));
360extern bfd_vma bfd_coff_reloc16_get_value
361 PARAMS ((arelent *, struct bfd_link_info *, asection *));
362extern void bfd_perform_slip
363 PARAMS ((bfd *, unsigned int, asection *, bfd_vma));
364
365/* Functions and types in cofflink.c. */
366
367#define STRING_SIZE_SIZE (4)
368
369/* We use a hash table to merge identical enum, struct, and union
370 definitions in the linker. */
371
372/* Information we keep for a single element (an enum value, a
373 structure or union field) in the debug merge hash table. */
374
375struct coff_debug_merge_element
376{
377 /* Next element. */
378 struct coff_debug_merge_element *next;
379
380 /* Name. */
381 const char *name;
382
383 /* Type. */
384 unsigned int type;
385
386 /* Symbol index for complex type. */
387 long tagndx;
388};
389
390/* A linked list of debug merge entries for a given name. */
391
392struct coff_debug_merge_type
393{
394 /* Next type with the same name. */
395 struct coff_debug_merge_type *next;
396
397 /* Class of type. */
398 int class;
399
400 /* Symbol index where this type is defined. */
401 long indx;
402
403 /* List of elements. */
404 struct coff_debug_merge_element *elements;
405};
406
407/* Information we store in the debug merge hash table. */
408
409struct coff_debug_merge_hash_entry
410{
411 struct bfd_hash_entry root;
412
413 /* A list of types with this name. */
414 struct coff_debug_merge_type *types;
415};
416
417/* The debug merge hash table. */
418
419struct coff_debug_merge_hash_table
420{
421 struct bfd_hash_table root;
422};
423
424/* Initialize a COFF debug merge hash table. */
425
426#define coff_debug_merge_hash_table_init(table) \
427 (bfd_hash_table_init (&(table)->root, _bfd_coff_debug_merge_hash_newfunc))
428
429/* Free a COFF debug merge hash table. */
430
431#define coff_debug_merge_hash_table_free(table) \
432 (bfd_hash_table_free (&(table)->root))
433
434/* Look up an entry in a COFF debug merge hash table. */
435
436#define coff_debug_merge_hash_lookup(table, string, create, copy) \
437 ((struct coff_debug_merge_hash_entry *) \
438 bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
439
440/* Information we keep for each section in the output file when doing
441 a relocateable link. */
442
443struct coff_link_section_info
444{
445 /* The relocs to be output. */
446 struct internal_reloc *relocs;
447 /* For each reloc against a global symbol whose index was not known
448 when the reloc was handled, the global hash table entry. */
449 struct coff_link_hash_entry **rel_hashes;
450};
451
452/* Information that we pass around while doing the final link step. */
453
454struct coff_final_link_info
455{
456 /* General link information. */
457 struct bfd_link_info *info;
458 /* Output BFD. */
459 bfd *output_bfd;
460 /* Used to indicate failure in traversal routine. */
461 bfd_boolean failed;
462 /* If doing "task linking" set only during the time when we want the
463 global symbol writer to convert the storage class of defined global
464 symbols from global to static. */
465 bfd_boolean global_to_static;
466 /* Hash table for long symbol names. */
467 struct bfd_strtab_hash *strtab;
468 /* When doing a relocateable link, an array of information kept for
469 each output section, indexed by the target_index field. */
470 struct coff_link_section_info *section_info;
471 /* Symbol index of last C_FILE symbol (-1 if none). */
472 long last_file_index;
473 /* Contents of last C_FILE symbol. */
474 struct internal_syment last_file;
475 /* Symbol index of first aux entry of last .bf symbol with an empty
476 endndx field (-1 if none). */
477 long last_bf_index;
478 /* Contents of last_bf_index aux entry. */
479 union internal_auxent last_bf;
480 /* Hash table used to merge debug information. */
481 struct coff_debug_merge_hash_table debug_merge;
482 /* Buffer large enough to hold swapped symbols of any input file. */
483 struct internal_syment *internal_syms;
484 /* Buffer large enough to hold sections of symbols of any input file. */
485 asection **sec_ptrs;
486 /* Buffer large enough to hold output indices of symbols of any
487 input file. */
488 long *sym_indices;
489 /* Buffer large enough to hold output symbols for any input file. */
490 bfd_byte *outsyms;
491 /* Buffer large enough to hold external line numbers for any input
492 section. */
493 bfd_byte *linenos;
494 /* Buffer large enough to hold any input section. */
495 bfd_byte *contents;
496 /* Buffer large enough to hold external relocs of any input section. */
497 bfd_byte *external_relocs;
498 /* Buffer large enough to hold swapped relocs of any input section. */
499 struct internal_reloc *internal_relocs;
500};
501
502/* Most COFF variants have no way to record the alignment of a
503 section. This struct is used to set a specific alignment based on
504 the name of the section. */
505
506struct coff_section_alignment_entry
507{
508 /* The section name. */
509 const char *name;
510
511 /* This is either (unsigned int) -1, indicating that the section
512 name must match exactly, or it is the number of letters which
513 must match at the start of the name. */
514 unsigned int comparison_length;
515
516 /* These macros may be used to fill in the first two fields in a
517 structure initialization. */
518#define COFF_SECTION_NAME_EXACT_MATCH(name) (name), ((unsigned int) -1)
519#define COFF_SECTION_NAME_PARTIAL_MATCH(name) (name), (sizeof (name) - 1)
520
521 /* Only use this entry if the default section alignment for this
522 target is at least that much (as a power of two). If this field
523 is COFF_ALIGNMENT_FIELD_EMPTY, it should be ignored. */
524 unsigned int default_alignment_min;
525
526 /* Only use this entry if the default section alignment for this
527 target is no greater than this (as a power of two). If this
528 field is COFF_ALIGNMENT_FIELD_EMPTY, it should be ignored. */
529 unsigned int default_alignment_max;
530
531#define COFF_ALIGNMENT_FIELD_EMPTY ((unsigned int) -1)
532
533 /* The desired alignment for this section (as a power of two). */
534 unsigned int alignment_power;
535};
536
537extern struct bfd_hash_entry *_bfd_coff_link_hash_newfunc
538 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
539extern bfd_boolean _bfd_coff_link_hash_table_init
540 PARAMS ((struct coff_link_hash_table *, bfd *,
541 struct bfd_hash_entry *(*) (struct bfd_hash_entry *,
542 struct bfd_hash_table *,
543 const char *)));
544extern struct bfd_link_hash_table *_bfd_coff_link_hash_table_create
545 PARAMS ((bfd *));
546extern const char *_bfd_coff_internal_syment_name
547 PARAMS ((bfd *, const struct internal_syment *, char *));
548extern bfd_boolean _bfd_coff_link_add_symbols
549 PARAMS ((bfd *, struct bfd_link_info *));
550extern bfd_boolean _bfd_coff_final_link
551 PARAMS ((bfd *, struct bfd_link_info *));
552extern struct internal_reloc *_bfd_coff_read_internal_relocs
553 PARAMS ((bfd *, asection *, bfd_boolean, bfd_byte *, bfd_boolean,
554 struct internal_reloc *));
555extern bfd_boolean _bfd_coff_generic_relocate_section
556 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
557 struct internal_reloc *, struct internal_syment *, asection **));
558
559extern struct bfd_hash_entry *_bfd_coff_debug_merge_hash_newfunc
560 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
561extern bfd_boolean _bfd_coff_write_global_sym
562 PARAMS ((struct coff_link_hash_entry *, PTR));
563extern bfd_boolean _bfd_coff_write_task_globals
564 PARAMS ((struct coff_link_hash_entry *, PTR));
565extern bfd_boolean _bfd_coff_link_input_bfd
566 PARAMS ((struct coff_final_link_info *, bfd *));
567extern bfd_boolean _bfd_coff_reloc_link_order
568 PARAMS ((bfd *, struct coff_final_link_info *, asection *,
569 struct bfd_link_order *));
570
571
572#define coff_get_section_contents_in_window \
573 _bfd_generic_get_section_contents_in_window
574
575/* Functions in xcofflink.c. */
576
577extern long _bfd_xcoff_get_dynamic_symtab_upper_bound
578 PARAMS ((bfd *));
579extern long _bfd_xcoff_canonicalize_dynamic_symtab
580 PARAMS ((bfd *, asymbol **));
581extern long _bfd_xcoff_get_dynamic_reloc_upper_bound
582 PARAMS ((bfd *));
583extern long _bfd_xcoff_canonicalize_dynamic_reloc
584 PARAMS ((bfd *, arelent **, asymbol **));
585extern struct bfd_link_hash_table *_bfd_xcoff_bfd_link_hash_table_create
586 PARAMS ((bfd *));
587extern void _bfd_xcoff_bfd_link_hash_table_free
588 PARAMS ((struct bfd_link_hash_table *));
589extern bfd_boolean _bfd_xcoff_bfd_link_add_symbols
590 PARAMS ((bfd *, struct bfd_link_info *));
591extern bfd_boolean _bfd_xcoff_bfd_final_link
592 PARAMS ((bfd *, struct bfd_link_info *));
593extern bfd_boolean _bfd_ppc_xcoff_relocate_section
594 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
595 struct internal_reloc *, struct internal_syment *, asection **));
596
597/* Functions in coff-ppc.c. FIXME: These are called be pe.em in the
598 linker, and so should start with bfd and be declared in bfd.h. */
599
600extern bfd_boolean ppc_allocate_toc_section
601 PARAMS ((struct bfd_link_info *));
602extern bfd_boolean ppc_process_before_allocation
603 PARAMS ((bfd *, struct bfd_link_info *));
604
605/* Extracted from coffcode.h. */
606typedef struct coff_ptr_struct
607{
608 /* Remembers the offset from the first symbol in the file for
609 this symbol. Generated by coff_renumber_symbols. */
610 unsigned int offset;
611
612 /* Should the value of this symbol be renumbered. Used for
613 XCOFF C_BSTAT symbols. Set by coff_slurp_symbol_table. */
614 unsigned int fix_value : 1;
615
616 /* Should the tag field of this symbol be renumbered.
617 Created by coff_pointerize_aux. */
618 unsigned int fix_tag : 1;
619
620 /* Should the endidx field of this symbol be renumbered.
621 Created by coff_pointerize_aux. */
622 unsigned int fix_end : 1;
623
624 /* Should the x_csect.x_scnlen field be renumbered.
625 Created by coff_pointerize_aux. */
626 unsigned int fix_scnlen : 1;
627
628 /* Fix up an XCOFF C_BINCL/C_EINCL symbol. The value is the
629 index into the line number entries. Set by coff_slurp_symbol_table. */
630 unsigned int fix_line : 1;
631
632 /* The container for the symbol structure as read and translated
633 from the file. */
634 union
635 {
636 union internal_auxent auxent;
637 struct internal_syment syment;
638 } u;
639} combined_entry_type;
640
641
642/* Each canonical asymbol really looks like this: */
643
644typedef struct coff_symbol_struct
645{
646 /* The actual symbol which the rest of BFD works with */
647 asymbol symbol;
648
649 /* A pointer to the hidden information for this symbol */
650 combined_entry_type *native;
651
652 /* A pointer to the linenumber information for this symbol */
653 struct lineno_cache_entry *lineno;
654
655 /* Have the line numbers been relocated yet ? */
656 bfd_boolean done_lineno;
657} coff_symbol_type;
658/* COFF symbol classifications. */
659
660enum coff_symbol_classification
661{
662 /* Global symbol. */
663 COFF_SYMBOL_GLOBAL,
664 /* Common symbol. */
665 COFF_SYMBOL_COMMON,
666 /* Undefined symbol. */
667 COFF_SYMBOL_UNDEFINED,
668 /* Local symbol. */
669 COFF_SYMBOL_LOCAL,
670 /* PE section symbol. */
671 COFF_SYMBOL_PE_SECTION
672};
673
674typedef struct
675{
676 void (*_bfd_coff_swap_aux_in)
677 PARAMS ((bfd *, PTR, int, int, int, int, PTR));
678
679 void (*_bfd_coff_swap_sym_in)
680 PARAMS ((bfd *, PTR, PTR));
681
682 void (*_bfd_coff_swap_lineno_in)
683 PARAMS ((bfd *, PTR, PTR));
684
685 unsigned int (*_bfd_coff_swap_aux_out)
686 PARAMS ((bfd *, PTR, int, int, int, int, PTR));
687
688 unsigned int (*_bfd_coff_swap_sym_out)
689 PARAMS ((bfd *, PTR, PTR));
690
691 unsigned int (*_bfd_coff_swap_lineno_out)
692 PARAMS ((bfd *, PTR, PTR));
693
694 unsigned int (*_bfd_coff_swap_reloc_out)
695 PARAMS ((bfd *, PTR, PTR));
696
697 unsigned int (*_bfd_coff_swap_filehdr_out)
698 PARAMS ((bfd *, PTR, PTR));
699
700 unsigned int (*_bfd_coff_swap_aouthdr_out)
701 PARAMS ((bfd *, PTR, PTR));
702
703 unsigned int (*_bfd_coff_swap_scnhdr_out)
704 PARAMS ((bfd *, PTR, PTR));
705
706 unsigned int _bfd_filhsz;
707 unsigned int _bfd_aoutsz;
708 unsigned int _bfd_scnhsz;
709 unsigned int _bfd_symesz;
710 unsigned int _bfd_auxesz;
711 unsigned int _bfd_relsz;
712 unsigned int _bfd_linesz;
713 unsigned int _bfd_filnmlen;
714 bfd_boolean _bfd_coff_long_filenames;
715 bfd_boolean _bfd_coff_long_section_names;
716 unsigned int _bfd_coff_default_section_alignment_power;
717 bfd_boolean _bfd_coff_force_symnames_in_strings;
718 unsigned int _bfd_coff_debug_string_prefix_length;
719
720 void (*_bfd_coff_swap_filehdr_in)
721 PARAMS ((bfd *, PTR, PTR));
722
723 void (*_bfd_coff_swap_aouthdr_in)
724 PARAMS ((bfd *, PTR, PTR));
725
726 void (*_bfd_coff_swap_scnhdr_in)
727 PARAMS ((bfd *, PTR, PTR));
728
729 void (*_bfd_coff_swap_reloc_in)
730 PARAMS ((bfd *abfd, PTR, PTR));
731
732 bfd_boolean (*_bfd_coff_bad_format_hook)
733 PARAMS ((bfd *, PTR));
734
735 bfd_boolean (*_bfd_coff_set_arch_mach_hook)
736 PARAMS ((bfd *, PTR));
737
738 PTR (*_bfd_coff_mkobject_hook)
739 PARAMS ((bfd *, PTR, PTR));
740
741 bfd_boolean (*_bfd_styp_to_sec_flags_hook)
742 PARAMS ((bfd *, PTR, const char *, asection *, flagword *));
743
744 void (*_bfd_set_alignment_hook)
745 PARAMS ((bfd *, asection *, PTR));
746
747 bfd_boolean (*_bfd_coff_slurp_symbol_table)
748 PARAMS ((bfd *));
749
750 bfd_boolean (*_bfd_coff_symname_in_debug)
751 PARAMS ((bfd *, struct internal_syment *));
752
753 bfd_boolean (*_bfd_coff_pointerize_aux_hook)
754 PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
755 unsigned int, combined_entry_type *));
756
757 bfd_boolean (*_bfd_coff_print_aux)
758 PARAMS ((bfd *, FILE *, combined_entry_type *, combined_entry_type *,
759 combined_entry_type *, unsigned int));
760
761 void (*_bfd_coff_reloc16_extra_cases)
762 PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *,
763 bfd_byte *, unsigned int *, unsigned int *));
764
765 int (*_bfd_coff_reloc16_estimate)
766 PARAMS ((bfd *, asection *, arelent *, unsigned int,
767 struct bfd_link_info *));
768
769 enum coff_symbol_classification (*_bfd_coff_classify_symbol)
770 PARAMS ((bfd *, struct internal_syment *));
771
772 bfd_boolean (*_bfd_coff_compute_section_file_positions)
773 PARAMS ((bfd *));
774
775 bfd_boolean (*_bfd_coff_start_final_link)
776 PARAMS ((bfd *, struct bfd_link_info *));
777
778 bfd_boolean (*_bfd_coff_relocate_section)
779 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
780 struct internal_reloc *, struct internal_syment *, asection **));
781
782 reloc_howto_type *(*_bfd_coff_rtype_to_howto)
783 PARAMS ((bfd *, asection *, struct internal_reloc *,
784 struct coff_link_hash_entry *, struct internal_syment *,
785 bfd_vma *));
786
787 bfd_boolean (*_bfd_coff_adjust_symndx)
788 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *,
789 struct internal_reloc *, bfd_boolean *));
790
791 bfd_boolean (*_bfd_coff_link_add_one_symbol)
792 PARAMS ((struct bfd_link_info *, bfd *, const char *, flagword,
793 asection *, bfd_vma, const char *, bfd_boolean, bfd_boolean,
794 struct bfd_link_hash_entry **));
795
796 bfd_boolean (*_bfd_coff_link_output_has_begun)
797 PARAMS ((bfd *, struct coff_final_link_info *));
798
799 bfd_boolean (*_bfd_coff_final_link_postscript)
800 PARAMS ((bfd *, struct coff_final_link_info *));
801
802} bfd_coff_backend_data;
803
804#define coff_backend_info(abfd) \
805 ((bfd_coff_backend_data *) (abfd)->xvec->backend_data)
806
807#define bfd_coff_swap_aux_in(a,e,t,c,ind,num,i) \
808 ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i))
809
810#define bfd_coff_swap_sym_in(a,e,i) \
811 ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i))
812
813#define bfd_coff_swap_lineno_in(a,e,i) \
814 ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i))
815
816#define bfd_coff_swap_reloc_out(abfd, i, o) \
817 ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o))
818
819#define bfd_coff_swap_lineno_out(abfd, i, o) \
820 ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o))
821
822#define bfd_coff_swap_aux_out(a,i,t,c,ind,num,o) \
823 ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o))
824
825#define bfd_coff_swap_sym_out(abfd, i,o) \
826 ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o))
827
828#define bfd_coff_swap_scnhdr_out(abfd, i,o) \
829 ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o))
830
831#define bfd_coff_swap_filehdr_out(abfd, i,o) \
832 ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o))
833
834#define bfd_coff_swap_aouthdr_out(abfd, i,o) \
835 ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o))
836
837#define bfd_coff_filhsz(abfd) (coff_backend_info (abfd)->_bfd_filhsz)
838#define bfd_coff_aoutsz(abfd) (coff_backend_info (abfd)->_bfd_aoutsz)
839#define bfd_coff_scnhsz(abfd) (coff_backend_info (abfd)->_bfd_scnhsz)
840#define bfd_coff_symesz(abfd) (coff_backend_info (abfd)->_bfd_symesz)
841#define bfd_coff_auxesz(abfd) (coff_backend_info (abfd)->_bfd_auxesz)
842#define bfd_coff_relsz(abfd) (coff_backend_info (abfd)->_bfd_relsz)
843#define bfd_coff_linesz(abfd) (coff_backend_info (abfd)->_bfd_linesz)
844#define bfd_coff_filnmlen(abfd) (coff_backend_info (abfd)->_bfd_filnmlen)
845#define bfd_coff_long_filenames(abfd) \
846 (coff_backend_info (abfd)->_bfd_coff_long_filenames)
847#define bfd_coff_long_section_names(abfd) \
848 (coff_backend_info (abfd)->_bfd_coff_long_section_names)
849#define bfd_coff_default_section_alignment_power(abfd) \
850 (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power)
851#define bfd_coff_swap_filehdr_in(abfd, i,o) \
852 ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o))
853
854#define bfd_coff_swap_aouthdr_in(abfd, i,o) \
855 ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o))
856
857#define bfd_coff_swap_scnhdr_in(abfd, i,o) \
858 ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o))
859
860#define bfd_coff_swap_reloc_in(abfd, i, o) \
861 ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_in) (abfd, i, o))
862
863#define bfd_coff_bad_format_hook(abfd, filehdr) \
864 ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr))
865
866#define bfd_coff_set_arch_mach_hook(abfd, filehdr)\
867 ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr))
868#define bfd_coff_mkobject_hook(abfd, filehdr, aouthdr)\
869 ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook)\
870 (abfd, filehdr, aouthdr))
871
872#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name, section, flags_ptr)\
873 ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook)\
874 (abfd, scnhdr, name, section, flags_ptr))
875
876#define bfd_coff_set_alignment_hook(abfd, sec, scnhdr)\
877 ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr))
878
879#define bfd_coff_slurp_symbol_table(abfd)\
880 ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd))
881
882#define bfd_coff_symname_in_debug(abfd, sym)\
883 ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym))
884
885#define bfd_coff_force_symnames_in_strings(abfd)\
886 (coff_backend_info (abfd)->_bfd_coff_force_symnames_in_strings)
887
888#define bfd_coff_debug_string_prefix_length(abfd)\
889 (coff_backend_info (abfd)->_bfd_coff_debug_string_prefix_length)
890
891#define bfd_coff_print_aux(abfd, file, base, symbol, aux, indaux)\
892 ((coff_backend_info (abfd)->_bfd_coff_print_aux)\
893 (abfd, file, base, symbol, aux, indaux))
894
895#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order,\
896 reloc, data, src_ptr, dst_ptr)\
897 ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\
898 (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr))
899
900#define bfd_coff_reloc16_estimate(abfd, section, reloc, shrink, link_info)\
901 ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\
902 (abfd, section, reloc, shrink, link_info))
903
904#define bfd_coff_classify_symbol(abfd, sym)\
905 ((coff_backend_info (abfd)->_bfd_coff_classify_symbol)\
906 (abfd, sym))
907
908#define bfd_coff_compute_section_file_positions(abfd)\
909 ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\
910 (abfd))
911
912#define bfd_coff_start_final_link(obfd, info)\
913 ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\
914 (obfd, info))
915#define bfd_coff_relocate_section(obfd,info,ibfd,o,con,rel,isyms,secs)\
916 ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\
917 (obfd, info, ibfd, o, con, rel, isyms, secs))
918#define bfd_coff_rtype_to_howto(abfd, sec, rel, h, sym, addendp)\
919 ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\
920 (abfd, sec, rel, h, sym, addendp))
921#define bfd_coff_adjust_symndx(obfd, info, ibfd, sec, rel, adjustedp)\
922 ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\
923 (obfd, info, ibfd, sec, rel, adjustedp))
924#define bfd_coff_link_add_one_symbol(info, abfd, name, flags, section,\
925 value, string, cp, coll, hashp)\
926 ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\
927 (info, abfd, name, flags, section, value, string, cp, coll, hashp))
928
929#define bfd_coff_link_output_has_begun(a,p) \
930 ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a,p))
931#define bfd_coff_final_link_postscript(a,p) \
932 ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a,p))
933
Note: See TracBrowser for help on using the repository browser.